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

有些交易所如火币,请求k线数据的最后一根k线的收盘价并不是真正的收盘价,而是取得最新价格,这会导致指标计算错误.请问这个问题如何修改?

Member
avatar
加入于:
帖子: 1987
声望: 131

可以附上对比截图看看吗?

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

部分代码:

 def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        self.bg1h = BarGenerator(self.on_bar, 1, self.on_1_hour_bar, Interval.HOUR)
        self.bg4h = BarGenerator(self.on_bar, 4, self.on_4_hour_bar, Interval.HOUR)

 def on_init(self):
        self.load_bar(150,Interval.HOUR)

因为要加载150天数据,所以改用HOUR.

def on_tick(self, tick: TickData):
        """
        Callback of new tick data update.
        """
        self.bg1h.update_tick(tick)

def on_bar(self, bar: BarData):
       """
        Callback of new bar data update.
        """
        self.最新价格 = bar.close_price
        self.bg1h.update_bar(bar)
        self.bg4h.update_bar(bar)

回调函数中分别打印:

 def on_1_hour_bar(self, bar: BarData):
       self.write_log(f"on_1_hour_bar:______{self.vt_symbol}_____{datetime}_____{bar.close_price}")
  def on_4_hour_bar(self, bar: BarData):
       self.write_log(f"on_4_hour_bar:______{self.vt_symbol}_____{datetime}_____{bar.close_price}")

测试结果如下:

description
两个问题,1小时bar的最后一个是错的.4小时bar只打印出一个也不正常.

Member
avatar
加入于:
帖子: 1987
声望: 131

你加载的是基于交易所一分钟历史数据合成的小时线(ctatemplate里默认load_data里interval的参数是分钟)。可以去vnpy.trader.utility下去看bg的update_bar函数,合成小时线的时候的判断是上一个合成的bar的小时和这一个合成的bar的小时不一致,才合成一根小时线。那么,以三点举例,应该要三点整走完到三点零一分,合成了三点整的K线了再去与两点五十九分的K线比较才生成这根小时线。如果想要别的合成方法,可以自己进行个性化修改了。
如果想去交易所历史查询小时线,那么就给load_data传interval为小时就好了,那么回测也要用小时线。

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

沪公网安备 31011502017034号