回测时,同一根分钟k线成交量第一次变化时总是0,要第二次才返回数值
kline = api.get_kline_serial(symbol, 60) while True: api.wait_update() api.is_changing(kline) print('v: {}'.format(kline.iloc[-1]['volume']))
这是设计bug: tqsdk回测时,kline在生成和结束时各刷新一次,在第一次刷新时,所有数据为上一根kline的close。
这个bug造成的问题是:
如果你加了 if api.is_changing(klines.iloc[-1], "datetime"): 判断,得到的永远是第一次数据,也就是bar的volume为0 ,而ohlc都等于open。
改为if **not** api.is_changing(klines.iloc[-1], "datetime")去获取同一天的第二个bar能解决这个问题, 但又和设计思想冲突了:
以为所有例子,一直强调 if api.is_changing(klines.iloc[-1], "datetime")的。
正确解决办法只有一个,按标准来,只返回一个bar,花样越多,虫子越多。
`#!/usr/bin/env python
-- coding: utf-8 --
导入其他库
from datetime import date
from tqsdk import TqApi, TqSim, TqBacktest from tqsdk.tafunc import time_to_datetime
api = TqApi(TqSim(), backtest=TqBacktest(start_dt=date(2019, 5, 1), end_dt=date(2020, 10, 1)))
klines = api.get_kline_serial(symbol="SHFE.rb2010", duration_seconds=24 * 60 * 60 ,)
while True: api.wait_update() # 不能加这个判断,每天的bar会来两次数据,第一个只有open。第二个才是正确的 ohlc # if api.is_changing(klines.iloc[-1], "datetime"): currentTime = time_to_datetime(klines.datetime.iloc[-1]) # K线起点时间 print(currentTime, klines.open.iloc[-1], klines.high.iloc[-1], klines.low.iloc[-1], klines.close.iloc[-1]) `
在 api.is_changing(klines.iloc[-1], "datetime") 的时候处理上一根及之前的k线([:-1])就好了