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
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)
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)