from tqsdk import TqApi,TqSim,TqBacktest,TargetPosTask,tafunc import datetime as dt import copy backtest = TqBacktest(start_dt=dt.date(2019, 12, 20), end_dt=dt.date(2019, 12, 21)) api = TqApi(TqSim(100000),backtest=backtest,web_gui=True) ticks = api.get_tick_serial("SHFE.rb2001") klines = api.get_kline_serial("SHFE.rb2001", 10*60, 5) while True: api.wait_update() if api.is_changing(klines.iloc[-1]): k = copy.deepcopy(klines) k.insert(0, 'dt', k['datetime'].apply(lambda x:tafunc.time_to_datetime(x))) print(k[-1:]) print('------')
发现我对tqsdk的K线生成事件理解有误, klines.iloc[-2]是上根完成的K, 当前K线klines.iloc[-1]是会随着行情变化的,直到下根K出现, 当前K线序列上移
west 已回答的问题 2019年12月23日
回测时K线的一个生成规则:https://doc.shinnytech.com/pysdk/latest/usage/backtest.html#id4
“规则2: K线序列 总是按周期推进. 每根K线在创建时和结束时各更新一次”
因此当你在判断api.is_changing(klines.iloc[-1])时,每根K线会触发两次条件通过。
is_changing()中如果不填任何参数,则检查这个obj下的任意字段是否有更新
west 已回答的问题 2019年12月23日