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

因为自己写的策略会用到日K线的数据,但是我自己写的时候发现调用不了,然后进入代码去看,
发现合成K线的BarGenerator下面的方法并没有self.interval == Interval.DAILY
又是我就来社区找,发现有大佬写的代码,很强,于是小弟也来发一发自己的,
因为自己做的是cta国内期货所以时间的问题可能和大家的不一样,我的规定是每天收到14:59:00的
合成一个日K线,所以在self.interval == Interval.HOUR后面加上了四行代码,就很简单的合成了日K线
把代码粘到elif self.interval == Interval.HOUR: 下面对齐就好了,只是国内的期货啊,别的不适应!

        elif self.interval == Interval.DAILY:
            ''' 如果当天的最后一个收盘时间事14.59,进行合成,生成日线bar'''
            if self.last_bar and str(bar.datetime)[-8:]=='14:59:00':
                finished = True
                self.interval_count = 0

description

那么如何调用呢??也很简单 看图

description

description

这是合成的数据,和别的平台的对比,看图

description

description

Member
加入于:
帖子: 53
声望: 2

太棒了 我一直在找日线怎么合成。 是只需要在BarGenerator 下面加你的4条代码就可以了吗?

Member
avatar
加入于:
帖子: 15
声望: 1

期货也有夜盘啊对这样的品种就成了问题。 如果把时间在往后退,到第二天早上8点。这样的数据合成,就是昨天的 日K线就比较准。

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

谢谢分享

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

这样获取不行,请教什么原因 https://www.vnpy.com/forum/topic/4533-huo-qu-ri-xian-shu-ju

Member
avatar
加入于:
帖子: 16
声望: 1

千一量化 wrote:

这样获取不行,请教什么原因 https://www.vnpy.com/forum/topic/4533-huo-qu-ri-xian-shu-ju
我也是,改了好几天了,也还是不行,想说爱vnpy不容易

Member
avatar
加入于:
帖子: 2364
声望: 148

请问哪里遇上问题了

Member
avatar
加入于:
帖子: 16
声望: 1

xiaohe wrote:

请问哪里遇上问题了

  1. 增加了BarGenerator中日线合成的逻辑

description

description

  1. 策略中测试日线合成情况,打印无任何数据产生
    ```
    def init(

         self,
         cta_engine: Any,
         strategy_name: str,
         vt_symbol: str,
         setting: dict,
    

    ):

     # 继承后初始化
     super().__init__(cta_engine, strategy_name, vt_symbol, setting)
     # 调用K线生成器和指标计算器
     # 跨周期调用
     #self.bg = BarGenerator(self.on_bar)
     #self.am = ArrayManager()
    
     # 调用日线
     self.bg_daily = BarGenerator(self.on_bar, 1, self.on_daily_bar, Interval.DAILY)
     self.am_daily = ArrayManager()
    
    

    def on_init(self):

     """
     策略初始化
     """
     self.write_log("策略初始化")
     self.load_bar(10)
    
    

    def on_start(self):

     """
     策略开始
     """
     self.write_log("策略开始")
    
    

    def on_stop(self):

     """
     策略停止
     """
     self.write_log("策略停止")
    
    

    def on_tick(self, tick: TickData):

     """
     更新tick数据,实盘用于合成K线数据,对于突破类策略也可以将开平仓写在该函数里
     """
     """
     更新tick进K线生成器,注意:与on_bar不同,此处是由tick生成bar,而on_bar是拿到生成后的
     bar之后将bar装入ArrayManager中计算相关指标
     """
     self.bg_daily.update_tick(tick)
    
    

    def on_bar(self, bar: BarData):

     """
     K线合成后进行指标计算,默认为1m周期
     """
     self.bg_daily.update_bar(bar)
def on_daily_bar(self, bar: BarData):

    self.cancel_all()

    am = self.am_daily
    am.update_bar(bar)

    if not am.inited:
        return

    print(bar.datetime, am.close_array[-1])

输出为:

2020-11-02 23:51:20.961780 开始加载历史数据
2020-11-02 23:51:23.245111 加载进度:## [25%]
2020-11-02 23:51:24.339998 加载进度:#### [50%]
2020-11-02 23:51:25.979666 加载进度:####### [74%]
2020-11-02 23:51:27.855945 加载进度:######### [99%]
2020-11-02 23:51:27.941742 加载进度:########## [100%]
2020-11-02 23:51:27.941742 历史数据加载完成,数据量:21375
2020-11-02 23:51:27.971931 策略初始化完成
2020-11-02 23:51:27.971931 开始回放历史数据
2020-11-02 23:51:28.266168 历史数据回放结束
2020-11-02 23:51:28.266168 开始计算逐日盯市盈亏
2020-11-02 23:51:28.266168 成交记录为空,无法计算
2020-11-02 23:51:28.266168 开始计算策略统计指标
2020-11-02 23:51:28.266168 ------------------------------
2020-11-02 23:51:28.266168 首个交易日:
2020-11-02 23:51:28.266168 最后交易日:
2020-11-02 23:51:28.266168 总交易日: 0
2020-11-02 23:51:28.266168 盈利交易日: 0
2020-11-02 23:51:28.266168 亏损交易日: 0
2020-11-02 23:51:28.266168 起始资金: 0.00
2020-11-02 23:51:28.266168 结束资金: 0.00
2020-11-02 23:51:28.267167 总收益率: 0.00%
2020-11-02 23:51:28.267167 年化收益: 0.00%
2020-11-02 23:51:28.267167 最大回撤: 0.00
2020-11-02 23:51:28.267167 百分比最大回撤: 0.00%
2020-11-02 23:51:28.267167 最长回撤天数: 0
2020-11-02 23:51:28.267167 总盈亏: 0.00
2020-11-02 23:51:28.267167 总手续费: 0.00
2020-11-02 23:51:28.267167 总滑点: 0.00
2020-11-02 23:51:28.267167 总成交金额: 0.00
2020-11-02 23:51:28.267167 总成交笔数: 0
2020-11-02 23:51:28.267167 日均盈亏: 0.00
2020-11-02 23:51:28.267167 日均手续费: 0.00
2020-11-02 23:51:28.267167 日均滑点: 0.00
2020-11-02 23:51:28.267167 日均成交金额: 0.00
2020-11-02 23:51:28.267167 日均成交笔数: 0
2020-11-02 23:51:28.267167 日均收益率: 0.00%
2020-11-02 23:51:28.267167 收益标准差: 0.00%
2020-11-02 23:51:28.267167 Sharpe Ratio: 0.00
2020-11-02 23:51:28.267167 收益回撤比: 0.00
2020-11-02 23:51:28.287060 策略统计指标计算完成

进程已结束,退出代码0

```

