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

故障现象:
2月升级了2.1.9(升级前2.0.8),使用no_ui在实盘过程中发现datarecoder无法记录bar的情况。
简单排查:
在策略on_tick中print(tick)正常,在on_bar中print(bar)无输出,发现策略on_bar不触发。同时在simnow下测试on_bar和datarecoder均正常。

询问实盘开户的期货公司,他们CTP最近升级到了6.5.1,表示向下兼容6.3.15;询问simnow,他们CTP的版本是6.3.20.p3。

这里存在几个变量
1、CTP6.5.1/6.3.20.p3/6.3.15
2、VNPY2.1.9/2.0.8
3、win10/ubuntu18.04(win交易/ubuntu数据记录)
4、不同交易所CZCE/DCE/SHFE/CFFEX
然后是持续数天的组合测试.....

测试结果:
1、策略on_bar和datarecoder均正常的情况
(1)VNPY2.0.8+CTP6.5.1+ win/ubuntu
(2)VNPY2.0.8+CTP6.3.20.p3(simnow)+ win/ubuntu
(3)VNPY2.1.9+CTP6.3.20.p3(simnow)+ win/ubuntu

2、策略on_bar和datarecoder不正常的情况
(1)VNPY2.1.9+CTP6.5.1+ win/ubuntu

3、其他
(1)VNPY2.1.9+CTP6.5.1+ win/ubuntu 在夜盘中CZCE/DCE/SHFE几个交易所是正常的,但是在早上8:45自动开启后CZCE/DCE/SHFE几个交易所不正常,CFFEX交易所正常。
(2)VNPY2.1.9+CTP6.5.1+ win/ubuntu在日盘交易时间关闭no_ui再重新启动后均正常
(3)各组合分别在win/ubuntu下测试结果一致

原因猜测:
1、期货公司CTP版本升级原因(VNPY2.1.9+CTP6.3.20.p3正常)?
2、VNPY2.1.9修改了BarGenerator或on_bar相关代码或是其他代码(VNPY2.0.8+CTP6.5.1正常)?
3、VNPY2.1.9下no_ui子进程自动开启关闭的原因(交易时间关闭no_ui再重新启动后正常)?
或者是以上的叠加?
在坛子里爬楼也看到了其他类似可能与此相关的问题:
行情记录9点之前连接ctp后不能自动记录
https://www.vnpy.com/forum/topic/5970-xing-qing-ji-lu-9dian-zhi-qian-lian-jie-ctphou-bu-neng-zi-dong-ji-lu
无界面运行在早上9点时候必须重启才能$到数据
https://www.vnpy.com/forum/topic/4251-wu-jie-mian-yun-xing-zai-zao-shang-9dian-shi-hou-bi-xu-zhong-qi-cai-neng-dao-shu-ju
还有一篇问是否修改了BarGenerator找不到了

反复重装了几次系统和VNPY都未解决,目前退回到VNPY2.0.8使用,个人能力有限,望官方解决。

Member
avatar
加入于:
帖子: 3033
声望: 174

如果策略on_tick能收到tick,但on_bar收不到合成的bar,那么请在bargenerator里打印进行排查
同样,datarecorder如果不能记录也请在相关函数下进行打印排查

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

问题解决了吗?我的vnpy2.5.2也是同样问题,夜盘的没事,实盘日盘的no_ui的on_bar再8:45启动后就再也不触发了,开盘后重启就好了

Member
avatar
加入于:
帖子: 3033
声望: 174

可能是有非交易时间的数据进来了,可以在process_tick_event下面过滤试试

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

我估计是这里出问题了:
def update_tick(self, tick: TickData) -> None:
"""
Update new tick data into generator.
"""
new_minute = False

    # Filter tick data with 0 last price
    if not tick.last_price:
        return

    # Filter tick data with older timestamp
    if self.last_tick and tick.datetime < self.last_tick.datetime:
        self.writeCtaLog('tick.datetime: ' + str(tick.datetime))
        self.writeCtaLog('last_tick.datetime: ' + str(self.last_tick.datetime))
        return


我打了日志,明天开盘后看看什么情况,这里应该改一下,不能这么生硬的过滤吧

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

tick.datetime: 2021-06-22 09:00:00+08:00
last_tick.datetime: 2021-06-22 22:59:59+08:00

把昨天最后一笔交易的时间弄成今天的了,应该改一下

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

我把trade/utility.py 的update_tick函数这么改了一下,不知道有无问题:
def update_tick(self, tick: TickData) -> None:
"""
Update new tick data into generator.
"""
new_minute = False

    # Filter tick data with 0 last price
    if not tick.last_price:
        return
    # 日盘开盘区间,开盘时间内不进行last_tick时间判断,郑商所会把昨天收盘时间错改成今天收盘时间,导致bar生成不了
    DAY_START = time(8, 45)
    DAY_END = time(9, 3)

    current_time = tick.datetime.time()
    opening = False
    if (current_time >= DAY_START and current_time <= DAY_END):
         opening = True
   # Filter tick data with older timestamp
    if self.last_tick and tick.datetime < self.last_tick.datetime and opening == False:
        print('tick.datetime: ' + str(tick.datetime))
        print('last_tick.datetime: ' + str(self.last_tick.datetime))
        return
Member
avatar
加入于:
帖子: 15
声望: 0

请问问题解决了吗?我也遇到同样的问题,我使用的是vnpy2.3.0,使用no_ui夜盘是正常记录的,隔天定时8:45启动策略,on_bar不执行,要关掉进程重启才行

Member
avatar
加入于:
帖子: 3033
声望: 174

pin wrote:

请问问题解决了吗?我也遇到同样的问题,我使用的是vnpy2.3.0,使用no_ui夜盘是正常记录的,隔天定时8:45启动策略,on_bar不执行,要关掉进程重启才行
请过滤掉非交易时段的tick再试试看

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

沪公网安备 31011502017034号