14 KiB
miniQMT 停服迁移评估(xtquant_big_convert / 大QMT RPC)
2026-09-07 infra session 出品。背景:券商通知 2026-09-18 停 miniQMT(用户与国金确认),VPS 上 8 组合实盘 + 8 影子 + CTA/bridge/monitor + xt_eod 采集全部依赖 XtMiniQmt(模拟端,账号 66639661)。 依据:双 agent 只读探查(对方仓库
~/.openclaw/sanguo_projects/xtquant_big_convertv0.3.25 + 我方调用面盘点),本文引用均来自探查报告的文件:行号。
一、结论
方向可行:xtquant_big_convert 的 xtquant shim 兼容面覆盖我方三形态全部交易 API 与绝大多数行情 API,回调机制完整,多客户端(16 引擎)协议级支持。 但有 4 个风险,其中前 2 个是 go/no-go 级,必须在动手前闭环:
🔴 R1(置顶,09-07 用户澄清后收窄):「实盘模式」指模型交易页的运行模式单选,非账号类型
- 用户澄清(符合 QMT 产品形态):QMT 与 miniQMT 是同一客户端——登录时勾「独立交易」进 miniQMT,不勾即进完整版大 QMT;模拟/实盘是账号维度,正交
- 我们的搭建路径 = 模拟账号 66639661 登录 + 不勾独立交易 → 完整版 QMT(模拟柜台上的纸面交易性质不变)
- 对方 README.md:264「模拟模式下单返回 -1」应指模型交易页「运行模式」选了模拟那一档;部署文档要求「运行模式切实盘」——即:模拟账号 + 运行模式=实盘(单走模拟柜台)是正解
- 待实测闭环:模拟账号登录完整版 QMT 后,模型交易页能否选到实盘运行模式 + 回报/查询完整;不行则问维护者(项目日更活跃)
🟡 R2(09-07 用户澄清后降级):同一客户端,无需另装/另批权限
- VPS 已装的
C:\国金QMT交易端模拟\即完整安装(XtMiniQmt.exe 只是其中一个入口 exe) - 剩余动作:RDP 启动主程序(XtItClient.exe)+ 下载 python 库组件;⚠️ 需验证完整版 QMT 与常驻的 XtMiniQmt.exe 同装同机共存(16 引擎还挂在 mini 上,迁移期双开是常态——userdata/柜台会话是否互斥要实测)
🟡 R3:串行吞吐与头阻塞
- 对方约束:交易类请求全部 defer 到 QMT 主线程 adjust 串行(Redis 串行 20 次/s,4 线程并发 143 次/s);慢调用堵队列(实测首次
get_financial_data346s) - 我方压力:16 引擎轮询叠加(vnpy_qmt EVENT_TIMER + bullet_trade LiveEngine 轮询 query_orders/trades)开盘段可能 >20 req/s
- 对策(工程化可解):①组合实盘链路本就是轮询制,迁移时顺势切回调制(对方有全套推送)或调低轮询频率 ②
get_financial_data/download_financial_data等重数据腿限时盘后跑或改走本地 sanguo_data(fundamentals provider 本就有本地化计划)
🟡 R4:xtdata 长尾接口待验证(xt_eod 断供风险)
- 对方明确缺口:
get_sector_list/get_holidays仅 fallback、get_stock_type不可用 - 我方在用但对方报告未明确列出的:
get_stock_list_in_sector(xt_eod 的 ETF/基金/北交所名单命脉)、get_index_weight/get_divid_factors/get_trading_dates(bullet_trade MiniQMTProvider)——需装好后逐个验证;call_method万能入口可兜底一部分 - 若不支持:ETF/基金/北交所 EOD 断供 → 数据 session 另找源(与交易迁移解耦)
二、接口对照(我方最小集 vs 对方兼容面)
交易(三形态合并去重)——全绿 ✅
| 我方调用 | 对方实现 | 备注 |
|---|---|---|
XtQuantTrader(path,session)/start/connect/subscribe/stop/register_callback |
shim BigQmtXtTrader(xtquant_compat.py:4864) |
connect 语义=连 Redis/ZMQ;session_id 撞车问题(08-30 案)自动消失;path 参数失效 |
order_stock 同步 8 参(bridge/bullet_trade) |
:3576-3586,int 子类 OrderId(>0 成功/-1 失败,str()=合同号) | 契约同 miniQMT |
order_stock_async(vnpy_qmt) |
:4184-4208,<1ms 返回 seq | 「事件先于响应」常态,按 order_remark 设屏障(我们 remark 指纹体系现成) |
cancel_order_stock(_sysid)(+async) |
:4333/:4312/:4654/:4701 | 返回 0 成功/-1 失败 |
query_stock_asset/positions/orders/trades(+async+callback 参数) |
:3222/:3322/:3473/:3495,async 变体 :4584-4651 | 服务端白名单 137 只读+3 下单 |
回调 on_disconnected/on_stock_asset/on_stock_order/on_stock_trade/on_stock_position/on_order_error/on_cancel_error/on_order_stock_async_response/on_cancel_order_stock_async_response |
XtQuantTraderCallback 基类全套(xtquant_compat.py:88-123) |
Redis PUBLISH+XADD(stream maxlen 2000 可短时回放),柜台回报 ms 级 |
StockAccount(id[,type])/XtOrder/XtTrade/.../xtconstant(ORDER_* 48-57、市价链) |
shim xttype + 539 常量 | 我们三套状态码映射不用改 |
行情——大面积绿,四个待验证
| 我方调用 | 对方 |
|---|---|
get_full_tick(影子撮合价/涨跌停、实盘自检、fundamentals 批量) |
✅ 但注意破坏性变更:get_full_tick(["SH"]) 默认只取股票,要全量传 types=["all"] |
get_market_data(_ex)/get_local_data/get_instrument_detail/get_last_quote/subscribe_quote/subscribe_whole_quote/unsubscribe_*/download_history_data(2) |
✅(订阅多客户端引用计数共享) |
get_financial_data/download_financial_data |
✅ 但重腿盘后跑(R3) |
get_stock_list_in_sector / get_index_weight / get_divid_factors / get_trading_dates |
⚠️ 待验证(R4) |
三、我方三形态迁移差异(探查 B 的链路梳理)
| 形态 | 现状 | 迁移动作 |
|---|---|---|
| A. HTTP bridge(备胎) | 纯同步 API、无回调 | shim 顶替后零改动;remark 现传空——若启用需补指纹 |
| B. vnpy_qmt CTA(进程内) | 全 async+callback | shim 兼容签名;回调链最全,重点联调 |
| C. bullet_trade QmtBroker(组合实盘×8 主路径) | 同步 API+轮询制、回调只挂 on_disconnected、bt:live_{id}:{hash} remark 归因 |
最小改动:装 shim 即可跑;轮询 query 兼容;remark 往返保真是验收重点(对方 0.3.25 #216 正好修了 strategy_name 归因优先级) |
| 影子×8 | 无 xttrader,仅 xtdata 取价 | shim 顶替 xtdata;get_full_tick 注意 types 参数 |
| xt_eod 采集 schtask | get_stock_list_in_sector+download_history_data2 | 客户端 pip 包装上即连(跨平台),R4 验证后定去留 |
连接参数变化:SANGUO_QMT_PATH(userdata_mini 扫描)与 session_id 体系全部失效 → 换成 Redis/ZMQ 端点配置;live_accounts 注入 env 的机制保留,只换内容。多账号单 server 或多策略实例(对方 README.md:813-865)——我们单账号 66639661,单 server 足够。
执行回报广播过滤:对方按 account_id 广播全部委托/成交,16 引擎各自按 order_remark 过滤——我们已有 remark 指纹库(7b7667e 重建 own 集 + live_{id} 唯一 label),天然匹配。
四、灰度时间表(deadline 09-18,目标 09-15 全量切完留 3 天观察)
| 阶段 | 日 | 内容 | 闸门 |
|---|---|---|---|
| P0 前置 | 09-08 前 | 用户:券商确认大QMT权限+下载安装到 VPS(D:\国金证券QMT交易端\),下载 python 库组件 |
大 QMT 能登录(模拟+实盘口径都问清) |
| P1 部署 | D+1 | Redis-windows 装同机(bind 127.0.0.1+强密码)或 ZMQ;deploy_qmt_bridge.ps1;QMT 模型交易页加载 BIGQMT_REDIS_DRYRUN.py(实盘模式、不勾"启动本地python") |
server 起、Redis 队列可见 |
| P2 只读验证 | D+1~2 | pip 装 client(editable 防 shim 冲突);跑通 query_stock_asset/positions/orders + get_full_tick;R1 模拟模式实测 + R4 四接口验证 | 只读全绿;R1/R4 定性 |
| P3 下单冒烟 | D+2~3 | 官方 6 步灰度第 4 步开 rpc_allow_order_methods=True;模拟小单 1 笔买+卖,验 remark 往返/成交回报/撤单 |
冒烟单闭环 |
| P4 影子试水 | D+3~5 | 影子×1 切 shim 跑 2 个交易日,与 miniQMT 侧对照 | 撮合价/涨跌停判定无异常 |
| P5 全量 | D+5~8 | 8 影子全切 → 组合实盘逐个切(每切一个跑一日恒等式对账绿再切下一个);CTA/monitor/bridge 收尾 | 恒等式连续绿 |
| 回退 | 至 09-17 | miniQMT 在 09-18 前天然是回退路径(保留不卸载,env 切回即回退) | — |
五、开放项(按优先级,09-07 用户澄清 R2 后更新)
R1 验证:模拟账号+完整版QMT+运行模式实盘 的下单/回报闭环✅ 09-08 关闭:国金版没有「运行模式」控件(README 作者券商版才有);模拟账号下单天然走模拟柜台(第十套),实弹直测即通,P3 全绿双开共存验证✅ 09-07 双进程整夜共存实证(mini PID 17488 / XtItClient / miniquote 同 bin.x64)- 账号规划:66639661 已确认完整版可登录(09-07 用户实测)→ 终态沿用,账本/remark 指纹连续;1000w 新模拟账号备用未启用
R4 四个 xtdata 接口验证清单✅ 09-07 深夜数据 session 三发实测全绿(get_stock_list_in_sector / download_history_data2 北交920 / get_market_data_ex 268根含当日bar)- 策略 session 参与:P4 影子试水 + P5 全量切换涉及策略代码/调度,需策略 session 联合(三向一致性检查按项目 CLAUDE.md 流程走 Gitea Issue)
xt_eod 断供✅ 桥可全替无一项换源(README 能力表 + R4 实测);连接层代码切换(from xtquant import→ compat configure())= 数据 session 工序
六、09-08 P1~P3 实施记录(VPS 手工部署位,不在 git,升级/重装必读)
本节是活文档:桥的 VPS 侧部署全部为手工操作,git 里没有。任何「重装/升级上游版本」都要对照本节重打。
6.1 部署位全清单(VPS 49.232.102.198)
| 路径 | 内容 | 说明 |
|---|---|---|
C:\sanguo_bigqmt\ |
暂存区:entry_v4.py(入口补丁源)、redis_common_v4.py、xbc_p2b.py(P2 只读探针)、p3_flip_config.py(闸门翻转)、p3_smoke.py(冒烟)、qmt_status.py(launcher 探针)、bridge_data_test.py(R4 数据三发,data session)、r353_pkg、xbc_src.zip、probe_*.txt |
操作工具箱 |
C:\国金QMT交易端模拟\python\ |
桥 server 5 件套 + bigqmt_signal_trader_local_config.py(rpc_allow_order_methods=True 已开)+ 借壳入口「新建策略文件3.py」(=打补丁的 BIGQMT_REDIS_DRYRUN.py,勿在 QMT 编辑器里动它) |
server 侧 |
...\python\logs\bigqmt-pid*.log |
桥 pid 日志(只记 ERROR;正常输出看 QMT 面板 XtClient_Formula 日志) | 排障 |
bin.x64\Lib\site-packages\redis\ |
redis-py 3.5.3(4.4.4 需 py3.8 的 typing.Literal,QMT 内置 3.6 跑不了;残留 4.4.4 会遮蔽,必须清干净) | ⚠️ 版本钉死 |
C:\redis\ |
Redis 8.10.1 Windows 服务(127.0.0.1:6379 + requirepass,密码只在 redis.conf)+ C:\redis-data(--dir 必须先建否则 1067) |
RPC 总线 |
C:\Python310\Lib\site-packages\bigqmt_signal_trader\ |
客户端 0.3.25 + psutil 7.2.2(qmt_launcher 依赖,09-08 装) | client 侧 |
6.2 P3 冒烟记录(09-08 13:14,双市场全绿)
| 验证点 | 结果 |
|---|---|
| 沪市下单+成交 | ✅ 510050.SH 100股 @3.022(合同号 3263) |
| 深市下单+成交 | ✅ 159915.SZ 100股 @3.397(合同号 3264) |
| remark 往返 | ✅ p3smoke:0908:* user_order_id 完整回读 + strategy_name 显示在 QMT「报单来源」列 |
| 撤单 | ✅ 3265 挂 90% 低价 → cancel → success |
| 订单状态推送 | ✅ bigqmt:order_events:{acc} stream:50→56(全成)/50→54(已撤) |
| 成交回报推送 | ✅ bigqmt:trade_events:{acc} stream:含 trade_id/金额/commission |
| 持仓残留 | +642 元 ETF(510050×100+159915×100),用户次日人工平 |
6.3 新坑(09-08 增补)
- 配置改完必须重启策略:
rpc_allow_order_methods等只在策略启动时读盘;远程确认 server 内存值用pingRPC(返回allow_order_methods字段)——诊断利器 - 两道闸两种报错:
ValueError: rpc method is not allowed= 方法不在白名单(False 时的表现);PermissionError: order rpc methods are disabled= 显式关单——都指向闸门未开,别混淆 - 裸 RPC 字段名:订单里 remark 字段是
remark/user_order_id,不是order_remark(脚本过滤用错会显示 0 但数据在) - 「编辑策略交易」弹窗无运行模式控件(国金定制):模拟/实盘切换按钮在主界面;模拟账号下单天然走模拟柜台
- qmt_launcher restart 会连杀 miniQMT:mini/完整版/miniquote 同属一个 bin.x64,按目录隔离也躲不开——只在维护窗用(16 引擎全停时)
- get_full_tick 实时性判据:
timetag字段盘中应实时跳动,隔夜值停在 00:00
6.4 自愈链设计(三环,第二环待确认)
| 环 | 机制 | 状态 |
|---|---|---|
| ① 策略自动运行 | QMT「编辑策略交易」勾「终端启动后自动运行」(已配延迟 10 秒) | ✅ 09-08 已勾 |
| ② 客户端自动登录 | 项目自带 qmt_launcher:VPS 无免密 bat、login 模式受 RDP 锁屏限制 → 唯一路径 = exe 模式 + QMT 登录框「记住密码」(待用户 RDP 确认有无此勾选);确认后注册看门狗 schtask:is_qmt_running 为假 → open_qmt(mode=exe) |
⏳ |
| ③ 看门狗(VPS schtask,系统级) | 定时健康检查:is_qmt_running + redis ping + 桥 RPC ping,异常记日志/报警;与 Claude session 生死无关 |
⏳ 影子试水期间并行完善 |
6.5 剩余工序(09-18 大限倒计时)
| # | 工序 | 负责 | 前置 |
|---|---|---|---|
| 1 | 自愈链②确认(登录框记住密码)+③看门狗 schtask | infra(本 session) | 用户 RDP 看一眼 |
| 2 | 影子×1 切桥试水 2 交易日(撮合价/涨跌停判定对照 mini 侧) | 策略 session + infra 验收 | 恒等式绿 |
| 3 | 8 影子全切 → 8 实盘逐个切(每切一个跑一日恒等式对账绿再切下一个) | 策略 session + infra | #2 绿 |
| 4 | xt_eod/daily_update_xtdata 连接层改造(from xtquant import → compat configure()) |
数据 session | 独立可并行 |
| 5 | 回退预案保留:miniQMT 不卸载,env 切回即回退(至 09-17 有效) | — | — |