🚀 AI 一键生成 qmt 策略代码

QMT策略中passorder设置quickTrade=0为何有信号无委托?

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

关于passorder,quickTrade参数设置为0

老师好
策略使用分钟周期
使用passorder下单quickTrade参数设置为0,经检查分钟最后一个tick是触发信号的,为什么没有发出委托呢。

解决方案

您好!在 QMT 平台中,出现您描述的“分钟最后一个 tick 触发了信号,但没有发出委托”的情况,主要是由 quickTrade=0 时的底层交易运行机制决定的。

原因解析

根据 QMT 的交易函数运行机制:
quickTrade 参数设置为 0(默认模式)时,passorder 函数的下单逻辑是:在当前 K 线完全走完(即最后一个 tick)时判定模型信号是否成立。如果信号成立,交易函数被调用,但实际的下单动作(生成委托任务)必须等到下一根 K 线的第一个 tick 数据到来时才会触发。

因此,您虽然在当前分钟 K 线的最后一个 tick 检查到了信号触发,但委托并没有立即发出,可能的原因有:

  1. 下一根 K 线的 tick 尚未到来:如果该品种交易不活跃,或者刚好处于休盘/收盘时间(例如 11:30 或 15:00 的最后一根分钟 K 线),下一根 K 线的第一个 tick 还没产生,委托就不会发出。
  2. 回测与实盘的差异:在实盘/模拟盘中,严格依赖下一个 tick 驱动。如果没有新的行情推送,下单任务就会一直挂起等待。

解决方案

如果您希望在信号成立时立即发出委托,而不必等待下一根 K 线的 tick,有以下两种解决方法:

方法一:修改 quickTrade 参数为 1
passorder 函数中的 quickTrade 参数设置为 1。这样设置后,在非历史 bar 上执行时(即 ContextInfo.is_last_bar()True),只要策略模型中调用到了 passorder,就会立即触发下单交易,无需等待下一个 tick。

# 示例:将 quickTrade 参数(倒数第二个参数)设置为 1
passorder(23, 1101, '您的账号', '000001.SZ', 5, -1, 100, '策略名', 1, '备注', ContextInfo)

方法二:使用 do_order(ContextInfo) 函数
如果您仍想保持 quickTrade=0 的逻辑,但想在特定时间点(如收盘前)强制把上一根 K 线生成的信号发出去,可以在代码中调用 do_order(ContextInfo) 函数。该函数被调用后,会把上一根 K 线生成的模型信号立刻发出,且只发一次。

总结quickTrade=0 是“本 K 线确认信号,下 K 线首 tick 下单”的机制。要实现立即下单,请使用 quickTrade=1