shinnytech / tqsdk-python

天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易
https://doc.shinnytech.com/tqsdk/latest
Apache License 2.0
3.64k stars 650 forks source link

回测时,同一根分钟k线成交量第一次变化时总是0,要第二次才返回数值 #303

Open realoptimusprime opened 4 years ago

realoptimusprime commented 4 years ago

kline = api.get_kline_serial(symbol, 60) while True: api.wait_update() api.is_changing(kline) print('v: {}'.format(kline.iloc[-1]['volume']))

qingtiandalaoye commented 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,花样越多,虫子越多。

qingtiandalaoye commented 4 years ago

`#!/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])

`

shinny-chengzhi commented 4 years ago

在 api.is_changing(klines.iloc[-1], "datetime") 的时候处理上一根及之前的k线([:-1])就好了