QMT 策略运行后没有任何反应怎么办?
策略运行后日志面板没有任何输出,通常是 init 或 handlebar 没有被正确调用。最常见的原因包括:策略未真正启动、init 或 handlebar 函数名拼写错误、代码存在语法错误、运行模式或品种周期设置不当。按以下步骤逐一排查即可定位问题。
问题现象
策略文件已加载并点击运行,但输出面板完全空白,看不到任何 print 输出或错误信息。
直接判断
如果输出面板完全空白(连错误信息都没有),说明策略代码可能根本没有被加载执行,或者 init/handlebar 函数定义存在问题导致系统无法识别回调函数。
QMT 策略运行时,系统首先加载策略文件并检查语法,然后调用 init 函数,最后在 K 线更新时调用 handlebar。如果输出面板连语法错误都没有显示,可能是策略未真正启动运行。如果只有 init 的输出但没有 handlebar 的输出,则可能是 handlebar 未被触发或函数名错误。
小建议 按以下 6 个步骤从最简单到最复杂逐一排查,每一步确认后再进入下一步。
排查步骤
步骤 1:确认策略已启动运行
策略需要在 QMT 客户端中点击"运行"按钮才会开始执行。
常见误区是只保存了策略文件但没有点击运行按钮,或者运行按钮显示为灰色(策略未加载成功)。在回测环境中,需要点击"开始回测"而非"运行"。
操作方法: 在量化交易模块中,确认策略文件已选中,点击"运行"按钮(实时环境)或"开始回测"按钮(回测环境),观察按钮状态是否变为"运行中"或"停止"。
正确结果: 运行按钮状态变为"运行中",输出面板开始显示系统加载信息。
步骤 2:检查 init 函数是否定义
init 是 QMT 策略的必需回调函数,函数名必须为 init,参数必须为 ContextInfo。
如果 init 函数名拼写错误(如 Init、init1)、参数名错误(如 init(context)),或者 init 函数完全缺失,系统可能无法正确初始化策略。虽然 QMT 不一定报错,但策略不会正常执行。
操作方法: 检查策略代码中是否定义了 def init(ContextInfo):,确保函数名全小写为 init,参数名为 ContextInfo。
正确结果: init 函数定义正确,且 init 中的 print 语句在运行后立即输出。
步骤 3:检查 handlebar 是否定义
handlebar 是 QMT 策略的核心回调函数,函数名必须为 handlebar,参数必须为 ContextInfo。
如果 handlebar 函数名拼写错误(如 HandleBar、handle_bar)、参数名错误,或者 handlebar 函数缺失,策略将无法响应 K 线更新。init 的输出可能出现,但 handlebar 的输出不会出现。
操作方法: 检查策略代码中是否定义了 def handlebar(ContextInfo):,确保函数名全小写为 handlebar,参数名为 ContextInfo。
正确结果: handlebar 函数定义正确,在 K 线更新时其中的 print 语句正常输出。
步骤 4:检查是否有语法错误
策略文件如果存在 Python 语法错误,QMT 会在加载时报错,错误信息显示在输出面板中。但某些情况下错误可能被静默处理。
常见的语法错误包括:缩进不一致(Tab 和空格混用)、括号不匹配、中文标点符号(如中文冒号、中文引号)、字符串引号不匹配等。如果策略使用了不支持的库或函数,也可能在运行时出错。
操作方法: 仔细检查输出面板是否有红色错误信息。如果有,根据错误提示修复语法问题。如果没有错误信息但策略不运行,尝试将策略代码精简到最小,只保留 init 和 handlebar 的空函数定义。
正确结果: 输出面板无语法错误提示,init 和 handlebar 的 print 语句正常输出。
步骤 5:检查运行模式设置
QMT 策略需要在正确的运行模式下才会触发 handlebar。回测环境中需要设置回测起止日期和品种周期,实时环境中需要选择正确的品种和周期。
在回测环境中,如果回测起止日期范围内没有数据,handlebar 不会被调用。在实时环境中,如果选择的品种没有行情更新(如非交易时段或品种无行情),handlebar 也不会被触发。周期设置不当(如设置了日线但在盘中运行)可能导致 handlebar 长时间不触发。
操作方法: 回测环境:确认回测起止日期有效且该范围内有历史数据。实时环境:确认当前为交易时段,品种代码正确且行情正在更新。尝试切换为更短的周期(如 1 分钟线)测试 handlebar 是否触发。
正确结果: handlebar 在每个 K 线周期被调用一次,print 语句按周期频率输出。
步骤 6:检查品种和周期设置
策略的主图品种和周期设置决定了 handlebar 的触发。如果品种代码错误(如格式不正确)或周期不支持,handlebar 可能不会被调用。
品种代码需要符合 QMT 的格式规范(如 000001.SZ、600000.SH)。如果品种代码格式错误或品种不存在,系统可能无法获取行情数据,handlebar 不会被触发。周期设置需要与策略逻辑匹配。
操作方法: 确认品种代码格式正确,确认品种在客户端中可以正常显示行情。尝试使用一个确定有行情的品种(如主流股票)测试。确认周期设置与策略预期一致。
正确结果: 品种行情正常显示,handlebar 按设定周期正常触发并输出日志。
最小验证代码
使用以下最小策略代码验证 init 和 handlebar 是否正常工作。如果这段代码运行后没有任何输出,说明问题出在环境配置而非策略代码:
def init(ContextInfo):
ContextInfo.set_universe(['000001.SZ'])
print('=== init 已执行 ===')
def handlebar(ContextInfo):
print(f'=== handlebar 已执行,barpos={ContextInfo.barpos}, is_last={ContextInfo.is_last_bar()} ===')
预期输出:
- 运行后立即显示:
=== init 已执行 === - 每个 K 线周期显示:
=== handlebar 已执行,barpos=N, is_last=True/False ===
如果最小验证代码也没有输出,请重点检查步骤 1(策略是否已启动)和步骤 5(运行模式设置)。
如何确认已修复
问题修复的标志是 init 和 handlebar 中的 print 语句在输出面板中正常显示。
修复后,init 的输出应在策略启动后立即出现,handlebar 的输出应按设定的 K 线周期频率出现。在回测环境中,handlebar 会在回测过程中被多次调用;在实时环境中,handlebar 会在每个 K 线更新时被调用。
小建议 确认修复后,将最小验证代码逐步替换回完整的策略代码,每添加一段逻辑就运行测试一次,确保每一步都有输出。这样可以快速定位是哪段代码导致了问题。在回测环境中验证修复后,再在仿真交易环境中运行 1-2 个交易日确认实时环境中也正常工作。