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

帖子https://www.vnpy.com/forum/topic/7891-ctace-lue-ke-cheng-zhong-yu-2-6-0ban-ben-bu-yi-zhi-de-di-fang?page=1#pid28997

课时8-K线的自定义合成
问题:
2.6.0版本对部分源代码进行了重构,其中就包括了该课程中的BarGenerator,所以课程具体的源代码与课程中展示的不完全一致。

解决方案:
2.6.0版本对BarGenerator进行了重构,对于update_tick函数做了一些改进,同时对于update_bar函数更新分钟数据和小时数据的逻辑分离成了两个独立的函数,分别为update_bar_minute_window函数和update_bar_hour_window函数,虽然与课程中展示的不完全一致,但是功能都是一致的。因此如果大家想要按照课程中所展示的代码自定义一个可以生成类似7分钟这种分钟数据,应该对update_bar_minute_window函数进行复制后再做修改。可以尝试修改如下:

def update_bar_minute_window(self, bar: BarData) -> None:
""""""

    # If not inited, create window bar object
    if not self.window_bar:
        dt = bar.datetime.replace(second=0, microsecond=0)
        self.window_bar = BarData(
            symbol=bar.symbol,
            exchange=bar.exchange,
            datetime=dt,
            gateway_name=bar.gateway_name,
            open_price=bar.open_price,
            high_price=bar.high_price,
            low_price=bar.low_price
        )
    # Otherwise, update high/low price into window bar
    else:
        self.window_bar.high_price = max(
            self.window_bar.high_price,
            bar.high_price
        )
        self.window_bar.low_price = min(
            self.window_bar.low_price,
            bar.low_price
        )

    # Update close price/volume/turnover into window bar
    self.window_bar.close_price = bar.close_price
    self.window_bar.volume += bar.volume
    self.window_bar.turnover += bar.turnover
    self.window_bar.open_interest = bar.open_interest

    # Check if window bar completed
    if self.window_bar.datetime.minute != bar.datetime.minute:
        self.interval_count += 1
        if not (bar.datetime.minute + 1) % self.window:
            self.on_window_bar(self.window_bar)
            self.window_bar = None
            self.interval_count = 0



description

使用vnpy3.5版本,发现《CTA策略》课程中与2.6.0版本的代码自定义k线合成45分钟k线有误,如上图所示,自定义45分钟,第一根为45分钟的k线,后面的就变成了每个小时的45分钟,第一根为45分钟的k线,第二根不是应该30分钟时出现吗?

Member
avatar
加入于:
帖子: 1472
声望: 105

if not (bar.datetime.minute + 1) % self.window:

这个切分方式,是基于每次分钟时间戳为44(44+1=45)的时候触发一次合成,因此都是在45分钟的时候合成出来了

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

沪公网安备 31011502017034号

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