QMT 委托状态枚举定义了委托从提交到最终状态的完整生命周期。通过 order_callback 回调函数中的 order_info.m_nOrderStatus 字段,或 get_trade_detail_data 查询委托记录时返回的 m_nOrderStatus 字段,可获取委托的当前状态。本页面列出全部状态码及其含义。

QMT 委托状态枚举完整列表

【事实】 以下为 QMT 委托状态枚举的完整列表:

状态码 状态名称 含义 是否终态
48 待报 委托已生成,尚未发送至交易服务器
49 未报 委托未成功报送至交易服务器
50 已报 委托已成功报送至交易服务器
51 已报待撤 委托已报送,用户发起撤单请求,撤单尚未处理
52 部分成交待撤 委托部分成交后,用户发起撤单请求
53 部分撤单 委托部分成交后撤单成功,未成交部分已撤销
54 已撤 委托撤单成功,全部未成交
55 已报部成 委托已报送至交易所并部分成交
56 部分成交 委托部分成交(同已报部成,不同版本命名可能不同)
57 全部成交 委托全部成交
58 已撤 委托已撤销(别名)
59 部分撤 委托部分撤销
60 废单 委托被交易所或交易服务器拒绝,标记为废单
61 确认 委托已被交易服务器确认

【解释】 - 待报(48):策略调用 passorder 后,委托已生成但尚未发送至交易服务器的中间状态。此状态通常持续时间极短。 - 已报(50):委托已成功发送至交易服务器并等待交易所处理。此状态后委托可能进入部分成交或全部成交。 - 部分成交(56):委托已部分成交,剩余部分仍在交易所等待撮合。 - 全部成交(57):委托已全部成交,为终态状态,不再变化。 - 已撤(54/58):用户主动撤单且撤单成功,为终态状态。 - 废单(60):委托被拒绝(如价格异常、数量不合法等),为终态状态。 - 终态状态:一旦进入终态,委托状态不再发生变化。

【建议】 策略中判断委托是否完成时,应检查终态状态(57 全部成交、54/58 已撤、60 废单),而非仅检查部分成交。

QMT 委托状态流转图

【事实】 委托状态的典型流转路径:

待报(48) → 已报(50) → 部分成交(56) → 全部成交(57) ↘ ↘ 已撤(54) 已撤(54) 已报(50) → 废单(60) 已报(50) → 已报待撤(51) → 已撤(54) 部分成交(56) → 部分成交待撤(52) → 部分撤单(53)

【解释】 委托从待报开始,经过已报后可能直接成交(全部成交),也可能部分成交后再全部成交或撤单。废单可能在已报后由交易所拒绝产生。

QMT 委托状态在回调中的使用

【事实】 order_callback 回调函数中通过 order_info.m_nOrderStatus 获取委托状态:

def order_callback(ContextInfo, order_info): """委托状态变化回调""" status = order_info.m_nOrderStatus stock = order_info.m_strStockCode if status == 57: print(f'{stock} 委托全部成交') elif status == 56: print(f'{stock} 委托部分成交,已成交 {order_info.m_dTradedVolume}') elif status == 54 or status == 58: print(f'{stock} 委托已撤销') elif status == 60: print(f'{stock} 委托废单: {order_info.m_strErrorInfo}') elif status == 50: print(f'{stock} 委托已报') else: print(f'{stock} 委托状态: {status}')

【建议】order_callback 中应处理所有可能的状态,特别是终态状态(全部成交、已撤、废单),避免策略因未处理某些状态而卡住。

QMT 委托状态在查询中的使用

【事实】 使用 get_trade_detail_data 查询委托记录时,可通过 m_nOrderStatus 字段筛选特定状态的委托:

def handlebar(ContextInfo): if not ContextInfo.is_last_bar(): return accountid = ContextInfo.accountid order_list = get_trade_detail_data(accountid, 'ORDER', 'STOCK') # 统计各状态委托数量 status_count = {} for order in order_list: status = order.m_nOrderStatus status_count[status] = status_count.get(status, 0) + 1 for status, count in status_count.items(): status_name = get_status_name(status) print(f'{status_name}({status}): {count} 笔') # 筛选未成交委托 pending_orders = [o for o in order_list if o.m_nOrderStatus in (48, 49, 50, 55, 56)] print(f'未成交委托: {len(pending_orders)} 笔') # 筛选废单 rejected_orders = [o for o in order_list if o.m_nOrderStatus == 60] for order in rejected_orders: print(f'废单: {order.m_strInstrumentID}, ' f'原因: {order.m_strErrorInfo}') def get_status_name(status): """状态码转名称""" status_map = { 48: '待报', 49: '未报', 50: '已报', 51: '已报待撤', 52: '部分成交待撤', 53: '部分撤单', 54: '已撤', 55: '已报部成', 56: '部分成交', 57: '全部成交', 58: '已撤', 59: '部分撤', 60: '废单', 61: '确认', } return status_map.get(status, f'未知({status})')

QMT 委托状态回测与实盘差异

【事实】 委托状态在回测和实盘环境中的差异:

对比项 回测环境 实盘环境
状态数量 通常仅出现 50(已报)和 57(全部成交) 可能出现全部状态码
废单 回测中一般不产生废单 实盘中可能因各种原因产生废单
部分成交 取决于回测设置 由市场流动性决定
撤单 回测中撤单立即生效 实盘中撤单可能失败(如已成交)
状态延迟 无延迟,即时更新 可能有网络延迟

【建议】 策略从回测迁移到实盘时,需确保 order_callback 能正确处理所有状态码,特别是废单(60)和部分成交(56)等在回测中较少出现的状态。

QMT 委托状态注意事项

【事实】 使用委托状态时需注意:

注意项 说明
状态码版本差异 部分状态码在不同客户端版本中可能不同
别名状态 54 和 58 均表示已撤,56 和 55 均表示部分成交(不同版本命名不同)
状态变化顺序 委托状态按生命周期顺序变化,不会回退
终态判断 终态状态包括 57(全部成交)、54/58(已撤)、53(部分撤单)、60(废单)
废单原因 废单时可通过 m_strErrorInfo 获取具体原因

【建议】 1. 判断委托是否终态时,应检查所有终态状态码,而非仅检查全部成交 2. 不同版本的状态码可能存在差异,建议以当前客户端版本为准 3. 策略中建议维护一个状态码到名称的映射表,便于日志输出和调试

QMT 委托状态相关参考

参考内容 说明 链接
passorder 下单函数 passorder
order_callback 委托回调函数 委托回调
get_trade_detail_data 查询委托记录 get_trade_detail_data
账号类型与操作类型 账号类型、操作类型、报价类型枚举 账号类型
数据结构与枚举 Account、Position、Order 对象字段 数据结构与枚举

QMT 委托状态来源与更新时间

【事实】 本页面内容基于 QMT 官方文档整理。

项目
数据来源 QMT 官方文档
更新时间 2026-08-04
验证时间 2026-08-04
适用版本 以当前客户端版本为准