问题描述
解决方案
在 QMT 平台中,若希望在委托单成交后立即获得通知并执行后续操作,最推荐的方式是使用 交易回报实时主推函数 中的 deal_callback(成交回报)或 order_callback(委托回报)。
这种方式是事件驱动的,比循环查询(轮询)效率更高且延迟更低。
核心步骤
- 绑定账号:在
init函数中必须调用ContextInfo.set_account(accountID)绑定资金账号,否则无法接收推送。 - 定义回调函数:在策略代码中定义
deal_callback(ContextInfo, dealInfo)函数。 - 编写逻辑:当有成交发生时,系统会自动调用该函数,你可以在函数内部读取
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} 全部成交")
关键说明
-
deal_callback vs order_callback:
deal_callback:推荐使用。只要有成交(包括部成)就会触发,包含具体的成交价格和数量,适合做精确的对冲或止盈止损计算。order_callback:当委托状态变化(如从“未报”变“已报”,或“已报”变“已成”)时触发。如果你只关心订单最终是否完成,可以使用这个。
-
dealInfo 对象属性:
m_strInstrumentID: 证券代码m_dPrice: 成交均价m_nVolume: 成交数量m_strOrderSysID: 关联的委托号(可用于追踪是哪一笔委托成交的)m_nDirection: 买卖方向(48为买,49为卖)m_strRemark: 投资备注(如果在下单时填写了备注,这里可以取回,用于区分不同策略发出的单)
-
运行模式:
- 这些回调函数仅在 实盘 或 模拟交易 模式下生效。
- 在回测模式中,成交通常是在
handlebar的下一根 K 线或撮合逻辑中同步完成的,不会触发这些异步回调。