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