diff --git a/docs/xhs-miniqmt-bridge.md b/docs/xhs-miniqmt-bridge.md new file mode 100644 index 0000000..3e3c1e3 --- /dev/null +++ b/docs/xhs-miniqmt-bridge.md @@ -0,0 +1,260 @@ +# 小红书四页图文|MiniQMT 关停后怎么办(桥接 API 方案) + +> 素材来源:本仓库 `api/qmt_rest_new.py`(REST 桥接服务端)、`docs/api.md`(接口契约)、`py-client/`(外部 Python 策略端)、`py-client/etc/_global.yaml`(配置)。 +> 说明:全文所有账号、密码、TOKEN 均为占位符,**发布前不要把真实凭据写进图里或正文**。 + +--- + +## 一、发布总览 + +| 项 | 内容 | +| --- | --- | +| 主题 | MiniQMT(极简模式/外接 xtquant)关停后,老策略怎么继续跑 | +| 卖点 | 桥接 API:策略代码不搬家,大 QMT 只当"下单通道" | +| 页数 | 4 页(图文轮播) | +| 目标动作 | 评论区/私信"关停""桥接"→ 引导私聊 | +| 语气 | 同行分享、干货向,不喊单、不承诺收益 | + +--- + +## 二、四页文案(可直接做图) + +### 第 1 页:MiniQMT 关停后的几大问题 + +**主标题(大字)** +> MiniQMT 关停后,你的策略还能跑吗? + +**副标题(小字)** +> 4 个坑,90% 的人第一个就卡住 + +**正文(分条,每条一行,配极简图标)** + +| 图标 | 痛点 | 一句话讲透 | +| --- | --- | --- | +| 🔌 | **外接 xtquant 通道没了** | `XtQuantTrader` / `xtdata` 那套"独立进程连客户端"的入口关闭;外挂式策略、跟单程序、历史数据下载脚本集体失联 | +| 🐍 | **被迫搬进大 QMT 内置 Python** | 内置端是 Python 3.6 + GBK + 库受限:f-string、dataclasses、asyncio、第三方库可能全废,代码要重写 | +| 🧵 | **单线程、禁止阻塞** | 内置端所有策略共用一个线程,一个 `time.sleep` 或死循环,能把全部策略一起卡死 | +| ⚠️ | **下单没有返回值** | `passorder` 不回订单号,只能靠"投资备注 + 委托查询"对账;客户端查询还有几十毫秒到数秒延迟,照搬"下单即查"必然漏单、超单 | +| 💻 | **必须围着电脑转** | 客户端要登录、策略要手动点运行、电脑不能睡、断网断电容错全靠自己 | + +**页脚金句** +> 关停的不是"量化",是"连接方式"。 + +**设计**:深色背景 + 红色警示色标题;每条配一个 emoji 大图标;右侧竖排页码 "01/04"。 + +--- + +### 第 2 页:桥接 API 的方式(拆解 `qmt_rest_new.py`) + +**主标题** +> 不用改策略:把大 QMT 变成一台"下单服务器" + +**副标题** +> 一个文件,14 个 HTTP 接口,老代码继续跑 + +**核心原理(三句话,配一张数据流图)** + +``` +你的 Python 策略(独立进程、Python 3.14、随便装库) + │ HTTP + X-Token + ▼ +大 QMT 内置策略进程:qmt_rest_new.py(Tornado @ 0.0.0.0:10086) + │ 只做转发 + ▼ +passorder / get_trade_detail_data / ContextInfo(QMT 原生能力) +``` + +**这张图就是全部价值:策略留在外面,QMT 只当通道。** + +**服务端怎么跑(4 步启动流程)** +1. 校验账户与数据目录非空 → `set_account(账号)` +2. 从远端拉股票池 + 合并当前持仓 → 去重 +3. `set_universe()` 设置标的池 +4. 启动 Tornado 监听 `0.0.0.0:10086`,等待外部调用 + +**接口清单(14 个,按用途分四组)** + +| 分组 | 接口 | 用途 | +| --- | --- | --- | +| 上下文 | `GET /api/context/info` | 周期、资金、标的池等策略上下文 | +| 数据 | `GET /api/get/{类型}` | 股票名、上市日、总股本、股息因子、ETF、合约详情、ST 历史等 11 类单票查询 | +| 数据 | `POST /api/data/full_tick` | 实时 tick 行情 | +| 账户 | `GET /api/portfolio` | 资产 + 持仓 + 委托一次拿全 | +| 账户 | `GET /api/portfolio/assets`、`/positions`、`/order`、`/deal`、`/org/{类型}` | 资产、持仓、委托、成交、原始记录 | +| 交易 | `POST /api/trade/passorder` | 下单 | +| 交易 | `POST /api/trade/cancel_by_id` | 按柜台订单号撤单 | +| 交易 | `POST /api/trade/ipo_data` | 新股/新债发行数据 | +| 系统 | `GET /api/sys/python_version` | 看内置端 Python 版本 | + +**怎么调(一行代码的体感)** + +```python +# 外部策略端:改 base_url 就能跑 +client = Client(base_url="http://127.0.0.1:10086", token="<你的TOKEN>") +client.passorder(op_type=23, stock_code="600000.SH", volume=100, price=10.0) +``` + +服务端下单请求体也是大白话 JSON: + +```json +{"opType":23,"orderType":1101,"stockCode":"600000.SH", + "prType":11,"price":10.0,"volume":100, + "quickTrade":2,"strategyName":"trend","orderId":"trend-BUY-001"} +``` + +**这套方案的 3 个硬优势** +- ✅ **策略代码零改动**:老策略、老库、老 Python 版本全部留在外部进程 +- ✅ **绕开 Python 3.6 / GBK**:内置端只跑一个转发文件,不跑你的业务逻辑 +- ✅ **一份服务,多端复用**:本机策略、远程脚本、手机查持仓,都走同一个 API + +**必须知道的 4 个坑(专业感来源,也是引流钩子)** +- ⚠️ **Token 是唯一门禁**:`X-Token` 不对一律拒绝;端口开在 `0.0.0.0`,别直接把 10086 暴露到公网,建议只绑内网或加白名单 +- ⚠️ **下单"成功"≠ 成交**:`status: success` 只代表底层没抛异常;查询查的是客户端本地缓存,不是柜台实查 +- ⚠️ **服务端不做幂等**:超时重发可能变成两单,`orderId` 去重要在自己策略里做 +- ⚠️ **首启依赖远端股票池**:远端超时或返回格式不对,服务直接起不来 + +**页脚金句** +> 关停逼你换的不是策略,是"接口层"。 + +**设计**:白底科技蓝;上半部分放数据流图(三个方框 + 箭头);下半部分放接口表格,只保留"分组 + 代表接口";右下角放一行代码截图感的小卡片。 + +--- + +### 第 3 页:个人 PC 全自动运行(开机 → 登录 → 起服务 → 跑策略) + +**主标题** +> 人不在电脑前,策略照样跑 +> ——个人 PC 无人值守 5 步搞定 + +**副标题** +> 断电重启后全自动恢复,早上打开手机就能看持仓 + +**Step 1|开机就启动客户端** +- `Win + R` → 输入 `shell:startup` → 把 QMT 快捷方式复制进去(最简单,免管理员) +- 更稳的做法:任务计划程序 → 勾选"不管用户是否登录都运行" + "使用最高权限" + 延迟 1–2 分钟启动(等网络和驱动就绪) +- 🚫 **安装路径不要带中文**,例如 `D:\quant\qmt`,中文路径容易让内置 Python 直接崩 + +**Step 2|自动登录(关停后最容易翻车的一步)** +- 客户端登录界面先勾"记住账号 + 记住密码",能覆盖大部分场景 +- 有验证码/弹窗时,记住密码不够用,需要**窗口自动化兜底**: + - 交易时段每 10 分钟探活一次(用交易日历排除周末和节假日) + - 没进程就拉起客户端 → 激活登录窗口 → 填密码 → 回车 + - 每步都带重试,失败写日志,便于第二天排查 +- 关键前提:**策略自身必须配成"客户端启动后自动运行"**,否则软件开了策略还是停的 + +**Step 3|客户端内把"自动"全勾上** +- 模型交易 → 新建策略交易 → 选策略 + 资金账号 → 运行模式选实盘 +- 勾选 **"终端启动后自动运行"**,登录延迟设 10 秒左右 +- 交易设置里开启 **盘前自动重启**(如 8:30),刷新行情连接,避免隔夜卡顿 +- 多个策略就每条都建一条策略交易、都勾自动运行 + +**Step 4|外部策略进程也得活下去** +- 用任务计划程序托管外部策略:开机启动 / 断线重启 / 最高权限 +- 进程内自检:定时 `GET /api/sys/python_version` 或 `/api/context/info` 做**心跳**,返回异常就重连并告警 +- 日志落盘(绝对路径),关键动作全部留痕:下单、撤单、心跳失败、重连次数 + +**Step 5|把"睡着"这件事彻底掐死** +- 电源设置:屏幕和睡眠都设 **"从不"**;笔记本长期插电 +- 设备管理器 → 网卡 → 电源管理 → **取消勾选"允许计算机关闭此设备以节约电源"** +- 高级电源设置:无线适配器改"最高性能",硬盘设为"从不关闭" +- 台式机在 BIOS 里开 **"来电自动开机"**,停电恢复后能自己爬起来 +- 兜底:装远程桌面工具,人不在也能看一眼服务是否在跑 + +**页脚金句** +> 自动化的本质不是"不用管",而是"坏了能自己回来"。 + +**设计**:浅色底 + 五个编号圆角卡片纵向排列,每张卡片左侧一个大数字(01–05),右侧 2–3 行短句;最后一行放一句金句。 + +--- + +### 第 4 页:有问题可以私我 + +**主标题** +> 卡在哪一步了? + +**副标题** +> 关停不可怕,可怕的是自己瞎折腾一整天 + +**正文(我这边能帮你看)** +- 🧩 **策略迁移评估**:你的老策略能不能桥接?哪些地方必须动? +- 🔌 **桥接服务部署**:`qmt_rest_new.py` 怎么落地到你的 QMT,接口怎么调通 +- 🔁 **订单对账**:下单没返回值、漏单/超单/重复单,怎么用备注 + 委托查询兜住 +- 🖥️ **无人值守**:开机自启、自动登录、防休眠、断线重连、告警 +- 📩 评论区回 **"桥接"** 或直接私信,说明你的情况(券商 / 策略语言 / 卡在哪一步),我按顺序回 + +**页脚(合规与免责,必须留)** +> 仅交流技术实现,不构成投资建议,不承诺收益。 +> 量化有风险,策略与运维问题请自行验证后再上实盘。 + +**设计**:与第 1 页呼应的深色底;中间放 4 个圆角标签;底部留大面积"私信我"引导区 + 小字免责声明。 + +--- + +## 三、小红书正文(复制即用) + +``` +MiniQMT 关停,最先崩掉的不是策略,是"连接方式"。 + +很多人第一反应是:完了,策略要重写。 +其实先别急着改代码—— + +大 QMT 内置 Python 是 3.6 + GBK + 单线程, +把几百行策略硬搬进去,f-string、第三方库、定时调度全得重来, +还要担心一个 sleep 卡死全部策略。 + +更省事的思路是:让大 QMT 只当"下单通道"。 + +做法很简单: +在 QMT 里挂一个桥接文件,开一个本地 HTTP 服务(默认 10086,带 Token 鉴权), +把下单、撤单、持仓、资产、委托、成交、tick 行情全部包成接口。 +你的 Python 策略继续待在外面,用 http 调用,代码基本不用改。 + +再配上个人 PC 的无人值守五件套: +开机自启 → 自动登录 → 客户端内"终端启动后自动运行" → 外部策略进程守护 → 防休眠防断网(含 BIOS 来电自启), +断电重启也能自己恢复。 + +当然有几个坑要提前知道: +· Token 是唯一门禁,端口别暴露公网 +· 下单"成功"不等于成交,查询查的是客户端缓存 +· 服务端不做幂等,超时重发小心变双单 + +完整拆解我做了 4 张图,从"关停后几大问题"到"接口清单"再到"无人值守步骤"都在图里 👉 左滑 + +(仅技术交流,不构成投资建议,不承诺收益) +``` + +--- + +## 四、标题备选(挑一个,建议 A/B 两版) + +| 序 | 标题 | 风格 | +| --- | --- | --- | +| 1 | MiniQMT 关停后怎么办?完整解决办法 | 结果导向,最推荐 | +| 2 | MiniQMT 停了,但我的策略还在自动下单 | 悬念感 | +| 3 | 关停不是终点:把大 QMT 变成下单服务器 | 技术向 | +| 4 | MiniQMT 关停 + 电脑无人值守,4 张图讲透 | 干货合集 | +| 5 | 别急着重写策略,先看这个桥接方案 | 反直觉钩子 | + +## 五、话题标签 + +``` +#MiniQMT #QMT #量化交易 #Python量化 #程序化交易 #量化策略 #自动交易 #xtquant #量化新手 #程序员副业 #无人值守 #技术分享 +``` + +--- + +## 六、发布要点(合规提醒) + +1. **不要出现真实账号、密码、TOKEN、IP、端口映射截图**;图里的 Token 一律打码或用占位符。 +2. 不写"稳赚""躺赚""保收益";不展示具体收益截图诱导交易。 +3. 券商开户/软件权限类话题容易被判定为引流,建议只谈技术实现,把商务信息放私信。 +4. 提到"开户""低佣"等内容时务必谨慎,容易触发平台风控。 +5. 四页图建议统一比例(3:4,1080×1440),第 1 页负责停留,第 2 页负责专业度,第 3 页负责收藏,第 4 页负责转化。 + +## 七、资料来源 + +- 桥接服务端实现:`api/qmt_rest_new.py`(14 个路由、Token 鉴权、启动流程) +- 接口契约细节:`docs/api.md`(字段、错误码、下单与撤单语义) +- 外部策略端调用方式:`py-client/sdk/client.py`、`py-client/sdk/trade.py` +- 部署与自启参考:[QMT 本地电脑全自动开机运行全教程](https://licai.cofool.com/user/guide_view_3452029.html)、[国金 QMT 自动登录(Python 版)](https://blog.csdn.net/oamayi/article/details/156651767) +- 迁移差异参考:[MiniQMT 策略转大 QMT 内置 Python](https://github.com/Listolany/MiniQMT_2_BigQMT/blob/main/SKILL.md) diff --git a/py-client/etc/dev.yaml b/py-client/etc/dev.yaml index 4da4df4..2a657b6 100644 --- a/py-client/etc/dev.yaml +++ b/py-client/etc/dev.yaml @@ -11,4 +11,4 @@ enable_loss_add_position: True enable_auto_ipo: True excluded_codes: - "00000.SZ" -zt_open_hands: 0 +zt_open_hands: 1 diff --git a/py-client/libs/calc.py b/py-client/libs/calc.py index afc0548..f8e560d 100644 --- a/py-client/libs/calc.py +++ b/py-client/libs/calc.py @@ -14,7 +14,7 @@ def trading_time(now: datetime) -> bool: def calc_buy_volume(price: float, buy_value: float) -> int: if price <= 0 or buy_value <= 0: return 0 - return max(1, floor(buy_value / (price * 100))) * 100 + return max(1, round(buy_value / (price * 100))) * 100 def calculate_min_profit_rate(price: float, profit_mult: int) -> float: """