如果get_position_detail得到的单个symbol下的PositionHolding实例中一个active_orders可以很好理解
因为整个运行都是通过事件驱动,顺序运行不存在异步问题
1.首先处理 EVENT_TICK,GUI处理完,CTAEngine方法调用策略的on_tick,进入到修改部分,获得当前唯一的active_order,若满足撤单条件则进行撤单,触发cancel_order,通过CTP.ReqOrderAction发送撤单,等待OnRtnOrder 发回撤单回报, 在撤单回报未返回推送EVENT_ORDER事件,mainengine类中的omsengine处理EVENT_ORDER事件之前,self.get_order(self.last_vt_orderid).status并不会变为Status.CANCELLED (第一次on_tick函数运行完成)
- 中间若是一直先处理EVENT_TICK事件,重复cancel_order不影响;
- 等待EVENT_ORDER处理完了,再进入on_tick函数中,active_orders撤出,self.last_vt_orderid保存上一笔订单,order_finished变为True;进入到下一步追单中
这是一笔订单就可以完全执行;
但是如果有多个active_orders,在撤单仅处理第一个active_order,当第一笔active_order状态转为撤单,再次进入on_tick函数进行撤补判断时,last_vt_orderid会变为下一笔active_order;之前第一个list(active_orders.items())[0][0]就仅仅撤单,之后就漏掉了,然后处理下一个last_vt_orderid
逻辑上的结果就是,若有多笔订单,则对除最后一个active_order进行撤单,对最后一个active_order进行撤补
所以这里面是不是还需要自己修改若有多笔active_order的情况