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

关于vnpy重启后,比如开盘前开始,即使符合挂停止单条件,也没有挂停止单的问题

目前找到的解决方案是张国平老师的方案:

  1. 修改策略的 onInit(self) ,回放不包括最后一个bar
    def onInit(self):
    """初始化策略(必须由用户继承实现)"""
    self.writeCtaLog(u'%s策略初始化' % self.name)
    # 载入历史数据,并采用回放计算的方式初始化策略数值
    initData = self.loadBar(self.initDays)
    for bar in initData[:-1]:
     self.onBar(bar)
    
    self.putEvent()
    2.给onStart加入最后一个bar回放,
    def onStart(self):
    """启动策略(必须由用户继承实现)"""
    initData = self.loadBar(1)
    bar = initData[-1]
    self.onBar(bar)
    self.writeCtaLog(u'%s策略启动' % self.name)

但由于现在的load_bar函数并不会直接返回数据,而是在加载完成后由引擎负责执行on_bar推送了,所以这里init_data拿到的是None,我改成以下逻辑是否正确呢?
def on_init(self):
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
self.load_bar(10)

def on_start(self):
    """
    Callback when strategy is started.
    """
    initData1 = self.load_bar(1)   
    bar1 = initData1[-1]
    self.on_bar(bar1)
    self.write_log("策略启动")
Member
加入于:
帖子: 130
声望: 34

这个问题根源是CTA策略的init和trading约束,init初始化时候把历史bar回测,但是此时trading为false不会发出交易;只有启动时候才会发出,但是此时bar回测已经结束了。最好修改就是onStart方法中加入对分析如果最后参数状态复合发出交易时候,在onStart方法发出交易

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