Files
crypto_monitor/manual_trading_hub/使用说明.md
T
2026-05-22 11:44:34 +08:00

327 lines
13 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** 的架构、启动方式、界面操作与故障排查。中控聚合四所 **持仓/余额/关键位/趋势计划监控 + 紧急全平**;**人工下单、添加关键位、趋势回调、交易复盘** 均在各实例网页操作。
---
## 1. 架构总览
```
浏览器
├─ /monitor 监控区(持仓、关键位、趋势计划、全平)
└─ /settings 系统设置(hub_settings.json
中控 hub.py(默认 :5100
├─ HTTP → 子代理 agent.py × N/status、/emergency/close-all
└─ HTTP → 各实例 Flask/api/hub/monitor、/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/settings
- (旧链接 `/trade` 会自动跳转到监控区)
---
## 4. 页面操作说明
### 4.1 监控区 `/monitor`
| 功能 | 说明 |
|------|------|
| **2×2 卡片** | 仅显示「已启用」账户;每卡含子代理持仓、浮盈、余额 |
| **机器人持仓** | 来自实例 `/api/hub/monitor``order_monitors`active |
| **关键位** | 仅 `capabilities``key` 的户;展示门控摘要(`/api/price_snapshot` |
| **趋势计划** | 仅 Gate 趋势户;`trend_pullback_plans` active |
| **实例 / 复盘** | 「实例」打开该户 Flask 首页;「复盘」打开 `/records`。**中控不做下单与复盘编辑**。若配置 **`HUB_PUBLIC_ORIGIN`**,外链会把 `127.0.0.1` 换成内网 IP |
| **关键位** | 来自实例 `/api/hub/monitor` + `/api/price_snapshot`(须 Flask 已启动);无记录或 Flask 未连通时卡片会提示原因;**Gate 趋势户**无关键位 |
| **该户全平** | `POST` 子代理 `/emergency/close-all`,仅平该 API Key 仓位 |
| **全局紧急全平** | 对所有已启用户依次全平(不含 `HUB_DISABLED_IDS` 强制关闭的 id |
| **自动刷新** | 默认每 5 秒请求 `/api/monitor/board` |
持仓数据以 **子代理 ccxt** 为准;关键位/趋势/机器人单以 **Flask 数据库** 为准。若 Flask 未启动,卡片仍会显示 agent 持仓,但下方策略信息可能为空或报错。
### 4.2 系统设置 `/settings`
**可用**:打开 http://127.0.0.1:5100/settings ,修改表格后点 **保存设置** 即写入 `hub_settings.json`;**重新加载** 从磁盘/默认再读(会重新套用 `HUB_DISABLED_IDS`)。保存后监控区立即使用新 URL/启用状态,**无需重启 hub**。
**下单与关键位**:请在监控卡片点击「实例」,进入各 `crypto_monitor_*` 网页操作(与中控上线前相同)。
| 列 | 含义 |
|----|------|
| 启用 | 是否参与监控与全局全平;被 `HUB_DISABLED_IDS` 锁定的无法勾选 |
| 显示名 | 监控卡片标题 |
| Flask URL | 实例根地址,如 `http://127.0.0.1:5001` |
| Agent URL | 子代理根地址,如 `http://127.0.0.1:15200` |
| 复盘链接 | 一般为 `{Flask}/records` |
| 能力 | 勾选「监控关键位」「监控趋势计划」,控制监控卡片展示块 |
| id | 与 `HUB_DISABLED_IDS`、全平 API 路径中的 id 对应 |
- **保存设置**:写入 `hub_settings.json`,重启 hub 后仍生效。
- **添加交易所**:可增第五所等,需自行启动对应 Flask + agent 并填写 URL。
- **删**:从列表移除(保存后生效)。
---
## 5. 能力矩阵(监控展示)
| 账户 | 监控关键位 | 监控趋势计划 |
|------|:----------:|:--------------:|
| 币安 | ✓ | — |
| OKX | ✓ | — |
| Gate 训练 | ✓ | — |
| Gate 趋势 | — | ✓ |
---
## 6. HTTP API 摘要(中控)
访问控制:
- **IP**:默认允许本机与 RFC1918 私网(`HUB_TRUST_LAN=true`);公网 IP 直连返回 403。
- **密码**:设置 `HUB_PASSWORD` 后,所有页面与 API(除 `/login``/assets``/api/auth/*`)须先登录;反代到公网时**务必设置**。
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/settings` | 读取配置 |
| POST | `/api/settings` | 保存配置 |
| GET | `/api/monitor/board` | 监控聚合 |
| POST | `/api/close/{id}` | 单户全平 |
| POST | `/api/close-all` | 全局全平,body 可选 `exclude_ids` |
| GET | `/api/auth/status` | 是否需登录、是否已登录 |
| POST | `/api/auth/login` | body `{"password":"..."}` |
| POST | `/api/auth/logout` | 退出 |
实例侧(中控只读调用 `/api/hub/monitor` 等;下单请在实例网页):
| 路径 | 说明 |
|------|------|
| `/api/hub/ping` | 连通与能力 |
| `/api/hub/monitor` | 关键位、机器人单、趋势计划 |
---
## 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` 时仅本机可访问中控页面 |
| `HUB_PASSWORD` | (空) | 非空即启用 Web 登录 |
| `HUB_SESSION_SECRET` | 回退 `HUB_PASSWORD` | 会话 Cookie 签名密钥 |
| `HUB_COOKIE_SECURE` | `false` | HTTPS 反代时设 `true` |
| `HUB_SESSION_DAYS` | `7` | 登录保持天数 |
### 子代理 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**:必须设置 `HUB_PASSWORD`HTTPS 反代建议 `HUB_COOKIE_SECURE=true`;亦可 `HUB_HOST=127.0.0.1` 仅本机监听 + 反代。
5. **复盘不在中控**:时间筛选、导出 CSV、编辑笔记仍在各实例 `/records`
6. **OKX 默认关**:避免未部署 OKX 时监控卡片持续报错。
---
## 9. 故障排查
| 现象 | 可能原因 | 处理 |
|------|----------|------|
| 监控卡片「子代理不可用」 | agent 未启动或端口错 | 检查 Agent URL、启动 agent |
| 无关键位/趋势信息 | Flask 未启动或令牌错误 | 启动 app.py;核对 `HUB_BRIDGE_TOKEN` |
| 全平 401 | 子代理 `CONTROL_TOKEN` 与中控不一致 | 中控用 `X-Control-Token` 转发,需与 agent 一致 |
| OKX 始终灰色 | `HUB_DISABLED_IDS=1` | 清空该环境变量并在设置页启用 |
| 无关键位块 | 该户 capabilities 无 `key` | 正常;Gate 趋势户无关键位 |
| 局域网无法打开中控 | 防火墙 / `HUB_TRUST_LAN=0` | 放行端口或恢复默认信任私网 |
| 打开即跳转登录 | 已设 `HUB_PASSWORD` | 正常;输入密码后 7 天内免登(可改 `HUB_SESSION_DAYS` |
| 登录后仍 401 | Cookie 未带上 / HTTPS | HTTPS 反代设 `HUB_COOKIE_SECURE=true` |
手动探测实例桥接:
```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** 只读聚合监控数据。
子代理 `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. 开仓、关键位、趋势 → 点击监控卡片「实例」进入对应 Flask。
4. 复盘、导出记录 → 点击「复盘」进入 `/records`
5. 异常行情 → 单户全平或全局紧急全平。
如有新交易所,在 **系统设置** 添加一行并勾选能力,无需修改 hub.py 源码(需该所有 Flask 注册 `hub_bridge` 且 agent 已部署)。