XtQuant外部接口
内置 Python 必须在 QMT 客户端的策略编辑器里写、受客户端环境约束。如果你想在自己的 Python 环境里跑策略——用熟悉的 IDE、自由装 pandas/numpy/任意第三方库、把交易能力嵌入已有系统——那就用 XtQuant。它是基于迅投 MiniQMT 衍生的 Python 库,以独立 Python 包的形式提供行情和交易 API。
XtQuant 是什么
XtQuant 是一套完善的 Python 策略运行框架,对外以 Python 库形式提供接口,分两个模块:
| 模块 | 作用 |
|---|---|
xtdata | 行情模块:历史和实时的 K 线/分笔、财务数据、合约基础信息、板块行业分类 |
xttrader | 交易模块:报单、撤单、查询资产/委托/成交/持仓,接收资金/委托/成交/持仓变动的主推消息 |
运行依赖
- Python 版本:提供 3.6 / 3.7 / 3.8 / 3.9 / 3.10 / 3.11 / 3.12 的库,导入时自动切换对应版本。
- 必须先启动 MiniQMT 客户端:XtQuant 不是独立行情源,它连接到正在运行的 MiniQMT 客户端,通过客户端和柜台交互。程序运行前先把 MiniQMT 打开并登录。
行情模块:xtdata
xtdata 的接口和内置 Python 的行情函数风格接近,提供精简直接的数据:
from xtquant import xtdata
# 下载历史数据(同内置 Python,先下后取)
xtdata.download_history_data('600000.SH', '1d', '20240101', '')
# 取历史 K 线,返回 {代码: DataFrame}
data = xtdata.get_market_data_ex(
field_list=['close','open','high','low','volume'],
stock_list=['600000.SH'],
period='1d',
start_time='20240101',
end_time='',
count=-1
)
# 取合约基础信息
info = xtdata.get_instrument_detail('600000.SH')
# 取板块成分
stocks = xtdata.get_stock_list_in_sector('沪深A股')
# 订阅实时行情
xtdata.subscribe_quote('600000.SH', period='1d')
常用 xtdata 函数:
| 函数 | 作用 |
|---|---|
download_history_data(code, period, start, end) | 下载历史 |
download_history_data2(...) | 新版批量下载 |
get_market_data_ex(...) | 取历史/实时 K 线 |
subscribe_quote(code, period, callback=...) | 订阅推送 |
get_full_tick(codes) | 全市场快照 |
get_instrument_detail(code) | 合约基础信息 |
get_stock_list_in_sector(name) | 板块成分 |
get_trading_dates(market, start, end) | 交易日历 |
get_trade_times(code) | 交易时段 |
交易模块:xttrader
xttrader 封装了报单、撤单、查询和主推回调。使用流程是:建会话 → 连接 → 订阅账号 → 启动 → 注册回调 → 下单/查询。
连接与会话
from xtquant import xttrader
path = r'C:\broker_userdata_mini_path' # MiniQMT 用户数据目录
session_id = 123456 # 会话 ID,自定义整数
trader = xttrader.XtQuantTrader(path, session_id)
trader.register_callback(MyCallback()) # 注册回调
trader.start() # 启动
account = xttrader.StockAccount('1000044') # 资金账号
trader.connect() # 连接 MiniQMT
trader.subscribe(account) # 订阅该账号的交易主推
XtQuantTrader(path, session_id)的path指向 MiniQMT 客户端的用户数据目录(userdata_mini),session_id是区分多个会话的整数,自定义即可。
下单与撤单
# 下单:account, 代码, 买卖方向, 数量, 策略类型, 价格
# 方向:xttrader.STOCK_BUY / STOCK_SELL
# 策略类型:xttrader.FIX_PRICE(限价)、LATEST_PRICE(最新价)等
seq = xttrader.order_stock(account, '600000.SH',
xttrader.STOCK_BUY, 100,
xttrader.FIX_PRICE, 0.0)
# 撤单:传账号和委托号
xttrader.cancel_order_stock(account, seq)
查询
查询函数返回对象列表,字段和内置 Python 的 get_trade_detail_data 类似:
asset = xttrader.query_stock_asset(account) # 资产
orders = xttrader.query_stock_orders(account) # 委托列表
trades = xttrader.query_stock_trades(account) # 成交列表
pos = xttrader.query_stock_positions(account) # 持仓列表
也有 _async 异步版本(如 query_stock_orders_async),结果通过回推返回,适合大批量查询不阻塞。
回调:XtQuantTraderCallback
继承 XtQuantTraderCallback 重写回调方法,接收连接状态和交易主推:
class MyCallback(xttrader.XtQuantTraderCallback):
def on_disconnected(self):
print('连接断开')
def on_stock_order(self, order):
print('委托主推', order.stock_code, order.order_status)
def on_stock_trade(self, deal):
print('成交主推', deal.stock_code, deal.traded_volume)
def on_order_error(self, error):
print('下单错误', error.error_id, error.error_msg)
def on_cancel_error(self, error):
print('撤单错误', error.error_id)
def on_account_status(self, status):
print('账号状态变化', status.account_id)
内置 Python vs XtQuant
| 维度 | 内置 Python | XtQuant |
|---|---|---|
| 运行位置 | QMT 客户端内 | 外部 Python 进程 |
| 客户端依赖 | 必须开 QMT | 必须开 MiniQMT |
| Python 版本 | 固定 3.6 | 3.6~3.12 自选 |
| 第三方库 | 受客户端环境限制 | 自由(任意 pip 包) |
| 编码 | 必须 #coding:gbk | 标准 UTF-8 |
| 适合 | 回测+实盘一体、事件驱动策略 | 自建框架、研究脚本、对接系统 |
| 触发机制 | handlebar/subscribe/run_time | 自己写主循环或回调 |
两者底层数据和柜台是同一套,结果一致。很多人用 XtQuant 做盘后研究和模拟,用内置 Python 跑实盘报单。
常见坑
- MiniQMT 没开就连接失败:XtQuant 所有调用都依赖客户端在线,启动程序前确认 MiniQMT 已登录。
- path 写错:
userdata_mini路径必须是 MiniQMT 实际使用的目录,错了连不上或拿不到数据。 - session_id 冲突:多个脚本同时连同一账号,用不同的
session_id区分。 - 订阅了才推主推:下单后要
subscribe(account)才会收到on_stock_order/on_stock_trade主推。
下一步
XtQuant 覆盖了内置 Python 之外的需求。如果想用公式写指标和程序化策略,看 VBA公式模型。