def xcancel(self,instrument_id,exchange_id,order_sys_id,front_id,session_id,order_ref):
     """
         当以RESTART方式订阅流时,会收到之前的委托/成交回报. 在委托回报中,有各委托单状态
             如果撤单的时候数据对不上号,就会有 撤单找不到相应报单 的错误
         撤单请求返回的OnRtnOrder是被撤单的这个pOrder的委托响应的状态更新,不会有单独的撤单OnRtnOrder
             该OnRtnOrder中, front_id,session_id等都对应到被撤的那个pOrder
             如果是重新登陆,那么发出撤单命令的这个session_id和OnRtnOrder响应中的session_id是不一样的
     """
     self.logger.info('SPI_XC:取消命令')
     ref_id = self.inc_request_id()
     #orderActionRef是一个可有可无的值,设置错了也无关紧要
     req = UStruct.InputOrderAction(
             InstrumentID = instrument_id,
             BrokerID = self._broker,
             InvestorID = self._investor,
             ActionFlag = UType.AF_Delete,
             OrderActionRef = ref_id,    #   这需要一个int,真TM矛盾, OrderRef是一个String
             #OrderActionRef = order_ref, #   这个ref无关紧要,根据文档,应当是ref_id
         )
     if exchange_id:   #已设置,则采用Exchange_id+orderSysID方式. 这两种方式均可撤当日任意单
         req.ExchangeID = exchange_id
         req.OrderSysID = order_sys_id
     else:   #采用frontID + sessionID + orderRef标识的方式. 这两种方式均可撤当日任意单
         #这个分支的测试 必须在OnRtnOrder第一次Callback时才能触发. 需要在该回调中测试
         req.FrontID = front_id
         req.SessionID = session_id
         req.OrderRef = str(order_ref)
     ret= self.ReqOrderAction(req,self.inc_request_id())
     return ret
Пример #2
0
 def CancelOrder(self, orderref):
     '''撤单:根据当前trader的orderref'''
     with self.orderslock:
         if orderref in self.orders:
             torder = self.orders[orderref]
             order = ApiStruct.InputOrderAction(
                 BrokerID=torder.BrokerID,
                 InvestorID=torder.InvestorID,
                 OrderRef=torder.OrderRef,
                 FrontID=torder.FrontID,
                 SessionID=torder.SessionID,
                 ExchangeID=torder.ExchangeID,
                 OrderSysID=torder.OrderSysID,
                 ActionFlag=ApiStruct.AF_Delete,
                 InstrumentID=torder.InstrumentID)
             self.IncReqid()
             self.ReqOrderAction(order, self.requestid)
             self.logger.info('Order[%s]: CancelOrder sended' % orderref)
         else:
             self.logger.error('Order[%s] not exist' % orderref)
Пример #3
0
    def ReqOrderAction(self, pInputOrderAction, nRequestID):
        '''报单操作请求'''
        #撤单, 交易成功, 为测试调用CTP/EXCHANGE撤单错误
        self.logger.info("TAStub-ROA:%s" % (str(pInputOrderAction), ))
        target_order = None
        if pInputOrderAction.InstrumentID in self._wlist:
            i = -1
            porders = self._wlist[pInputOrderAction.InstrumentID]
            for porder in porders:
                i += 1
                if porder.ExchangeID == pInputOrderAction.ExchangeID and porder.OrderSysID == pInputOrderAction.OrderSysID:
                    target_order = porder
                    break
            if i >= 0:
                del porders[i]

        if target_order:
            #print("撤单")
            self._cancelled += 1
            #取消的各种状态
            #莫名失败
            porder.OrderStatus = UType.OST_NoTradeNotQueueing
            self.OnRtnOrder(porder)  #
            #部分取消
            porder.OrderStatus = UType.OST_PartTradedNotQueueing
            self.OnRtnOrder(porder)  #
            #全部取消
            porder.OrderStatus = UType.OST_Canceled
            self.OnRtnOrder(porder)  #
        else:  #在CancelInstruction中作了设置,正常不可能进这个分支
            #已经成交
            self._cancel_after_traded += 1
            #print("已经成交,不能撤单")
            pioa = UStruct.InputOrderAction()
            self.OnRspOrderAction(pioa, self._failureRspInfo, nRequestID, True)
            poa = UStruct.OrderAction()
            self.OnErrRtnOrderAction(poa, self._failureRspInfo)