QMT 最小可运行策略
本示例展示一个只输出日志的最小 QMT 策略,不涉及任何交易委托,适合用来验证 QMT 内置 Python 运行环境是否正常工作。策略在 init 中初始化股票池并打印一条日志,在 handlebar 中判断当前是否为最新 K 线并输出 Bar 位置信息。
示例目标
创建一个只输出日志的最小策略,确认 QMT 内置 Python 环境能够正常加载策略文件、执行 init 和 handlebar 回调,并在输出面板中显示日志。
适用环境
| 环境 | 是否支持 |
|---|---|
| 回测环境 | 支持 |
| 模拟信号 | 支持 |
| 仿真交易环境 | 不适用(无需交易) |
| 真实交易环境 | 不适用(无需交易) |
运行位置
QMT 客户端 - 量化交易模块。
使用周期
日线(1d)。本策略对周期无特殊要求,任意周期均可运行。
是否可能产生真实委托
否。本策略不包含任何下单函数调用,不会产生真实委托或模拟委托。
需要修改的参数
无。代码可直接复制运行,无需修改任何参数。
完整代码
def init(ContextInfo):
"""策略初始化,仅执行一次"""
ContextInfo.set_universe(['600000.SH'])
print('策略初始化完成')
def handlebar(ContextInfo):
"""每根 K 线触发一次"""
if ContextInfo.is_last_bar():
print('当前Bar时间:', ContextInfo.barpos)
代码分段说明
init 函数
def init(ContextInfo):
ContextInfo.set_universe(['600000.SH'])
print('策略初始化完成')
ContextInfo.set_universe(['600000.SH']):设置股票池为浦发银行(600000.SH)。股票池决定了策略可以获取哪些品种的行情数据。print('策略初始化完成'):在输出面板打印一条日志,用于确认init已被执行。
handlebar 函数
def handlebar(ContextInfo):
if ContextInfo.is_last_bar():
print('当前Bar时间:', ContextInfo.barpos)
ContextInfo.is_last_bar():判断当前 K 线是否为最新一根。在回测模式下,所有历史 K 线都会触发handlebar,通过此判断可以只在最新 K 线执行逻辑。ContextInfo.barpos:当前 K 线的位置索引,用于确认handlebar被正确触发。print(...):输出当前 Bar 位置信息。
运行步骤
- 打开 QMT 客户端并登录账户。
- 进入「量化交易」模块。
- 点击「新建策略」,选择「Python 策略」。
- 将上方完整代码粘贴到策略编辑器中。
- 保存策略文件。
- 选择「回测」模式,设置回测起止日期(如近 30 个交易日)。
- 选择周期为「日线」。
- 点击「开始回测」或「运行」按钮。
预期日志
回测运行后,输出面板应显示类似以下内容:
策略初始化完成
当前Bar时间: 1
当前Bar时间: 2
当前Bar时间: 3
...
当前Bar时间: 30
提示
具体的 Bar 位置数值取决于回测起止日期和数据量,重点是确认日志正常输出且无报错。
成功判断标准
| 判断项 | 预期结果 |
|---|---|
init 日志 |
输出面板显示「策略初始化完成」 |
handlebar 日志 |
输出面板显示「当前Bar时间:」并附带数字 |
| 错误信息 | 输出面板无红色错误提示 |
| 运行状态 | 策略状态显示为「运行中」或「回测完成」 |
已知限制
- 本策略仅输出日志,不执行任何交易逻辑,不能用于实际交易。
print输出仅在 QMT 客户端的输出面板中可见,策略停止后日志不会自动保存(取决于客户端版本配置,以当前客户端版本为准)。- 如果股票池中的品种数据未下载,
handlebar可能不会触发。请确保在运行前已下载对应品种的历史数据。 - 在模拟信号模式下,
handlebar仅在实时 K 线完成时触发,非交易时间内不会有新的日志输出。