From 998dbbd175a47ee1821a04778317b9e053989c52 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期三, 16 八月 2023 09:50:02 +0800
Subject: [PATCH] ++++++++++++++++ bug修复-

---
 huaxin_api/trade_client.py |   87 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 64 insertions(+), 23 deletions(-)

diff --git a/huaxin_api/trade_client.py b/huaxin_api/trade_client.py
index 9d6d7e7..1269e2c 100644
--- a/huaxin_api/trade_client.py
+++ b/huaxin_api/trade_client.py
@@ -512,24 +512,29 @@
         else:
             logger.info('OnRspOrderInsert: Error! [%d] [%d] [%s]'
                         % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
-            self.__data_callback(TYPE_ORDER, nRequestID, {"sinfo": pInputOrderField.SInfo, "orderStatus": -1,
-                                                          "orderStatusMsg": pRspInfoField.ErrorMsg})
+            threading.Thread(target=lambda: self.__data_callback(TYPE_ORDER, nRequestID,
+                                                                 {"sinfo": pInputOrderField.SInfo, "orderStatus": -1,
+                                                                  "orderStatusMsg": pRspInfoField.ErrorMsg}),
+                             daemon=True).start()
 
     def OnRspOrderAction(self, pInputOrderActionField: "CTORATstpInputOrderActionField",
                          pRspInfoField: "CTORATstpRspInfoField", nRequestID: "int") -> "void":
         if pRspInfoField.ErrorID == 0:
             logger.info('OnRspOrderAction: OK! [%d]' % nRequestID)
-            self.__data_callback(TYPE_CANCEL_ORDER, nRequestID, {"sinfo": pInputOrderActionField.SInfo,
-                                                                 "orderSysID": pInputOrderActionField.OrderSysID,
-                                                                 "cancel": 1})
+            threading.Thread(target=lambda: self.__data_callback(TYPE_CANCEL_ORDER, nRequestID,
+                                                                 {"sinfo": pInputOrderActionField.SInfo,
+                                                                  "orderSysID": pInputOrderActionField.OrderSysID,
+                                                                  "cancel": 1}), daemon=True).start()
 
         else:
             logger.info('OnRspOrderAction: Error! [%d] [%d] [%s]'
                         % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
-            self.__data_callback(TYPE_CANCEL_ORDER, nRequestID, {"sinfo": pInputOrderActionField.SInfo,
-                                                                 "orderSysID": pInputOrderActionField.OrderSysID,
-                                                                 "cancel": 0, "errorID": pRspInfoField.ErrorID,
-                                                                 "errorMsg": pRspInfoField.ErrorMsg})
+            threading.Thread(target=lambda: self.__data_callback(TYPE_CANCEL_ORDER, nRequestID,
+                                                                 {"sinfo": pInputOrderActionField.SInfo,
+                                                                  "orderSysID": pInputOrderActionField.OrderSysID,
+                                                                  "cancel": 0, "errorID": pRspInfoField.ErrorID,
+                                                                  "errorMsg": pRspInfoField.ErrorMsg}),
+                             daemon=True).start()
 
     def OnRspInquiryJZFund(self, pRspInquiryJZFundField: "CTORATstpRspInquiryJZFundField",
                            pRspInfoField: "CTORATstpRspInfoField", nRequestID: "int") -> "void":
@@ -556,12 +561,15 @@
                pOrderField.LimitPrice, pOrderField.VolumeTotalOriginal, pOrderField.OrderSysID,
                pOrderField.OrderStatus))
         if pOrderField.OrderStatus != traderapi.TORA_TSTP_OST_Unknown:
-            self.__data_callback(TYPE_ORDER, 0, {"sinfo": pOrderField.SInfo, "securityId": pOrderField.SecurityID,
-                                                 "orderLocalId": pOrderField.OrderLocalID,
-                                                 "orderStatus": pOrderField.OrderStatus,
-                                                 "statusMsg": pOrderField.StatusMsg,
-                                                 "orderSysID": pOrderField.OrderSysID,
-                                                 "accountID": pOrderField.AccountID})
+            set_system_order_id(pOrderField.SInfo, pOrderField.OrderSysID)
+            threading.Thread(target=lambda: self.__data_callback(TYPE_ORDER, 0, {"sinfo": pOrderField.SInfo,
+                                                                                 "securityId": pOrderField.SecurityID,
+                                                                                 "orderLocalId": pOrderField.OrderLocalID,
+                                                                                 "orderStatus": pOrderField.OrderStatus,
+                                                                                 "statusMsg": pOrderField.StatusMsg,
+                                                                                 "orderSysID": pOrderField.OrderSysID,
+                                                                                 "accountID": pOrderField.AccountID}),
+                             daemon=True).start()
 
     def OnRtnTrade(self, pTradeField: "CTORATstpTradeField") -> "void":
         logger_trade_debug.info(
@@ -634,7 +642,8 @@
                    pTradingAccountField.UsefulMoney, pTradingAccountField.FetchLimit))
         else:
             results = self.__temp_money_account_list_dict.pop(nRequestID)
