VeighNa量化社区
你的开源社区量化交易平台
Member
加入于:
帖子: 31
声望: 0

若在实盘交易过程中,因各种原因导致程序退出或网络中断,一段时间后,程序网络又重新启动恢复正常。如果恰好退出/断开的中间有成交回报错过,因为 策略层没法主动查询底层持仓,持仓怎么维护?
1)原本策略代码想是通过成交回报自己维护持仓。那么中断导致策略漏掉数据,有什么方法?
2)系统重启动后,self.pos(逻辑持仓)还会是准确的吗?系统重启时,会主动更新一次逻辑持仓吗? 怎么可以获取详细持仓信息然后同步回策略自己维护的持仓当中。
3)断开的过程中,可能还包括手动去做的一些下单操作等,这些成交怎么可以同步回逻辑持仓当中?
谢谢

Member
avatar
加入于:
帖子: 4618
声望: 284

只有on_trade的时候,CTA引擎才会去修改self.pos字段,然后调用sync_strategy_data函数同步pos。
还有就是on_init初始化的时候,会从缓存文件中读取同步。停止策略时调用sync_strategy_data函数同步pos。
手动下单需要自行修改cta_strategy_data.json文件里对应的pos。
可参考https://www.vnpy.com/forum/topic/4775-qing-wen-self-posdao-di-shi-ru-he-ji-suan-chu-lai-de

Member
加入于:
帖子: 31
声望: 0

照我的理解,问题就是:当系统被意外关闭或者网络意外断开,导致错过了部分成交回报,这种情况下,系统对于self.pos就无法被更新了?(即便重启系统也没用?) 除了手动修改json文件,让系统重启的时候读取之外,还有其他方法吗? 比如,不是说系统会每隔3秒在底层查询一次持仓,这个查询会更新到pos上来吗?或者策略可否主动查询,然后自己来更新这个pos?

以上这种情况,应该实盘很常见,不知道各位大神都是怎么处理的。。。
麻烦再给回答一下,谢谢。

Member
avatar
加入于:
帖子: 4618
声望: 284

是的。
基于分钟或者更低频交易的话,因为网络断开错过成交回报的情况应该不太常见。
底层持仓是会更新推送,可以用get_pos获取

Member
加入于:
帖子: 31
声望: 0

谢谢回答。 我再理解一下,就是说:如果确实漏掉了成交回报,再等多3秒(底层自动刷新时间),pos会被更新成正确的持仓,是吗?
那如果重启系统,会不会在读取完json(此时还是错误的)之后,会将pos与底层同步一次? 如果是这样,是不是可以理解成,万一漏掉成交回报,不一致了,就重启一次系统,即可完成底层与pos的同步?

Member
avatar
加入于:
帖子: 4618
声望: 284

不是,on_trade是成交变动了再推。要是漏掉了on_trade推送self.pos就不对了,但是这种情况应该不常见的,建议如果遇到了就手动修改一下self.pos。
ctp接口的话,底层持仓是每秒钟查询更新的。但在cta_strategy模块里不与self.pos挂钩,只是在process_position_event函数下给OffsetConverter这个类更新了仓位。底层持仓是不会主动去与self.pos同步的,因为如果一个品种跑多个策略,这样是不能拿底层持仓去进行判断的。但是如果就想获取底层持仓,而且一个品种只跑一个策略,可以用get_pos函数获取底层持仓的。

Member
加入于:
帖子: 31
声望: 0

谢谢耐心指导。菜鸟问题多多,不好意思。
一个品种跑一个策略,这个前提,我能理解。

1)“在process_position_event函数下给OffsetConverter这个类更新了仓位。”
这个process_position_event是怎样才会触发? 系统检查底层仓位有变化,就触发更新OffsetConverter?还是说要成交回报来触发(错过就不会触发)?
2)如果上边这点是底层仓位变化就触发,那么要获得仓位,只要在OffsetConverter获取get_position_holding就能获取?如果不是,你说的get_pos是指哪个?

谢谢

Administrator
avatar
加入于:
帖子: 4500
声望: 320

JT20 wrote:

谢谢耐心指导。菜鸟问题多多,不好意思。
一个品种跑一个策略,这个前提,我能理解。

1)“在process_position_event函数下给OffsetConverter这个类更新了仓位。”
这个process_position_event是怎样才会触发? 系统检查底层仓位有变化,就触发更新OffsetConverter?还是说要成交回报来触发(错过就不会触发)?
2)如果上边这点是底层仓位变化就触发,那么要获得仓位,只要在OffsetConverter获取get_position_holding就能获取?如果不是,你说的get_pos是指哪个?

谢谢

  1. 底层接口推送持仓状态更新数据(CTP是6秒一次),放入到事件引擎中,事件引擎再转发给策略模块的process_position_event
  2. OffsetConverter中会基于持仓、成交、委托三条线的状态变化来更新数据,所以get_position_holding就能获取
Member
加入于:
帖子: 31
声望: 0

谢谢大神的回答!

Member
avatar
加入于:
帖子: 8
声望: 0

用Python的交易员 wrote:

JT20 wrote:

谢谢耐心指导。菜鸟问题多多,不好意思。
一个品种跑一个策略,这个前提,我能理解。

1)“在process_position_event函数下给OffsetConverter这个类更新了仓位。”
这个process_position_event是怎样才会触发? 系统检查底层仓位有变化,就触发更新OffsetConverter?还是说要成交回报来触发(错过就不会触发)?
2)如果上边这点是底层仓位变化就触发,那么要获得仓位,只要在OffsetConverter获取get_position_holding就能获取?如果不是,你说的get_pos是指哪个?

谢谢

  1. 底层接口推送持仓状态更新数据(CTP是6秒一次),放入到事件引擎中,事件引擎再转发给策略模块的process_position_event
  2. OffsetConverter中会基于持仓、成交、委托三条线的状态变化来更新数据,所以get_position_holding就能获取
     position = self.cta_engine.offset_converter.get_position_holding(self.vt_symbol)
        self.write_log("vt_symbol:" + str(self.vt_symbol))
        self.write_log("position:" + str(position.long_pos) + "||" + str(position.short_pos) )

请问我在cta策略内用这个方法获取持仓打印出来都是0。 是使用错了么

Member
avatar
加入于:
帖子: 4618
声望: 284

我这边是有显示的。

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

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】