Files
sanguo_vnpy_v2/docs/design/2026-09-07-miniqmt-shutdown-migration-assessment.md
T
claude_dev 5bfde82f2b
CI/CD / test (push) Successful in 26s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 8s
docs: 迁移评估§6——P1~P3实施记录+VPS手工部署位清单+09-08新坑+自愈链设计+剩余工序 [nas]
2026-09-08 13:26:01 +08:00

14 KiB
Raw Blame History

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_convert v0.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_data 346s
  • 我方压力:16 引擎轮询叠加(vnpy_qmt EVENT_TIMER + bullet_trade LiveEngine 轮询 query_orders/trades)开盘段可能 >20 req/s
  • 对策(工程化可解):①组合实盘链路本就是轮询制,迁移时顺势切回调制(对方有全套推送)或调低轮询频率 ②get_financial_data/download_financial_data 等重数据腿限时盘后跑或改走本地 sanguo_datafundamentals provider 本就有本地化计划)

🟡 R4xtdata 长尾接口待验证(xt_eod 断供风险)

  • 对方明确缺口:get_sector_list/get_holidays 仅 fallback、get_stock_type 不可用
  • 我方在用但对方报告未明确列出的:get_stock_list_in_sectorxt_eod 的 ETF/基金/北交所名单命脉)、get_index_weight/get_divid_factors/get_trading_datesbullet_trade MiniQMTProvider)——需装好后逐个验证;call_method 万能入口可兜底一部分
  • 若不支持:ETF/基金/北交所 EOD 断供 → 数据 session 另找源(与交易迁移解耦)

二、接口对照(我方最小集 vs 对方兼容面)

交易(三形态合并去重)——全绿

我方调用 对方实现 备注
XtQuantTrader(path,session)/start/connect/subscribe/stop/register_callback shim BigQmtXtTraderxtquant_compat.py:4864 connect 语义=连 Redis/ZMQsession_id 撞车问题(08-30 案)自动消失path 参数失效
order_stock 同步 8 参(bridge/bullet_trade :3576-3586int 子类 OrderId>0 成功/-1 失败,str()=合同号) 契约同 miniQMT
order_stock_asyncvnpy_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/:3495async 变体 :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+XADDstream maxlen 2000 可短时回放),柜台回报 ms 级
StockAccount(id[,type])/XtOrder/XtTrade/.../xtconstantORDER_* 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 顶替 xtdataget_full_tick 注意 types 参数
xt_eod 采集 schtask get_stock_list_in_sector+download_history_data2 客户端 pip 包装上即连(跨平台),R4 验证后定去留

连接参数变化SANGUO_QMT_PATHuserdata_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+强密码)或 ZMQdeploy_qmt_bridge.ps1QMT 模型交易页加载 BIGQMT_REDIS_DRYRUN.py实盘模式、不勾"启动本地python" server 起、Redis 队列可见
P2 只读验证 D+1~2 pip 装 clienteditable 防 shim 冲突);跑通 query_stock_asset/positions/orders + get_full_tickR1 模拟模式实测 + 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 后更新)

  1. R1 验证:模拟账号+完整版QMT+运行模式实盘 的下单/回报闭环 09-08 关闭:国金版没有「运行模式」控件(README 作者券商版才有);模拟账号下单天然走模拟柜台(第十套),实弹直测即通,P3 全绿
  2. 双开共存验证 09-07 双进程整夜共存实证(mini PID 17488 / XtItClient / miniquote 同 bin.x64
  3. 账号规划:66639661 已确认完整版可登录(09-07 用户实测)→ 终态沿用,账本/remark 指纹连续;1000w 新模拟账号备用未启用
  4. R4 四个 xtdata 接口验证清单 09-07 深夜数据 session 三发实测全绿(get_stock_list_in_sector / download_history_data2 北交920 / get_market_data_ex 268根含当日bar
  5. 策略 session 参与:P4 影子试水 + P5 全量切换涉及策略代码/调度,需策略 session 联合(三向一致性检查按项目 CLAUDE.md 流程走 Gitea Issue
  6. 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.pyxbc_p2b.pyP2 只读探针)、p3_flip_config.py(闸门翻转)、p3_smoke.py(冒烟)、qmt_status.pylauncher 探针)、bridge_data_test.pyR4 数据三发,data session)、r353_pkgxbc_src.zipprobe_*.txt 操作工具箱
C:\国金QMT交易端模拟\python\ 桥 server 5 件套 + bigqmt_signal_trader_local_config.pyrpc_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.34.4.4 需 py3.8 的 typing.LiteralQMT 内置 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.2qmt_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} stream50→56(全成)/50→54(已撤)
成交回报推送 bigqmt:trade_events:{acc} stream:含 trade_id/金额/commission
持仓残留 +642 元 ETF510050×100+159915×100),用户次日人工平

6.3 新坑(09-08 增补)

  1. 配置改完必须重启策略rpc_allow_order_methods 等只在策略启动时读盘;远程确认 server 内存值用 ping RPC(返回 allow_order_methods 字段)——诊断利器
  2. 两道闸两种报错ValueError: rpc method is not allowed = 方法不在白名单(False 时的表现);PermissionError: order rpc methods are disabled = 显式关单——都指向闸门未开,别混淆
  3. 裸 RPC 字段名:订单里 remark 字段是 remark/user_order_id,不是 order_remark(脚本过滤用错会显示 0 但数据在)
  4. 「编辑策略交易」弹窗无运行模式控件(国金定制):模拟/实盘切换按钮在主界面;模拟账号下单天然走模拟柜台
  5. qmt_launcher restart 会连杀 miniQMTmini/完整版/miniquote 同属一个 bin.x64,按目录隔离也躲不开——只在维护窗用16 引擎全停时)
  6. get_full_tick 实时性判据:timetag 字段盘中应实时跳动,隔夜值停在 00:00

6.4 自愈链设计(三环,第二环待确认)

机制 状态
① 策略自动运行 QMT「编辑策略交易」勾「终端启动后自动运行」(已配延迟 10 秒) 09-08 已勾
② 客户端自动登录 项目自带 qmt_launcherVPS 无免密 bat、login 模式受 RDP 锁屏限制 → 唯一路径 = exe 模式 + QMT 登录框「记住密码」(待用户 RDP 确认有无此勾选);确认后注册看门狗 schtaskis_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 有效)