🚀 AI 一键生成 qmt 策略代码

如何在 QMT 中使用 order_callback 和 deal_callback 实时监控交易状态?

qmt | 发布时间: 2025/11/24
以下内容由 EasyQuant 生成。

问题描述

当我的委托单成交后,如何能立即得到通知并执行下一步操作?

解决方案

在 QMT 平台中,若希望在委托单成交后立即获得通知并执行后续操作,最推荐的方式是使用 交易回报实时主推函数 中的 deal_callback(成交回报)或 order_callback(委托回报)。

这种方式是事件驱动的,比循环查询(轮询)效率更高且延迟更低。

核心步骤

  1. 绑定账号:在 init 函数中必须调用 ContextInfo.set_account(accountID) 绑定资金账号,否则无法接收推送。
  2. 定义回调函数:在策略代码中定义 deal_callback(ContextInfo, dealInfo) 函数。
  3. 编写逻辑:当有成交发生时,系统会自动调用该函数,你可以在函数内部读取 dealInfo 对象的信息(如成交代码、价格、数量),并编写“下一步操作”的代码。

代码示例

以下是一个完整的策略示例。当发生成交时,它会打印成交详情,并演示如何触发下一步操作(例如:成交后立即针对该标的挂一个止盈单)。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 1. 设置资金账号(必须设置才能接收回报)
    # 请将 'YOUR_ACCOUNT_ID' 替换为您的真实资金账号
    ContextInfo.accID = '6000000000' 
    ContextInfo.set_account(ContextInfo.accID)
    
    print(f"策略初始化完成,已绑定账号: {ContextInfo.accID}")

def handlebar(ContextInfo):
    # 这里是K线驱动的逻辑,可以留空,或者写定时触发的下单逻辑
    pass

# 2. 定义成交回报回调函数
# 当有成交发生时,QMT会自动调用此函数
def deal_callback(ContextInfo, dealInfo):
    """
    dealInfo: 成交对象,包含成交的具体信息
    """
    # 获取成交的关键信息
    stock_code = dealInfo.m_strInstrumentID  # 证券代码
    trade_price = dealInfo.m_dPrice          # 成交均价
    trade_volume = dealInfo.m_nVolume        # 成交数量
    order_sys_id = dealInfo.m_strOrderSysID  # 对应的委托号
    direction = dealInfo.m_nDirection        # 买卖方向 (48:买入, 49:卖出)
    
    print(f"收到成交回报: 代码={stock_code}, 价格={trade_price}, 数量={trade_volume}, 方向={direction}")
    
    # 3. 执行下一步操作
    # 示例逻辑:如果是买入成交,则立即执行止盈挂单逻辑
    if direction == 48: # 48 代表买入
        do_next_step_after_buy(ContextInfo, stock_code, trade_price, trade_volume)

def do_next_step_after_buy(ContextInfo, stock_code, cost_price, volume):
    """
    自定义的后续操作函数
    """
    print(f"触发后续操作:正在为 {stock_code} 设置止盈单...")
    
    # 假设止盈价为成本价的 1.05 倍
    target_price = cost_price * 1.05
    
    # 注意:这里仅为演示逻辑,实际下单需考虑可用资金、持仓状态等
    # passorder(24, 1101, ContextInfo.accID, stock_code, 11, target_price, volume, ContextInfo)
    print(f"已触发逻辑:计划以 {target_price:.2f} 卖出 {volume} 股")

# 补充:委托状态变化回调(可选)
# 如果你需要在委托变成“已成”或“废单”时触发,也可以使用这个
def order_callback(ContextInfo, orderInfo):
    """
    orderInfo: 委托对象
    m_nOrderStatus: 56 代表已成, 54 代表已撤, 57 代表废单
    """
    if orderInfo.m_nOrderStatus == 56:
        print(f"委托单 {orderInfo.m_strOrderSysID} 全部成交")

关键说明

  1. deal_callback vs order_callback

    • deal_callback推荐使用。只要有成交(包括部成)就会触发,包含具体的成交价格和数量,适合做精确的对冲或止盈止损计算。
    • order_callback:当委托状态变化(如从“未报”变“已报”,或“已报”变“已成”)时触发。如果你只关心订单最终是否完成,可以使用这个。
  2. dealInfo 对象属性

    • m_strInstrumentID: 证券代码
    • m_dPrice: 成交均价
    • m_nVolume: 成交数量
    • m_strOrderSysID: 关联的委托号(可用于追踪是哪一笔委托成交的)
    • m_nDirection: 买卖方向(48为买,49为卖)
    • m_strRemark: 投资备注(如果在下单时填写了备注,这里可以取回,用于区分不同策略发出的单)
  3. 运行模式

    • 这些回调函数仅在 实盘模拟交易 模式下生效。
    • 在回测模式中,成交通常是在 handlebar 的下一根 K 线或撮合逻辑中同步完成的,不会触发这些异步回调。