Administrator
2023-08-16 998dbbd175a47ee1821a04778317b9e053989c52
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是一个CTORATstpTradeField类对象
@@ -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()