-            self.__data_callback(TYPE_LIST_MONEY, nRequestID, results)
+            threading.Thread(target=lambda: self.__data_callback(TYPE_LIST_MONEY, nRequestID, results),
+                             daemon=True).start()
             logger.info('鏌ヨ璧勯噾璐﹀彿缁撴潫[%d] ErrorID[%d] ErrorMsg[%s]'
                         % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
 
@@ -664,7 +673,9 @@
         else:
             logger.info('鏌ヨ鎶ュ崟缁撴潫[%d] ErrorID[%d] ErrorMsg[%s]'
                         % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
-            self.__data_callback(TYPE_LIST_DELEGATE, nRequestID, self.__temp_order_list_dict[nRequestID])
+            threading.Thread(target=lambda: self.__data_callback(TYPE_LIST_DELEGATE, nRequestID,
+                                                                 self.__temp_order_list_dict[nRequestID]),
+                             daemon=True).start()
             self.__temp_order_list_dict.pop(nRequestID)
 
     def OnRspQryPosition(self, pPositionField: "CTORATstpPositionField", pRspInfoField: "CTORATstpRspInfoField",
@@ -687,7 +698,9 @@
         else:
             logger.info('鏌ヨ鎸佷粨缁撴潫[%d] ErrorID[%d] ErrorMsg[%s]'
                         % (nRequestID, pRspInfoField.ErrorID, pRspInfoField.ErrorMsg))
-            self.__data_callback(TYPE_LIST_POSITION, nRequestID, self.__temp_position_list_dict[nRequestID])
+            threading.Thread(target=lambda: self.__data_callback(TYPE_LIST_POSITION, nRequestID,
+                                                                 self.__temp_position_list_dict[nRequestID]),
+                             daemon=True).start()
             self.__temp_position_list_dict.pop(nRequestID)
 
     # 鎴愪氦鍥炴姤,鍙傛暟pTradeField鏄竴涓狢TORATstpTradeField绫诲璞�
@@ -709,7 +722,9 @@
                  "volume": pTradeField.Volume, "tradeDate": pTradeField.TradeDate, "tradingDay": pTradeField.TradingDay,
                  "pbuID": pTradeField.PbuID, "accountID": pTradeField.AccountID})
         else:
-            self.__data_callback(TYPE_LIST_TRADED, nRequestID, self.__temp_order_list_dict[nRequestID])
+            threading.Thread(target=lambda: self.__data_callback(TYPE_LIST_TRADED, nRequestID,
+                                                                 self.__temp_order_list_dict[nRequestID]),
+                             daemon=True).start()
             self.__temp_order_list_dict.pop(nRequestID)
 
 
@@ -733,10 +748,11 @@
             volume = data["volume"]
             price = data["price"]
             sinfo = data["sinfo"]
+            local_order_id = data.get("local_order_id")
             if direction == 1:
                 # 涔�
                 try:
-                    req_rid_dict[sinfo] = (client_id, request_id)
+                    req_rid_dict[sinfo] = (client_id, request_id, local_order_id)
                     self.__tradeSimpleApi.buy(code, volume, price, sinfo)
                 except Exception as e:
                     send_response(json.dumps({"code": 1, "msg": str(e)}), TYPE_ORDER, client_id,
@@ -759,11 +775,16 @@
             # 鎾ゅ崟
             direction = data["direction"]
             code = data["code"]
-            orderSysID = data["orderSysID"]
+            orderSysID = data.get("orderSysID")
+            localOrderID = data.get("localOrderID")
             sinfo = data["sinfo"]
             if direction == 1:
+                if not orderSysID and localOrderID:
+                    orderSysID = local_order_id_map.get(localOrderID)
                 # 鎾や拱
                 try:
+                    if not orderSysID:
+                        raise Exception("娌℃湁鎵惧埌绯荤粺璁㈠崟鍙�")
                     req_rid_dict[sinfo] = (client_id, request_id)
                     self.__tradeSimpleApi.cancel_buy(code, orderSysID, sinfo)
                 except Exception as e:
@@ -887,6 +908,21 @@
     strategy_pipe.send(data)
 
 
+local_order_id_map = {}
+
+
+# 璁剧疆绯荤粺璁㈠崟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
+
+
 # 浜ゆ槗鍙嶉鍥炶皟
 def __traderapi_callback(type, req_id, data):
     logger_trade_debug.info("鍥炶皟:type-{} req_id-{}", type, req_id)
@@ -897,7 +933,13 @@
         print("traderapi_callback", req_rid_dict)
         if req_rid_dict and key in req_rid_dict:
             print("API鍥炶皟")
-            client_id, request_id = req_rid_dict.pop(key)
+            temp_params = req_rid_dict.pop(key)
+            client_id, request_id = temp_params[0], temp_params[1]
+            # 鏈湴璁㈠崟鍙�-绯荤粺璁㈠崟鍙锋槧灏�
+            if len(temp_params) >= 3 and type == TYPE_ORDER:
+                local_order_id = temp_params[2]
+                data["localOrderId"] = local_order_id
+
             logger_trade_debug.info("API鍥炶皟 request_id-{}", request_id)
             # 娴嬭瘯
             send_response(
@@ -935,7 +977,6 @@
 
     global strategy_pipe
     strategy_pipe = pipe_strategy
-
 
     global tradeCommandManager
     tradeCommandManager = command_manager.TradeCommandManager()

--
Gitblit v1.8.0