前言:
上一篇我们讲了 4 个高频事件:
- on_disconnected(断线)
- on_stock_order(委托回报)
- on_stock_trade(成交)
- on_order_error(下单失败)
但实盘里还有 3 个“隐形炸弹”经常被忽略:
- 撤单失败——你以为撤掉了,其实还在场,风险敞口瞬间爆炸;
- 异步下单回执——用
order_stock_async 时,柜台先给你一个“受理号”,后续才真正挂单;
- 账户状态——密码被改、会话掉线、备用账户切换,都必须第一时间感知。
今天把最后 3 个回调补完,加上逐行解析,凑齐 100% 官方事件。
二、运行环境(与上篇完全一致)
- Windows 10/11
- Python ≥3.7 64 bit
pip install xtquant (2025-10 已支持 3.11)
- 券商 QMT 客户端已登录(模拟盘亦可)
三、完整代码(含新增 3 大事件,共 106 行)
下面给出 全部源码,老事件不再赘述
一、on_cancel_error —— 撤单失败通知
def on_cancel_error(self, cancel_error): """ 撤单失败推送 :param cancel_error: XtCancelError 对象 :return: """ print("on cancel_error callback") print(cancel_error.order_id, cancel_error.error_id, cancel_error.error_msg)
- 什么时候触发
- 你代码里调用
cancel_order(...) 或 cancel_order_async(...) 后,柜台返回“撤单失败”就会立刻进这个函数。
- 失败常见原因:原单已成交、已撤、已过期、非法 order_id、集合竞价不允许撤等。
- 字段详解
| 字段 |
类型 |
举例 |
用途 |
| cancel_error.order_id |
str |
'12345678' |
你刚才想撤的那笔单的系统编号 |
| cancel_error.error_id |
int |
9803 |
柜台给出的错误码,可对照券商文档 |
| cancel_error.error_msg |
str |
'该委托已成交,不能撤销' |
人能直接看懂的失败原因 |
二、on_order_stock_async_response —— 异步下单“已受理”回执
def on_order_stock_async_response(self, response): """ 异步下单回报推送 :param response: XtOrderResponse 对象 :return: """ print("on_order_stock_async_response") print(response.account_id, response.order_id, response.seq)
- 什么时候触发
- 你调用
order_stock_async(...) 之后,柜台第一次收到指令就会立刻推送这个响应;
- 注意:它只是“已受理”,不代表已成交甚至已报!真正的成交/状态变化后面还会走
on_stock_order。
- 字段详解
| 字段 |
类型 |
举例 |
用途 |
| response.account_id |
str |
'888888' |
下单所用账户 |
| response.order_id |
str |
'abc123' |
柜台生成的临时订单编号,后面撤单、查单都要用它 |
| response.seq |
int |
10086 |
你调用 order_stock_async 时自己传的序列号,用来把“请求”和“响应”对上 |
三、on_account_status —— 账户状态变化
def on_account_status(self, status): """ :param status: XtAccountStatus 对象 :return: """ print("on_account_status") print(status.account_id, status.account_type, status.status)
- 什么时候触发
- 终端登录成功、断开、被踢、资金账号冻结、柜台维护等任何账户级事件都会推送;
- 一天可能只收到一两次,但关键时刻必须知道。
- 字段详解
| 字段 | 类型 | 举例 | 用途 |
| -------------------- | ---- | -------- | ------------------------------------------------ |
| status.account_id | str | '888888' | 账户号 |
| status.account_type | int | 1 | 1=普通股票 2=信用 3=期权 …(具体看 xtconstant) |
| status.status | int | 3 | 0=未登录 1=正在登录 2=登录成功 3=断开 4=冻结 … |
快速记忆口诀
- 撤单失败 →
on_cancel_error(order_id + 原因)
- 异步下单受理 →
on_order_stock_async_response(seq ↔ order_id 对钥匙)
- 账户掉线/登录 →
on_account_status(account_id + 状态码)
彩蛋:

|