🚀 AI 一键生成 qmt 策略代码

QMT中passorder与order_shares的区别是什么?下单时机解析

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

问题描述

passorder and order_shares 的区别

请问 order_shares 是与 passorder 的哪种下单模式一样, 是快速下单, 还是等 K 线有变化后才下单? 与下面哪种模式一样呢?

解决方案

在 QMT 平台中,order_shares 的下单模式等同于 passorder 函数中 quickTrade=0(默认模式) 的情况。也就是说,它是等当前 K 线完全走完后,在下一根 K 线的第一个 tick 数据到来时才触发下单,而不是立即(快速)下单。

详细区别与机制解析

1. order_shares 的运行机制

order_shares 是 QMT 提供的一个封装好的、更易用的股票指定股数交易函数。它的底层触发机制是标准的 K 线驱动模式:

  • 当策略在盘中运行到最后一根 K 线时,每个 tick 都会驱动 handlebar 运行并判断条件。
  • 只有当这根 K 线走完(即最后一个 tick 确定,K 线闭合)时,产生的信号才是有效信号。
  • 实际下单动作会在下一根 K 线的第一个 tick 产生时发出

2. passorder 的运行机制与 quickTrade 参数

passorder 是 QMT 的综合交易下单底层函数,它提供了一个非常关键的参数:quickTrade(快速交易)。

  • quickTrade = 0(默认):与 order_shares 完全一样,等当前 K 线走完,下一根 K 线第一个 tick 触发下单。
  • quickTrade = 1(快速下单):非历史 bar 上执行时(即 ContextInfo.is_last_bar() == True),不需要等 K 线走完,只要策略模型中调用到了该函数,就会立即触发下单交易
  • quickTrade = 2:不判断 bar 状态,只要调用就立即触发(甚至在历史回测 bar 上也会触发,需谨慎使用)。

如何让 order_shares 实现快速下单?

如果你希望使用简单的 order_shares 语法,但又想实现类似 passorder 的立即下单效果,可以通过配合调用 do_order(ContextInfo) 函数来实现。

do_order(ContextInfo) 函数的作用是:实时触发前一根 bar 或当前未走完 bar 产生的信号。调用它后,会把刚刚生成的模型信号立刻发出,且只发一次,从而打破“必须等下一根 K 线第一个 tick”的限制。

示例代码:

def handlebar(ContextInfo):
    # 假设满足了某个买入条件
    if buy_condition:
        # 1. 使用 passorder 快速下单 (quickTrade=1)
        # passorder(23, 1101, ContextInfo.accID, '000001.SZ', 5, -1, 100, 'my_strategy', 1, 'remark', ContextInfo)
        
        # 2. 或者使用 order_shares 配合 do_order 实现立即下单
        order_shares('000001.SZ', 100, 'LATEST', ContextInfo, ContextInfo.accID)
        do_order(ContextInfo) # 立即将 order_shares 的信号发出去

总结

  • order_shares = 等 K 线走完后下单(同 passorderquickTrade=0)。
  • 如果需要盘中条件一满足就立即下单,请使用 passorder 并设置 quickTrade=1,或者在使用 order_shares 后紧接着调用 do_order(ContextInfo)