再也不怕漏单错单!QMT 订单状态实时追踪与异常处理
发布时间:1小时前阅读:28
实盘交易中最可怕的事情不是策略亏钱,而是订单异常:
明明触发了交易信号,却没有下单;明明下了单,却没有成交;明明撤了单,却还在持仓。
这些异常如果不能及时发现和处理,可能会造成巨大的损失。
QMT 提供了完善的订单回调机制,可以实时追踪每一笔订单的全生命周期状态,从委托申报到成交、撤单、废单,每一个状态变化都会触发回调函数,让你第一时间掌握订单的情况。
QMT 订单的全生命周期
一个订单从创建到结束,会经历以下几个状态:
- 已报:订单已经提交到券商柜台,但还没有进入交易所。
- 待报:订单正在等待提交到交易所。
- 交易所已报:订单已经进入交易所系统,正在等待成交。
- 部分成交:订单已经成交了一部分,还有一部分没有成交。
- 全部成交:订单已经全部成交。
- 已撤:订单已经被成功撤销。
- 部成部撤:订单部分成交,剩余部分被撤销。
- 废单:订单被交易所拒绝,成为废单。
如何使用回调函数追踪订单状态
QMT 提供了两个核心回调函数来追踪订单状态:
order_callback:当订单状态发生变化时触发,比如从已报变为部分成交。deal_callback:当订单有成交时触发,每一笔成交都会触发一次。- 以下是一个完整的订单状态追踪示例:
python运行
# -*- coding: gbk -*-
"""
订单状态全生命周期追踪示例
"""
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockOrder, OrderStatus
import time
import uuid
class MyCallback(XtQuantTraderCallback):
def on_order_status(self, order):
"""
订单状态变化回调
:param order: 订单对象
"""
print(f"\n订单状态变化:")
print(f"订单编号:{order.order_id}")
print(f"股票代码:{order.stock_code}")
print(f"买卖方向:{'买入' if order.order_type == 23 else '卖出'}")
print(f"订单价格:{order.price:.2f}")
print(f"订单数量:{order.quantity}")
print(f"已成交数量:{order.traded_quantity}")
print(f"订单状态:{OrderStatus.to_string(order.order_status)}")
print(f"订单时间:{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(order.order_time/1000))}")
# 处理不同的订单状态
if order.order_status == OrderStatus.ALL_TRADED:
print(f"订单全部成交:{order.stock_code},成交数量:{order.traded_quantity}")
elif order.order_status == OrderStatus.PART_TRADED:
print(f"订单部分成交:{order.stock_code},已成交:{order.traded_quantity},剩余:{order.quantity - order.traded_quantity}")
elif order.order_status == OrderStatus.CANCELED:
print(f"订单已撤销:{order.stock_code},撤销数量:{order.quantity - order.traded_quantity}")
elif order.order_status == OrderStatus.PART_CANCELED:
print(f"订单部分撤销:{order.stock_code},已成交:{order.traded_quantity},撤销:{order.quantity - order.traded_quantity}")
elif order.order_status == OrderStatus.REJECTED:
print(f"订单被拒绝:{order.stock_code},拒绝原因:{order.err_msg}")
# 处理废单,比如重新下单
self.handle_rejected_order(order)
def on_deal(self, deal):
"""
成交回调
:param deal: 成交对象
"""
print(f"\n新的成交:")
print(f"成交编号:{deal.deal_id}")
print(f"订单编号:{deal.order_id}")
print(f"股票代码:{deal.stock_code}")
print(f"买卖方向:{'买入' if deal.order_type == 23 else '卖出'}")
print(f"成交价格:{deal.price:.2f}")
print(f"成交数量:{deal.quantity}")
print(f"成交金额:{deal.amount:.2f}")
print(f"成交时间:{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(deal.deal_time/1000))}")
def handle_rejected_order(self, order):
"""
处理废单
:param order: 废单对象
"""
# 常见的废单原因:价格超出涨跌幅限制、资金不足、持仓不足等
if "资金不足" in order.err_msg:
print("资金不足,无法下单")
elif "持仓不足" in order.err_msg:
print("持仓不足,无法卖出")
elif "价格超出涨跌幅限制" in order.err_msg:
print("价格超出涨跌幅限制,重新计算价格")
# 重新计算价格,比如按涨跌停价下单
last_price = xt_trader.get_last_price(order.stock_code)
if order.order_type == 23: # 买入
new_price = last_price * 1.1
else: # 卖出
new_price = last_price * 0.9
# 重新下单
new_order_id = str(uuid.uuid4())
xt_trader.order_stock(
order.account_id,
order.stock_code,
order.order_type,
new_price,
order.quantity,
new_order_id,
"strategy1"
)
print(f"重新下单:{new_order_id},价格:{new_price:.2f}")
if __name__ == "__main__":
# 初始化QMT交易对象
path = r"D:\QMT交易端\userdata_mini"
session_id = int(time.time())
xt_trader = XtQuantTrader(path, session_id)
# 创建回调对象并注册
callback = MyCallback()
xt_trader.register_callback(callback)
# 启动交易线程
xt_trader.start()
# 连接交易服务器
connect_result = xt_trader.connect()
if connect_result != 0:
print("连接失败")
exit(1)
print("连接成功")
# 获取资金账号
account_list = xt_trader.get_account_list()
if not account_list:
print("没有找到资金账号")
exit(1)
account_id = account_list[0]
print(f"使用资金账号:{account_id}")
# 订阅资金账号
subscribe_result = xt_trader.subscribe(account_id)
if subscribe_result != 0:
print("订阅账号失败")
exit(1)
print("订阅账号成功")
# 示例:买入平安银行
order_id = str(uuid.uuid4())
order_result = xt_trader.order_stock(
account_id,
"000001.SZ",
23, # 买入
10.0, # 价格
100, # 数量
order_id,
"strategy1"
)
if order_result == 0:
print(f"下单成功,订单编号:{order_id}")
else:
print(f"下单失败,错误码:{order_result}")
# 保持程序运行
xt_trader.run_forever()
常见订单异常及处理方法
- 订单被拒绝(废单) 原因:价格超出涨跌幅限制、资金不足、持仓不足、股票停牌等。 处理方法:在on_order_status回调中判断订单状态为REJECTED,根据错误信息进行相应处理,比如重新计算价格、检查资金和持仓等。
- 订单长时间未成交 原因:价格不合理、流动性不足等。 处理方法:设置订单超时时间,如果超过一定时间未成交,自动撤单并重新下单。可以在策略中维护一个订单字典,记录每个订单的下单时间,定期检查超时订单。
- 撤单失败 原因:订单已经成交、订单已经撤销、订单不存在等。 处理方法:在撤单回调中判断撤单结果,如果撤单失败,检查订单的当前状态,根据状态进行相应处理。
- 重复下单 原因:网络延迟、策略逻辑错误等。 处理方法:使用唯一的订单编号,避免重复下单;在下单前检查是否已经有相同的订单在运行。
- 如果你想学习更多订单处理的技巧,或者需要完整的订单管理模板,欢迎点我头像私信。我会免费为你开通 QMT 量化权限,提供一对一的订单追踪和异常处理指导。
风险提示:订单追踪不能完全消除交易风险,量化交易存在市场风险、系统风险等。本内容仅为投资者教育目的,不构成任何投资建议。
免责声明:本栏目刊载的信息力求准确可靠,但对信息的准确性或完整性不作任何保证,亦不对因使用该等信息而引发的损失承担责任。
温馨提示:投资有风险,选择需谨慎。
reits基金开户步骤详解,再也不怕搞不懂啦!
-
REITs打新:本周共有4个商业REITs基金发售:唯品商业、首农商业、砂之船和地产商业
2026-05-25 16:03
-
网格交易条件单怎么选?小叩深度测评国金、华泰、国泰海通三大主流券商APP
2026-05-25 16:03
-
聪明投资者都会做的止盈止损,应该如何设置?(附自动交易工具)
2026-05-25 16:03


问一问

+微信
分享该文章
