量化交易≠画几条K线就完事。真正的实盘,必须让策略能听、能说、能记录。
今天这份QMT(MiniQMT通用)保姆级教程,让你的账户: 
- 成交即打印
 
- 失败即报警
 
- 断连即重连
全部代码已放文末
 
 
  
前言:
xtquant 是 QMT 官方维护的 Python 接口,把“下单-回报-成交-异常”全部封装成事件回调。
今天全文只围绕一份代码展开,逐行讲透:一个事件驱动的回调 
- 如何建立柜台连接;
 
- 如何监听委托、成交、撤单、断线等 7 大事件;
 
- 如何把事件打印成结构化日志,方便后续扩展成资金风控、推送微信、入库 MySQL。
 
 
二、运行环境
- Windows 10/11(QMT 仅支持 Win)
 
- Python ≥3.7,64 位
 
pip install xtquant (2025-10 官方已支持 3.11) 
- 券商版 QMT 交易端(模拟盘也可)已启动并登录
 
 
三、完整代码(共 92 行,含空行)
Python复制#coding=utf-8 :这是 Python 文件中的编码声明,用来告诉 Python 解释器这个文件是用 UTF-8 编码的。这通常用于确保文件中的非 ASCII 字符(如中文)能被正确处理。 
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback from xtquant.xttype import StockAccount from xtquant import xtconstant:这段代码的目的是为了使用 xtquant 这个量化交易库中的功能,包括创建交易者实例、处理交易回调、管理股票账户以及使用预定义的常量。 
xtquant.xttrader:这是一个模块的路径,可能是一个量化交易相关的库。 
XtQuantTrader:从 xtquant.xttrader 模块中导入的类,可能用于创建量化交易的交易者实例。 
XtQuantTraderCallback:同样是从 xtquant.xttrader 模块中导入的类,可能是一个回调类,用于处理交易过程中的回调事件。 
 
from xtquant.xttype import StockAccount: 
 
xtquant.xttype:这是另一个模块的路径,可能包含与量化交易相关的数据类型。 
StockAccount:从 xtquant.xttype 模块中导入的类,可能代表一个股票账户,用于管理股票交易相关的账户信息。 
 
from xtquant import xtconstant: 
 
xtquant:这是一个包(package),可能包含量化交易相关的多个模块。 
xtconstant:从 xtquant 包中导入的模块,可能包含一些常量定义,如股票代码、交易状态等 
 
【2-4】官方三大模块: 
XtQuantTrader —— 柜台会话,负责发单、撤单、查持仓; 
XtQuantTraderCallback —— 抽象基类,我们继承它即可“挂”到事件总线; 
StockAccount —— 账户对象,用资金账号初始化; 
xtconstant —— 常量集合,如买卖方向、市价限价等,后续扩展策略时会用到。 
 
Python复制class MyXtQuantTraderCallback(XtQuantTraderCallback): 
继承基类,相当于“告诉柜台:以下函数指针是我关心的事件,有消息就扔给我”。 
 
事件 1 连接断开
Python复制def on_disconnected(self): 
- """ 连接断开
 
- 
return: 
 
 
""" 
print("connection lost") 
- 触发时机:QMT 被手动关闭、网络掉线、柜台夜切;
 
- 生产环境建议:发邮件/微信、暂停策略、尝试重连。
 
 
 
事件 2 委托回报(最关键)
on_stock_order(self, order)
Python复制def on_stock_order(self, order): print("on order callback:") print(order.stock_code, order.order_status, order.order_sysid) 
- 触发时机:当你下单后,券商系统返回委托回报(即订单状态更新)。
 
- 参数说明:
order.stock_code:股票代码 
order.order_status:订单状态(如已报、已成交、已撤等) 
order.order_sysid:系统订单号(券商内部编号) 
 
 
 
 
事件 3 成交变动
on_stock_trade(self, trade)
Python复制def on_stock_trade(self, trade): print("on trade callback") print(trade.account_id, trade.stock_code, trade.order_id) 
- 触发时机:当订单成交时推送。
 
- 参数说明:
trade.account_id:账户ID 
trade.stock_code:成交的股票代码 
trade.order_id:对应的订单ID 
 
 
 
一笔委托可能分多笔成交,每次成交都会单独触发;这里打印的 order_id 是本地编号,与 on_stock_order 里的 order_id 一致,可用来“拼单”计算平均成交价。 
 
事件 4 委托失败
on_order_error(self, order_error)
Python复制def on_order_error(self, order_error): print("on order_error callback") print(order_error.order_id, order_error.error_id, order_error.error_msg) 
- 触发时机:当下单失败时(如价格非法、余额不足、停牌等)。
 
- 参数说明:
order_error.order_id:出错的订单ID 
order_error.error_id:错误代码 
order_error.error_msg:错误描述(如“余额不足”) 
 
 
 
 
四、常见踩坑
- 端口占用:QMT 只能开一个客户端,否则 58605 被占用;
 
- 编码错误:文件必须保存为 UTF-8,否则中文策略名会乱码;
 
- 32 位 Python:xtquant 只提供 64 位 whl,装错位数会 
ImportError; 
- 异步/同步混用:同一笔委托不要既调 
order_stock 又调 order_stock_async,会重复。 
 
五、结语
全文完,下期将继续讲解 撤单失败推送、 异步下单回报推送等内容。 
六、彩蛋
全套量化资料分享   |