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

维度内置 PythonXtQuant
运行位置QMT 客户端内外部 Python 进程
客户端依赖必须开 QMT必须开 MiniQMT
Python 版本固定 3.63.6~3.12 自选
第三方库受客户端环境限制自由(任意 pip 包)
编码必须 #coding:gbk标准 UTF-8
适合回测+实盘一体、事件驱动策略自建框架、研究脚本、对接系统
触发机制handlebar/subscribe/run_time自己写主循环或回调

两者底层数据和柜台是同一套,结果一致。很多人用 XtQuant 做盘后研究和模拟,用内置 Python 跑实盘报单。

常见坑

  1. MiniQMT 没开就连接失败:XtQuant 所有调用都依赖客户端在线,启动程序前确认 MiniQMT 已登录。
  2. path 写错:userdata_mini 路径必须是 MiniQMT 实际使用的目录,错了连不上或拿不到数据。
  3. session_id 冲突:多个脚本同时连同一账号,用不同的 session_id 区分。
  4. 订阅了才推主推:下单后要 subscribe(account) 才会收到 on_stock_order/on_stock_trade 主推。

下一步

XtQuant 覆盖了内置 Python 之外的需求。如果想用公式写指标和程序化策略,看 VBA公式模型。