vn.py官网
开源量化社区
Member
avatar
加入于:
帖子: 18
声望: 3

新手,在使用vnpy使用中遇到这样的情况:

目前使用本地停止单,cta_engine收到EVENT_TICK,先去检查停止单,再去调策略on_tick(),这样在某些情况下会出现:
检查停止单 -> 停止单触发 -> 挂出限价单 -> 挂单成功拿到orederids,cta_engine的map找到策略并为其记录下这个order,且EVENT_ORDER进入事件队列 -> 策略on_tick()调用 -> 策略on_bar()调用 -> on_bar()中拿着得到的限价单orderids去cancel_all() -> OmsEngine中找不到(EVENT_ORDER此时还没处理) -> 报错撤单失败 -> 策略的pos还没更新 -> on_bar()重复挂单

说白了是 cta 拿着自己有的单号去 oms 那边找对应的单撤,两边不是严格同步的(事件队列FIFO),就会出现这个情况

  • 考虑的解决方法(还不够熟悉vnpy,求指正求其他思路)
  • 方案1.给cancel_all()返回值,去标记是否出现 OmsEngine中找不到 的情况,做相应处理
  • 方案2.策略自身维护一个订单列表,使用 on_stop_order/on_order 去同步cta_engine的 策略—订单列表map ,做相应判断
Member
加入于:
帖子: 23
声望: 0

同遇到这种问题,请问有找到可行的解决办法嘛?求指教~

Member
avatar
加入于:
帖子: 3115
声望: 181

防止重复挂单可参考https://www.vnpy.com/forum/topic/1830-jin-tian-vnpychu-cuo-liao-tong-yi-barnei-cheng-jiao-liang-ci

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号