策略运行后日志面板没有任何输出，通常是 init 或 handlebar 没有被正确调用。最常见的原因包括：策略未真正启动、init 或 handlebar 函数名拼写错误、代码存在语法错误、运行模式或品种周期设置不当。按以下步骤逐一排查即可定位问题。

## 问题现象

策略文件已加载并点击运行，但输出面板完全空白，看不到任何 `print` 输出或错误信息。

## 直接判断

如果输出面板完全空白（连错误信息都没有），说明策略代码可能根本没有被加载执行，或者 init/handlebar 函数定义存在问题导致系统无法识别回调函数。

QMT 策略运行时，系统首先加载策略文件并检查语法，然后调用 init 函数，最后在 K 线更新时调用 handlebar。如果输出面板连语法错误都没有显示，可能是策略未真正启动运行。如果只有 init 的输出但没有 handlebar 的输出，则可能是 handlebar 未被触发或函数名错误。

<span class="docs-small-tip__label">小建议</span> 按以下 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 是否正常工作。如果这段代码运行后没有任何输出，说明问题出在环境配置而非策略代码：

```python
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 线更新时被调用。

<span class="docs-small-tip__label">小建议</span> 确认修复后，将最小验证代码逐步替换回完整的策略代码，每添加一段逻辑就运行测试一次，确保每一步都有输出。这样可以快速定位是哪段代码导致了问题。在回测环境中验证修复后，再在仿真交易环境中运行 1-2 个交易日确认实时环境中也正常工作。
