问题描述
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 的注意事项:
- 必须绑定账号:在使用主推函数前,必须在
init函数中使用ContextInfo.set_account()绑定您的资金账号,否则无法接收到推送。 - 仅实盘有效:交易回报实时主推函数仅在实盘运行模式下生效(回测模式下不会触发)。
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_callback和deal_callback,让系统在状态改变时主动通知您,这是编写高频/实盘量化策略的标准做法。