3.64K 浏览
0

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日
0

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日
您正在查看1个答案中的1个,单击此处查看所有答案。