实盘交易接口为什么必须有速查表
xtdata 接口数量不算多,xttrader 是真的多——
下单:
order_stock、order_stock_async各 8 个参数价格类型:限价、最新价、对手方最优、五档即成、全额成交……7 种
委托状态:48-57,10 种状态
回调:
on_stock_order、on_stock_trade、on_order_error等十几个
每次写代码都翻文档,累得人想砸键盘。
这一节把所有 xttrader 高频接口+常量+回调全部收录在一页,强烈建议收藏 → 置顶 → 写代码时随时翻。
一、连接管理 —— 5 行代码搞定
| 函数 | 说明 | 返回值 |
|---|---|---|
XtQuantTrader(path, session_id) | 创建交易对象 | 实例 |
start() | 启动交易线程 | 无 |
connect() | 连接交易服务器 | 0=成功,非 0=失败 |
register_callback(callback) | 注册回调类 | 无 |
stop() | 停止交易线程 | 无 |
fromxtquant.xttraderimportXtQuantTrader
fromxtquant.xttypeimportStockAccount
path = r'D:\国金QMT交易端模拟\userdata_mini'
session_id = 123456
trader = XtQuantTrader(path, session_id)
trader.start()
result = trader.connect()
ifresult == 0:
print("连接成功")
踩坑提示:
必须先 start 再 connect,反过来会失败
session_id在多个进程间必须不同,否则后启动的会顶掉前一个
二、账户订阅 —— 不订阅没回调
| 函数 | 说明 |
|---|---|
subscribe(account) | 订阅账户(下单前必须) |
unsubscribe(account) | 取消订阅 |
acc = StockAccount('55009728')
trader.subscribe(acc)
踩坑提示:
❌ 没订阅就下单 → 下单可以发,但收不到
on_stock_order回报这是新手第一次跑实盘最常见的坑
三、委托下单 —— 核心中的核心
| 函数 | 说明 | 返回值 |
|---|---|---|
order_stock(...) | 同步委托 | order_id(int) |
order_stock_async(...) | 异步委托 | order_id |
委托类型(order_type)速查
| 值 | 常量 | 说明 |
|---|---|---|
| 23 | xtconstant.STOCK_BUY | 股票买入 |
| 24 | xtconstant.STOCK_SELL | 股票卖出 |
实盘里只用这两个。其他都是信用账户用的(融资融券)。
价格类型(price_type)速查 ⭐ 重要
| 值 | 常量 | 说明 |
|---|---|---|
| 5 | FIX_PRICE | 限价(最常用) |
| 11 | LATEST_PRICE | 最新价 |
| 14 | MARKET_SH_CONVERT_5_CANCEL | 上海最优五档即成剩撤 |
| 15 | MARKET_SH_CONVERT_5_LIMIT | 上海最优五档即成转限价 |
| 42 | MARKET_PEER_PRICE_FIRST | 对手方最优(市价首选) |
| 43 | MARKET_MINE_PRICE_FIRST | 本方最优 |
| 44 | MARKET_SZ_INSTBUSI_RESTCANCEL | 深圳即成剩撤 |
| 45 | MARKET_SZ_CONVERT_5_CANCEL | 深圳最优五档即成剩撤 |
| 46 | MARKET_SZ_FULL_OR_CANCEL | 深圳全额成交或撤销 |
价格类型怎么选
| 场景 | 推荐 | 理由 |
|---|---|---|
| 普通挂单 | FIX_PRICE | 价格可控 |
| 快速买入 | MARKET_PEER_PRICE_FIRST | 对手价立刻成交 |
| 快速卖出 | MARKET_PEER_PRICE_FIRST | 同上 |
| 追涨买入 | MARKET_SZ_CONVERT_5_CANCEL | 五档即成 |
fromxtquantimportxtconstant
# 限价买入
order_id = trader.order_stock(
account=acc,
stock_code='600000.SH',
order_type=xtconstant.STOCK_BUY,
volume=100,
strategy_name='策略1',
price=10.50,
price_type=xtconstant.FIX_PRICE,
order_id=0, # 0=自动生成
)
# 市价卖出(对手方最优)
order_id = trader.order_stock(
account=acc, stock_code='600000.SH',
order_type=xtconstant.STOCK_SELL, volume=100,
strategy_name='策略1', price=0,
price_type=xtconstant.MARKET_PEER_PRICE_FIRST,
)
四、撤单接口
| 函数 | 说明 | 返回值 |
|---|---|---|
cancel_order_stock(account, order_id) | 同步撤单 | 0=请求成功 |
cancel_order_stock_async(account, order_id) | 异步撤单 | 0=请求成功 |
result = trader.cancel_order_stock(acc, order_id)
ifresult == 0:
print("撤单请求已发送")
踩坑提示:
❌ "返回 0" ≠ "已撤单成功"——只是请求已提交
✅ 真正撤成功要等
on_stock_order回调中 status=54(已撤)才算
五、查询接口 —— 实盘必查
| 函数 | 说明 | 返回值 |
|---|---|---|
query_stock_asset(account) | 查资产 | XtAsset |
query_stock_orders(account) | 查所有委托 | list[XtOrder] |
query_stock_trades(account) | 查所有成交 | list[XtTrade] |
query_stock_positions(account) | 查持仓 | list[XtPosition] |
query_credit_detail(account) | 查信用账户 | XtCreditDetail |
# 资产
asset = trader.query_stock_asset(acc)
print(f"总资产: {asset.total_asset}, 可用资金: {asset.cash}")
# 持仓
forposintrader.query_stock_positions(acc):
print(f"{pos.stock_code}: {pos.volume}股 可卖{pos.can_use_volume}")
# 委托
fororderintrader.query_stock_orders(acc):
print(f"委托{order.order_id}: {order.stock_code} 状态={order.order_status}")
实战建议:
查询接口有延迟——别在 callback 里高频调用
持仓的
can_use_volume是真正能卖的数量(T+1 制度)
六、回调函数 —— 实盘灵魂
| 回调方法 | 触发时机 | 参数 |
|---|---|---|
on_disconnected() | 连接断开 | 无 |
on_account_status(status) | 账户状态变化 | XtAccountStatus |
on_stock_order(order) | 委托回报(每次状态变化) | XtOrder |
on_stock_trade(trade) | 成交回报 | XtTrade |
on_stock_position(pos) | 持仓变化 | XtPosition |
on_stock_asset(asset) | 资产变化 | XtAsset |
on_order_error(error) | 委托错误 | XtOrderError |
on_cancel_error(error) | 撤单错误 | XtCancelError |
on_order_stock_async_response(resp) | 异步委托响应 | XtOrderResponse |
on_cancel_order_stock_async_response(resp) | 异步撤单响应 | XtCancelOrderResponse |
fromxtquant.xttraderimportXtQuantTraderCallback
classMyCallback(XtQuantTraderCallback):
defon_disconnected(self):
print("连接断开!")
defon_stock_order(self, order):
print(f"委托回报: {order.stock_code} 状态={order.order_status}")
defon_stock_trade(self, trade):
print(f"成交: {trade.stock_code} {trade.traded_volume}股@{trade.traded_price}")
defon_order_error(self, error):
print(f"委托失败: {error.error_msg}")
trader.register_callback(MyCallback())
关键提示:回调在独立线程执行——共享数据要加锁,别在回调里阻塞(参考 5.1 节)。
七、委托状态码 ⭐ 必须背下来
| 状态码 | 说明 | 是否终态 |
|---|---|---|
| 48 | 未报 | ❌ |
| 49 | 待报 | ❌ |
| 50 | 已报 | ❌ |
| 51 | 已报待撤 | ❌ |
| 52 | 部成待撤 | ❌ |
| 53 | 部撤 | ✅ |
| 54 | 已撤 | ✅ |
| 55 | 部成 | ❌(继续中) |
| 56 | 已成 | ✅ |
| 57 | 废单 | ✅ |
终态判断模板:
FINAL_STATUS = {53, 54, 56, 57} # 终态集合
defis_order_finished(status):
returnstatusinFINAL_STATUS
defget_status_name(status):
return {
48: '未报', 49: '待报', 50: '已报',
51: '已报待撤', 52: '部成待撤', 53: '部撤',
54: '已撤', 55: '部成', 56: '已成', 57: '废单',
}.get(status, str(status))
实战经验:
55 部成不是终态——它会继续成交直到 56 或被撤成 53
自动撤单要监控未到终态的委托:
status not in FINAL_STATUS
八、5 个高频代码模板
1. 市价买入
defmarket_buy(trader, acc, code, volume):
returntrader.order_stock(
account=acc, stock_code=code,
order_type=xtconstant.STOCK_BUY, volume=volume,
strategy_name='market_buy', price=0,
price_type=xtconstant.MARKET_PEER_PRICE_FIRST,
)
2. 限价卖出
deflimit_sell(trader, acc, code, volume, price):
returntrader.order_stock(
account=acc, stock_code=code,
order_type=xtconstant.STOCK_SELL, volume=volume,
strategy_name='limit_sell', price=price,
price_type=xtconstant.FIX_PRICE,
)
3. 拿可用资金
defget_available_cash(trader, acc):
asset = trader.query_stock_asset(acc)
returnasset.cashifassetelse0
4. 拿可卖数量
defget_can_use_volume(trader, acc, code):
forposintrader.query_stock_positions(acc) or []:
ifpos.stock_code == code:
returnpos.can_use_volume
return0
5. 全部撤单
defcancel_all_pending_orders(trader, acc):
PENDING = {48, 49, 50, 51, 52, 55}
forointrader.query_stock_orders(acc) or []:
ifo.order_statusinPENDING:
trader.cancel_order_stock(acc, o.order_id)
九、5 个常见坑(自查清单)
- 先 connect 再 start ❌(应该相反)
- 没 subscribe 账户就下单 ❌(收不到回报)
- 把"返回 0"当作"已撤成功" ❌(只是请求提交)
- 在回调里阻塞操作 ❌(会卡死整个线程)
- 委托量不是 100 整数倍 ❌(直接被打成废单)
十、注意事项总结
| 注意点 | 说明 |
|---|---|
| 先 start 再 connect | 顺序不能反 |
| 必须订阅账户 | 不订阅没有回调 |
| 回调在独立线程 | 注意线程安全 |
| order_id 唯一性 | 自定义 id 必须不重复 |
| 数量整百 | A 股最低 100 股 / 必须 100 整数倍 |
写在最后
xttrader 的接口比 xtdata 多一倍,靠记性记不住。
这一篇我建议你直接收藏到公众号置顶——写下单/撤单/回调时点开就抄,比翻文档快 10 倍。
下一篇预告
接口名记住了,返回的对象长什么样?
下一篇 7.3 核心数据结构字段全览:
XtAsset、XtPosition、XtOrder、XtTrade 字段全收录
Tick / K线 / 合约详情 字段对照表
错误对象 XtOrderError / XtCancelError
每个字段什么场景用,给你讲明白
留个互动给你
你最容易混淆的 price_type 是哪一个?
评论区聊聊——你写下单时遇到过哪个最坑爹的参数?
如果这一篇对你有帮助:
点个 在看 让我知道速查表内容你需要 👍
转给一个还在翻文档的朋友 🔁
关注 + 星标 ⭐ 第一时间看下一篇
风险提示:本文仅作技术分享与教学用途,不构成任何投资建议。量化交易有风险,实盘需谨慎。
夜雨聆风