🚀 AI 一键生成 qmt 策略代码

QMT 交易接口:get_value_by_order_id 状态延迟怎么办?如何使用 order_callback 监听?

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

问题描述

get_value_by_order_id获取委托单状态会有几秒的延迟吗

rt

get_value_by_order_id 获取委托单状态会有几秒的延迟吗,实盘测试貌似会有几秒的延迟,是需要用

order_callback 监听吗

解决方案

是的,您的观察非常准确。在 QMT 实盘交易中,使用 get_value_by_order_id 主动查询委托单状态确实可能会遇到几秒的延迟。强烈建议使用 order_callback 来实时监听委托状态的变化。

为什么 get_value_by_order_id 会有延迟?

get_value_by_order_id 是一个主动查询函数。当您调用它时,它通常是去读取本地客户端缓存的交易数据。如果底层交易通道的数据还没有同步到本地缓存,您查询到的就是旧状态。这种轮询机制不仅效率低,而且无法保证绝对的实时性。

最佳实践:使用 order_callback 实时监听

为了获取最实时的委托状态变化,QMT 提供了交易回报实时主推函数。当柜台的委托状态发生变化时,服务器会主动将最新状态推送到您的策略中,这比主动查询要快得多。

您应该使用 order_callback(委托状态变化主推)和 deal_callback(成交状态变化主推)。

使用 order_callback 的注意事项:

  1. 必须绑定账号:在使用主推函数前,必须init 函数中使用 ContextInfo.set_account() 绑定您的资金账号,否则无法接收到推送。
  2. 仅实盘有效:交易回报实时主推函数仅在实盘运行模式下生效(回测模式下不会触发)。

Python 代码示例

#coding:gbk

def init(ContextInfo):
    # 1. 必须设置对应的资金账号,用于订阅交易主推
    ContextInfo.account = '您的资金账号'
    ContextInfo.set_account(ContextInfo.account)
    print("策略初始化,已绑定账号:", ContextInfo.account)

def handlebar(ContextInfo):
    # 策略逻辑,例如触发下单
    pass

# 2. 定义委托状态变化主推函数
def order_callback(ContextInfo, orderInfo):
    """
    当账号委托状态有变化时,运行这个函数
    """
    print("--- 收到委托状态更新 ---")
    print("委托单号 (m_strOrderSysID):", orderInfo.m_strOrderSysID)
    print("证券代码 (m_strInstrumentID):", orderInfo.m_strInstrumentID)
    print("委托状态 (m_nOrderStatus):", orderInfo.m_nOrderStatus)
    print("已成交量 (m_nVolumeTraded):", orderInfo.m_nVolumeTraded)
    print("委托剩余量 (m_nVolumeTotal):", orderInfo.m_nVolumeTotal)
    
    # 委托状态 m_nOrderStatus 常见枚举值:
    # 48: 未报
    # 49: 待报
    # 50: 已报
    # 53: 部撤
    # 54: 已撤
    # 55: 部成
    # 56: 已成
    # 57: 废单

# 3. (可选) 定义成交状态变化主推函数
def deal_callback(ContextInfo, dealInfo):
    """
    当账号成交状态有变化时,运行这个函数
    """
    print("--- 收到成交回报 ---")
    print("委托单号 (m_strOrderSysID):", dealInfo.m_strOrderSysID)
    print("成交均价 (m_dPrice):", dealInfo.m_dPrice)
    print("成交量 (m_nVolume):", dealInfo.m_nVolume)

总结

  • 放弃轮询:不要在 handlebar 中使用 while 循环配合 get_value_by_order_id 去死等状态,这会阻塞策略执行且有延迟。
  • 拥抱事件驱动:使用 order_callbackdeal_callback,让系统在状态改变时主动通知您,这是编写高频/实盘量化策略的标准做法。