Files
crypto_monitor/manual_trading_hub/使用说明.md
T

352 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 多账户交易中控 — 使用说明
本文档说明 **manual_trading_hub**(方案 A)的架构、启动方式、三页界面操作与故障排查。中控聚合四所 **监控 + 下单 + 关键位 + 趋势回调(仅 Gate 趋势户)**;**交易复盘**仍进入各实例网页,中控只提供跳转链接。
---
## 1. 架构总览
```
浏览器
├─ /monitor 监控区(持仓、关键位、趋势计划、全平)
├─ /trade 下单区(人工下单 / 关键位 / 趋势回调)
└─ /settings 系统设置(hub_settings.json
中控 hub.py(默认 :5100
├─ HTTP → 子代理 agent.py × N/status、/emergency/close-all
└─ HTTP → 各实例 Flask app.py/api/hub/*、/api/price_snapshot
```
| 组件 | 职责 | 默认端口(可在设置页改) |
|------|------|-------------------------|
| **hub.py** | 聚合 UI、转发下单/监控 API、全平 | `5100` |
| **agent.py** | 交易所只读状态 + 紧急市价全平 | 币安 `15200`、OKX `15201`、Gate `15202`、Gate趋势 `15203` |
| **crypto_monitor_*.app** | 策略库、关键位、人工单、趋势预览/执行 | 币安 `5001`、Gate `5000`、Gate趋势 `5002`、OKX `5004` |
### 1.1 四账户默认配置
| id | 名称 | Flask | Agent | 能力 | 默认启用 |
|----|------|-------|-------|------|----------|
| 0 | 币安 | :5001 | :15200 | 下单、关键位 | 是 |
| 1 | OKX | :5004 | :15201 | 下单、关键位 | **否**`HUB_DISABLED_IDS=1` |
| 2 | Gate 训练 | :5000 | :15202 | 下单、关键位 | 是 |
| 3 | Gate 趋势 | :5002 | :15203 | **下单、趋势回调**(无关键位 Tab | 是 |
- **Gate 趋势户**:保留 **人工下单****趋势回调**;监控区可看到运行中的趋势计划,但 **不展示关键位**capabilities 无 `key`)。
- **OKX**:默认关闭;需要时在「系统设置」勾选启用,并去掉环境变量 `HUB_DISABLED_IDS` 中的 `1`
### 1.2 实例侧改动(最小)
`crypto_monitor_*` 仅增加:
1. `login_required``hub_auth.request_allowed`(支持请求头 `X-Hub-Token`)。
2. 文件末尾 `hub_bridge.install_on_app(...)` 注册 `/api/hub/*`
业务逻辑、数据库、复盘页面 **未改**;复盘请打开各实例 `/records`(设置里的「复盘链接」)。
---
## 2. 环境准备
### 2.1 依赖安装
```powershell
cd c:\Users\dekun\Desktop\crypto_monitor\manual_trading_hub
pip install -r requirements.txt
```
### 2.2 鉴权令牌(推荐生产启用)
四实例 Flask 与中控、子代理需 **同一密钥**
| 变量 | 作用 |
|------|------|
| `HUB_BRIDGE_TOKEN` | 中控 → Flask 使用头 `X-Hub-Token`;各实例 `hub_auth` 校验 |
| `CONTROL_TOKEN` | 可与上相同;中控 → 子代理使用头 `X-Control-Token` |
中控 `hub.py` 会读取 `HUB_BRIDGE_TOKEN`,若无则回退 `CONTROL_TOKEN`
**开发本机**可临时在各实例 `.env``APP_AUTH_DISABLED=true`,则 Flask 不校验令牌(仍建议子代理设 `CONTROL_TOKEN` 防误暴露)。
### 2.3 强制关闭某账户
```powershell
$env:HUB_DISABLED_IDS="1" # 默认即关闭 OKXid=1
```
与设置页「启用」取 **与** 关系:环境变量强制关闭时,网页勾选框会灰掉且无法启用。
### 2.4 配置文件
- 路径:`manual_trading_hub/hub_settings.json`(在网页 **系统设置 → 保存设置** 后写入)。
- 未保存前使用 `settings_store.py` 内置默认四所地址。
- 建议 **不要** 把含内网 IP 的 `hub_settings.json` 提交到公开仓库。
- 环境变量模板:`manual_trading_hub/.env.example`;四实例模板中已补充 `HUB_BRIDGE_TOKEN` 说明。
---
## 3. 启动顺序(Windows 示例)
**原则**:先子代理与四实例 Flask,再中控。
### 3.1 子代理(每所一个终端)
在对应策略目录加载 `.env` 后:
```powershell
# 币安
cd c:\Users\dekun\Desktop\crypto_monitor\crypto_monitor_binance
$env:EXCHANGE="binance"; $env:PORT="15200"; $env:HOST="127.0.0.1"
# 可选:$env:CONTROL_TOKEN="你的随机串"
python ..\manual_trading_hub\agent.py
```
```powershell
# OKX(若启用)
cd ..\crypto_monitor_okx
$env:EXCHANGE="okx"; $env:PORT="15201"
python ..\manual_trading_hub\agent.py
```
```powershell
# Gate 训练
cd ..\crypto_monitor_gate
$env:EXCHANGE="gate"; $env:PORT="15202"
python ..\manual_trading_hub\agent.py
```
```powershell
# Gate 趋势
cd ..\crypto_monitor_gate_bot
$env:EXCHANGE="gate"; $env:PORT="15203"
python ..\manual_trading_hub\agent.py
```
### 3.2 四实例 Flask
在各目录按原有方式启动 `app.py`(确保 `APP_PORT` 与设置页 Flask URL 一致)。
### 3.3 中控
```powershell
cd c:\Users\dekun\Desktop\crypto_monitor\manual_trading_hub
$env:HUB_HOST="0.0.0.0" # 仅本机可改为 127.0.0.1
$env:HUB_PORT="5100"
$env:HUB_BRIDGE_TOKEN="你的随机串" # 与各实例、子代理一致
python hub.py
```
浏览器打开:
- 监控区:http://127.0.0.1:5100/monitor
- 下单区:http://127.0.0.1:5100/trade
- 系统设置:http://127.0.0.1:5100/settings
---
## 4. 页面操作说明
### 4.1 监控区 `/monitor`
| 功能 | 说明 |
|------|------|
| **2×2 卡片** | 仅显示「已启用」账户;每卡含子代理持仓、浮盈、余额 |
| **机器人持仓** | 来自实例 `/api/hub/monitor``order_monitors`active |
| **关键位** | 仅 `capabilities``key` 的户;展示门控摘要(`/api/price_snapshot` |
| **趋势计划** | 仅 Gate 趋势户;`trend_pullback_plans` active |
| **复盘** | 新标签打开该户 `review_url`(各实例交易记录页) |
| **该户全平** | `POST` 子代理 `/emergency/close-all`,仅平该 API Key 仓位 |
| **全局紧急全平** | 对所有已启用户依次全平(不含 `HUB_DISABLED_IDS` 强制关闭的 id |
| **自动刷新** | 默认每 5 秒请求 `/api/monitor/board` |
持仓数据以 **子代理 ccxt** 为准;关键位/趋势/机器人单以 **Flask 数据库** 为准。若 Flask 未启动,卡片仍会显示 agent 持仓,但下方策略信息可能为空或报错。
### 4.2 下单区 `/trade`
顶部 **账户下拉** 切换目标所;下方 Tab 根据该户 **能力** 自动启用/禁用:
#### Tab:人工下单
- 字段与各实例「手工开仓」一致:合约、方向、止盈止损模式(价格/百分比)、趋势单/波段单、杠杆、移动保本、止损/止盈。
- 提交后中控转发 `POST /api/hub/add_order`,逻辑与在实例网页下单相同(含以损定仓、门控等)。
- **Gate 趋势户** 同样可使用本 Tab(保留人工下单)。
#### Tab:关键位
-**币安、Gate 训练、OKX**capabilities 含 `key`)显示。
- 类型:箱体突破、收敛突破、斐波回调、关键阻力/支撑等;模式含标准突破、箱体 1R、趋势单自填止盈。
- 提交转发 `POST /api/hub/add_key`
- 页面上方会显示该实例 **关键位门控规则** 文案(来自 `/api/hub/meta`)。
#### Tab:趋势回调
-**Gate 趋势户**capabilities 含 `trend`)。
- 流程:**填写参数 → 生成预览 → 确认执行(实盘)**。
- 预览转发 `POST /api/hub/trend/preview`;执行须带 `preview_id`,转发 `POST /api/hub/trend/execute`
- 预览有效期内展示补仓档位表;过期需重新生成。
- 做空时「补仓上沿」在 UI 上提示为补仓下沿价(字段名仍为 `add_upper`,与实例一致)。
操作结果在页面底部 **Toast** 显示实例返回的 flash 汇总信息。
### 4.3 系统设置 `/settings`
**可用**:打开 http://127.0.0.1:5100/settings ,修改表格后点 **保存设置** 即写入 `hub_settings.json`;**重新加载** 从磁盘/默认再读(会重新套用 `HUB_DISABLED_IDS`)。保存后监控区、下单区立即使用新 URL/启用状态,**无需重启 hub**。
| 列 | 含义 |
|----|------|
| 启用 | 是否参与监控与全局全平;被 `HUB_DISABLED_IDS` 锁定的无法勾选 |
| 显示名 | 监控卡片标题 |
| Flask URL | 实例根地址,如 `http://127.0.0.1:5001` |
| Agent URL | 子代理根地址,如 `http://127.0.0.1:15200` |
| 复盘链接 | 一般为 `{Flask}/records` |
| 能力 | 勾选 order / key / trend,控制下单区 Tab |
| id | 与 `HUB_DISABLED_IDS`、全平 API 路径中的 id 对应 |
- **保存设置**:写入 `hub_settings.json`,重启 hub 后仍生效。
- **添加交易所**:可增第五所等,需自行启动对应 Flask + agent 并填写 URL。
- **删**:从列表移除(保存后生效)。
---
## 5. 能力矩阵(下单区 Tab)
| 账户 | 人工下单 | 关键位 | 趋势回调 |
|------|:--------:|:------:|:--------:|
| 币安 | ✓ | ✓ | — |
| OKX | ✓ | ✓ | — |
| Gate 训练 | ✓ | ✓ | — |
| Gate 趋势 | ✓ | — | ✓ |
---
## 6. HTTP API 摘要(中控)
访问控制:默认允许 **本机****RFC1918 私网**`HUB_TRUST_LAN=true`);公网 IP 访问返回 403。
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/settings` | 读取配置 |
| POST | `/api/settings` | 保存配置 |
| GET | `/api/monitor/board` | 监控聚合 |
| POST | `/api/close/{id}` | 单户全平 |
| POST | `/api/close-all` | 全局全平,body 可选 `exclude_ids` |
| GET | `/api/trade/meta/{id}` | 实例 meta(门控文案等) |
| POST | `/api/trade/order/{id}` | 人工下单 |
| POST | `/api/trade/key/{id}` | 添加关键位 |
| POST | `/api/trade/trend/preview/{id}` | 趋势预览 |
| POST | `/api/trade/trend/execute/{id}` | 趋势执行 |
实例侧(需 `X-Hub-Token` 或已登录):
| 路径 | 说明 |
|------|------|
| `/api/hub/ping` | 连通与能力 |
| `/api/hub/meta` | 表单规则、预览 TTL 等 |
| `/api/hub/monitor` | 关键位、机器人单、趋势计划 |
| `/api/hub/add_order` | 人工开仓 |
| `/api/hub/add_key` | 添加关键位 |
| `/api/hub/trend/preview` | 趋势预览 |
| `/api/hub/trend/execute` | 趋势执行 |
---
## 7. 环境变量速查
### 中控 hub.py
| 变量 | 默认 | 说明 |
|------|------|------|
| `HUB_HOST` | `0.0.0.0` | 监听地址 |
| `HUB_PORT` | `5100` | 监听端口 |
| `HUB_BRIDGE_TOKEN` | 空 | Flask 桥接令牌;可同 `CONTROL_TOKEN` |
| `HUB_DISABLED_IDS` | `1` | 逗号分隔,强制关闭的账户 id |
| `HUB_TRUST_LAN` | `true` | `false` 时仅本机可访问中控页面 |
### 子代理 agent.py
| 变量 | 说明 |
|------|------|
| `EXCHANGE` | `binance` / `okx` / `gate` |
| `PORT` / `HOST` | 监听 |
| `CONTROL_TOKEN` | 与中控一致时必填头 `X-Control-Token` |
### 各实例 Flask
| 变量 | 说明 |
|------|------|
| `HUB_BRIDGE_TOKEN` | 与中控一致 |
| `APP_AUTH_DISABLED` | `true` 时跳过登录与令牌(仅建议本机调试) |
---
## 8. 安全与边界
1. **中控可下单**:下单区操作会真实调用交易所逻辑,与在实例网页操作等价,请确认账户与参数。
2. **全平为市价减仓**:监控区全平不可撤销,操作前二次确认。
3. **子代理建议只监听 127.0.0.1**,不要对局域网暴露 API Key 通道。
4. **公网暴露 hub**:请防火墙限制 `5100`,或 `HUB_HOST=127.0.0.1` + `HUB_TRUST_LAN=0`
5. **复盘不在中控**:时间筛选、导出 CSV、编辑笔记仍在各实例 `/records`
6. **OKX 默认关**:避免未部署 OKX 时监控卡片持续报错。
---
## 9. 故障排查
| 现象 | 可能原因 | 处理 |
|------|----------|------|
| 监控卡片「子代理不可用」 | agent 未启动或端口错 | 检查 Agent URL、启动 agent |
| 无关键位/趋势信息 | Flask 未启动或令牌错误 | 启动 app.py;核对 `HUB_BRIDGE_TOKEN` |
| 下单返回 401 | 令牌不一致 | 四实例与中控设相同 `HUB_BRIDGE_TOKEN` |
| 全平 401 | 子代理 `CONTROL_TOKEN` 与中控不一致 | 中控用 `X-Control-Token` 转发,需与 agent 一致 |
| OKX 始终灰色 | `HUB_DISABLED_IDS=1` | 清空该环境变量并在设置页启用 |
| 趋势预览成功但执行失败 | 预览过期 | 重新「生成预览」再执行 |
| 关键位 Tab 灰色 | 该户 capabilities 无 `key` | 正常;Gate 趋势户无关键位 |
| 局域网无法打开中控 | 防火墙 / `HUB_TRUST_LAN=0` | 放行端口或恢复默认信任私网 |
手动探测实例桥接:
```powershell
$tok = "你的令牌"
Invoke-WebRequest -Uri "http://127.0.0.1:5001/api/hub/ping" -Headers @{"X-Hub-Token"=$tok}
```
---
## 10. 与旧版 README 的差异
早期中控 **仅监控 + 全平**,使用环境变量 `HUB_AGENTS` 列表。当前版本改为:
- **hub_settings.json**(或内置默认)管理四所 URL 与能力;
- **三页 UI**:监控 / 下单 / 设置;
- 通过 **hub_bridge** 调用实例下单 API。
子代理 `agent.py` 仍负责持仓与全平;`HUB_AGENTS` 环境变量在新版 hub 中 **不再使用**(以设置文件为准)。
**PM2 守护(推荐 Linux**
```bash
cd manual_trading_hub
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
pm2 start ecosystem.config.cjs # 一次启动 4 个 agent + manual-trading-hub
pm2 save && pm2 startup
```
快捷:`bash scripts/pm2_hub.sh start|restart|logs`(同样 hub+agent 一起)。
更细的安装顺序、反代、验收见 **《部署文档.md》**screen / systemd 见 **scripts/**
---
## 11. 日常推荐流程
1. 启动四所 **agent** + **Flask**OKX 按需)。
2. 启动 **hub.py**,打开监控区确认持仓与关键位门控正常。
3. 在下单区选账户 → 人工单 / 关键位 / 趋势(按能力)。
4. 复盘、导出记录 → 点击监控卡片「复盘」进入对应实例。
5. 异常行情 → 单户全平或全局紧急全平。
如有新交易所,在 **系统设置** 添加一行并勾选能力,无需修改 hub.py 源码(需该所有 Flask 注册 `hub_bridge` 且 agent 已部署)。