Member
avatar
加入于:
帖子: 2364
声望: 148

建议还是按照这个帖子改,只在bg里添加四行,但请把[-8:]换成[14:-6],因为vnpy2.1.3之后已经换成全球时间戳了。然后调用也按照楼主改,然后可以在def on_daily_bar下打印看看有没有合成成功

Member
avatar
加入于:
帖子: 16
声望: 1

xiaohe wrote:

建议还是按照这个帖子改,只在bg里添加四行,但请把[-8:]换成[14:-6],因为vnpy2.1.3之后已经换成全球时间戳了。然后调用也按照楼主改,然后可以在def on_daily_bar下打印看看有没有合成成功

依旧不行,一字不差的按这个帖子改的,def on_daily_bar 下面无任何打印输出。

Member
avatar
加入于:
帖子: 2364
声望: 148

抱歉,是我打错了是[-14:-6]

Member
avatar
加入于:
帖子: 16
声望: 1

xiaohe wrote:

抱歉,是我打错了是[-14:-6]

哈哈,完美的解决了,问答可以结束了~

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

求助,我按照上面的改了,还是没有合成成功啊

Member
avatar
加入于:
帖子: 2364
声望: 148

木子 wrote:

求助,我按照上面的改了,还是没有合成成功啊
能看下你utility里bargenerator里修改的那段代码吗?

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

感谢回复!

if self.interval == Interval.MINUTE:

        # x-minute bar
        if not (bar.datetime.minute + 1) % self.window:
            finished = True
    elif self.interval == Interval.HOUR:
        if self.last_bar and bar.datetime.hour != self.last_bar.datetime.hour:
            # 1-hour bar
            if self.window == 1:
                finished = True
            # x-hour bar
            else:
                self.interval_count += 1

                if not self.interval_count % self.window:
                    finished = True
                    self.interval_count = 0                        
    elif self.interval == Interval.DAILY:
        ''' 如果当天的最后一个收盘时间事14.59,进行合成,生成日线bar'''
        if self.last_bar and str(bar.datetime)[-14:-6]=='14:59:00':
            finished = True 
            self.interval_count = 0
Member
avatar
加入于:
帖子: 2364
声望: 148

description
建议检查一下别的地方,我拿你这段代码跑的出来的

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

谢谢了,其他地方我也是完全拷贝楼主在另外一个帖子里分享的可以实盘的策略代码,查不出来什么原因,是不是得一步一步debug试试?

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

现在可以合成日线了,在历史回测时也能读到“昨收盘价”,但在模拟交易时,策略初始化后,发现有时候读到的”昨收盘价“不是最新的,而可能是前天的,求助这是什么问题? 谢谢!

Member
avatar
加入于:
帖子: 2364
声望: 148

是不是初始化的数据不够

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

谢谢回复,不会啊,我初始化是load 5 days, 但我其实策略用到的就是“昨收盘价”,其余都没用。

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

沪公网安备 31011502017034号