3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
是的,您的观察非常准确。在 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 的注意事项:init 函数中使用 ContextInfo.set_account() 绑定您的资金账号,否则无法接收到推送。#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_callback 和 deal_callback,让系统在状态改变时主动通知您,这是编写高频/实盘量化策略的标准做法。