496 浏览
0

在回测过程中打印60分钟K线的结果,发现开高低收都一样,论坛上这个https://forum.shinnytech.com/question/22821/answer/22833/遇到了同样的问题,我看答复后,仍然不太理解。

代码如下:

acc = TqSim()
SYMBOL = “SHFE.rb2503”
api = TqApi(acc,backtest=TqBacktest(start_dt=date(2025, 1, 1), end_dt=date(2025, 1, 31)),
auth=TqAuth(“1138987769”, “Kuaiqi314!”),web_gui = False)
k60m = api.get_kline_serial(SYMBOL, 60 * 60, data_length = 50)
k1m = api.get_kline_serial(SYMBOL, 1 * 60, data_length = 10)
target_pos = TargetPosTask(api, SYMBOL, price=”PASSIVE”)
orders = api.get_order()
position = api.get_position(SYMBOL)
account = api.get_account()
print(“策略开始启动”)
count = 0
while True and count < 5:
api.wait_update()   # 程序惯例,等待position、acount、K、quote等数据更新
# 0、输出基本信息
if api.is_changing(k60m.iloc[-1], “datetime”):
print(‘======================================’)
print(‘当前日期为:’,time_to_datetime(k60m[‘datetime’].iloc[-1]))
print(‘    当前价格为:’,k60m.iloc[-1])
print(“合约{0}多头(手){1},空头(手){2},当前价格{3}”.format(
SYMBOL,position.pos_long,position.pos_short,k60m.iloc[-1].close))
count = count + 1
api.close()

===========================打印出来的部分结果如下,经核对,open价格正确,其他3个价格错误。

当前价格为: datetime 1735779600000000000.0
id 1348.0
open 3284.0
high 3284.0
low 3284.0
close 3284.0
volume 0.0
open_oi 341954.0
close_oi 341954.0
symbol SHFE.rb2503

2025-01-28

该问题已经解决。再加一层过滤即可,如下所示。

if api.is_changing(k60m.iloc[-1]) and \
                not((k60m[‘open_oi’].iloc[-1] ==k60m[‘close_oi’].iloc[-2]) or
                (k60m[‘open’].iloc[-1] == k60m[‘high’].iloc[-1] ==
                  k60m[‘low’].iloc[-1] == k60m[‘close’].iloc[-1])):

786702309 已回答的问题 1天 前

我是使用主连合约对应的quote的时间,把00.000000时间的整点报价过滤掉就行。

0

回测中K线的生成规则是只在 创建 和 结束 的时候更新,所以取k60m.iloc[-1]的时候是属于创建的时候更新了,数据还不完整,等结束时更新后高开低收的数据才是完整的,所以可以取k60m.iloc[-2]的数据

786702309 已回答的问题 1天 前