vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 13
声望: 0

求助版主!最近在跑火币的策略,准备实盘上云服务器,在测试时发现了很神奇的事情!
云服务器是阿里云的,新加坡机房,win7 64位系统
我是写的是5分钟策略,要验证下K线合成的准确性,在on_tick中若干tick也输出下最近的一个5分钟bar,在on_5min_bar中每更新一个5分钟bar就输出一下,红框所示
我首次连接到远程服务器,添加策略,启动策略,输出的K线数据都是正常的,重点来了,这时候我把远程断开,过一段时间再连接,tick数据会正常输出,但是5分钟bar不会正常合成,输出了一个20:36分的5分钟K线,正常那个时间应该要输出20:40的K线,另外20:35的K线也没有正常输出。继续等待后面的5分钟K线数据也不会恢复正常。

description

Member
avatar
加入于:
帖子: 1013
声望: 55

应该是vnpy处理的时间戳+08:06和本地时间输出+08:00的差别,可以用replace(tzinfo=None)处理一下时间再输出看看

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

xiaohe wrote:

应该是vnpy处理的时间戳+08:06和本地时间输出+08:00的差别,可以用replace(tzinfo=None)处理一下时间再输出看看

但是远程连接断开前的K线合成是正常的,也是同样的代码,如下图的红框。
这个问题也是因为连接服务器各种测试都没问题,然后挂实盘发现开平仓与预期不符合才排查到的
description

Administrator
avatar
加入于:
帖子: 4232
声望: 241

请贴下你的BarGenerator初始化部分的代码?以及你用的是标准版的BarGenerator吗,还是自己修改过合成逻辑的

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

用Python的交易员 wrote:

请贴下你的BarGenerator初始化部分的代码?以及你用的是标准版的BarGenerator吗,还是自己修改过合成逻辑的

都是用的原版生成器,没有任何修改。k线合成和输出部分的代码详见下方。代码很简单就是合成、赋值、输出,在服务器上莫名的出问题,在自己电脑挂梯子跑就非常正常

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        self.bg = BarGenerator(self.on_bar, self.minutes, self.on_mutimin_bar)
        self.am = ArrayManager(200)
        self.num_tick=0
        self.mutibar_last=None

    def on_init(self):
        """
        Callback when strategy is inited.
        """
        self.write_log("策略初始化")
        self.load_bar(10)
def on_tick(self, tick: TickData):
        """
        Callback of new tick data update.
        """
        self.bg.update_tick(tick)

        if self.mutibar_last:
             if self.trading:
                self.num_tick+=1
            if self.num_tick%100==0 and self.num_tick>0:
                self.write_log(f"ticktime:{tick.datetime},  bar_time:{self.mutibar_last.datetime},last_high:{self.mutibar_last.high_price},last_low:{self.mutibar_last.low_price},tick:{tick.last_price}")  

def on_mutimin_bar(self, bar: BarData):
        """"""
        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return

        self.mutibar_last = bar
        self.write_log("更新 bar:{t}".format(t=bar.datetime))

        self.put_event()
Member
avatar
加入于:
帖子: 9
声望: 0

漏了实现on_bar回调函数?

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

on_bar函数忘记粘贴到帖子里了,实际代码是有的。
又做了一些测试,将系统切换成了Windows server2016 64位,安装最新版vnpy
测试1分钟K线合成和5分钟K线合成
1、远程连接到云服务器,开启软件,添加策略并运行,这时1分钟K线合成和5分钟K线合成都正确
2、断开远程连接,过几分钟再进去,tick数据还在一直进来,但是发现1分钟K线不合成了,也就是on_bar函数不调用了,这样也就导致5分钟K线不合成。
求大佬解惑,崩溃啊!

Administrator
avatar
加入于:
帖子: 4232
声望: 241

有点奇怪,请检查下cmd中是否有报错输出?

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

断开连接后报错如图所示,做了好几次测试,有时候不断开连接也会报这个错误,然后就不输出打印信息了
qt.network.ssl.QSslSocket: cannot call unresolved function SSL_set_psk_use_session_callback
description

Administrator
avatar
加入于:
帖子: 4232
声望: 241

这个不是报错了,正常的QT输出,那只有在BarGenerator的update_tick函数内,多加一些print来做检查了

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