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

策略采用示例中的双均线策略,相关合成数据代码如下:
def init(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super().init(cta_engine, strategy_name, vt_symbol, setting)

    # 5分钟周期
    self.bg = BarGenerator(self.on_bar,5,self.on_bar_5m)
    self.am = ArrayManager()

def on_bar(self, bar: BarData):
    """
    Callback of new bar data update.
    """

    # am = self.am
    # am.update_bar(bar)
    # if not am.inited:
    #     return
    self.bg.update_bar(bar)

def on_bar_5m(self, bar: BarData):
    am = self.am
    am.update_bar(bar)
    if not am.inited:
        return
   print(f"{bar.datetime} >> open:{bar.open_price}   close:{bar.close_price})"

数据来源为通达信导出的1分钟数据,转换格式后导入到vnpy数据库中。
错误描述如下:
VNPY合成14:55~15:00的bar数据,使用的是14:55~14:59的分钟数据合成的,而文华财经和通达信均用的是14:56-15:00的分钟数据合成的。
而更离谱的是15:00这根最后一分钟的数据居然在5分钟周期上合并了第二天的数据。简单来说,vnpy在用1分钟bar合成5分钟bar的时候,均提前了1分钟。
请问怎么修改才能使vnpy合成的bar数据与文华财经一致?

description

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

你们都没有遇到过这种问题么?

Member
avatar
加入于:
帖子: 4713
声望: 287

veighna是以时间的开始做时间戳的

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

这不是以哪个时间做时间戳的问题,是合成bar的第一根bar就错位了。应该在用1分钟bar合成5分钟bar的时候往后推一根1分钟bar.

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

貌似通过修改源代码解决了些问题,修改部分如下:
在utility.py中修改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

        # 以下代码由本人修改,用于修改合成bar的显示时间为结束时间,而不是默认的开始时间,和通达信保持一致。
        dt = bar.datetime.replace(second=0, microsecond=0)
        self.window_bar.datetime=dt
        # Check if window bar completed
        # 以下代码由本人修改,用于修复bar合成,存在1分钟错位的问题
        # if not (bar.datetime.minute + 1) % self.window:
        if not (bar.datetime.minute) % self.window:
            self.on_window_bar(self.window_bar)
            self.window_bar = None

经过初步测试,结果正确,就是不知道还在哪里会有没改到的地方。请知道的不吝指教。

Member
avatar
加入于:
帖子: 103
声望: 7

我也发现由1分钟合成出来的5分钟数据完全都不对

楼主最后是怎么解决的?

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

参照5楼是对的

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

沪公网安备 31011502017034号

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