Open realoptimusprime opened 4 years ago
这是设计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
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()
# 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])就好了
kline = api.get_kline_serial(symbol, 60) while True: api.wait_update() api.is_changing(kline) print('v: {}'.format(kline.iloc[-1]['volume']))