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

目前我这样写,不行

def on_init(self):
        if self.is_backtesting:
            self.load_bar(10)
            self.load_tick(10)
        else:
            self.load_bar(10)

我的直觉是,当回测选择tick的时候,那个load_bar就会失效,选择1m的时候,那个load_tick就会失效。
但是实际情况是:
如果选择tick回测,那个load_bar会把tick数据传到on_bar方法里面,造成错误
同理
选择1m回测,那个load_tick会把bar类型的数据传到on_tick方法里面,也造成错误

代码层面没办法判断回测输入的回测数据类型吗?
我现在只能根据测试反复注释这两句来切换,有点麻烦。

至于为什么会同时支持两种回测,
策略实际交易是根据tick数据来下单的,但是回测下载tick数据太慢,所以做了一个兼容1m k线回测的方案,但有时候也需要比较精确的tick回测。
所以就会遇到回测的时候两种周期

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

我感觉这是一个设计上的缺陷吧,
从函数名字也能看出来,load_bar应该只会载入k线,然而如果周期选的tick,那么load_bar载入的就是tick了而且还会错误传到on_bar里面
同理load_tick也一样。

Member
avatar
加入于:
帖子: 3265
声望: 218

cta回测策略设计的就是载入单品种的单频率行情,有多种频率需求可以通过原始数据合成。
如果基于Tick数据回测,需要调用load_tick函数,基于K线数据回测,需要调用load_bar函数,文档也有说过。
如果有自己情况特殊的需求,可以做个性化修改。

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

xiaohe wrote:

cta回测策略设计的就是载入单品种的单频率行情,有多种频率需求可以通过原始数据合成。
如果基于Tick数据回测,需要调用load_tick函数,基于K线数据回测,需要调用load_bar函数,文档也有说过。
如果有自己情况特殊的需求,可以做个性化修改。

好的,谢谢,我做了如下处理,算是一种投机取巧吧

  def on_init(self):
        print("=====================策略初始化=====================")
        if self.is_backtesting:
            self.load_bar(10, callback=self.on_testquota)
        else:
            self.load_bar(10)

    # 回测加载历史行情
    def on_testquota(self, quota: Union[BarData, TickData]):
        if isinstance(quota,BarData):
            self.on_bar(quota)
        elif isinstance(quota,TickData):
            self.on_tick(quota)
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号

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