fix calc_buy_num floor -> round

This commit is contained in:
2026-09-15 10:38:47 +08:00
parent efc53b35fc
commit bfe89ba122
3 changed files with 262 additions and 2 deletions

260
docs/xhs-miniqmt-bridge.md Normal file
View File

@@ -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.pyTornado @ 0.0.0.0:10086
│ 只做转发
passorder / get_trade_detail_data / ContextInfoQMT 原生能力)
```
**这张图就是全部价值策略留在外面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 快捷方式复制进去(最简单,免管理员)
- 更稳的做法:任务计划程序 → 勾选"不管用户是否登录都运行" + "使用最高权限" + 延迟 12 分钟启动(等网络和驱动就绪)
- 🚫 **安装路径不要带中文**,例如 `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 里开 **"来电自动开机"**,停电恢复后能自己爬起来
- 兜底:装远程桌面工具,人不在也能看一眼服务是否在跑
**页脚金句**
> 自动化的本质不是"不用管",而是"坏了能自己回来"。
**设计**:浅色底 + 五个编号圆角卡片纵向排列每张卡片左侧一个大数字0105右侧 23 行短句;最后一行放一句金句。
---
### 第 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:41080×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)

View File

@@ -11,4 +11,4 @@ enable_loss_add_position: True
enable_auto_ipo: True enable_auto_ipo: True
excluded_codes: excluded_codes:
- "00000.SZ" - "00000.SZ"
zt_open_hands: 0 zt_open_hands: 1

View File

@@ -14,7 +14,7 @@ def trading_time(now: datetime) -> bool:
def calc_buy_volume(price: float, buy_value: float) -> int: def calc_buy_volume(price: float, buy_value: float) -> int:
if price <= 0 or buy_value <= 0: return 0 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: def calculate_min_profit_rate(price: float, profit_mult: int) -> float:
""" """