3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在QMT(迅投/国信)量化平台上编写并运行策略时,遇到“策略不发单”是开发者常碰到的问题。这通常与运行环境设置、信号触发机制或代码逻辑有关。以下是详细的6步排查指南,帮助您快速定位并解决问题。
首先,请确认您是在**“策略交易”模块中创建了策略并开始运行。如果您仅仅是在“策略开发”模块点击了“运行”或“回测”,系统只会进行历史数据计算或模拟输出,是无法产生真实交易信号和发单**的。
确认策略的“运行模式”是否已切换到**“实盘”**。
进入“策略交易”模块下的“策略信号”分页:
QMT的机制是:默认情况下,策略只会在选定周期的最后一根K线的最后一个tick满足发单逻辑时,才触发下单指令。如果您的策略周期选择的是“日线(1d)”,那么盘中是不会发单的(只有15:00收盘时才会触发,且此时发出的单通常是废单)。
解决方法:使用 quickTrade 参数
在QMT中,只有 passorder、algo_passorder、smart_algo_passorder 这三个综合下单函数支持 quickTrade 参数设置:
quickTrade = 0(默认):仅在本周期最后一个tick满足条件时发单。quickTrade = 1:非历史bar上执行时(即最新K线),只要策略模型调用到该函数就立即触发下单。quickTrade = 2:不判断bar状态,只要调用到就触发下单(历史bar上也会触发,需谨慎使用)。注意:像 order_lots、order_value 等快捷下单函数没有 quickTrade 参数,相当于默认 quickTrade=0。如果使用长周期(如30m、60m、1d),强烈建议改用 passorder 并设置 quickTrade=1。
检查“消息提醒”中是否有异常信息。查看位置:
在策略发单位置打印当前K线的时间,确认发单信号触发时是最新K线而非历史K线。如果您的策略逻辑不需要在历史K线上发委托,建议进行以下优化:
1(限制计算范围)。handlebar 函数中,使用 ContextInfo.is_last_bar() 对历史K线进行过滤,避免无效计算和历史信号干扰。代码示例:
def handlebar(ContextInfo):
# 过滤历史K线,只在最新K线上执行交易逻辑
if not ContextInfo.is_last_bar():
return
# 您的交易逻辑...
# 使用 passorder 并设置 quickTrade=1 实现盘中立即发单
passorder(23, 1101, ContextInfo.accID, '000001.SZ', 5, -1, 100, 'MyStrategy', 1, 'Order_01', ContextInfo)
通过以上6个步骤的逐一排查,绝大多数QMT策略不发单的问题都可以迎刃而解。重点关注 quickTrade 参数的设置以及 is_last_bar() 的使用,这是量化实盘中最容易被忽略的细节。