问题描述
期货 handlebar 函数运行时,起始时间是否可以自己设定实测第一笔数据从 2025 年 1 月开始的,我使用的周期时 1 分钟,从点击开始运行到获取到最新行情需要很长时间(10 分钟以上),我已经使用了非最后一根 K 直接返回。
def handlebar(C):
if not C.is_last_bar() and not C.do_back_test :
return True
请问是否有什么参数可以设置:如设置开始时间为 2025 年 6 月份,不用每次都从 1 月份把每分钟的 K 线全部运行一次
解决方案
在 QMT 平台中,实盘或模拟运行时(非回测模式),handlebar 函数默认会从当前主图或默认品种加载的第一根 K 线开始逐根运行。对于 1 分钟等小周期,如果本地历史数据较多,确实会导致启动时耗时极长。
虽然代码中的 ContextInfo.start 和 ContextInfo.end 只能用于回测模式,但你可以通过 QMT 策略编辑器自带的**“快速计算”**参数来完美解决实盘运行时的起始时间/计算范围问题。
解决方法:设置“快速计算”参数
你可以通过限制策略启动时加载的 K 线数量,来间接设定起始时间。具体操作步骤如下:
- 打开 QMT 的**【策略编辑器】**。
- 在右侧或下方的面板中找到**【基本信息】**选项卡。
- 找到**【快速计算】**参数(默认值为
0)。- 默认值
0:表示模型运行会从当前品种的第一根 K 线(即你本地下载的最早数据,如 1 月份)开始计算。 - 设置为
n(如1000):表示模型启动时,只从当前最新 K 线往前推n根 K 线开始计算。
- 默认值
举个例子:
如果你只需要策略在启动时加载最近几天的 1 分钟 K 线来初始化指标(比如计算 60 均线只需要 60 根),你可以将【快速计算】设置为 500。这样策略点击运行后,只会瞬间遍历最近的 500 根 K 线,然后立刻进入最新行情的 tick 驱动状态,耗时不到 1 秒。
补充说明
-
关于你代码中的跳过逻辑:
def handlebar(C): if not C.is_last_bar() and not C.do_back_test: return这段代码确实能跳过历史 K 线的交易逻辑,但 QMT 底层仍然在逐根遍历并调用
handlebar,所以当 K 线数量达到几万根时,依然会产生显著的耗时。使用“快速计算”是从底层直接截断了输入的数据量,是最高效的做法。 -
主图运行时的限制:
如果你是在“行情”界面的主图上直接右键运行策略,策略的计算范围也会受到当前主图 K 线显示数量的影响。你可以通过缩小主图的 K 线显示范围(如按↓键缩小),然后再运行策略,也能起到一定的加速作用。但最规范的做法依然是在策略基本信息中设置“快速计算”。