From 36731498e1b7c65a69cd15d626fedca4c92c1042 Mon Sep 17 00:00:00 2001 From: admin <admin@example.com> Date: 星期四, 20 二月 2025 17:39:54 +0800 Subject: [PATCH] 增加撤单 --- strategy/order_methods.py | 196 ++++++++++++++++-------------------------------- 1 files changed, 66 insertions(+), 130 deletions(-) diff --git a/strategy/order_methods.py b/strategy/order_methods.py index e21ef19..1d93565 100644 --- a/strategy/order_methods.py +++ b/strategy/order_methods.py @@ -1,37 +1,52 @@ """ 浜ゆ槗鏂瑰紡妯″潡锛堟�昏澶勭悊鎵�鏈夋笭閬撶殑鍚勭浜ゆ槗鏂规硶闆嗗悎锛� """ +import logging import multiprocessing import threading # import log -from strategy import data_cache +from strategy import data_cache, account_management import data_server from log_module.log import logger_debug -# import account_management + +from trade import huaxin_trade_api, huaxin_trade_data_update, middle_api_protocol +from utils import huaxin_util, tool + # 寮曞叆鏃ュ織妯″潡 from strategy.logging_config import get_logger -from trade import huaxin_trade_api, huaxin_trade_data_update, middle_api_protocol -from utils import huaxin_util - # 鑾峰彇logger瀹炰緥 logger = get_logger() # 涓嬪崟涔板叆鍑芥暟锛堟寜閲戦锛屼互闄愪环涔帮級銆愭寜閲戦涔� 鍩虹鐗堛�� -def buy_order_by_value(symbol, buy_order_value, sec_name, price): - price = round(float(price), 2) +def buy_order_by_value(symbol, buy_order_value, sec_name, current_price): + price = round(float(current_price), 2) volume = (int(buy_order_value / price) // 100) * 100 - order = huaxin_trade_api.order(1, symbol[-6:], volume, price, blocking=True) - logger.info(f"order===={order}") - logger.info(f"涔扮エ 鎵ц鎴愬姛锛氥�恵sec_name}銆�") - # 涔扮エ鍚庢坊鍔� 鎸佷粨浠g爜闆嗗悎 - data_cache.position_symbols_set.add(symbol) - # 涔扮エ鍚庢坊鍔� 浠婃棩鏂板鎸佷粨浠g爜闆嗗悎 - data_cache.addition_position_symbols_set.add(symbol) - logger.info(f"褰撳墠鎸佷粨鏁伴噺:::{len(data_cache.position_symbols_set)}") - logger.info(f"浠婃棩鏂板鎸佷粨鏁伴噺:::{len(data_cache.addition_position_symbols_set)}") + if volume < 100: + volume = 100 + # 璋冪敤绗煎瓙浠疯绠楀伐鍏疯绠椾笅鍗曚环鏍� + order_price = tool.get_buy_max_price(current_price) + buy_order = huaxin_trade_api.order(1, symbol[-6:], volume, order_price, blocking=True) + logger.info(f"buy_order===={buy_order}") + orderStatusMsg = buy_order['data'].get('orderStatusMsg', None) + statusMsg = buy_order['data'].get('statusMsg', None) + # orderStatusMsg 涓嶅湪buy_order鐨勪笅鍗曞洖璋冧腑锛岄偅涔堟墠璁や负涓嬪崟鎴愬姛 + if orderStatusMsg is not None or (statusMsg is not None and statusMsg != ''): + logger.info(f"涔扮エ 涓嬪崟鎴愬姛锛氥�恵sec_name}銆�") + # 姣忎竴娆℃垚鍔熶笅鍗曞悗瑕佹洿鏂颁竴涓� 缂撳瓨 鐨勬寔浠撴暟鎹� + account_management.position_management() + logger.info(f"鏇存柊鐨勬寔浠撴暟鎹甦ata_cache.account_positions_dict=={data_cache.account_positions_dict}") + # 璋冪敤璧勯噾鏌ヨ鍑芥暟 鏌ョ湅璧勯噾鍙樺寲 + account_management.finance_management() + logger.info(f"鏇存柊鐨勮祫閲戞暟鎹甦ata_cache.account_finance_dict=={data_cache.account_finance_dict}") + # 涔扮エ鍚庢坊鍔� 鎸佷粨浠g爜闆嗗悎 + data_cache.position_symbols_set.add(symbol) + # 涔扮エ鍚庢坊鍔� 浠婃棩鏂板鎸佷粨浠g爜闆嗗悎 + data_cache.addition_position_symbols_set.add(symbol) + logger.info(f"褰撳墠鎸佷粨鏁伴噺:::{len(data_cache.position_symbols_set)}") + logger.info(f"浠婃棩鏂板鎸佷粨鏁伴噺:::{len(data_cache.addition_position_symbols_set)}") # 涓嬪崟涔板叆鍑芥暟锛堟寜鍙敤璧勯噾鐨勪竴瀹氭瘮渚嬶紝鍦ㄦ定鍋滀环涔帮級銆愭寜閲戦涔� 楂樼骇鐗堛�� @@ -51,7 +66,7 @@ # 鍙湁鎸佷粨鏁伴噺澶т簬濮斿崠鏁伴噺鎵嶈繘鍏ヤ拱绁ㄦ祦绋� if available >= buy_order_value: sell_order_by_volume(symbol, buy_order_value, sec_name, today_limit_up_price) - logger.info(f"銆愬崄鍒嗕箣{part_of_value * 10}鍙敤璧勯噾銆戝涔板畬姣曪紝榛樿鎴愬姛") + logger.info(f"銆愬崄鍒嗕箣{part_of_value * 10}鍙敤璧勯噾銆戝涔板畬姣�") data_cache.available = available - buy_order_value logger.info(f"涔扮エ鎵ц鎴愬姛锛氥�恵sec_name}銆�") logger.info(f"涔扮エ鍚庡墿浣欒祫閲戯細{round(data_cache.available, 2)}") @@ -60,152 +75,73 @@ # 涓嬪崟鍗栧嚭鍑芥暟锛堟寜鎸佷粨鏁伴噺锛屽湪闄愪环鍗栵級銆愭寜閲忓崠 鍩虹鐗堛�� -def sell_order_by_volume(symbol, volume, sec_name, price): - price = round(float(price), 2) - order = huaxin_trade_api.order(2, symbol[-6:], volume, price, blocking=True) - logger.info(f"order===={order}") - # order_test = [ - # {'strategy_id': '507bb60a-a919-11ee-b6ad-0ae0afd621cd', - # 'account_id': 'aaee2221-839c-11ee-a7cd-00163e022aa6', - # 'account_name': 'aaee2221-839c-11ee-a7cd-00163e022aa6', - # 'cl_ord_id': '4a8fff26-7ba6-11ef-8351-00e070c692a6', - # 'symbol': 'SHSE.600716', - # 'side': 2, - # 'position_effect': 2, - # 'order_type': 1, - # 'status': 10, - # 'price': 2.62, - # 'order_style': 1, - # 'volume': 3200, - # 'created_at': datetime.datetime(2024, 9, 26, 9, 26, 1, 751325, tzinfo=datetime.timezone( - # datetime.timedelta(seconds=28800), - # 'Asia/Shanghai')), - # 'order_business': 2, - # 'properties': {'board': '1', 'origin_product': 'MYQUANT', 'origin_module': 'API', 'sec_type': '1'}, - # 'order_id': '', - # 'ex_ord_id': '', - # 'algo_order_id': '', - # 'position_side': 0, - # 'order_duration': 0, - # 'order_qualifier': 0, - # 'order_src': 0, - # 'position_src': 0, - # 'ord_rej_reason': 0, - # 'ord_rej_reason_detail': '', - # 'stop_price': 0.0, - # 'value': 0.0, - # 'percent': 0.0, - # 'target_volume': 0, - # 'target_value': 0.0, - # 'target_percent': 0.0, - # 'filled_volume': 0, - # 'filled_vwap': 0.0, - # 'filled_amount': 0.0, - # 'filled_commission': 0.0, - # 'updated_at': None}] - logger.info(f"绛栫暐ID===={order[0]['strategy_id']}") - logger.info(f"璐﹀彿ID===={order[0]['account_id']}") - logger.info(f"璐︽埛鐧诲綍鍚�===={order[0]['account_name']}") - logger.info(f"濮旀墭瀹㈡埛绔疘D锛屼笅鍗曠敓鎴愶紝鍥哄畾涓嶅彉锛堟帢閲戠淮鎶わ紝涓嬪崟鍞竴鏍囪瘑锛�===={order[0]['cl_ord_id']}") - - logger.info(f"鏍囩殑浠g爜===={order[0]['symbol']}") - logger.info(f"涔板崠鏂瑰悜===={order[0]['side']}") - logger.info(f"寮�骞虫爣蹇�===={order[0]['position_effect']}") - logger.info(f"濮旀墭绫诲瀷===={order[0]['order_type']}") - logger.info(f"濮旀墭鐘舵��===={order[0]['status']} ") - logger.info(f"濮旀墭浠锋牸===={order[0]['price']}") - logger.info(f"濮旀墭椋庢牸===={order[0]['order_style']}") - logger.info(f"濮旀墭閲�===={order[0]['volume']}") - logger.info(f"濮旀墭涓氬姟灞炴��===={order[0]['order_business']}") - - logger.info(f"璐骇===={order[0]['properties']}") - - # logger.info(f"濮旀墭鏌滃彴ID锛堢郴缁熷瓧娈碉紝涓嬪崟涓嶄細绔嬪埢鐢熸垚锛屽鎵樻姤鍒版煖鍙版墠浼氱敓鎴愶級===={order[0]['order_id']}") - # logger.info(f"濮旀墭浜ゆ槗鎵�ID锛堢郴缁熷瓧娈碉紝涓嬪崟涓嶄細绔嬪埢鐢熸垚锛屽鎵樻姤鍒版煖鍙版墠浼氱敓鎴愶級===={order[0]['ex_ord_id']}") - # logger.info(f"绠楁硶鍗旾D===={order[0]['algo_order_id']}") - - logger.info(f"鎸佷粨鏂瑰悜===={order[0]['position_side']}") - logger.info(f"濮旀墭鏃堕棿灞炴��===={order[0]['order_duration']}") - logger.info(f"濮旀墭鎴愪氦灞炴��===={order[0]['order_qualifier']}") - logger.info(f"order_src===={order[0]['order_src']}") - logger.info(f"澶村鏉ユ簮锛堢郴缁熷瓧娈碉級===={order[0]['position_src']}") - logger.info(f"濮旀墭鎷掔粷鍘熷洜===={order[0]['ord_rej_reason']}") - logger.info(f"濮旀墭鎷掔粷鍘熷洜鎻忚堪===={order[0]['ord_rej_reason_detail']}") - logger.info(f"stop_price===={order[0]['stop_price']}") - logger.info(f"濮旀墭棰�===={order[0]['value']}") - logger.info(f"濮旀墭鐧惧垎姣�===={order[0]['percent']}") - logger.info(f"濮旀墭鐩爣閲�===={order[0]['target_volume']}") - logger.info(f"濮旀墭鐩爣棰�===={order[0]['target_value']}") - logger.info(f"濮旀墭鐩爣鐧惧垎姣�===={order[0]['target_percent']}") - logger.info(f"宸叉垚閲� 锛堜竴绗斿鎵樺搴斿绗旀垚浜や负绱鍊硷級===={order[0]['filled_volume']}") - logger.info( - f"宸叉垚鍧囦环锛屽叕寮忎负(price*(1+backtest_slippage_ratio)) 锛堜粎鑲$エ瀹炵洏鏀寔锛屾湡璐у疄鐩樹笉鏀寔锛�===={order[0]['filled_vwap']}") - logger.info( - f"宸叉垚閲戦锛屽叕寮忎负(filled_volume*filled_vwap) 锛堜粎鑲$エ瀹炵洏鏀寔锛屾湡璐у疄鐩樹笉鏀寔锛�===={order[0]['filled_amount']}") - logger.info(f"filled_commission===={order[0]['filled_commission']}") - - logger.info(f"濮旀墭鏇存柊鏃堕棿===={order[0]['updated_at']}") - logger.info(f"濮旀墭鍒涘缓鏃堕棿===={order[0]['created_at']}") - - logger.info(f"鍗栫エ 鎵ц鎴愬姛锛氥�恵sec_name}銆�") +def sell_order_by_volume(symbol, volume, sec_name, current_price): + # price = round(float(price), 2) + # 璋冪敤绗煎瓙浠疯绠楀伐鍏疯绠椾笅鍗曚环鏍� + order_price = tool.get_buy_min_price(current_price) + sell_order = huaxin_trade_api.order(2, symbol[-6:], volume, order_price, blocking=True) + logger.info(f"sell_order===={sell_order}") + orderStatusMsg = sell_order['data'].get('orderStatusMsg', None) + statusMsg = sell_order['data'].get('statusMsg', None) + # orderStatusMsg 涓嶅湪buy_order鐨勪笅鍗曞洖璋冧腑锛岄偅涔堟墠璁や负涓嬪崟鎴愬姛 + if orderStatusMsg is not None or (statusMsg is not None and statusMsg != ''): + logger.info(f"鍗栫エ 涓嬪崟鎴愬姛锛氥�恵sec_name}銆�") + # 姣忎竴娆℃垚鍔熶笅鍗曞悗瑕佹洿鏂颁竴涓� 缂撳瓨 鐨勬寔浠撴暟鎹� + account_management.position_management() + logger.info(f"鏇存柊鐨勬寔浠撴暟鎹甦ata_cache.account_positions_dict=={data_cache.account_positions_dict}") + # 璋冪敤璧勯噾鏌ヨ鍑芥暟 鏌ョ湅璧勯噾鍙樺寲 + account_management.finance_management() + logger.info(f"鏇存柊鐨勮祫閲戞暟鎹甦ata_cache.account_finance_dict=={data_cache.account_finance_dict}") # 涓嬪崟鍗栧嚭鍑芥暟锛堟寜鎸佷粨鏁伴噺鐨勪竴瀹氭瘮渚嬶紝鍦ㄨ穼鍋滀环鍗栵級銆愭寜閲忓崠 楂樼骇鐗堛�� -def sell_order_by_part_volume(part_of_volume, symbol, position_volume_yesterday, today_limit_down_price, sec_name, +def sell_order_by_part_volume(part_of_volume, symbol, position_volume_yesterday, current_price, sec_name, index): """ :param symbol: 浠g爜 :param position_volume_yesterday: 鍙敤鎸佷粨鏁伴噺 :param part_of_volume: 璁″垝濮斿崠鎸佷粨閲忕殑姣斾緥 - :param today_limit_down_price: 浠婃棩璺屽仠浠� + :param current_price: 褰撳墠鏈�鏂颁环 :param sec_name: 鍏徃鍚嶇О :param index: 鎸佷粨瀵硅薄鍒楄〃涓殑涓偂瀵瑰簲搴忓垪鍙� :return: 灏濊瘯杩斿洖鐨勮鍗曟暟鎹� """ - logger.info(f"褰撳墠涓偂鎸佷粨鎵嬫暟==={position_volume_yesterday}") + logger.info(f"褰撳墠涓偂鎸佷粨鎵嬫暟銆愬綋鍓嶅嚱鏁拌璋冪敤鏃朵紶杩涙潵鐨勫悓姝ユ暟鎹甦ata_cache涓殑鎸佷粨鏁版嵁銆�==={position_volume_yesterday}") # sell_order_volume = int(position_volume_yesterday * part_of_volume) sell_order_volume = round(position_volume_yesterday * part_of_volume / 100) * 100 logger.info(f"褰撳墠璁″垝姣斾緥==={part_of_volume}锛屽綋鍓嶅鎵橀噺==={sell_order_volume}") + # 褰撳鎵橀噺澶т簬0 if sell_order_volume > 0: # 鍙湁鎸佷粨鏁伴噺澶т簬濮斿崠鏁伴噺鎵嶈繘鍏ヤ拱绁ㄦ祦绋� if position_volume_yesterday >= sell_order_volume: - sell_order_by_volume(symbol, sell_order_volume, sec_name, today_limit_down_price) - logger.info(f"銆愬崄鍒嗕箣 {round(part_of_volume * 10)} 浠撱�戝鍗栧畬姣曪紝榛樿鎴愬姛") + sell_order_by_volume(symbol, sell_order_volume, sec_name, current_price) + logger.info(f"銆愬崄鍒嗕箣 {round(part_of_volume * 10)} 浠撱�戝鍗栧畬姣�") + # todo data_cache.account_positions 鏁版嵁鍐呭宸茬粡鍙樺寲闇�閲嶆柊鍐欙紝浼间箮涓嶇敤璁$畻鍓╀綑鎸佷粨閲忥紝鐩存帴璇锋眰灏辫浜� + # 璁$畻骞舵洿鏂板墿浣欏彲鐢ㄦ寔浠撴暟閲� - data_cache.account_positions[index]['volume'] = position_volume_yesterday - sell_order_volume - if data_cache.account_positions[index]['volume'] <= 0: - logger.info(f"data_cache.account_positions == {data_cache.account_positions}") - logger.info(f"涓嬪崟鍚庯紝銆恵sec_name}銆戠殑鍓╀綑鍙敤鎸佷粨鏁伴噺==={data_cache.account_positions[index]['volume']}") + # data_cache.account_positions[index]['volume'] = position_volume_yesterday - sell_order_volume + if data_cache.account_positions_dict[index]['currentPosition'] <= 0: + logger.info(f"data_cache.account_positions == {data_cache.account_positions_dict}") + logger.info(f"涓嬪崟鍚庯紝銆恵sec_name}銆戠殑鍓╀綑鍙敤鎸佷粨鏁伴噺==={data_cache.account_positions_dict[index]['currentPosition']}") # 鏈エ鏈鍗栫エ锛屽彲鐢ㄤ粨浣嶄负0鎴栧皬浜�0锛�,绉婚櫎銆愬彲鐢ㄦ寔浠撲唬鐮併�戦泦鍚� ''' 鍏ㄥ眬鍙橀噺涓殑鍙敤涓偂鏁伴噺锛岀敱浜庡彧鍦ㄣ�愰泦鍚堢珵浠枫�戦樁娈电敤锛屽鏋滅Щ闄や細褰卞搷杩涘叆娆℃暟锛屾殏涓嶈�冭檻浣跨敤 ''' # data_cache.available_symbols_set.remove(symbol) - # logger.info(f"銆恵sec_name}銆戝綋鏃ュ彲鐢ㄤ粨浣嶆暟鍗栧畬浜�") - # logger.info(f"鍗栧悗鍙敤鎸佷粨绁ㄦ暟:::{len(data_cache.available_symbols_set)}") - if symbol in data_cache.account_positions: - for i in data_cache.account_positions: - if i['symbol'] == symbol: - logger.info(f"涓嬪崟鍚庛�恵sec_name}銆戞寔浠撴墜鏁皏olume==={i['volume']}") - if i['volume'] == 0: - # 鏈エ鏈鍗栫エ锛屽叏閮ㄦ寔浠撲粨浣嶄负0锛�,绉婚櫎銆愭寔浠撲唬鐮併�戦泦鍚� - data_cache.position_symbols_set.remove(symbol) - logger.info(f"銆恵sec_name}銆戠殑鎸佷粨宸茬粡鍗栧畬浜嗭紝鎴栦唬鐮佸凡缁忎笉鍦ㄦ寔浠撲腑") - logger.info(f"鍗栧悗鎸佷粨绁ㄦ暟:::{len(data_cache.position_symbols_set)}") + logger.info(f"銆恵sec_name}銆戝綋鏃ュ彲鐢ㄤ粨浣嶆暟鍗栧畬浜�") + logger.info(f"鍗栧悗鍙敤鎸佷粨绁ㄦ暟:::{len(data_cache.available_symbols_set)}") else: logger.info( f"銆恵sec_name}銆戯紝鍙敤鎸佷粨锛歿position_volume_yesterday}灏忎簬璁″垝濮旀墭锛歿sell_order_volume},鏃犳硶濮旀墭锛岀洿鎺ュ钩浠�!") - sell_order_by_volume(symbol, position_volume_yesterday, sec_name, today_limit_down_price) + sell_order_by_volume(symbol, position_volume_yesterday, sec_name, current_price) # 璁$畻骞舵洿鏂板墿浣欏彲鐢ㄦ寔浠撴暟閲� - data_cache.account_positions[index]['volume'] = position_volume_yesterday - position_volume_yesterday + # data_cache.account_positions_dict[index]['currentPosition'] = position_volume_yesterday - position_volume_yesterday else: logger.info(f"濮旀墭閲忓皬浜庣瓑浜庨浂锛屽鎵樺け璐�!") logger.info( f"銆恵sec_name}銆戯紝鍙敤鎸佷粨锛歿position_volume_yesterday}锛岃鍒掑鎵橈細{sell_order_volume}<=0 锛�,鏃犳硶濮旀墭锛岀洿鎺ュ鍗�100!") - sell_order_by_volume(symbol, 100, sec_name, today_limit_down_price) - # 璁$畻骞舵洿鏂板墿浣欏彲鐢ㄦ寔浠撴暟閲� - data_cache.account_positions[index]['volume'] = position_volume_yesterday - 100 + sell_order_by_volume(symbol, 100, sec_name, current_price) def run(): -- Gitblit v1.8.0