乐于分享
好东西不私藏

miniQMT:实盘下单一直翻文档?这一份 xttrader 速查表能让你写代码效率翻倍

miniQMT:实盘下单一直翻文档?这一份 xttrader 速查表能让你写代码效率翻倍

实盘交易接口为什么必须有速查表

xtdata 接口数量不算多,xttrader 是真的多——

  • 下单:order_stockorder_stock_async 各 8 个参数

  • 价格类型:限价、最新价、对手方最优、五档即成、全额成交……7 种

  • 委托状态:48-57,10 种状态

  • 回调:on_stock_orderon_stock_tradeon_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(pathsession_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)速查

常量说明
23xtconstant.STOCK_BUY股票买入
24xtconstant.STOCK_SELL股票卖出

实盘里只用这两个。其他都是信用账户用的(融资融券)。

价格类型(price_type)速查 ⭐ 重要

常量说明
5FIX_PRICE限价(最常用)
11LATEST_PRICE最新价
14MARKET_SH_CONVERT_5_CANCEL上海最优五档即成剩撤
15MARKET_SH_CONVERT_5_LIMIT上海最优五档即成转限价
42MARKET_PEER_PRICE_FIRST对手方最优(市价首选)
43MARKET_MINE_PRICE_FIRST本方最优
44MARKET_SZ_INSTBUSI_RESTCANCEL深圳即成剩撤
45MARKET_SZ_CONVERT_5_CANCEL深圳最优五档即成剩撤
46MARKET_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=accstock_code='600000.SH',
order_type=xtconstant.STOCK_SELLvolume=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(accorder_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(selforder):
print(f"委托回报: {order.stock_code} 状态={order.order_status}")

defon_stock_trade(selftrade):
print(f"成交: {trade.stock_code} {trade.traded_volume}股@{trade.traded_price}")

defon_order_error(selferror):
print(f"委托失败: {error.error_msg}")

trader.register_callback(MyCallback())

关键提示:回调在独立线程执行——共享数据要加锁,别在回调里阻塞(参考 5.1 节)。


七、委托状态码 ⭐ 必须背下来

状态码说明是否终态
48未报
49待报
50已报
51已报待撤
52部成待撤
53部撤
54已撤
55部成❌(继续中)
56已成
57废单

终态判断模板

FINAL_STATUS = {53545657}  # 终态集合

defis_order_finished(status):
returnstatusinFINAL_STATUS

defget_status_name(status):
return {
48'未报'49'待报'50'已报',
51'已报待撤'52'部成待撤'53'部撤',
54'已撤'55'部成'56'已成'57'废单',
    }.get(statusstr(status))

实战经验

  • 55 部成不是终态——它会继续成交直到 56 或被撤成 53

  • 自动撤单要监控未到终态的委托status not in FINAL_STATUS


八、5 个高频代码模板

1. 市价买入

defmarket_buy(traderacccodevolume):
returntrader.order_stock(
account=accstock_code=code,
order_type=xtconstant.STOCK_BUYvolume=volume,
strategy_name='market_buy'price=0,
price_type=xtconstant.MARKET_PEER_PRICE_FIRST,
    )

2. 限价卖出

deflimit_sell(traderacccodevolumeprice):
returntrader.order_stock(
account=accstock_code=code,
order_type=xtconstant.STOCK_SELLvolume=volume,
strategy_name='limit_sell'price=price,
price_type=xtconstant.FIX_PRICE,
    )

3. 拿可用资金

defget_available_cash(traderacc):
asset = trader.query_stock_asset(acc)
returnasset.cashifassetelse0

4. 拿可卖数量

defget_can_use_volume(traderacccode):
forposintrader.query_stock_positions(accor []:
ifpos.stock_code == code:
returnpos.can_use_volume
return0

5. 全部撤单

defcancel_all_pending_orders(traderacc):
PENDING = {484950515255}
forointrader.query_stock_orders(accor []:
ifo.order_statusinPENDING:
trader.cancel_order_stock(acco.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 是哪一个?

评论区聊聊——你写下单时遇到过哪个最坑爹的参数?


如果这一篇对你有帮助

  • 点个 在看 让我知道速查表内容你需要 👍

  • 转给一个还在翻文档的朋友 🔁

  • 关注 + 星标 ⭐ 第一时间看下一篇


风险提示:本文仅作技术分享与教学用途,不构成任何投资建议。量化交易有风险,实盘需谨慎。