3.76K 浏览
0

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

回测时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日