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

请问下面代码中if not am.inited 具体是干什么呢?如果删除会怎么样呢?

def on_15min_bar(self, bar: BarData):
""""""
self.cancel_all()

am = self.am
am.update_bar(bar)
if not am.inited:
    return
Member
avatar
加入于:
帖子: 2115
声望: 140

如果策略内用到了K线时间序列管理模块(ArrayManager)来计算变量指标的值,那么需要确保历史数据的长度足够ArrayManager进行初始化(默认的ArrayManager需要100条数据才能初始化成功)。如果历史数据的长度不够ArrayManager初始化,即使图形界面上输出了日志“初始化完成”,该策略实例的初始化也是失败的。
如果策略逻辑是基于if not am.inited写的话,那么策略初始化时可以观察到,图形界面左侧策略实例面版下的基于ArrayManager计算的策略指标的值是0。说明此时该策略实例虽然启动之后就能处于可以发出交易信号的状态,但是因为ArrayManager没有初始化成功,该策略实例需要一直等到推进策略实例的数据足够ArrayManager初始化之后,才能开始计算变量指标,进而发出交易信号。
如果策略逻辑不是基于if not am.inited写的话,那么虽然初始化之后可观察到图形界面左侧策略实例面版下的策略指标是有数值的。而且此时启动也能处于可以发出交易信号的状态,但是因为数据不够ArrayManager初始化成功,该策略实例计算出来的变量指标值会是不准确的,进而可能会发出错误的交易信号。

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

xiaohe wrote:

如果策略内用到了K线时间序列管理模块(ArrayManager)来计算变量指标的值,那么需要确保历史数据的长度足够ArrayManager进行初始化(默认的ArrayManager需要100条数据才能初始化成功)。如果历史数据的长度不够ArrayManager初始化,即使图形界面上输出了日志“初始化完成”,该策略实例的初始化也是失败的。
如果策略逻辑是基于if not am.inited写的话,那么策略初始化时可以观察到,图形界面左侧策略实例面版下的基于ArrayManager计算的策略指标的值是0。说明此时该策略实例虽然启动之后就能处于可以发出交易信号的状态,但是因为ArrayManager没有初始化成功,该策略实例需要一直等到推进策略实例的数据足够ArrayManager初始化之后,才能开始计算变量指标,进而发出交易信号。
如果策略逻辑不是基于if not am.inited写的话,那么虽然初始化之后可观察到图形界面左侧策略实例面版下的策略指标是有数值的。而且此时启动也能处于可以发出交易信号的状态,但是因为数据不够ArrayManager初始化成功,该策略实例计算出来的变量指标值会是不准确的,进而可能会发出错误的交易信号。

谢谢。如果历史数据中间有断的话,那么是不是也不会初始化成功?但是VNPY 如何判断历史数据中间有没有断点呢?

Super Moderator
avatar
加入于:
帖子: 37
声望: 8

针对am.inited的初始化情况,你可以去看一下ArrayManager的代码部分(vnpy/trader/utility.py文件下 )
相关部分如下面所示:

        self.count += 1
        if not self.inited and self.count >= self.size:
            self.inited = True

可以看到,这里初始化的逻辑只是ArrayManger中更新的bar的数量超过self.size的时候,am.inited才会等于true。
这里并不涉及检查历史数据是否有断点。你可以根据需要自行拓展。

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

沪公网安备 31011502017034号