howtrader 2.1.8.0
一、在on_tick函数中加上一行self.bg.update_tick(tick)就可以实现K线合成
二、howtrader\gateway\binance\binance_gateway.py中BinanceDataWebsocketApi推送bar数据到on_bar
elif channel == "kline_1m":
dt = generate_datetime(float(data['k']['t']))
if dt < bar.datetime and bar.close_price > 0:
# filter the older kline.
return
bar.open_price = float(data['k']['o'])
bar.high_price = float(data['k']['h'])
bar.low_price = float(data['k']['l'])
bar.close_price = float(data['k']['c'])
bar.volume = float(data['k']['v'])
bar.datetime = dt
if data['k']['x']: # bar finished
self.gateway.on_bar(copy(bar))
目前看来两种方式每一种应该都可以,
############################################################
更正,howtrader计算binance k线数据不能使用update_tick(tick)K线合成方法,因为VNPY Trader是根据tick的数据来合成分钟的K线,然后再讲分钟的K线合成更高界别的K线数据。但是币安的api他们推送的ticker数据是滚动24小时的ticker数据,成交的价格和量都是过去24小时的数据
{
"e": "24hrTicker", // 事件类型
"E": 123456789, // 事件时间
"s": "BNBBTC", // 交易对
"p": "0.0015", // 24小时价格变化
"P": "250.00", // 24小时价格变化(百分比)
"w": "0.0018", // 平均价格
"x": "0.0009", // 整整24小时之前,向前数的最后一次成交价格
"c": "0.0025", // 最新成交价格
"Q": "10", // 最新成交交易的成交量
"b": "0.0024", // 目前最高买单价
"B": "10", // 目前最高买单价的挂单量
"a": "0.0026", // 目前最低卖单价
"A": "100", // 目前最低卖单价的挂单量
"o": "0.0010", // 整整24小时前,向后数的第一次成交价格
"h": "0.0025", // 24小时内最高成交价
"l": "0.0010", // 24小时内最低成交加
"v": "10000", // 24小时内成交量
"q": "18", // 24小时内成交额
"O": 0, // 统计开始时间
"C": 86400000, // 统计结束时间
"F": 0, // 24小时内第一笔成交交易ID
"L": 18150, // 24小时内最后一笔成交交易ID
"n": 18151 // 24小时内成交数
}
根据这样的ticker数据处理,实际上得分钟的数据是不对的。所以需要订阅分钟的数据,然后拿到分钟的数据进行合成。
如图所对比
观看了大佬的博客搞懂了这个原理针对VNPY的软件bugs的修改总结