api.get_kline_serial获得日K的,存在18点交易所还会传递信息(天勤团队在论坛有提到过),导致更新的日K会错误,请予以修正。
一、按照网站的例子,编写程序
from datetime import datetime from tqsdk import TqApi, TqBacktest, TargetPosTask # 在创建 api 实例时传入 TqBacktest 就会进入回测模式,设置web_gui=True开启图形化界面 api = TqApi(backtest=TqBacktest(start_dt=datetime(2020, 1, 1), end_dt=datetime(2020, 2, 1)),web_gui=":8888") # 获得 螺纹指数 日K线的引用 klines = api.get_kline_serial("KQ.i@SHFE.rb", 24*60*60, data_length=5) while True: api.wait_update() if api.is_changing(klines.iloc[-1], ["datetime", "open"]): # 新产生一根日线或开盘价发生变化: 重新计算 print(datetime.fromtimestamp(klines.datetime.iloc[-1]/1000000/1000),klines.open.iloc[-1],klines.high.iloc[-1],klines.low.iloc[-1],klines.close.iloc[-1],klines.volume.iloc[-1])
用api.is_changing(klines.iloc[-1], [“datetime”, “open”]):语句来更新,打印出来的结果,完全不对,出来的开盘收盘的价格都是一样的。
改用api.is_changing(klines.iloc[-1]):语句来更新,打印出来的结果,就发现问题了。每天会更新两次,第一次更新是错的。
现在能想到的办法,只能是把更新语句改为如下。不太确定这样使用是否会产生新的问题。
希望天勤团队尽快修正18点交割时候产生的数据问题,减少用户使用麻烦。
if api.is_changing(klines.iloc[-1])and klines.volume.iloc[-1] != 0:
更新两次的原因,找到了,在文档总有写到。但是第一次更新完全是错的。
west 已回答的问题 2020年2月20日
18点交易所发来下一交易日部分数据是作为交易日切换点,在此时生成一根新日线是服务器生成新日线的算法。
根据我们的K线生成规则(https://www.shinnytech.com/blog/why-our-kline-different/),K线刚生成时的高开低收等数据都是和上一根K线的收盘价相同。
在回测时,K线在刚生成和结束时各更新一次,这是回测时的规则(https://doc.shinnytech.com/tqsdk/latest/reference/tqsdk.backtest.html?highlight=%E7%94%9F%E6%88%90#tqsdk.backtest.TqBacktest)。
west 已回答的问题 2020年2月20日