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