3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!在 QMT 平台中,出现您描述的“分钟最后一个 tick 触发了信号,但没有发出委托”的情况,主要是由 quickTrade=0 时的底层交易运行机制决定的。
根据 QMT 的交易函数运行机制:
当 quickTrade 参数设置为 0(默认模式)时,passorder 函数的下单逻辑是:在当前 K 线完全走完(即最后一个 tick)时判定模型信号是否成立。如果信号成立,交易函数被调用,但实际的下单动作(生成委托任务)必须等到下一根 K 线的第一个 tick 数据到来时才会触发。
因此,您虽然在当前分钟 K 线的最后一个 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。