QMT与MiniQMT API差异对比
以下以QMT内置Python文档和MiniQMT的xtquant文档为依据,对比运行逻辑、系统函数、行情接口、交易接口、主推回调的代码用法、函数签名、参数差异及迁移注意事项。
一、一句话定位
| 项目 | 内置Python(大QMT) | xtquant(MiniQMT) |
|---|---|---|
| 代码运行位置 | QMT客户端进程内部的Python引擎(官方内置3.6) | 本地的Python环境(3.6~3.13) |
| 与客户端关系 | 代码写在客户端编辑器里,由客户端直接驱动 | 客户端提供行情/交易,xtdata/xttrader库 |
| 入口对象 | ContextInfo + 固定生命周期函数(init/handlebar…) | xtdata模块(行情)+ XtQuantTrader实例(交易) |
| 适合人群 | 想开箱即用、在客户端内一站式完成编写/回测/实盘 | 想用自己IDE、pandas/numpy/sklearn、多线程并行、复杂工程 |
二、基础运行逻辑
2.1 内置Python:事件驱动 / 定时任务 + 固定生命周期
内置策略由客户端按固定回调驱动,核心是ContextInfo对象(策略运行环境,含账号、K线信息等):
init(ContextInfo):策略启动时仅执行一次,用于订阅行情、订阅账号、设股票池after_init(ContextInfo):init之后、handlebar之前执行一次,用于一次性下单/取数handlebar(ContextInfo)(逐K线驱动):历史K线每根调用一次;盘中每个新分笔(tick)到达驱动调用一次subscribe订阅推送(事件驱动):订阅指定品种分笔,新分笔到达触发回调run_time(func, period, startTime)/schedule_run(...)(定时任务):固定间隔触发回调,适合盘中持续判断stop(ContextInfo):策略关闭前调用(交易连接已断开,不能报撤单)
# coding:gbk
def init(ContextInfo):
# 订阅行情 / 账号,仅在启动时执行一次
ContextInfo.set_account('1000000365') # 实盘主推前必须 set_account
def handlebar(ContextInfo):
# 每根 K 线 / 每个 tick 都会进来
print(ContextInfo.barpos)
# 计算信号 -> passorder(...) 下单
内置模式有三种运行机制:逐K线(handlebar)、订阅推送(subscribe)、定时任务(run_time)。回测走本地历史数据遍历;实盘走MiniQMT推送。
2.2 xtquant:外部进程 + 显式连接 + 阻塞接收
xtquant是标准Python项目,需先启动MiniQMT客户端,再在外部脚本里主动建连:
XtQuantTrader(path, session_id):创建API实例(path为MiniQMT的userdata_mini路径,session_id不同策略要不同)register_callback(cls):注册回调类(主推消息入口)start()→connect()→subscribe(account):启动线程、建连、订阅账号run_forever():阻塞当前线程,持续接收交易主推- 行情侧
xtdata模块直接与MiniQMT交互,订阅后需xtdata.run()阻塞维持回调(或在自己的事件循环里保持进程存活)
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
class MyCallBack(XtQuantTraderCallback):
def on_stock_order(self, order):
print("委托回报:", order.stock_code, order.order_status)
if __name__ == "__main__":
path = r'D:\QMT\userdata_mini'
xt_trader = XtQuantTrader(path, session_id=123456)
xt_trader.register_callback(MyCallBack())
xt_trader.start()
xt_trader.connect() # 返回 0 表示连接成功
acc = StockAccount('1000000365')
xt_trader.subscribe(acc) # 订阅账号主推
# ... 下单 ...
xt_trader.run_forever() # 阻塞,接收主推
2.3 逻辑差异要点
- 内置Python由客户端"推着函数跑"(你写回调,客户端调你);xtquant是"你主动连网关、自己阻塞收推送"
- xtquant没有
init/handlebar概念,行情/交易的驱动完全由你的代码主线程控制 - 关键坑:内置Python里
ContextInfo会随K线切换回滚,不能拿它当持久存储;xtquant没有这层限制,但也没有"每根bar自动触发"的便利,需要自己组织主循环
三、系统函数(运行环境与全局对象)
| 对比点 | 内置Python | xtquant |
|---|---|---|
| 核心对象 | ContextInfo(策略上下文,存全局变量、账号、K线信息) | 无等价对象;行情用xtdata模块,交易用XtQuantTrader实例 |
| 初始化 | init / after_init(框架自动调用) |
手写XtQuantTrader(...).start().connect() |
| 定时器 | ContextInfo.run_time(func, period, startTime)、ContextInfo.schedule_run(...)、cancel_schedule_run(key) |
用标准库threading.Timer / schedule / asyncio自己实现 |
| 工具函数 | is_last_bar()、is_new_bar()、set_account()、get_stock_list_in_sector()等 |
xtdata.get_trading_dates()、get_sector_list()、get_stock_list_in_sector()等(多为模块级函数) |
| 变量保存 | 建议用自建全局变量;ContextInfo会随bar切换重置到上一根bar结束状态 | 普通Python全局/类属性即可,无"bar重置"机制 |
| 编码/第三方库 | 编辑器内写#coding:gbk,基于内置python3.6版本的三方库NumPy、Pandas等 |
任意Python版本与第三方库(pandas/numpy/sklearn/pytorch随意) |
四、行情接口(数据获取与订阅)
两者提供的数据种类高度一致(K线、分笔、财务、合约信息、板块、北向等),但调用形态不同:内置是ContextInfo的方法,xtquant是xtdata的模块级函数。
| 功能 | 内置Python(ContextInfo方法) | xtquant(xtdata模块) |
|---|---|---|
| 下载历史行情 | 通过系统功能,操作-数据管理-补充数据等操作补充 | xtdata.download_history_data(...) / download_history_data2(...)(带进度回调) |
| 获取行情 | ContextInfo.get_market_data_ex(field_list, stock_list, period, start, end, count, dividend_type, fill_data, subscribe) |
xtdata.get_market_data(field_list=[], stock_list=[], period='1d', ...) |
| 本地数据 | ContextInfo.get_local_data(...)(不推荐) |
xtdata.get_local_data(data_dir=...) |
| 订阅单股 | ContextInfo.subscribe_quote(stock, period, dividend, result_type, callback) → 返回订阅号 |
xtdata.subscribe_quote(stock_code, period, start, end, count, callback) |
| 订阅全推 | ContextInfo.subscribe_whole_quote(code_list, callback) |
xtdata.subscribe_whole_quote(code_list, callback=None) |
| 反订阅 | ContextInfo.unsubscribe_quote(subId) |
xtdata.unsubscribe_quote(seq) |
| 全推快照 | ContextInfo.get_full_tick(stock_list) |
xtdata.get_full_tick(code_list) |
| 财务数据 | ContextInfo.get_financial_data(fieldList, stockList, start, end, report_type) |
xtdata.get_financial_data(stock_list, table_list, ...) |
| 合约信息 | ContextInfo.get_instrument_detail(stockcode) |
xtdata.get_instrument_detail(stock_code, iscomplete) |
| 交易日/板块 | ContextInfo.get_stock_list_in_sector(...) |
xtdata.get_stock_list_in_sector(...) |
4.1 示例代码对比
内置Python(在 handlebar / init 里取数):
# coding:gbk
def handlebar(ContextInfo):
# 取多只股票、多字段、指定时间的历史+实时行情
data = ContextInfo.get_market_data_ex(
field_list=['open', 'high', 'low', 'close'],
stock_list=ContextInfo.stock_list,
period='1d', start_time='20230101', end_time='20231231',
subscribe=True) # subscribe=True 同时订阅实时
print(data)
# 订阅单股行情,回调里拿推送
ContextInfo.subscribe_quote('600000.SH', '1m', 'none', 'DataFrame', on_quote)
def on_quote(datas): # 推送回调
print(datas)
xtquant(外部脚本):
import xtquant.xtdata as xtdata
# 主动获取(从缓存/本地)
df = xtdata.get_market_data(
field_list=['open', 'high', 'low', 'close'],
stock_list=['600000.SH', '000001.SZ'],
period='1d', start_time='20230101', end_time='20231231')
print(df)
# 订阅单股,回调 on_data(datas)
def on_data(datas):
for code in datas:
print(code, datas[code])
sub_id = xtdata.subscribe_quote('600000.SH', '1m', '', '', 0, on_data)
xtdata.run() # 阻塞线程,维持回调
4.2 迁移注意事项:
- 内置
get_market_data_ex有subscribe开关,取数时可顺带订阅;xtquant的get_market_data是"取缓存",订阅是独立动作subscribe_quote - 内置订阅回调签名是自定义的全局函数;xtquant回调是
on_data(datas)形态,且必须run()/run_forever()阻塞才能持续收到 - 内置行情回调只在订阅品种有新分笔时触发;xtquant同理,但控制权在你自己进程
- 内置下载历史行情需通过客户端UI操作;xtquant可用
download_history_data编程式下载
五、下单函数
| 对比维度 | QMT(内置Python) | MiniQMT(xtquant) |
|---|---|---|
| 核心函数 | passorder() |
order_stock()(同步)/ order_stock_async()(异步) |
| 函数签名 | passorder(opType, orderType, accountid, orderCode, prType, price, volume, strategyName, quickTrade, userOrderId, ContextInfo) |
order_stock(account, stock_code, order_type, order_volume, price_type, price, strategy_name, order_remark)order_stock_async(account, stock_code, order_type, order_volume, price_type, price, strategy_name, order_remark) |
| 参数说明 | opType: 23=股票买入,24=股票卖出,33=信用担保品买入,60=ETF申购orderType: 1101=普通(按股数),1202=按金额/市值accountid: 资金账号(str)orderCode: 证券代码,如"600000.SH"prType: 5=最新价,11=指定价(限价),14=对手价(对方一档)price: 委托价格volume: 委托数量(股票为股,期货为手/张)strategyName: 策略名称quickTrade: 0=下根K线首tick触发,1=非历史bar调用即触发,2=不判断bar状态调用即触发(历史bar也能触发)userOrderId: 用户自定义委托ID(可缺省)ContextInfo: 系统上下文对象 |
account: StockAccount对象stock_code: 证券代码,如'600000.SH'order_type: xtconstant.STOCK_BUY / STOCK_SELLorder_volume: 委托数量(股/张)price_type: xtconstant.FIX_PRICE(指定价) / xtconstant.LATEST_PRICE(最新价) / 市价系列枚举price: 委托价格(市价填0)strategy_name: 策略名称order_remark: 委托备注 |
| 便捷下单 | order_shares/order_lots/order_value/order_percent/order_target_value/order_target_percent、buy_open/sell_open等(仅回测生效)另有 algo_passorder/smart_algo_passorder算法/拆单 |
无直接等价,需用query_stock_positions+order_stock自行封装目标仓位/按比例下单逻辑 |
| 返回值 | 无明确返回值,通过回调获取结果 | 成功返回order_id(>0),失败返回-1 |
| 代码示例 | # 限价买入100股
passorder(23, 1101, account,
'600000.SH', 11, 10.50, 100,
'my_strategy', 0, '', C)
# 立即下单
passorder(23, 1101, account,
'600000.SH', 5, -1, 100,
'my_strategy', 2, 'msg', C) |
# 同步限价买入
order_id = xt_trader.order_stock(
account, '600000.SH',
xtconstant.STOCK_BUY, 1000,
xtconstant.FIX_PRICE, 10.5,
'my_strategy', 'order_test')
# 异步市价买入
seq = xt_trader.order_stock_async(
account, '600000.SH',
xtconstant.STOCK_BUY, 1000,
xtconstant.LATEST_PRICE, 0,
'hft', 'fast_order') |
迁移注意事项:
- QMT使用单一
passorder函数通过opType数值(23/24/33/60...)区分买卖与品种;MiniQMT使用order_type常量(STOCK_BUY/STOCK_SELL等) - QMT报价类型用数值(5=最新价/11=指定价/14=对手价);MiniQMT用
xtconstant常量(FIX_PRICE/LATEST_PRICE及市价系列枚举) - quickTrade 精确语义:QMT
quickTrade=2表示"调用即报单"(对应order_stock默认行为);quickTrade=0表示"下根K线首tick触发",需在xtquant主循环里用run_time/定时器自行模拟;xtquantorder_stock默认就是"调用即立即报单" - QMT必须传入
ContextInfo对象;MiniQMT无需此参数 - QMT的
accountid是字符串;MiniQMT需构建StockAccount对象 - 便捷函数差异:QMT提供
order_target_percent等目标仓位/按比例下单函数(仅回测生效);xtquant无对应,需query_stock_positions+order_stock自行封装 - QMT的
algo_passorder/smart_algo_passorder算法/拆单函数在xtquant中无直接等价 - 代码不能直接复制粘贴,需重写下单逻辑
六、撤单函数
| 对比维度 | QMT(内置Python) | MiniQMT(xtquant) |
|---|---|---|
| 核心函数 | cancel()(统一撤单函数) |
cancel_order_stock()(同步)/ cancel_order_stock_async()(异步)/ cancel_order_stock_sysid_async()(按合同号) |
| 函数签名 | cancel(orderId, accountId, accountType, ContextInfo) |
cancel_order_stock(account, order_id)cancel_order_stock_async(account, order_id)cancel_order_stock_sysid_async(account, market, order_sysid) |
| 参数说明 | orderId: 委托号(需通过get_last_order_id或get_value_by_order_id获取)accountId: 资金账号accountType: 账号类型(如'STOCK')ContextInfo: 系统上下文对象 |
account: StockAccount对象order_id: 系统生成的订单编号(由order_stock返回)market: 交易市场(xtconstant.SH_MARKET等)order_sysid: 券商柜台合同编号(str) |
| 返回值 | 无明确返回值,通过orderError_callback获取错误信息 |
同步撤单返回撤单结果;异步撤单返回撤单请求序号(>0成功,-1失败);撤单失败通过on_cancel_error回调返回 |
| 代码示例 | # coding:gbk
def handlebar(ContextInfo):
# 先获取最新委托号
oid = get_last_order_id(
ContextInfo.accid, 'STOCK', 'order')
# 撤单
cancel(oid, ContextInfo.accid,
'STOCK', ContextInfo) |
# 按系统订单编号撤单
cancel_result = xt_trader.cancel_order_stock_async(
account, order_id)
# 按券商柜台合同编号撤单
cancel_result = xt_trader.cancel_order_stock_sysid_async(
account, xtconstant.SH_MARKET, "100") |
迁移注意事项:
- QMT使用单一
cancel函数,参数顺序为(orderId, accountId, accountType, ContextInfo);MiniQMT拆分为多个语义化方法 - QMT的
orderId需通过get_last_order_id等函数获取;MiniQMT的order_id由order_stock调用直接返回 - MiniQMT支持两种撤单方式:按系统订单编号(
order_id)和按券商柜台合同编号(order_sysid) - MiniQMT撤单失败信息通过独立的
on_cancel_error回调返回(QMT无对应回调,统一走orderError_callback)
七、账户信息查询
QMT(内置Python)与MiniQMT(xtquant)的查询接口形态完全不同:QMT使用统一的get_trade_detail_data函数,通过strDatatype字符串区分查询类型;MiniQMT使用独立的query_stock_*方法。
| 查询类型 | QMT(内置Python) | MiniQMT(xtquant) |
|---|---|---|
| 资产查询 | get_trade_detail_data(accountID, 'ACCOUNT', 'STOCK') |
xt_trader.query_stock_asset(account) |
| 持仓查询 | get_trade_detail_data(accountID, 'POSITION', 'STOCK') |
xt_trader.query_stock_positions(account) |
| 委托查询 | get_trade_detail_data(accountID, 'ORDER', 'STOCK')配合 get_value_by_order_id(...) |
xt_trader.query_stock_orders(account, cancelable_only=False) |
| 成交查询 | get_trade_detail_data(accountID, 'DEAL', 'STOCK') |
xt_trader.query_stock_trades(account) |
| 最新委托号 | get_last_order_id(account, type, 'order') |
由order_stock调用直接返回order_id |
| 参数说明 | accountID: 资金账号字符串strDatatype: 查询类型字符串('ACCOUNT'/'POSITION'/'ORDER'/'DEAL')第三参数: 品种类别('STOCK'等) |
account: StockAccount对象cancelable_only: 是否仅查询可撤委托(默认False) |
| 返回值 | 对应数据对象列表(字段名为m_xxx风格,如m_strInstrumentID) |
query_stock_asset: XtAsset对象或Nonequery_stock_positions: XtPosition列表或Nonequery_stock_orders: XtOrder列表或Nonequery_stock_trades: XtTrade列表或None |
| 代码示例 | # QMT统一查询接口
# 查询资产
asset = get_trade_detail_data(
account, 'ACCOUNT', 'STOCK')
# 查询持仓
positions = get_trade_detail_data(
account, 'POSITION', 'STOCK')
# 查询委托
orders = get_trade_detail_data(
account, 'ORDER', 'STOCK')
# 查询成交
trades = get_trade_detail_data(
account, 'DEAL', 'STOCK') |
# MiniQMT独立查询方法 # 查询资产 asset = xt_trader.query_stock_asset(account) # 查询持仓 positions = xt_trader.query_stock_positions(account) # 查询委托 orders = xt_trader.query_stock_orders(account, False) # 查询成交 trades = xt_trader.query_stock_trades(account) |
迁移注意事项:
- 函数形态完全不同:QMT用单一
get_trade_detail_data靠strDatatype字符串区分;MiniQMT用独立的query_stock_*方法,命名更语义化 - QMT最新委托号需
get_last_order_id单独获取;MiniQMT的order_stock调用后直接返回order_id account参数类型不同:QMT传字符串资金账号;MiniQMT传StockAccount对象- 返回值字段命名规则不同:QMT为
m_xxx(C++结构映射,如m_strInstrumentID);MiniQMT为snake_case(如stock_code),需对照各自数据字典 - MiniQMT查询失败返回
None
八、成交回报与回调函数
两者都能接收资金/委托/成交/持仓变动的实时推送,但注册与定义方式完全不同:QMT在策略中直接定义全局回调函数(由系统按名调用);MiniQMT需继承XtQuantTraderCallback类并注册实例。
| 推送类型 | QMT(内置Python 全局函数) | MiniQMT(xtquant 回调类方法) |
|---|---|---|
| 账号状态 | account_callback(ContextInfo, accountInfo) |
on_account_status(self, status)参数: status(XtAccountStatus对象) |
| 委托回报 | order_callback(ContextInfo, orderInfo)参数: ContextInfo上下文, orderInfo委托对象 |
on_stock_order(self, order)参数: order(XtOrder对象) |
| 成交回报 | deal_callback(ContextInfo, dealInfo)参数: ContextInfo, dealInfo成交对象 |
on_stock_trade(self, trade)参数: trade(XtTrade对象) |
| 持仓变动 | position_callback(ContextInfo, positionInfo) |
无独立回调,持仓变动合并在on_stock_trade中或通过query_stock_positions查询获得 |
| 任务状态 | task_callback(ContextInfo, taskInfo) |
—(无对应) |
| 下单异常 | orderError_callback(ContextInfo, passOrderInfo, msg) |
on_order_error(self, order_error)参数: order_error(XtOrderError对象) |
| 撤单异常 | —(统一走orderError_callback) |
on_cancel_error(self, cancel_error)参数: cancel_error(XtCancelError对象) |
| 异步下单回报 | —(内置无显式异步,依赖主推) | on_order_stock_async_response(self, response)参数: response(XtOrderResponse对象) |
| 连接状态回调 | 无明确对应 | on_disconnected(self) |
| 生效前提 | 必须先在init中调用ContextInfo.set_account(account),主推才会推送;回调是与init/handlebar平级的全局函数,由系统按名调用 |
需register_callback(回调类实例)注册回调;需先connect()建连,再subscribe(account)订阅账号主推;断线触发on_disconnected() |
| 代码示例 | # coding:gbk
def init(ContextInfo):
# 主推生效前提:必须先 set_account
ContextInfo.set_account('1000000365')
def order_callback(C, orderInfo):
print(orderInfo.m_strInstrumentID,
orderInfo.m_nOrderStatus)
def deal_callback(C, dealInfo):
print(dealInfo.m_strInstrumentID,
dealInfo.m_dTradePrice)
def orderError_callback(C, info, msg):
print(info.orderCode, msg) |
class MyCallback(XtQuantTraderCallback):
def on_stock_order(self, order):
print(f"委托状态:{order.order_status}")
def on_stock_trade(self, trade):
print(f"成交价:{trade.traded_price}")
def on_order_error(self, order_error):
print(f"下单失败:{order_error.error_msg}")
def on_account_status(self, status):
print(f"账号状态:{status.status}")
xt_trader.register_callback(MyCallback())
xt_trader.subscribe(acc) # 订阅后开始收主推 |
迁移注意事项:
- QMT回调函数为全局函数,直接在策略中定义即可,由系统按名调用;MiniQMT需继承
XtQuantTraderCallback类并调用register_callback(实例)注册 - QMT回调第一个参数均为
ContextInfo;MiniQMT回调第一个参数均为self - QMT回调函数名(
order_callback/deal_callback/account_callback)与MiniQMT(on_stock_order/on_stock_trade/on_account_status)完全不同 - 持仓变动差异:QMT有独立
position_callback;MiniQMT无独立持仓回调,持仓变动信息包含在on_stock_trade中或需主动调用query_stock_positions查询 - 异步下单回调:QMT无显式异步下单接口,依赖主推;MiniQMT有独立的
on_order_stock_async_response回调,配合order_stock_async使用 - 生效前提不同:QMT需在
init中set_account;MiniQMT需register_callback+connect+subscribe三步 - 数据结构字段命名规则不同:QMT为
m_xxx(如m_strInstrumentID);MiniQMT为snake_case(如stock_code),需对照各自数据字典
九、其他关键差异速览
| 维度 | 内置Python | xtquant |
|---|---|---|
| Python版本 | 客户端内置3.6,版本旧、库受限 | 本机3.6~3.13任选,生态完整 |
| 回测框架 | 原生提供(回测/运行按钮、回测结果报告) | 无回测框架,需自建或接第三方 |
| 并行/多线程 | 策略串行,一个卡死影响其他 | 可多线程、多进程并行跑多个策略 |
| 第三方库 | 需券商白名单 | 任意pip包 |
| 数据范围 | 与客户端一致(需本地补数据) | 与MiniQMT一致(同行情服务器) |
| 部署形态 | 必须在客户端内运行 | 任意机器,只要能连上MiniQMT |
| 典型缺点 | 环境封闭、版本旧、串行 | 无回测、要自己搭工程、要保活进程 |
十、交易操作码速查表(迁移时最易踩坑)
内置passorder用整数操作码,xtquant用xtconstant语义枚举。下面给出xtquant侧权威枚举(取自手册xttrader数据字典),以及内置侧已核实的整数码示例与对应关系。
10.1 xtquant xtconstant 权威枚举
委托类型 order_type(股票 / 信用 / 期货 / 期权)
| xtconstant | 含义 |
|---|---|
STOCK_BUY / STOCK_SELL | 股票买入 / 卖出 |
CREDIT_BUY / CREDIT_SELL | 信用担保品买入 / 卖出 |
CREDIT_FIN_BUY / CREDIT_SLO_SELL | 融资买入 / 融券卖出 |
CREDIT_BUY_SECU_REPAY / CREDIT_DIRECT_SECU_REPAY | 买券还券 / 直接还券 |
CREDIT_SELL_SECU_REPAY / CREDIT_DIRECT_CASH_REPAY | 卖券还款 / 直接还款 |
FUTURE_OPEN_LONG / FUTURE_CLOSE_LONG_HISTORY / FUTURE_CLOSE_LONG_TODAY | 期货开多 / 平昨多 / 平今多 |
FUTURE_OPEN_SHORT / FUTURE_CLOSE_SHORT_HISTORY / FUTURE_CLOSE_SHORT_TODAY | 期货开空 / 平昨空 / 平今空 |
FUTURE_CLOSE_LONG_TODAY_FIRST / FUTURE_CLOSE_LONG_HISTORY_FIRST | 期货平多(优先平今 / 优先平昨) |
FUTURE_CLOSE_SHORT_TODAY_FIRST / FUTURE_CLOSE_SHORT_HISTORY_FIRST | 期货平空(优先平今 / 优先平昨) |
STOCK_OPTION_BUY_OPEN / SELL_CLOSE / SELL_OPEN / BUY_CLOSE | 股票期权买开 / 卖平 / 卖开 / 买平 |
STOCK_OPTION_COVERED_OPEN / COVERED_CLOSE | 备兑开仓 / 备兑平仓 |
STOCK_OPTION_CALL_EXERCISE / PUT_EXERCISE | 认购 / 认沽行权 |
ETF_PURCHASE / ETF_REDEMPTION | ETF申赎 |
期货还有「两键风格」(FUTURE_OPEN / FUTURE_CLOSE)、「跨商品套利」(FUTURE_ARBITRAGE_OPEN等)、「展期」(FUTURE_RENEW_LONG_*等) 系列枚举,详见手册xttrader数据字典。
报价类型 price_type
| xtconstant | 含义 | 适用 |
|---|---|---|
LATEST_PRICE | 最新价 | 全市场 |
FIX_PRICE | 指定价 | 全市场 |
MARKET_SH_CONVERT_5_CANCEL | 最优五档即时成交剩余撤销 | 上交所/北交所股票 |
MARKET_SH_CONVERT_5_LIMIT | 最优五档即时成交剩转限价 | 上交所/北交所股票 |
MARKET_PEER_PRICE_FIRST / MARKET_MINE_PRICE_FIRST | 对手方 / 本方最优价格 | 上交所/深交所/期权 |
MARKET_SZ_INSTBUSI_RESTCANCEL | 即时成交剩余撤销 | 深交所 |
MARKET_SZ_CONVERT_5_CANCEL | 最优五档即时成交剩余撤销 | 深交所 |
MARKET_SZ_FULL_OR_CANCEL | 全额成交或撤销 | 深交所 |
MARKET_BEST / MARKET_CANCEL / MARKET_CANCEL_ALL | 期货市价系列 | 郑商所/大商所 |
MARKET_CANCEL_1 / MARKET_CANCEL_5 / MARKET_CONVERT_1 / MARKET_CONVERT_5 | 期货市价系列 | 中金所 |
市价类仅实盘生效,模拟环境不支持;完整期货市价枚举见手册xttrader数据字典。
委托状态 order_status(回调里 order.order_status 的取值)
| 值 | 含义 | 值 | 含义 |
|---|---|---|---|
| 48 | 未报 | 53 | 部撤 |
| 49 | 待报 | 54 | 已撤 |
| 50 | 已报 | 55 | 部成 |
| 51 | 已报待撤 | 56 | 已成 |
| 52 | 部成待撤 | 57 | 废单 / 255 未知 |
账号状态 account_status(回调里 status.status 的取值):-1 无效 / 0 正常 / 1 连接中 / 2 登陆中 / 3 失败 / 4 初始化中 / 5 数据刷新校正中 / 6 收盘后 / 7 穿透副链接断开 / 8 系统停用 / 9 用户停用。
多空 direction / 交易操作 offset_flag:DIRECTION_FLAG_LONG=48 多 / SHORT=49 空;OFFSET_FLAG_OPEN=48 买入·开仓 / CLOSE=49 卖出·平仓 / CLOSETODAY=51 平今 / CLOSEYESTERDAY=52 平昨。
10.2 内置 passorder 数据字典与对应关系
内置侧整数码在手册passorder参数说明页以分表给出,提取到的可靠示例值如下:
| 维度 | 已核实整数码 | 含义 | 对应xtconstant |
|---|---|---|---|
| opType | 23 | 股票买入 | STOCK_BUY |
| 24 | 股票卖出 | STOCK_SELL | |
| 33 | 信用担保品买入 | CREDIT_BUY | |
| 60 | ETF申购(一级申赎) | ETF_PURCHASE | |
| orderType | 1101 | 普通(按股数) | 隐含在 order_type |
| 1202 | 按金额/市值(示例中 volume=50000) | — | |
| prType | 5 | 最新价 | LATEST_PRICE |
| 11 | 指定价 | FIX_PRICE | |
| 14 | 对手价(对方一档价格) | 期货市价系列 | |
| quickTrade | 0/1/2 | 下单时机控制(见10.3) | 无(xtquant默认立即报单) |
10.3 quickTrade 精确语义(内置侧特有的下单时机开关)
| quickTrade | 触发时机(取自学册原文) |
|---|---|
| 0(缺省) | 信号在最后一根K线走完后生成 → 在下一根K线的第一个tick触发下单 |
| 1 | 非历史bar上,策略模型一旦调用到就触发下单 |
| 2 | 不判断bar状态,调用到就触发;历史bar上也能触发 |
xtquant没有quickTrade概念:order_stock默认就是「调用即立即报单」,由你自己的主循环控制时机。因此从内置迁xtquant时,原quickTrade=2的「立即下单」语义天然对应order_stock的默认行为;原quickTrade=0的「下根bar首tick触发」需要你在主循环里自己用run_time/定时器模拟。
十一、主推回调对象字段速查
主推回调拿到的对象,内置侧是m_xxx属性(C++结构映射),xtquant侧是snake_case属性(Python对象)。下面列出最常用的字段(完整字段以手册 data_structure / xttrader 数据字典为准)。
11.1 内置侧(orderInfo / dealInfo / accountInfo)
| 回调 | 对象 | 常用字段(示例) |
|---|---|---|
order_callback | orderInfo | m_strInstrumentID(代码)、m_nOrderStatus(状态)、m_strOrderSysID(合同号) |
deal_callback | dealInfo | m_strInstrumentID、m_dTradePrice(成交价)、m_nTradeVolume(成交量) |
account_callback | accountInfo | 资金账号状态(完整字段见手册data_structure页) |
position_callback | positonInfo | 持仓变动(完整字段见手册) |
orderError_callback | orderArgs + errMsg | 下单参数 + 错误文本(如「指定价 无效, 无法下单!」) |
内置侧对象字段需用dir(pythonobj)在运行期查看完整属性;手册在data_structure.html给出orderInfo/dealInfo/accountInfo全字段表。
11.2 xtquant 侧(order / trade / order_error / status)
| 回调方法 | 对象 | 常用字段(示例) |
|---|---|---|
on_stock_order(order) | XtOrder | stock_code、order_status(见10.1)、order_sysid、account_id、order_id |
on_stock_trade(trade) | XtTrade | account_id、stock_code、order_id、order_sysid、traded_volume、traded_price |
on_order_error(order_error) | XtOrderError | order_id、error_id、error_msg |
on_cancel_error(cancel_error) | XtCancelError | order_id、error_id、error_msg |
on_account_status(status) | XtAccountStatus | account_id、account_type、status(见10.1) |
on_order_stock_async_response(resp) | XtOrderResponse | order_id、seq、error_id、error_msg |
xtquant的XtOrder/XtTrade/XtAsset/XtPosition结构中,stock_code(代码)、direction(多空 48/49)、offset_flag(开平 48/49/51/52)字段用于区分买卖与开平仓;order_sysid是券商柜台合同号,可用于cancel_order_stock_sysid撤单。
十二、迁移总结
| 迁移项 | 改动难度 | 关键改动点 |
|---|---|---|
| 下单 | 高 | 函数名从passorder改为order_stock;参数从数值常量改为xtconstant枚举;需构建StockAccount对象;移除ContextInfo参数;便捷函数(order_target_percent等)xtquant无对应,需自行封装 |
| 撤单 | 中 | 函数从cancel(orderId, accountId, accountType, ContextInfo)改为cancel_order_stock系列;委托号获取方式从get_last_order_id改为order_stock直接返回;MiniQMT新增on_cancel_error独立撤单错误回调 |
| 账户查询 | 中 | 函数形态完全不同:QMT统一用get_trade_detail_data(accountID, strDatatype, 'STOCK')靠字符串区分类型;MiniQMT用独立的query_stock_asset/positions/orders/trades方法;返回值字段名从m_xxx改为snake_case |
| 回调函数 | 高 | 从全局函数改为继承类;函数名全部变更(order_callback→on_stock_order等);需注册回调实例;生效前提从set_account改为register_callback+connect+subscribe三步;MiniQMT无独立position_callback,需合并到on_stock_trade或主动查询 |
通用迁移建议:
- 将所有
passorder调用替换为order_stock/order_stock_async,参数映射参考上表 - 将字符串
accountid改为StockAccount(accountid)对象 - 将
prType数值(5/11/14)替换为xtconstant.LATEST_PRICE/FIX_PRICE等常量 - 回调函数从全局定义改为继承
XtQuantTraderCallback类 - 查询函数需整体重写:从
get_trade_detail_data(accountID, strDatatype, 'STOCK')改为对应的query_stock_*方法 - 撤单函数从
cancel(orderId, accountId, accountType, ContextInfo)改为cancel_order_stock系列