13 KiB
多账户交易中控 — 使用说明
本文档说明 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_* 仅增加:
login_required走hub_auth.request_allowed(支持请求头X-Hub-Token)。- 文件末尾
hub_bridge.install_on_app(...)注册/api/hub/*。
业务逻辑、数据库、复盘页面 未改;复盘请打开各实例 /records(设置里的「复盘链接」)。
2. 环境准备
2.1 依赖安装
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 强制关闭某账户
$env:HUB_DISABLED_IDS="1" # 默认即关闭 OKX(id=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 后:
# 币安
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
# OKX(若启用)
cd ..\crypto_monitor_okx
$env:EXCHANGE="okx"; $env:PORT="15201"
python ..\manual_trading_hub\agent.py
# Gate 训练
cd ..\crypto_monitor_gate
$env:EXCHANGE="gate"; $env:PORT="15202"
python ..\manual_trading_hub\agent.py
# 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 中控
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后须用户名+密码登录(HUB_USERNAME,未设时默认admin);反代到公网时务必设置。
| 方法 | 路径 | 说明 |
|---|---|---|
| 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 {"username":"...","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_USERNAME |
admin |
登录用户名(仅当已设密码时生效) |
HUB_PASSWORD |
(空) | 非空即启用 Web 登录 |
HUB_SESSION_SECRET |
用户名+密码 | 会话 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. 安全与边界
- 中控不下单:开仓、关键位、趋势回调仅在各实例网页操作。
- 全平为市价减仓:监控区全平不可撤销,操作前二次确认。
- 子代理建议只监听 127.0.0.1,不要对局域网暴露 API Key 通道。
- 公网暴露 hub:必须设置
HUB_USERNAME+HUB_PASSWORD;HTTPS 反代建议HUB_COOKIE_SECURE=true;亦可HUB_HOST=127.0.0.1仅本机监听 + 反代。 - 复盘不在中控:时间筛选、导出 CSV、编辑笔记仍在各实例
/records。 - 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 |
手动探测实例桥接:
$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):
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. 日常推荐流程
- 启动四所 agent + Flask(OKX 按需)。
- 启动 hub.py,打开监控区确认持仓与关键位门控正常。
- 开仓、关键位、趋势 → 点击监控卡片「实例」进入对应 Flask。
- 复盘、导出记录 → 点击「复盘」进入
/records。 - 异常行情 → 单户全平或全局紧急全平。
如有新交易所,在 系统设置 添加一行并勾选能力,无需修改 hub.py 源码(需该所有 Flask 注册 hub_bridge 且 agent 已部署)。