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

BarGenerator下的update_bar函数如下,举个例子,我要形成1个小时的bar,以股指期货IC为例,中午是11:29收盘,下午是13:00开盘,形成的60分钟bar,从11:00开始,下一个bar是从14:00开始,中间缺失了13:00这根Bar。

def update_bar(self, bar: BarData):
    """
    Update 1 minute bar into generator
    """
    if not self.xmin_bar:
        self.xmin_bar = BarData(
            symbol=bar.symbol,
            exchange=bar.exchange,
            datetime=bar.datetime,
            gateway_name=bar.gateway_name,
            open_price=bar.open_price,
            high_price=bar.high_price,
            low_price=bar.low_price
        )
    else:
        self.xmin_bar.high_price = max(
            self.xmin_bar.high_price, bar.high_price)
        self.xmin_bar.low_price = min(
            self.xmin_bar.low_price, bar.low_price)

    self.xmin_bar.close_price = bar.close_price
    self.xmin_bar.volume += int(bar.volume)

    if not (bar.datetime.minute + 1) % self.xmin:
        self.xmin_bar.datetime = self.xmin_bar.datetime.replace(
            second=0, microsecond=0
        )
        self.on_xmin_bar(self.xmin_bar)

        self.xmin_bar = None

是否这样修改可以?
。。。
if not (bar.datetime.minute + 1) % self.xmin or bar.datetime.hour != self.xmin_bar.datetiem.hour:
。。。

Administrator
avatar
加入于:
帖子: 157
声望: 16

BarGenerator一般用于合成60分钟之内的K线。
若要1h或者以上的K线,直接向数据提供商下载就好的

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

谢谢,但策略中怎么引用多周期呢?感觉还是要通过1分钟合成。BarGenerator不单单是60分钟有问题,30分钟也有问题,比如9:15开盘的,9:15-9:30分着一根没有合成。
经过测试,下面的程序可以解决30分钟、60分钟合成的问题。但大于60分钟的就不行了。

def update_bar(self, bar: BarData):
    """
    Update 1 minute bar into generator
    """
    if self.xmin_bar: 
        if bar.datetime.hour != self.xmin_bar.datetime.hour :
            self.xmin_bar.datetime = self.xmin_bar.datetime.replace(
            second=0, microsecond=0
            )
            self.on_xmin_bar(self.xmin_bar)

            self.xmin_bar = None

    if not self.xmin_bar:
        self.xmin_bar = BarData(
            symbol=bar.symbol,
            exchange=bar.exchange,
            datetime=bar.datetime,
            gateway_name=bar.gateway_name,
            open_price=bar.open_price,
            high_price=bar.high_price,
            low_price=bar.low_price
        )
    else:
        self.xmin_bar.high_price = max(
            self.xmin_bar.high_price, bar.high_price)
        self.xmin_bar.low_price = min(
            self.xmin_bar.low_price, bar.low_price)

    self.xmin_bar.close_price = bar.close_price
    self.xmin_bar.volume += int(bar.volume)

    if not (bar.datetime.minute + 1) % self.xmin :
        self.xmin_bar.datetime = self.xmin_bar.datetime.replace(
            second=0, microsecond=0
        )
        self.on_xmin_bar(self.xmin_bar)

        self.xmin_bar = None
Administrator
avatar
加入于:
帖子: 157
声望: 16

国内品种1h意义不大,因为没有一个完整的1小时时间周期(如9:30分开盘,下午3:30收盘)。1h更多用于全时间段交易的,如数字货币,外汇

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

有道理,谢谢。

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