From 2d27b626b35ec9d62df36daf6405d425557e11ae Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 21 八月 2023 12:24:40 +0800
Subject: [PATCH] 信息上传优化

---
 huaxin_api/trade_client.py |   53 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/huaxin_api/trade_client.py b/huaxin_api/trade_client.py
index 7f5b73c..e4dde10 100644
--- a/huaxin_api/trade_client.py
+++ b/huaxin_api/trade_client.py
@@ -566,7 +566,7 @@
                pOrderField.LimitPrice, pOrderField.VolumeTotalOriginal, pOrderField.OrderSysID,
                pOrderField.OrderStatus))
         if pOrderField.OrderStatus != traderapi.TORA_TSTP_OST_Unknown:
-            set_system_order_id(pOrderField.SInfo, pOrderField.OrderSysID)
+            OrderIDManager.set_system_order_id(pOrderField.SecurityID, pOrderField.SInfo, pOrderField.OrderSysID)
             threading.Thread(target=lambda: self.__data_callback(TYPE_ORDER, 0, {"sinfo": pOrderField.SInfo,
                                                                                  "securityId": pOrderField.SecurityID,
                                                                                  "orderLocalId": pOrderField.OrderLocalID,
@@ -734,8 +734,6 @@
 
 
 # 鑾峰彇鍝嶅簲鍙戦�乻ocket
-
-
 global req_rid_dict
 req_rid_dict = {}
 
@@ -745,7 +743,8 @@
 
     def OnTrade(self, client_id, request_id, type_, data):
         if type_ == 1:
-            logger_local_huaxin_trade_debug.info(f"---------------------\n璇锋眰涓嬪崟锛歝lient_id-{client_id} request_id-{request_id}")
+            logger_local_huaxin_trade_debug.info(
+                f"---------------------\n璇锋眰涓嬪崟锛歝lient_id-{client_id} request_id-{request_id}")
             # 涓嬪崟
             # 1-涔� 2-鍗�
             direction = data["direction"]
@@ -785,10 +784,12 @@
             sinfo = data["sinfo"]
             if direction == 1:
                 if not orderSysID and localOrderID:
-                    orderSysID = local_order_id_map.get(localOrderID)
+                    orderSysID = OrderIDManager.get_system_id_by_local_id(localOrderID)
                 # 鎾や拱
                 try:
                     if not orderSysID:
+                        if localOrderID:
+                            OrderIDManager.add_need_cancel_local_order_id(localOrderID)
                         raise Exception("娌℃湁鎵惧埌绯荤粺璁㈠崟鍙�")
                     req_rid_dict[sinfo] = (client_id, request_id)
                     self.__tradeSimpleApi.cancel_buy(code, orderSysID, sinfo)
@@ -913,19 +914,39 @@
     strategy_pipe.send(data)
 
 
-local_order_id_map = {}
+# 璁㈠崟鍙风鐞�
+class OrderIDManager:
+    # 灏氭湭鎾ゅ崟鐨勬湰鍦拌鍗曞彿
+    not_canceled_local_order_ids = set()
+    local_order_id_map = {}
 
+    __TradeSimpleApi = TradeSimpleApi()
 
-# 璁剧疆绯荤粺璁㈠崟ID
-def set_system_order_id(sinfo, orderSystemId):
-    # 鑾峰彇鏈湴璁㈠崟ID
-    local_order_id = None
-    if req_rid_dict and sinfo in req_rid_dict:
-        temp_params = req_rid_dict.get(sinfo)
-        if len(temp_params) > 2:
-            local_order_id = temp_params[2]
-    if local_order_id and local_order_id not in local_order_id_map and orderSystemId:
-        local_order_id_map[local_order_id] = orderSystemId
+    @classmethod
+    def get_system_id_by_local_id(cls, local_order_id):
+        return cls.local_order_id_map.get(local_order_id)
+
+    # 璁剧疆绯荤粺璁㈠崟ID
+    @classmethod
+    def set_system_order_id(cls, code, sinfo, orderSystemId):
+        # 鑾峰彇鏈湴璁㈠崟ID
+        local_order_id = None
+        if req_rid_dict and sinfo in req_rid_dict:
+            temp_params = req_rid_dict.get(sinfo)
+            if len(temp_params) > 2:
+                local_order_id = temp_params[2]
+        if local_order_id:
+            if local_order_id not in cls.local_order_id_map and orderSystemId:
+                cls.local_order_id_map[local_order_id] = orderSystemId
+            if local_order_id in cls.not_canceled_local_order_ids:
+                # 鎵ц鎾ゅ崟
+                cls.not_canceled_local_order_ids.discard(local_order_id)
+                cls.__TradeSimpleApi.cancel_buy(code, orderSystemId,
+                                                f"local_cancel_buy-{code}-{round(time.time() * 1000)}")
+
+    @classmethod
+    def add_need_cancel_local_order_id(cls, local_order_id):
+        cls.not_canceled_local_order_ids.add(local_order_id)
 
 
 # 浜ゆ槗鍙嶉鍥炶皟

--
Gitblit v1.8.0