User edition: prune docs, license gate, obfuscate core lib.
Keep deploy/basic docs only; integrate sq.bz121.com license client; encrypt strategy/trade/key_monitor/options/hedge_plan for release. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -110,3 +110,8 @@ TRADING_DAY_RESET_HOUR=8
|
||||
# HUB_BACKUP_ROOT=/root/backups/crypto_monitor_portal
|
||||
# 资金概况:曲线与回撤统计起始交易日
|
||||
HUB_FUND_HISTORY_START_DAY=2026-06-09
|
||||
|
||||
# --- 软件授权(整机共用,也可写仓库根 license.env)---
|
||||
# LICENSE_API_URL=https://sq.bz121.com
|
||||
# LICENSE_CLIENT_KEY=与授权站 CLIENT_API_KEY 相同
|
||||
# LICENSE_OFFLINE_GRACE_HOURS=72
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
# 中控 AI 教练说明
|
||||
|
||||
中控 **AI 教练**(`/ai`)与三实例 `/records` 里的 **AI 复盘** 分离:模块在 `manual_trading_hub/hub_ai/`,数据存同目录 JSON.
|
||||
|
||||
## 能力
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **交易教练** | 口语化陪聊;注入三户监控快照与今日总结摘要(后台自动生成,不在页面展示) |
|
||||
| **普通聊天** | 不绑交易数据,适合闲聊,答疑 |
|
||||
| **交易监管** | 今日长会话;手动/中控开平仓与新开仓自动推送 + 企业微信 + 可回聊(见 [交易监管说明.md](./交易监管说明.md)) |
|
||||
| **会话历史** | 右侧列表:切换,删除;消息一键复制 |
|
||||
|
||||
页面保留 **交易教练 / 普通聊天 / 交易监管** 与聊天区;**今日总结** 已移至 **数据看板**(`/dashboard`)纯数据展示,不再在 AI 页生成.
|
||||
|
||||
## 存储
|
||||
|
||||
与 `hub_settings.json` 同目录(`manual_trading_hub/`):
|
||||
|
||||
- `hub_ai_summaries.json` — 历史总结(供交易教练上下文,可选 API 仍保留)
|
||||
- `hub_ai_chat.json` — 聊天会话(`active_session_id`,多会话,`bot_mode`)
|
||||
|
||||
升级 / 迁移时请一并备份(见 [本地数据迁移到云端.md](./本地数据迁移到云端.md)).
|
||||
|
||||
## 模型配置
|
||||
|
||||
在 **`manual_trading_hub/.env`** 配置,**变量名与三实例完全相同**;中控 `hub_ai/client.py` 共用仓库根 `ai_client.py`,**默认也是 OpenAI 兼容网关**(`AI_PROVIDER=openai`),与你在三所 `.env` 里配的那套一致即可.
|
||||
|
||||
**推荐(与三实例默认一致):**
|
||||
|
||||
```env
|
||||
AI_PROVIDER=openai
|
||||
OPENAI_API_BASE=https://op.bz121.com/v1
|
||||
OPENAI_API_KEY=你的密钥
|
||||
OPENAI_MODEL=gemma4:e4b
|
||||
|
||||
# 本机 Ollama 备用(仅当 AI_PROVIDER=ollama 时生效)
|
||||
OLLAMA_API=http://127.0.0.1:11434/api/generate
|
||||
AI_MODEL=huihui_ai/deepseek-r1-abliterated:latest
|
||||
```
|
||||
|
||||
改走本机无限制模型时,将 `AI_PROVIDER=ollama`,并填好 `OLLAMA_API` / `AI_MODEL`;`OPENAI_*` 可保留不动.
|
||||
|
||||
总结与聊天使用**同一模型**(同一套 `OPENAI_MODEL` 或 `AI_MODEL`);总结 temperature≈0.15,聊天≈0.5.
|
||||
|
||||
可选:`TRADING_DAY_RESET_HOUR=8`(与实例一致,定义「今日」交易日).
|
||||
|
||||
## 依赖接口
|
||||
|
||||
中控通过 HTTP 拉取各实例:
|
||||
|
||||
- `GET /api/hub/monitor`(已有)
|
||||
- `GET /api/hub/trades/today?trading_day=YYYY-MM-DD`(`hub_bridge` 注册,需三实例更新代码并重启)
|
||||
|
||||
子代理 `GET /status` 提供持仓与余额.
|
||||
|
||||
## 与实例 AI 复盘的分工
|
||||
|
||||
| | 中控 AI 教练 | 实例 AI 复盘 |
|
||||
|--|-------------|-------------|
|
||||
| 入口 | `/ai` | 各所 `/records` |
|
||||
| 数据 | 三户聚合 | 单户 `journal_entries` |
|
||||
| 语气 | 聊天搭档 | 结构化教练报告 |
|
||||
| 代码 | `hub_ai/*` | `ai_review_lib` + 各 `app.py` |
|
||||
|
||||
详见仓库根 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)(实例侧).
|
||||
@@ -1,105 +1,8 @@
|
||||
# 复盘系统中控(manual_trading_hub)
|
||||
# manual_trading_hub
|
||||
|
||||
> **完整说明**:[使用说明.md](./使用说明.md) · **资金概况**:[资金概况说明.md](./资金概况说明.md) · **数据看板**:[数据看板说明.md](./数据看板说明.md) · **AI 教练**:[AI教练说明.md](./AI教练说明.md) · **行情区**:[行情区说明.md](./行情区说明.md) · **部署**:[部署文档.md](./部署文档.md) · **云服务器**:[云服务器部署说明.md](./云服务器部署说明.md) · **本地→云端迁移**:[本地数据迁移到云端.md](./本地数据迁移到云端.md) · **局域网/反代**:[局域网与反代部署说明.md](./局域网与反代部署说明.md) · **故障**:[常见问题.md](./常见问题.md)
|
||||
多账户交易中控(用户版)。
|
||||
|
||||
多账户 **监控聚合 + 紧急全平**;**不在中控网页下单**.人工下单,关键位,**策略交易**(`/strategy`),复盘请在各 `crypto_monitor_*` 实例网页操作(监控卡片 **「实例」** / **「复盘」**).**增加子账户**见 [使用说明 §4.3](./使用说明.md#43-增加账户例如再挂一个-gate).
|
||||
|
||||
---
|
||||
|
||||
## 当前能力
|
||||
|
||||
| 能力 | 说明 |
|
||||
|------|------|
|
||||
| 监控区 | 持仓,余额,关键位摘要,趋势计划,机器人单(只读) |
|
||||
| 资金概况 | 总/分户资金(资金户+交易户),180 日曲线,最大回撤 |
|
||||
| **数据看板** | 三户当日总览/分户/平仓明细,SSE 推送(`/dashboard`;见 [数据看板说明.md](./数据看板说明.md)) |
|
||||
| 行情区 | K 线(多周期,本地缓存,技术指标,从监控跳转持仓线) |
|
||||
| **AI 教练** | 交易教练 + 普通聊天,会话历史(`/ai`;见 [AI教练说明.md](./AI教练说明.md)) |
|
||||
| 紧急全平 | 单户 / 全局市价减仓 |
|
||||
| 系统设置 | `hub_settings.json` 管理 URL,启用,**监控关键位 / 监控趋势计划**(不控制策略交易页) |
|
||||
| Web 登录 | `.env` 设 `HUB_PASSWORD` 后用户名+密码保护(反代公网**务必**配置) |
|
||||
| ~~下单区~~ | **已移除**(避免与实例重复,减少故障面) |
|
||||
|
||||
---
|
||||
|
||||
## 架构
|
||||
|
||||
```
|
||||
浏览器 → hub.py (:5100) 监控 / 资金概况 / **数据看板** / 行情 / **AI 教练** / 设置 / 登录
|
||||
├→ agent.py × N (:15200~15202) 持仓,全平
|
||||
└→ 各 Flask (:5000/5001/5004) /api/hub/monitor 只读聚合
|
||||
```
|
||||
|
||||
- 账户列表:**系统设置** 或默认 `settings_store.py`(不再使用环境变量 `HUB_AGENTS`).
|
||||
- 三实例须注册 **hub_bridge**(仓库根 `hub_bridge.py`);PM2 建议 `PYTHONPATH=..`.
|
||||
|
||||
---
|
||||
|
||||
## 快速启动(Linux / PM2)
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user/manual_trading_hub
|
||||
python3 -m venv .venv && source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
cp .env.example .env
|
||||
# 编辑 .env:HUB_PASSWORD,HUB_BRIDGE_TOKEN,HUB_PUBLIC_ORIGIN 等
|
||||
|
||||
pm2 start ecosystem.config.cjs # 3 agent + hub
|
||||
pm2 save
|
||||
|
||||
bash scripts/verify_hub_deploy.sh
|
||||
curl -s http://127.0.0.1:5100/api/ping
|
||||
```
|
||||
|
||||
浏览器:`http://<本机IP>:5100/monitor`(行情 `/market`;已设密码则先 `/login`).
|
||||
|
||||
---
|
||||
|
||||
## 中控 `.env` 要点
|
||||
|
||||
| 变量 | 说明 |
|
||||
|------|------|
|
||||
| `HUB_PASSWORD` / `HUB_USERNAME` | 非空密码即启用登录 |
|
||||
| `HUB_BRIDGE_TOKEN` | 与三实例一致 |
|
||||
| `HUB_DISABLED_IDS` | 默认 `1` 关闭 OKX |
|
||||
| `HUB_PUBLIC_ORIGIN` | 其它设备打开复盘/实例外链(替换 127.0.0.1) |
|
||||
| `HUB_COOKIE_SECURE` | HTTPS 反代建议 `true` |
|
||||
|
||||
详见 [.env.example](./.env.example).
|
||||
|
||||
---
|
||||
|
||||
## 子代理(agent)
|
||||
|
||||
每所策略目录单独进程,`EXCHANGE` + `PORT`(15200~15202),密钥来自**该目录 `.env`**.PM2 经 `scripts/run_agent.sh` 启动(自动 `source .env`,去 CRLF).
|
||||
|
||||
| PORT | 目录 |
|
||||
|------|------|
|
||||
| 15200 | crypto_monitor_binance |
|
||||
| 15201 | crypto_monitor_okx |
|
||||
| 15202 | crypto_monitor_gate |
|
||||
|
||||
---
|
||||
|
||||
## 运维脚本
|
||||
|
||||
| 脚本 | 作用 |
|
||||
|------|------|
|
||||
| [scripts/fix_hub_deps.sh](./scripts/fix_hub_deps.sh) | 安装/更新 venv 依赖 |
|
||||
| [scripts/verify_hub_deploy.sh](./scripts/verify_hub_deploy.sh) | 验收代码版本与 ping |
|
||||
| [scripts/fix_env_crlf.sh](./scripts/fix_env_crlf.sh) | 修复 .env 的 Windows 换行 |
|
||||
| [scripts/pm2_hub.sh](./scripts/pm2_hub.sh) | PM2 启停 hub+agent |
|
||||
| [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | PM2 常驻 |
|
||||
| [docs/ubuntu-server.md](../docs/ubuntu-server.md) | Ubuntu / Python / Node / PM2 |
|
||||
|
||||
---
|
||||
|
||||
## 文档索引
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [使用说明.md](./使用说明.md) | 页面,API,环境变量,日常流程 |
|
||||
| [行情区说明.md](./行情区说明.md) | K 线周期,缓存,快捷键,拉取逻辑 |
|
||||
| [部署文档.md](./部署文档.md) | Ubuntu,PM2,反代,升级 |
|
||||
| [常见问题.md](./常见问题.md) | 已遇到问题与处理 |
|
||||
| [.env.example](./.env.example) | 环境变量模板 |
|
||||
- [部署文档.md](./部署文档.md)
|
||||
- [使用说明.md](./使用说明.md)
|
||||
- [常见问题.md](./常见问题.md)
|
||||
- 授权:[docs/license.md](../docs/license.md)
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# 更新前快照(行情区 + K 线库)
|
||||
|
||||
> 行情区使用说明见 [行情区说明.md](./行情区说明.md).
|
||||
|
||||
更新前已打 Git 标签,回滚方式:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user # 或你的仓库路径
|
||||
git fetch --tags
|
||||
git checkout snapshot/pre-hub-market-20260528
|
||||
# 恢复后重启:
|
||||
pm2 restart manual-trading-hub crypto_okx crypto_binance crypto_gate
|
||||
```
|
||||
|
||||
回到最新主线:
|
||||
|
||||
```bash
|
||||
git checkout main
|
||||
git pull
|
||||
```
|
||||
|
||||
K 线数据库(不纳入 Git):`manual_trading_hub/data/hub_kline.db`,回滚代码不会自动删除该文件.
|
||||
@@ -1,34 +0,0 @@
|
||||
# 快速开始
|
||||
|
||||
## 系统是什么
|
||||
|
||||
**中控**聚合三所(币安 / OKX / Gate)的持仓、委托、关键位与趋势计划,并提供资金曲线、行情、复盘与 AI 教练。**实际下单、关键位配置、策略执行、交易复盘**在各交易所**实例网页**完成。
|
||||
|
||||
```
|
||||
浏览器 → 中控(默认 :5100)
|
||||
├─ 监控区 / 资金 / 行情 / 内照明心 …
|
||||
└─ 点击「下单 / 期权」→ 实例页(内嵌或新标签)
|
||||
实例 Flask(币安 :5001 · Gate :5000 · OKX :5004)
|
||||
```
|
||||
|
||||
## 日常推荐流程
|
||||
|
||||
1. 打开 **监控区**,查看三所持仓、浮盈亏、关键位与趋势计划。
|
||||
2. 需要操作某所时,点该卡片 **「下单」**(或 **「期权」**)进入实例页。
|
||||
3. 复盘与统计:中控 **内照明心**、**数据看板**,或实例 **交易记录与复盘**。
|
||||
4. 事前计划:中控 **开仓计划**;策略 playbook:中控 **策略说明**(与实例「策略交易」不同,见下文)。
|
||||
|
||||
## 三账户默认对应
|
||||
|
||||
| 账户 | 实例端口 | 常见能力 |
|
||||
|------|----------|----------|
|
||||
| 币安 | 5001 | 关键位 + 趋势 |
|
||||
| OKX | 5004 | 关键位 + 趋势 + **期权**(需在设置勾选「监控期权」) |
|
||||
| Gate | 5000 | 关键位 + 趋势 |
|
||||
|
||||
## 两个容易混淆的名称
|
||||
|
||||
| 名称 | 在哪里 | 是什么 |
|
||||
|------|--------|--------|
|
||||
| **策略说明** | 中控顶栏 | 各所策略文档与开仓检查清单 |
|
||||
| **策略交易** | 实例顶栏 | 趋势回调 / 顺势加仓等自动化功能 |
|
||||
@@ -1,26 +0,0 @@
|
||||
# 中控导航说明
|
||||
|
||||
顶栏各页面用途如下(可在 **系统设置 → 显示与导航** 中隐藏不需要的 Tab)。
|
||||
|
||||
| 导航 | 用途 |
|
||||
|------|------|
|
||||
| **资金概况** | 总资金曲线、分户权益、回撤与 24h 变化 |
|
||||
| **开仓计划** | 事前写下计划、跟踪进行中、统计历史胜率 |
|
||||
| **监控区** | **核心操作台**:三所持仓卡片、全平/撤单、关键位与趋势计划摘要 |
|
||||
| **策略说明** | 三所策略 playbook + 开仓检查清单(非系统操作手册) |
|
||||
| **使用说明** | 本页:中控与实例怎么用 |
|
||||
| **行情区** | K 线、指标、画线;可从持仓跳转带币种 |
|
||||
| **计算器** | 趋势回调 / 滚仓张数与盈亏测算(手动填价) |
|
||||
| **内照明心** | 复盘语录、归档交易、永久 5m K 线 |
|
||||
| **数据看板** | 当日 KPI、分户卡片、SSE 刷新 |
|
||||
| **AI 教练** | 交易教练对话、监管推送(需配置密钥) |
|
||||
| **系统日志** | 中控与三实例 PM2 日志(排错用,非部署说明) |
|
||||
| **系统设置** | 中控密码、导航显示、交易所地址、监控能力勾选 |
|
||||
|
||||
## 手机端(≤720px)
|
||||
|
||||
底栏固定四项:**监控 / 行情 / 计算 / AI**;其余入口进 **更多**。电脑与平板仍用顶栏,布局不变。
|
||||
|
||||
## 默认首页
|
||||
|
||||
登录后默认进入 **监控区**(`/monitor`)。
|
||||
@@ -1,43 +0,0 @@
|
||||
# 监控区与实例入口
|
||||
|
||||
## 监控卡片里有什么
|
||||
|
||||
每张交易所卡片通常包含:
|
||||
|
||||
- **资金行**:资金账户 / 交易账户 / 浮动盈亏(可在设置关闭)
|
||||
- **永续持仓**:表格摘要;点击标题栏 **进入全屏** 可看完整持仓卡片
|
||||
- **OKX 期权**(勾选「监控期权」后):永续与期权分块;全屏时期权也以卡片展示(与实例期权页字段一致,只读)
|
||||
- **关键位 / 下单监控 / 趋势回调 / 顺势加仓**:只读摘要(数据来自实例)
|
||||
|
||||
## 全屏模式
|
||||
|
||||
点击卡片标题栏(或移动端卡片主体)进入 **全屏**:
|
||||
|
||||
- 永续:每币种一张持仓卡,可 **委托 / 平仓**(非日内纪律模式)
|
||||
- 期权(OKX):只读卡片,含权利金、标记价、买盘深度等
|
||||
- 下方:关键位、下单监控、趋势与滚仓区块
|
||||
|
||||
按 `Esc` 或 **返回监控** 退出全屏。
|
||||
|
||||
## 打开实例(SSO)
|
||||
|
||||
监控卡片或全屏顶栏按钮:
|
||||
|
||||
| 按钮 | 进入实例页 | 说明 |
|
||||
|------|------------|------|
|
||||
| **打开实例** | 实盘下单 | 新浏览器标签 |
|
||||
| **下单** | 实盘下单 | 中控内 iframe |
|
||||
| **监控位** | 关键位监控 | |
|
||||
| **复盘** | 交易记录与复盘 | |
|
||||
| **期权** | 期权页 | 仅 OKX 且勾选监控期权 |
|
||||
|
||||
实例地址在 **系统设置 → 交易所** 配置 `flask_url`;未配置时不会出现上述按钮。
|
||||
|
||||
## 常见操作
|
||||
|
||||
| 操作 | 位置 |
|
||||
|------|------|
|
||||
| 紧急全平 | 卡片 **全平**(日内纪律账户可能禁用) |
|
||||
| 改止盈止损 | 持仓行 **委托** 或全屏卡片 |
|
||||
| 撤条件单 | 监控区条件单列表 |
|
||||
| 停止趋势计划 | 趋势回调区块 **停止 / 保本** 等 |
|
||||
@@ -1,30 +0,0 @@
|
||||
# 实例页导航说明
|
||||
|
||||
从监控区 **下单 / 打开实例** 进入后,实例顶栏常见 Tab 如下(部分可在实例 **系统设置 → 导航显示** 中隐藏)。
|
||||
|
||||
| Tab | 用途 |
|
||||
|-----|------|
|
||||
| **关键位监控** | 配置 5m 门禁关键位,可选自动下单 |
|
||||
| **实盘下单** | 人工下单、下单监控、预估盈亏比 |
|
||||
| **策略交易** | 趋势回调、顺势加仓计划(自动化) |
|
||||
| **策略交易记录** | 上述策略的执行历史 |
|
||||
| **交易记录与复盘** | 平仓记录、日记、AI 复盘 |
|
||||
| **统计分析** | 按周期汇总盈亏 |
|
||||
| **期权** | OKX 期权链、持仓、买一平仓(OKX 且已启用) |
|
||||
| **风控说明** | 只读展示当前风控相关 env |
|
||||
| **env配置** | 修改运行参数(中文标签) |
|
||||
| **系统设置** | 实例登录密码、导航 Tab 开关等 |
|
||||
|
||||
## 与中控的分工
|
||||
|
||||
| 在中控做 | 在实例做 |
|
||||
|----------|----------|
|
||||
| 看三所持仓汇总、全平 | 下单、改单、平仓 |
|
||||
| 看关键位 / 趋势摘要 | 新建 / 修改关键位与策略 |
|
||||
| 内照明心、数据看板 | 交易记录详情、日记 |
|
||||
| 开仓计划 | 策略交易执行 |
|
||||
| OKX 期权只读监控 | 期权开仓、买一平仓 |
|
||||
|
||||
## iframe 内操作
|
||||
|
||||
在中控 iframe 打开实例时,顶栏有 **返回监控 / 刷新 / 新标签打开**,无需重复登录。
|
||||
@@ -1,38 +0,0 @@
|
||||
# 设置与配置说明
|
||||
|
||||
## 三层配置,不要混用
|
||||
|
||||
| 层级 | 入口 | 管什么 |
|
||||
|------|------|--------|
|
||||
| **中控系统设置** | 中控 `/settings` | 中控密码、顶栏显示、交易所 URL、监控能力(关键位/趋势/期权)、宏观日历、备份 |
|
||||
| **实例系统设置** | 实例 `/settings` | 实例登录密码、实例顶栏 Tab 显示 |
|
||||
| **实例 env配置** | 实例 `/env_config` | 交易参数(止损比例、风控开关等) |
|
||||
|
||||
改 env 后通常需 **重启对应实例 PM2** 才完全生效;具体字段含义见实例 env 页说明或仓库 `docs/env配置说明.md`(无需在中控内阅读)。
|
||||
|
||||
## 中控 · 显示与导航
|
||||
|
||||
可隐藏不常用的顶栏 Tab(**监控区**、**系统设置** 无法隐藏)。
|
||||
|
||||
## 中控 · 交易所
|
||||
|
||||
每项需配置:
|
||||
|
||||
- **flask_url**:实例 HTTP 地址(中控聚合与打开实例用)
|
||||
- **agent_url**:子代理地址(持仓与全平)
|
||||
- **capabilities**:勾选 **关键位 / 趋势 / 期权** 决定监控区展示哪些块
|
||||
|
||||
## 实例 · 导航显示
|
||||
|
||||
固定保留:**关键位监控、实盘下单、系统设置**。其余 Tab 可按需开关。
|
||||
|
||||
## 使用向常见问题
|
||||
|
||||
**监控卡片没有「下单」按钮**
|
||||
→ 检查该所 `flask_url` 是否填写且实例可访问。
|
||||
|
||||
**OKX 看不到期权**
|
||||
→ 中控设置勾选「监控期权」,且实例已启用期权模块。
|
||||
|
||||
**策略说明 vs 策略交易**
|
||||
→ 前者在中控,是文档;后者在实例,是自动化功能。
|
||||
@@ -768,6 +768,13 @@ async def _hub_lifespan(_app: FastAPI):
|
||||
|
||||
|
||||
app = FastAPI(title="复盘系统中控", docs_url=None, redoc_url=None, lifespan=_hub_lifespan)
|
||||
try:
|
||||
from lib.license.fastapi_gate import install_license_middleware
|
||||
|
||||
install_license_middleware(app)
|
||||
except Exception as _lic_err:
|
||||
print(f"[license] hub: {_lic_err}")
|
||||
|
||||
STATIC_DIR = DIR / "static"
|
||||
_REPO_STATIC = _REPO_ROOT / "lib" / "common" / "static"
|
||||
_AI_REVIEW_RENDER_JS = _REPO_STATIC / "ai_review_render.js"
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
# 中控与子代理 · 后台常驻(Ubuntu)
|
||||
|
||||
**唯一推荐方式:PM2.**
|
||||
|
||||
请仅使用 PM2 托管 `hub.py` 与 `agent.py`,勿与 nohup 等方式重复启动同一端口.
|
||||
|
||||
---
|
||||
|
||||
## 启动
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user/manual_trading_hub
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
cp -n .env.example .env # 首次
|
||||
|
||||
pm2 start ecosystem.config.cjs
|
||||
pm2 save
|
||||
pm2 list
|
||||
```
|
||||
|
||||
一条 `ecosystem.config.cjs` 会拉起 **4 个子代理 + 1 个 hub**.
|
||||
|
||||
---
|
||||
|
||||
## 常用命令
|
||||
|
||||
```bash
|
||||
pm2 logs manual-trading-hub
|
||||
pm2 restart manual-trading-hub
|
||||
pm2 restart all
|
||||
bash scripts/verify_hub_deploy.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 详细说明
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [../部署文档.md](../部署文档.md) | 端口,反代,故障排查 |
|
||||
| [../../docs/ubuntu-server.md](../../docs/ubuntu-server.md) | Python / Node / PM2 版本与三所启动顺序 |
|
||||
@@ -1,289 +0,0 @@
|
||||
# 云服务器部署说明
|
||||
|
||||
本文说明在 **云服务器(VPS)** 上部署 `crypto_monitor` 中控与三实例的推荐配置:硬件,软件,防火墙,宝塔反代,环境变量,PM2 启动与验收.
|
||||
|
||||
云上标准做法:**域名 + 宝塔/Nginx 反代 + HTTPS**;业务端口(5100,5000~5004,15200~15202)**不对公网直连**.
|
||||
|
||||
相关文档:
|
||||
|
||||
- **[本地数据迁移到云端.md](./本地数据迁移到云端.md)** — 备份 `crypto.db`,图片,`hub_settings` 与恢复步骤
|
||||
- [局域网与反代部署说明.md](./局域网与反代部署说明.md) — 局域网 IP:端口 与反代域名对照,SSO 行为
|
||||
- [部署文档.md](./部署文档.md) — PM2,依赖安装,日常运维
|
||||
- [使用说明.md](./使用说明.md) — 中控功能说明
|
||||
- [常见问题.md](./常见问题.md) — 故障排查
|
||||
- 环境变量模板:[.env.example](./.env.example)
|
||||
|
||||
---
|
||||
|
||||
## 一,服务器硬件与系统
|
||||
|
||||
| 项目 | 建议 |
|
||||
|------|------|
|
||||
| 配置 | **2 核 4G** 起步;三实例 + 中控 + PM2 同时运行,**4G~8G 更稳** |
|
||||
| 系统 | **Ubuntu 22.04 / 24.04**(项目文档按 Linux 编写) |
|
||||
| 磁盘 | **20G+**;日志,SQLite,上传图片会占空间 |
|
||||
| 网络 | 需能访问各交易所 API;若走代理,在对应 `crypto_monitor_*/.env` 配置 `OKX_SOCKS_PROXY`,`BINANCE_SOCKS_PROXY` 等 |
|
||||
|
||||
---
|
||||
|
||||
## 二,软件环境
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y python3 python3-venv python3-pip git curl
|
||||
|
||||
# 进程守护(推荐)
|
||||
sudo npm i -g pm2
|
||||
```
|
||||
|
||||
**宝塔面板(可选但推荐)**:安装 **Nginx**,用于反向代理与 **SSL**(Let’s Encrypt).
|
||||
|
||||
Python 虚拟环境(分开安装,互不替代):
|
||||
|
||||
| 目录 | 用途 |
|
||||
|------|------|
|
||||
| `manual_trading_hub/.venv` | 中控 `hub.py` + 子代理 `agent.py` |
|
||||
| `crypto_monitor_binance/.venv` | 币安 Flask |
|
||||
| `crypto_monitor_okx/.venv` | OKX Flask |
|
||||
| `crypto_monitor_gate/.venv` | Gate Flask |
|
||||
| `crypto_monitor_gate/.venv` | Gate Flask |
|
||||
|
||||
各实例 `ecosystem.config.cjs` 一般已设置 **`PYTHONPATH=..`**(仓库根),以便加载 `hub_bridge.py`,`hub_auth.py` 等.
|
||||
|
||||
---
|
||||
|
||||
## 三,网络与端口(云上最重要)
|
||||
|
||||
**原则:公网只暴露 Nginx 的 80/443;Flask 与 agent 只监听本机.**
|
||||
|
||||
| 服务 | 本机端口(示例) | 是否对公网开放 |
|
||||
|------|------------------|----------------|
|
||||
| 中控 hub | 5100 | **否** → 仅 `https://hub.你的域名` 反代 |
|
||||
| 币安 Flask | 5001 | **否** → `https://binance.你的域名` |
|
||||
| OKX Flask | 5004 | **否** → `https://okx.你的域名` |
|
||||
| Gate Flask | 5000 | **否** → `https://gate.你的域名` |
|
||||
| 子代理 agent | 15200~15202 | **否**,必须 **127.0.0.1** |
|
||||
|
||||
### 云厂商安全组 / 系统防火墙
|
||||
|
||||
- **放行**:`80`,`443`(给宝塔/Nginx)
|
||||
- **不要放行**:`5100`,`5000`~`5004`,`15200`~`15202`(除非临时本机调试,用完即关)
|
||||
|
||||
---
|
||||
|
||||
## 四,域名与宝塔反代
|
||||
|
||||
为 **中控 + 每个要对外打开的实例** 各建一个站点(子域名示例):
|
||||
|
||||
| 站点(浏览器访问) | 反代目标 |
|
||||
|--------------------|----------|
|
||||
| `https://hub.example.com` | `http://127.0.0.1:5100` |
|
||||
| `https://okx.example.com` | `http://127.0.0.1:5004` |
|
||||
| `https://binance.example.com` | `http://127.0.0.1:5001` |
|
||||
| `https://gate.example.com` | `http://127.0.0.1:5000` |
|
||||
|
||||
### 宝塔操作要点
|
||||
|
||||
1. 每个域名 → **网站** → **反向代理** → 目标 `http://127.0.0.1:对应端口`.
|
||||
2. 申请 **SSL**(Let’s Encrypt),强制 HTTPS.
|
||||
3. **不要**再给实例站加一层宝塔「访问密码」(会与 Flask `/login` 重复);直链鉴权用下文 **`APP_USERNAME` / `APP_PASSWORD`**.
|
||||
4. Nginx 建议保留常见代理头(宝塔默认通常已带):
|
||||
|
||||
```nginx
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
```
|
||||
|
||||
中控请求实例 `/api/hub/*` 时会带 **`X-Hub-Token`**,一般无需额外配置.
|
||||
|
||||
---
|
||||
|
||||
## 五,环境变量(必配)
|
||||
|
||||
### 5.1 中控 `manual_trading_hub/.env`
|
||||
|
||||
```env
|
||||
HUB_HOST=0.0.0.0
|
||||
HUB_PORT=5100
|
||||
|
||||
# 与三实例 .env 完全相同(API + SSO 签名)
|
||||
HUB_BRIDGE_TOKEN=请填一长串随机字符
|
||||
|
||||
# 中控网页登录(公网务必设置)
|
||||
HUB_USERNAME=admin
|
||||
HUB_PASSWORD=强密码
|
||||
HUB_SESSION_SECRET=另一串随机字符
|
||||
|
||||
# 中控为 HTTPS 时建议 true
|
||||
HUB_COOKIE_SECURE=true
|
||||
|
||||
# 公网用域名访问中控(宝塔反代)时必设其一:
|
||||
# HUB_ALLOW_PUBLIC=true (推荐:反代 + 中控密码)
|
||||
# 或反代目标必须是 http://127.0.0.1:5100 且可保持 HUB_TRUST_LAN=false
|
||||
HUB_ALLOW_PUBLIC=true
|
||||
HUB_TRUST_LAN=false
|
||||
|
||||
# 从中控打开实例的 SSO 链接有效期(秒),默认 7200 = 2 小时
|
||||
HUB_SSO_TTL_SEC=7200
|
||||
|
||||
# 各实例 hub_settings 里 flask_url 已写 https 域名时,一般可不设
|
||||
# HUB_PUBLIC_ORIGIN=https://hub.example.com
|
||||
```
|
||||
|
||||
完整项见 [`.env.example`](./.env.example).
|
||||
|
||||
### 5.2 三个实例 `crypto_monitor_*/.env`
|
||||
|
||||
每个目录都要有(**直链** `https://okx.域名` 时用这套登录网页):
|
||||
|
||||
```env
|
||||
# 各所 API 密钥(按交易所填写)
|
||||
# APP_PORT=5004
|
||||
|
||||
# 与中控 manual_trading_hub/.env 中 HUB_BRIDGE_TOKEN 完全一致
|
||||
HUB_BRIDGE_TOKEN=与中控相同
|
||||
|
||||
# 三实例建议统一(直链登录用)
|
||||
APP_USERNAME=统一用户名
|
||||
APP_PASSWORD=统一强密码
|
||||
|
||||
# 云服务器切勿开启(会跳过网页登录):
|
||||
# APP_AUTH_DISABLED=true
|
||||
```
|
||||
|
||||
### 5.3 子代理
|
||||
|
||||
- `CONTROL_TOKEN` 可与 `HUB_BRIDGE_TOKEN` 相同.
|
||||
- 由 PM2 在对应 `crypto_monitor_*` 目录启动,`run_agent.sh` 加载该目录 `.env`.
|
||||
- 只监听 **127.0.0.1:1520x**,不映射到公网.
|
||||
|
||||
---
|
||||
|
||||
## 六,中控「系统设置」`hub_settings.json`
|
||||
|
||||
在网页 **系统设置** 保存,或编辑 `manual_trading_hub/hub_settings.json`.
|
||||
|
||||
云上 **`flask_url` 必须写浏览器能打开的 HTTPS 域名**(不要写 `127.0.0.1`,除非配合 `HUB_PUBLIC_ORIGIN` 做替换):
|
||||
|
||||
| 字段 | 云上填法 | 说明 |
|
||||
|------|----------|------|
|
||||
| `flask_url` | `https://okx.example.com` | 用户浏览器,SSO 打开实例 |
|
||||
| `agent_url` | `http://127.0.0.1:15201` | 仅中控本机访问子代理 |
|
||||
| `enabled` | 按需 | 不参与监控的户可关 |
|
||||
| `capabilities` | 按需 | `key` / `trend` 等 |
|
||||
|
||||
**同机部署的两种写法(二选一):**
|
||||
|
||||
1. **推荐**:每个实例 `flask_url` 直接写该实例的 `https://子域名`.
|
||||
2. **备选**:`flask_url` 写 `http://127.0.0.1:5004`,中控 `.env` 设 `HUB_PUBLIC_ORIGIN=https://okx.example.com`(适合共用一个 IP,靠端口区分时).
|
||||
|
||||
`agent_url` 始终用 **`http://127.0.0.1:1520x`**.
|
||||
|
||||
---
|
||||
|
||||
## 七,PM2 启动顺序
|
||||
|
||||
代码路径示例:`/opt/crypto_monitor_user/`(按实际替换).
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user
|
||||
|
||||
# 1)三个实例 Flask(各目录 ecosystem.config.cjs,进程名以你机器为准)
|
||||
cd crypto_monitor_okx && pm2 start ecosystem.config.cjs
|
||||
cd ../crypto_monitor_binance && pm2 start ecosystem.config.cjs
|
||||
cd ../crypto_monitor_gate && pm2 start ecosystem.config.cjs
|
||||
|
||||
# 2)中控 + 三个子代理(一条拉起 4 个进程:hub + 3 agent)
|
||||
cd ../manual_trading_hub
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
cp .env.example .env # 编辑填入真实值
|
||||
chmod +x scripts/run_hub.sh scripts/run_agent.sh
|
||||
pm2 start ecosystem.config.cjs
|
||||
pm2 save
|
||||
pm2 startup # 按提示执行 sudo 命令后再 pm2 save
|
||||
```
|
||||
|
||||
或:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user/manual_trading_hub
|
||||
bash scripts/pm2_hub.sh start
|
||||
```
|
||||
|
||||
### PM2 进程一览
|
||||
|
||||
| 进程名 | 说明 |
|
||||
|--------|------|
|
||||
| `manual-trading-hub` | 中控 :5100 |
|
||||
| `manual-agent-binance` | :15200 |
|
||||
| `manual-agent-okx` | :15201 |
|
||||
| `manual-agent-gate` | :15202 |
|
||||
| `crypto_*`(各目录自定) | 各 Flask `APP_PORT` |
|
||||
|
||||
不用 OKX 时可在 `.env` 设 `HUB_DISABLED_IDS=1`,或 `pm2 stop manual-agent-okx`.
|
||||
|
||||
---
|
||||
|
||||
## 八,访问与登录(云上行为)
|
||||
|
||||
| 访问方式 | 地址示例 | 需要什么 |
|
||||
|----------|----------|----------|
|
||||
| 中控监控 | `https://hub.example.com/monitor` | **中控** `HUB_USERNAME` / `HUB_PASSWORD` |
|
||||
| 中控点「实例 / 策略交易 / 复盘」 | 自动打开 `https://okx.example.com/hub-sso?...` | 已登中控即可;**2 小时内,单次** SSO,**免输**实例密码 |
|
||||
| 浏览器直链实例 | `https://okx.example.com` | 实例 **`APP_USERNAME` / `APP_PASSWORD`**(`/login`) |
|
||||
|
||||
SSO 复用 **`HUB_BRIDGE_TOKEN`** 签名,详见 [局域网与反代部署说明.md §五](./局域网与反代部署说明.md).
|
||||
|
||||
---
|
||||
|
||||
## 九,安全建议(云服务器必看)
|
||||
|
||||
1. **SSH**:密钥登录,关闭密码登录;必要时改 SSH 端口.
|
||||
2. **`HUB_BRIDGE_TOKEN`**:足够长,随机;勿提交 Git,勿写进前端页面.
|
||||
3. **交易所 API Key**:仅放在各实例 `.env`;权限尽量最小化(勿随意开提币).
|
||||
4. **中控**:公网必须设 `HUB_PASSWORD`;`HUB_TRUST_LAN=false`.
|
||||
5. **实例**:云上 **`APP_AUTH_DISABLED` 必须为 false**(或未设置).
|
||||
6. **备份**:定期备份各实例数据库 / SQLite 与 `hub_settings.json`.
|
||||
7. **`.env` 换行**:Linux 上勿用 Windows CRLF;可用 `bash scripts/fix_env_crlf.sh`.
|
||||
|
||||
---
|
||||
|
||||
## 十,部署后验收清单
|
||||
|
||||
- [ ] `https://hub.你的域名` 能打开并登录中控
|
||||
- [ ] 监控卡片有持仓/余额(子代理在线)
|
||||
- [ ] 已登录中控 → 点「实例」→ **无**实例登录页,直接进入
|
||||
- [ ] 隐身窗口直开 `https://okx.你的域名` → 出现 **`/login`**,统一账号密码可进
|
||||
- [ ] `pm2 status`:hub,4×agent,用到的 `crypto_*` 均为 online
|
||||
- [ ] 云安全组 **未** 对公网开放 5100,5000~5004,15200~15202
|
||||
- [ ] 三实例 `.env` 与中控 `HUB_BRIDGE_TOKEN` 一致
|
||||
- [ ] 实例启动日志无长期 `[hub_bridge] ImportError`
|
||||
|
||||
---
|
||||
|
||||
## 十一,常见问题速查
|
||||
|
||||
| 现象 | 处理 |
|
||||
|------|------|
|
||||
| 从中控打开仍要实例密码 | 见 [常见问题.md §4.3](./常见问题.md);检查 token,重启 Flask,`hub_settings` 的 `key` |
|
||||
| 监控无持仓 / 子代理不可用 | `curl http://127.0.0.1:15201/status`;查 `.env` CRLF,API 密钥 |
|
||||
| 复盘/实例链接是 127.0.0.1 | `flask_url` 改为 https 域名,或设 `HUB_PUBLIC_ORIGIN` |
|
||||
| 仅 Gate 子代理反复重启 | `.env` CRLF:`bash manual_trading_hub/scripts/fix_env_crlf.sh` |
|
||||
|
||||
---
|
||||
|
||||
## 十二,与局域网部署的区别(简要)
|
||||
|
||||
| 项目 | 云服务器 | 局域网 |
|
||||
|------|----------|--------|
|
||||
| 对外地址 | `https://子域名` | `http://内网IP:端口` |
|
||||
| `flask_url` | 写 **域名** | 写 **内网 IP:端口** |
|
||||
| 防火墙 | 只开 80/443 | 内网可开 5100,500x |
|
||||
| SSL | 必须(宝塔证书) | 通常 HTTP 即可 |
|
||||
| `HUB_COOKIE_SECURE` | 建议 `true` | HTTP 时用 `false` |
|
||||
|
||||
局域网详细步骤见 [局域网与反代部署说明.md §三](./局域网与反代部署说明.md).
|
||||
@@ -1,84 +0,0 @@
|
||||
# 交易监管(AI 教练)
|
||||
|
||||
中控 **交易监管** 用于防止过度交易与频繁手动操作:在 **手动/中控开平仓** 与 **新开仓** 时自动推送至 **今日监管长会话**,并可选 **企业微信** 提醒;程序止盈/止损按「正常执行」鼓励,不计入频繁交易统计.
|
||||
|
||||
入口:**AI 教练**(`/ai`)→ Tab **交易监管**,或微信链接(在系统设置中配置).
|
||||
|
||||
## 监管范围
|
||||
|
||||
| 类型 | 识别 | 页内推送 | 微信(P0) | 频率统计 |
|
||||
|------|------|----------|------------|----------|
|
||||
| 实例手动平仓 | `result = 手动平仓` | ✓ | ✓ | ✓ |
|
||||
| 中控平仓 | `result = 强制清仓` 等 | ✓ | ✓ | ✓ |
|
||||
| 新开仓 | 监控板持仓 diff(0→有仓 / 新合约) | ✓ | ✓ | ✓ |
|
||||
| 程序止盈 | 止盈 / 保本止盈 / 移动止盈 | ✓ | 可选 | ✗ |
|
||||
| 程序止损 | 止损 | ✓ | 可选 | ✗ |
|
||||
| 外部平仓 | 外部平仓,时间平仓 | ✗ | ✗ | ✗ |
|
||||
|
||||
频率规则(间隔过短,30 分钟笔数,日笔数,连亏,平后快开)**只对手动/中控开平** 叠加 `[监管·频率]` 警告.
|
||||
|
||||
## 会话
|
||||
|
||||
- 每个交易日 **一条长会话**(`bot_mode: supervisor`,标题 `今日监管 YYYY-MM-DD`).
|
||||
- 系统消息(`role: system`)+ AI 短评(`assistant`)+ 用户回复(`user`)同线程.
|
||||
- 与 **交易教练 / 普通聊天** 分离;监管会话不支持「新开对话」.
|
||||
|
||||
## 系统设置
|
||||
|
||||
路径:**系统设置** → **交易监管 · 企业微信**(写入 `hub_settings.json` → `supervisor`).
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `enabled` | 总开关 |
|
||||
| `wechat_webhook` | **监管专用** 企业微信机器人(与三所实例 `.env` 的 `WECHAT_WEBHOOK` 独立) |
|
||||
| `wechat_link_base` | 微信消息末尾跳转链接(**可单独修改**,如 `https://域名/ai?mode=supervisor`) |
|
||||
| `wechat_prefix` | 消息前缀,默认 `【交易监管】` |
|
||||
| `wechat_on_program_tp_sl` | 程序止盈/止损是否也发微信 |
|
||||
| `manual_close_daily_warn` | 日手动平警告阈值(默认 2) |
|
||||
| `interval_warn_minutes` | 两笔手动/中控平最短间隔(默认 15 分钟) |
|
||||
| `freq_30m_count` | 30 分钟内笔数阈值(默认 2) |
|
||||
| `reopen_after_close_minutes` | 手动平后再开仓警告间隔(默认 30 分钟) |
|
||||
|
||||
`.env` 兜底(设置页保存优先):
|
||||
|
||||
```env
|
||||
SUPERVISOR_WECHAT_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...
|
||||
SUPERVISOR_WECHAT_LINK=https://你的域名/ai?mode=supervisor
|
||||
SUPERVISOR_POLL_INTERVAL_SEC=30
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/ai/supervisor/session` | 今日监管会话 |
|
||||
| GET | `/api/ai/supervisor/stream` | SSE 版本推送 |
|
||||
| POST | `/api/ai/supervisor/chat/send` | 用户回聊(JSON `{ "message": "..." }`) |
|
||||
| GET | `/api/ai/supervisor/rules` | 当前阈值 |
|
||||
| POST | `/api/ai/supervisor/refresh` | 立即扫描 |
|
||||
|
||||
## 存储
|
||||
|
||||
| 文件 | 内容 |
|
||||
|------|------|
|
||||
| `hub_supervisor_state.json` | 已处理事件,持仓快照,频率统计 |
|
||||
| `hub_ai_chat.json` | 监管会话(`bot_mode: supervisor`) |
|
||||
| `hub_settings.json` | `supervisor` 配置节 |
|
||||
|
||||
**首次启用** 会对当前交易日已有平仓做 **种子同步**(不补发历史推送),避免部署瞬间刷屏.
|
||||
|
||||
## 与实例风控
|
||||
|
||||
实例 `account_risk_lib`(冷静期 / 日冻结)为 **硬拦截**;监管为 **软提醒 + 陪聊**,不绕过实例开仓限制.
|
||||
|
||||
## 代码位置
|
||||
|
||||
| 模块 | 路径 |
|
||||
|------|------|
|
||||
| 规则与推送 | `hub_supervisor_lib.py` |
|
||||
| 后台扫描 | `hub_supervisor_cache.py` |
|
||||
| 会话 | `hub_ai/supervisor_store.py` |
|
||||
| AI 评语/回聊 | `hub_ai/supervisor.py` |
|
||||
| 提示词 | `hub_ai/prompts.py` → `SUPERVISOR_SYSTEM` |
|
||||
|
||||
部署后重启中控:`pm2 restart manual-trading-hub`(或你的 hub 进程名).
|
||||
+12
-506
@@ -1,518 +1,24 @@
|
||||
# 多账户交易中控 — 使用说明
|
||||
# 中控 manual_trading_hub(用户版)
|
||||
|
||||
本文档说明 **manual_trading_hub** 的架构,启动方式,界面操作与故障排查.中控聚合三所 **持仓/条件单/余额/关键位/趋势计划监控 + 撤单/紧急全平**,并提供 **资金概况**,**行情区 K 线** 与 **内照明心(复盘语录 + 永久 K 线)**;**人工下单,关键位,策略交易(趋势回调 / 顺势加仓),交易复盘** 均在各实例网页操作(点监控卡片 **「实例」**).资金概况见 **[资金概况说明.md](./资金概况说明.md)**;行情区细则见 **[行情区说明.md](./行情区说明.md)**;内照明心见 **[docs/hub-symbol-archive-kline.md](../docs/hub-symbol-archive-kline.md)**.
|
||||
聚合多账户监控与系统设置。人工下单与策略操作在各交易所实例网页完成。
|
||||
|
||||
---
|
||||
|
||||
## 1. 架构总览
|
||||
|
||||
```
|
||||
浏览器
|
||||
├─ /funds 资金概况
|
||||
├─ /plan 开仓计划(计划录入 / 进行中 / 历史胜率)
|
||||
├─ /monitor 监控区(持仓,关键位,趋势计划,全平)
|
||||
├─ /market 行情区(K 线,技术指标,持仓价格线)
|
||||
├─ /archive 内照明心(复盘语录 + 交易记录 + 永久 5m K 线)
|
||||
├─ /funds 资金概况(总资金曲线,分户资金与回撤)
|
||||
├─ /dashboard 数据看板(三户当日总览,SSE 推送;见 [数据看板说明.md](./数据看板说明.md))
|
||||
├─ /ai AI 教练(交易教练 / 普通聊天;见 [AI教练说明.md](./AI教练说明.md))
|
||||
└─ /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` |
|
||||
| **crypto_monitor_*.app** | 策略库,关键位,人工单,趋势预览/执行 | 币安 `5001`,Gate `5000`,OKX `5004` |
|
||||
|
||||
### 1.1 三账户默认配置
|
||||
|
||||
| id | 名称 | Flask | Agent | 监控能力(设置页勾选) | 默认启用 |
|
||||
|----|------|-------|-------|------------------------|----------|
|
||||
| 0 | 币安 | :5001 | :15200 | 关键位 + 趋势 | 是 |
|
||||
| 1 | OKX | :5004 | :15201 | 关键位 + 趋势 | 是 |
|
||||
| 2 | Gate | :5000 | :15202 | 关键位 + 趋势 | 是 |
|
||||
|
||||
- **三所均已支持** 关键位,策略交易(趋势回调 + 顺势加仓);中控可同时勾 **监控关键位** + **监控趋势计划**(见 §4.2,§5).
|
||||
|
||||
### 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 依赖安装
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user/manual_trading_hub
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
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 强制关闭某账户
|
||||
|
||||
```bash
|
||||
# 在 manual_trading_hub/.env 中设置,或临时:
|
||||
export HUB_DISABLED_IDS=1 # 默认即关闭 OKX(id=1)
|
||||
```
|
||||
|
||||
与设置页「启用」取 **与** 关系:环境变量强制关闭时,网页勾选框会灰掉且无法启用.
|
||||
|
||||
### 2.4 Web 登录(反代公网强烈建议)
|
||||
|
||||
在 `manual_trading_hub/.env` 中配置:
|
||||
|
||||
| 变量 | 说明 |
|
||||
|------|------|
|
||||
| `HUB_USERNAME` | 登录用户名;未设且已设密码时默认为 `admin` |
|
||||
| `HUB_PASSWORD` | **非空即启用登录**;所有页面与 API(除登录页,`/api/ping`,`/assets`)须先登录 |
|
||||
| `HUB_SESSION_SECRET` | 会话签名密钥(建议单独随机串) |
|
||||
| `HUB_COOKIE_SECURE` | 建议 `true`:仅 **HTTPS** 访问时 Cookie 带 Secure;**HTTP 内网 IP:5100 仍可登录** |
|
||||
| `HUB_SESSION_DAYS` | 登录保持天数,默认 `7` |
|
||||
|
||||
- 登录页:`http://<中控地址>:5100/login`
|
||||
- 顶栏 **退出** 清除会话.
|
||||
- **域名(HTTPS)** 与 **内网 IP(HTTP)** Cookie 不共用,需分别登录一次.
|
||||
|
||||
更多登录/Cookie 问题见 **[常见问题.md](./常见问题.md)** 第二节.
|
||||
|
||||
### 2.5 配置文件
|
||||
|
||||
- 路径:`manual_trading_hub/hub_settings.json`(在网页 **系统设置 → 保存设置** 后写入).
|
||||
- 未保存前使用 `settings_store.py` 内置默认三所地址.
|
||||
- 建议 **不要** 把含内网 IP 的 `hub_settings.json` 提交到公开仓库.
|
||||
- 环境变量模板:`manual_trading_hub/.env.example`;三实例模板中已补充 `HUB_BRIDGE_TOKEN` 说明.
|
||||
|
||||
---
|
||||
|
||||
## 3. 启动顺序(Ubuntu + PM2)
|
||||
|
||||
**原则**:代码在 **`/opt/crypto_monitor_user`**,先三实例 Flask,再中控(一条 PM2 含 3 agent + hub).环境见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**.
|
||||
|
||||
```bash
|
||||
# 三所 Flask(示例:币安;其余三所同理)
|
||||
cd /opt/crypto_monitor_user/crypto_monitor_binance
|
||||
pm2 start ecosystem.config.cjs
|
||||
|
||||
# 中控 + 子代理
|
||||
cd /opt/crypto_monitor_user/manual_trading_hub
|
||||
pm2 start ecosystem.config.cjs
|
||||
pm2 save
|
||||
```
|
||||
|
||||
浏览器(本机或反代):
|
||||
|
||||
- 监控区:`http://127.0.0.1:5100/monitor`
|
||||
- 行情区:`http://127.0.0.1:5100/market`
|
||||
- 内照明心:`http://127.0.0.1:5100/archive`
|
||||
- 资金概况:`http://127.0.0.1:5100/funds`
|
||||
- 系统设置:`http://127.0.0.1:5100/settings`
|
||||
|
||||
验收:
|
||||
|
||||
```bash
|
||||
bash /opt/crypto_monitor_user/manual_trading_hub/scripts/verify_hub_deploy.sh
|
||||
curl -s http://127.0.0.1:5100/api/ping
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 页面操作说明
|
||||
|
||||
Chrome **桌面快捷方式**图标来自站点 `favicon` / `manifest`(已配置统一品牌图),说明见 **[docs/shortcut-icon.md](../docs/shortcut-icon.md)**.
|
||||
|
||||
### 4.1 监控区 `/monitor`
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **服务器状态** | 标题下方可折叠条(**默认收起**),摘要行显示 CPU/内存/硬盘;展开见四指标卡片(`GET /api/host/status`,每 5 秒刷新).**CPU 或内存 ≥85%** 时浏览器弹窗告警(降至 85% 以下后再次超标会再提示).依赖 `manual_trading_hub/.venv` 内 **psutil**(勿用系统 `pip`,见 [部署文档.md](./部署文档.md)).可选 `HUB_HOST_DISK_PATH` 指定监控磁盘 |
|
||||
| **2×2 主界面** | 三所信息**完整展示**:余额,持仓表,委托/平仓,折叠委托单,下单监控,关键位,趋势/加仓摘要 |
|
||||
| **全屏放大** | **点击卡片标题栏**(非按钮区)→ 该所**全屏**:每币种一张实盘风格持仓卡(趋势持仓显示**来源: 趋势回调计划**,**风险%**,**程序监控·止盈价**,**盈亏比**,与实例策略页一致);独立卡片:**关键位**,**下单监控**,**趋势回调**(单计划 **两列**:左=币种基本信息与 3×2 指标,右=**补仓计划明细**,底=**保本偏移%** 可编辑 + **保本移交** / **结束计划**(中控直接调实例,与 `/strategy` 一致),快照可用/计划保证金/杠杆),**顺势加仓** |
|
||||
| **委托单折叠** | 仅「委托单」区块默认折叠;展开状态存浏览器本地,**5 秒刷新不重置** |
|
||||
| **条件单 / 委托** | 每个持仓下方展示交易所 **条件单**(默认折叠)与 **普通委托**;数据来自子代理实时拉取(币安含 Algo 通道) |
|
||||
| **撤单** | 条件单区内单笔「撤单」或「撤销全部」;经中控 `POST /api/orders/{id}/cancel`,`cancel-symbol` |
|
||||
| **挂止盈止损** | 持仓行 **「委托」**:弹窗填止损/止盈价 → **先撤该合约全部条件单,再挂新 TP/SL**(币安 / OKX / Gate / Gate 三所统一,逻辑与各实例 `.env` 参数一致) |
|
||||
| **平仓** | 持仓行「平仓」:仅平该方向仓位(子代理市价减仓) |
|
||||
| **机器人单** | 来自实例 `/api/hub/monitor` 的 `order_monitors`(active),为本地监控计划,**不等于**交易所条件单 |
|
||||
| **关键位** | 仅 `capabilities` 含 `key` 的户;展示门控摘要(`/api/price_snapshot`) |
|
||||
| **趋势计划** | 仅当该户勾选 **监控趋势计划** 时展示 `trend_pullback_plans`(active) |
|
||||
| **实例 / 复盘** | 「实例」「策略交易」「复盘」经中控签发 **SSO 链接**(默认 2h,单次)打开,**免输**实例 `APP_USERNAME/PASSWORD`;直链实例 IP/域名仍走 `/login`.**云服务器**见 **[云服务器部署说明.md](./云服务器部署说明.md)**;局域网/反代见 **[局域网与反代部署说明.md](./局域网与反代部署说明.md)** |
|
||||
| **关键位列表** | 来自 `/api/hub/monitor` + `/api/price_snapshot`;Flask 未连通时卡片提示原因;**Gate 户**无关键位块 |
|
||||
| **该户全平** | `POST` 子代理 `/emergency/close-all`,仅平该 API Key 仓位 |
|
||||
| **全局紧急全平** | 对所有已启用户依次全平(不含 `HUB_DISABLED_IDS` 强制关闭的 id) |
|
||||
| **自动刷新** | 默认每 5 秒请求 `/api/monitor/board` |
|
||||
|
||||
持仓数据以 **子代理 ccxt** 为准;关键位/趋势/机器人单以 **Flask 数据库** 为准.若 Flask 未启动,卡片仍会显示 agent 持仓,但下方策略信息可能为空或报错.
|
||||
|
||||
### 4.2 行情区 `/market`
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **K 线** | 选择已启用交易所 + 币种 + 周期;按需拉取,本地 `data/hub_kline.db` 缓存(默认保留 15 天) |
|
||||
| **周期** | `1m` `5m` `15m` `1h` `2h` `4h` `12h` `1d` `1w` |
|
||||
| **加载 / 强制刷新** | 普通加载优先缓存;强制刷新重拉并覆盖缓存 |
|
||||
| **从监控跳转** | 点击持仓合约名带入品种,并显示入场/止损/止盈/委托与 K 线价格线 |
|
||||
| **技术指标** | 可选 EMA 21/55,MACD,RSI |
|
||||
| **快捷键** | **`F`** 全屏/退出;全屏时 **`Esc`** 退出;数字键切换周期(见 [行情区说明.md](./行情区说明.md)) |
|
||||
| **自动刷新** | 约 5 秒更新最新 OHLCV |
|
||||
|
||||
数据经中控 → 各实例 `GET /api/hub/ohlcv`(`hub_ohlcv_lib`).升级 hub 与三实例 Flask 后请 **强刷浏览器**;异常 K 线可点 **强制刷新**.
|
||||
|
||||
### 4.2.1 内照明心 `/archive`
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **复盘语录** | 左栏按日添加/编辑;最多 100 条 |
|
||||
| **日期** | **本日 / 本周 / 本月 / 自选区间**(交易日 8:00 切日) |
|
||||
| **区间统计** | 总开仓,犯病次数与占比,盈亏,剔除犯病盈亏,各交易所分项 |
|
||||
| **筛选** | 盈利单,亏损单,犯病(仅过滤表格;统计栏不受此三项影响) |
|
||||
| **交易记录** | 区间内开仓列表;犯病行红色字体;可编辑备注与犯病标签 |
|
||||
| **K 线** | 默认折叠按需加载;独立库 `data/hub_symbol_archive.db`;仅存 **5m** 真源,**15m/1h/4h** 聚合 |
|
||||
| **建档** | 最早开仓向前 **30 天** 5m 种子;之后每 **4h** 增量(Hub 后台 + 可点「同步」) |
|
||||
| **视窗** | **持仓过程**(锚平仓)/ **进场决策**(锚开仓);支持时间输入跳转 |
|
||||
|
||||
与行情区 `hub_kline.db`(15 天滚动)**分离**,建档起 **只增不删**.细则见 **[docs/hub-symbol-archive-kline.md](../docs/hub-symbol-archive-kline.md)**.
|
||||
|
||||
### 4.2.2 资金概况 `/funds`
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **总资金** | 已监控账户的 **资金户 + 交易户** 合计(不含浮盈) |
|
||||
| **总曲线** | 自 **2026-06-09** 起,按北京时间交易日(默认 8:00 切日)每日一点,最多 **180** 天 |
|
||||
| **最大回撤** | 基于总资金余额曲线(非平仓盈亏回撤) |
|
||||
| **分户** | 每户资金/交易拆分,迷你曲线,分户回撤;**未监控** 不参与合计 |
|
||||
| **快照** | 监控板聚合成功时写入 `hub_fund_history.json` |
|
||||
|
||||
细则见 **[资金概况说明.md](./资金概况说明.md)**.
|
||||
|
||||
### 4.2.3 数据看板 `/dashboard`
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **总览** | 交易日,平仓盈亏,笔数,浮盈亏,资金合计,持仓数 |
|
||||
| **分户** | 三户资金/交易账户,今日盈亏,浮盈亏;单日亏损 ≥ 资金合计 **5%** 高亮预警 |
|
||||
| **平仓明细** | 当日平仓流水表 |
|
||||
| **刷新** | 后台每 60s 聚合 + **SSE** 推送版本号;页面无整页轮询闪烁 |
|
||||
| **主题** | 跟随顶栏亮/暗主题,卡片柔光样式(非霓虹背景) |
|
||||
|
||||
细则见 **[数据看板说明.md](./数据看板说明.md)**.
|
||||
|
||||
### 4.3 AI 教练 `/ai`
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **交易教练** | 口语化陪聊;后台注入三户监控快照(不在页面展示今日总结) |
|
||||
| **普通聊天** | 不绑交易数据 |
|
||||
| **会话** | 多会话历史(切换/删除),消息复制;点 **「新开对话」** 清空当前上下文 |
|
||||
| **模型** | 与三实例相同 `.env`(默认 `AI_PROVIDER=openai` + `OPENAI_*`;改 `ollama` 走本机),见 [AI教练说明.md](./AI教练说明.md) |
|
||||
| **与实例复盘** | 深度单笔 journal 复盘仍在各所 `/records`;中控不做重复 |
|
||||
|
||||
依赖三实例 `GET /api/hub/trades/today`(`hub_bridge`);升级代码后需 **重启三所 Flask**.
|
||||
|
||||
### 4.4 系统设置 `/settings`
|
||||
|
||||
**可用**:打开 http://127.0.0.1:5100/settings ,修改表格后点 **保存设置** 即写入 `hub_settings.json`;**重新加载** 从磁盘/默认再读(会重新套用 `HUB_DISABLED_IDS`).保存后监控区立即使用新 URL/启用状态,**无需重启 hub**.
|
||||
|
||||
**显示与导航**(`hub_settings.json` → `display`):
|
||||
|
||||
| 开关 | 说明 |
|
||||
|------|------|
|
||||
| 监控区资金/浮盈 | 关闭后监控卡片不显示资金户,交易户,浮盈亏列 |
|
||||
| 顶栏「资金概况」 | 关闭后隐藏导航;直接访问 `/funds` 会跳回监控区 |
|
||||
| 顶栏「数据看板」 | 关闭后隐藏导航;直接访问 `/dashboard` 会跳回监控区 |
|
||||
|
||||
**下单,关键位,策略交易**:请在监控卡片点击 **「实例」** 或 **「策略交易」**(SSO),进入各 `crypto_monitor_*` 网页(`/trade`,`/key_monitor`,`/strategy`,`/strategy/records` 等).中控 **不** 提供下单区;**策略交易记录** 仅在实例顶栏查看(见 [策略交易说明.md](../策略交易说明.md) §五).
|
||||
|
||||
| 列 | 含义 |
|
||||
|----|------|
|
||||
| 启用 | 是否参与监控与全局全平;被 `HUB_DISABLED_IDS` 锁定的无法勾选 |
|
||||
| 显示名 | 监控卡片标题 |
|
||||
| Flask URL | 实例根地址,如 `http://127.0.0.1:5001` |
|
||||
| Agent URL | 子代理根地址,如 `http://127.0.0.1:15200` |
|
||||
| 复盘链接 | 一般为 `{Flask}/records` |
|
||||
| **监控关键位** | 勾选后卡片展示 **关键位** 列表 + 门控价(读 Flask `/api/price_snapshot`) |
|
||||
| **监控趋势计划** | 勾选后卡片展示 **趋势回调** 运行中计划(`trend_pullback_plans` active) |
|
||||
| id | 与 `HUB_DISABLED_IDS`,全平 API 路径中的 id 对应;新增户勿与已有 id 重复 |
|
||||
|
||||
- **保存设置**:写入 `hub_settings.json`,重启 hub 后仍生效.
|
||||
- **添加交易所**:见下文 §4.5(须先自建 Flask + agent,再在中控登记).
|
||||
- **删**:从列表移除(保存后生效).
|
||||
|
||||
#### 能力与「策略交易」的关系(重要)
|
||||
|
||||
| 能力勾选 | 中控监控区 | 策略交易(趋势回调 / 顺势加仓) |
|
||||
|----------|------------|----------------------------------|
|
||||
| 监控关键位 | 显示关键位块 | **不控制**;在实例页 `/key_monitor` |
|
||||
| 监控趋势计划 | 显示趋势计划块 | **不控制**;在实例页 `/strategy` 左栏操作 |
|
||||
| 均未勾选 | 仅持仓,余额,机器人单 | 仍可在实例网页使用策略交易 |
|
||||
|
||||
三所 Flask 均已注册 `hub_bridge` 且 **`has_trend=true`**,勾选「监控趋势计划」后才会从 `/api/hub/monitor` 拉取趋势数据.修改勾选后 **保存即可**,须 **重启对应 Flask** 仅在你刚升级了 `hub_bridge` 相关代码时.
|
||||
|
||||
---
|
||||
|
||||
### 4.5 增加账户(例如再挂一个 Gate)
|
||||
|
||||
中控 **不会** 自动启动进程,也 **不** 保存交易所 API Key.新增一户 = **复制/新建一套实例目录 + 独立 `.env` + 新端口 Flask/agent + 在中控登记一行**.
|
||||
|
||||
#### 4.5.1 端口勿冲突(示例)
|
||||
|
||||
| 用途 | 目录(示例) | Flask `APP_PORT` | Agent `PORT` |
|
||||
|------|----------------|------------------|--------------|
|
||||
| Gate(已有) | `crypto_monitor_gate` | 5000 | 15202 |
|
||||
| **新增 Gate 子账户** | 复制为 `crypto_monitor_gate_2` 等 | **5005**(自定) | **15204**(自定) |
|
||||
|
||||
`agent` 的 `PORT` 与 Flask 的 `APP_PORT` **必须不同**;且不要与币安 5001,OKX 5004,中控 5100 等占用端口相同.
|
||||
|
||||
#### 4.5.2 新建实例目录
|
||||
|
||||
1. 复制整个 `crypto_monitor_gate` 到新目录(仓库内副本或 `/opt/` 下均可).
|
||||
2. 在新目录:`cp .env.example .env`,至少修改:
|
||||
- `APP_PORT` → 新 Flask 端口(如 5005)
|
||||
- `DB_PATH` → 独立库(如 `crypto_gate2.db`),**勿**与其它实例共用 `crypto.db`
|
||||
- `GATE_API_KEY` / `GATE_API_SECRET` → **该子账户** 密钥
|
||||
- `HUB_BRIDGE_TOKEN` → 与中控,其它实例 **相同**
|
||||
3. 安装 venv 与依赖(`bash /opt/crypto_monitor_user/deploy/setup_env.sh --only gate` 或按 Gate 部署文档),启动:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user/crypto_monitor_gate_2
|
||||
pm2 start ecosystem.config.cjs
|
||||
```
|
||||
|
||||
4. 在中控 `ecosystem.config.cjs` 增加对应 agent,或单独 `run_agent.sh` 配置后 `pm2 restart`(勿与已有 agent 端口冲突).
|
||||
|
||||
验收:`curl http://127.0.0.1:5005/login` 能开页;`curl http://127.0.0.1:15204/status` 返回 `ok`.
|
||||
|
||||
#### 4.5.3 在中控登记
|
||||
|
||||
1. 打开 **系统设置** → **添加交易所**(或手改 `manual_trading_hub/hub_settings.json`).
|
||||
2. 填写 **Flask URL**,**Agent URL**,**id**(如 `4`),**显示名**.
|
||||
3. 能力建议:
|
||||
- 训练/关键位户:**监控关键位** + **监控趋势计划**(若也要在中控看趋势计划);
|
||||
- 纯趋势户:只勾 **监控趋势计划**.
|
||||
4. 勾选 **启用** → **保存设置**.
|
||||
5. 在 **监控区** 应出现新卡片;点 **实例** 进入该户网页做下单与 **策略交易**.
|
||||
|
||||
PM2:仓库 `ecosystem.config.cjs` 默认只有三 agent;额外子账户需自行 `pm2 start` 或手工终端,与是否改 hub 源码无关.
|
||||
|
||||
---
|
||||
|
||||
## 5. 能力矩阵(监控展示,建议勾选)
|
||||
|
||||
| 账户 | 监控关键位 | 监控趋势计划 | 策略交易(实例页) |
|
||||
|------|:----------:|:--------------:|:------------------:|
|
||||
| 币安 | ✓ 建议 | ✓ 建议 | `/strategy` |
|
||||
| OKX | ✓ 建议 | ✓ 建议 | `/strategy` |
|
||||
| Gate | ✓ 建议 | ✓ 建议 | `/strategy` |
|
||||
| Gate | —(通常不勾) | ✓ | `/strategy` |
|
||||
|
||||
「建议」表示中控卡片展示对应块;**不勾** 仍可在该实例网页使用关键位或策略交易.
|
||||
|
||||
---
|
||||
|
||||
## 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` | 退出 |
|
||||
| GET | `/api/ping` | 版本与健康检查(**免登录**) |
|
||||
| GET | `/api/chart/meta` | 行情区:交易所,周期,limit |
|
||||
| GET | `/api/chart/ohlcv` | 行情区 K 线(`exchange_key`,`symbol`,`timeframe`,可选 `refresh=1`) |
|
||||
| GET | `/api/hub/fund-overview` | 资金概况:总/分户资金,180 日曲线,回撤 |
|
||||
| GET | `/api/archive/meta` | 内照明心:周期,同步间隔 |
|
||||
| GET | `/api/archive/daily-trades` | 内照明心:区间交易与统计(`period` / `date_from` / `date_to`) |
|
||||
| GET | `/api/archive/quotes` | 内照明心:复盘语录 |
|
||||
| GET | `/api/archive/list` | 币种列表(筛选 query) |
|
||||
| GET | `/api/archive/detail` | 单币种交易时间线 |
|
||||
| GET | `/api/archive/ohlcv` | 档案 K 线视窗 |
|
||||
| PATCH | `/api/archive/trade/{exchange_key}/{trade_id}` | 犯病/情绪标签与备注 |
|
||||
| POST | `/api/archive/sync` | 立即同步三所交易与 K 线 |
|
||||
|
||||
已移除的 `/api/trade/*` 若被旧缓存页面请求,返回 **410** 并提示前往各实例网页.
|
||||
|
||||
实例侧(中控只读;下单/关键位/趋势在实例网页):
|
||||
## 入口(默认端口 5100)
|
||||
|
||||
| 路径 | 说明 |
|
||||
|------|------|
|
||||
| `/api/hub/ping` | 连通与能力 |
|
||||
| `/api/hub/monitor` | 关键位,机器人单,趋势计划 |
|
||||
| `/api/hub/ohlcv` | 行情区 OHLCV(ccxt 拉取,供中控聚合缓存) |
|
||||
| `/api/hub/trades/archive` | 内照明心:近 N 天已平仓(`days` / `limit`) |
|
||||
| `/license` | 软件授权(未激活时自动跳转) |
|
||||
| `/monitor` | 监控区 |
|
||||
| `/settings` | 系统设置 |
|
||||
| `/login` | 登录 |
|
||||
|
||||
---
|
||||
完整装机见 [部署文档.md](./部署文档.md)。授权见 [docs/license.md](../docs/license.md)。
|
||||
|
||||
## 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`(仅 HTTPS 发 Secure Cookie,HTTP 内网 IP 仍可登) |
|
||||
| `HUB_SESSION_DAYS` | `7` | 登录保持天数 |
|
||||
| `HUB_KLINE_RETENTION_DAYS` | `15` | 行情区 K 线库保留天数 |
|
||||
| `HUB_KLINE_DB_PATH` | `data/hub_kline.db` | K 线 SQLite 路径 |
|
||||
| `HUB_ARCHIVE_DB_PATH` | `data/hub_symbol_archive.db` | 内照明心永久 K 线库 |
|
||||
| `HUB_ARCHIVE_SYNC_INTERVAL_SEC` | `14400` | 档案 K 线后台同步间隔(秒) |
|
||||
| `HUB_ARCHIVE_TRADE_DAYS` | `365` | 同步交易记录回看天数 |
|
||||
| `HUB_ARCHIVE_TRADE_LIMIT` | `2000` | 单所同步交易条数上限 |
|
||||
|
||||
### 子代理 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_USERNAME` + `HUB_PASSWORD`;HTTPS 反代建议 `HUB_COOKIE_SECURE=true`;亦可 `HUB_HOST=127.0.0.1` 仅本机监听 + 反代.
|
||||
5. **复盘不在中控**:时间筛选,导出 CSV,编辑笔记仍在各实例 `/records`.
|
||||
6. **OKX 默认关**:避免未部署 OKX 时监控卡片持续报错.
|
||||
|
||||
---
|
||||
|
||||
## 9. 故障排查(速查)
|
||||
|
||||
完整实录(含 `api_trade_key`,`multipart`,git 版本,PM2 等)见 **[常见问题.md](./常见问题.md)**.
|
||||
|
||||
| 现象 | 可能原因 | 处理 |
|
||||
|------|----------|------|
|
||||
| 监控卡片「子代理不可用」 | agent 未启动或端口错 | 检查 Agent URL;`pm2 restart` agent |
|
||||
| 无关键位/趋势信息 | Flask 未起或 hub_bridge 未加载 | 启动 `crypto_*`;`curl .../api/hub/ping` |
|
||||
| 全平 401 | `CONTROL_TOKEN` 与中控不一致 | 与 `HUB_BRIDGE_TOKEN` 对齐 |
|
||||
| OKX 始终灰色 | `HUB_DISABLED_IDS=1` | 改掉环境变量并在设置页启用 |
|
||||
| 打开即跳转登录 | 已设 `HUB_PASSWORD` | 正常;访问 `/login` |
|
||||
| 域名能登,IP:5100 不能 | Secure Cookie + HTTP | 见常见问题 §2.1;或分别登录 |
|
||||
| 添加关键位报错 / SyntaxError | 旧前端或旧 hub 代码 | 强刷浏览器;`git pull` + `verify_hub_deploy.sh` |
|
||||
| `curl /api/ping` 非 JSON | hub 未启动 | `pm2 restart manual-trading-hub` |
|
||||
| K 线只有约 300 根 | 旧版未分页 | `git pull` 三实例 + hub,强制刷新 |
|
||||
| 12h 周期异常 | 无原生 12h 或旧缓存 | 强制刷新;见 [行情区说明.md](./行情区说明.md) |
|
||||
|
||||
**运维脚本**(在 `manual_trading_hub` 目录执行):
|
||||
|
||||
| 脚本 | 作用 |
|
||||
|------|------|
|
||||
| `scripts/fix_hub_deps.sh` | 安装依赖(含 `python-multipart`) |
|
||||
| `scripts/verify_hub_deploy.sh` | 检查代码版本与 ping |
|
||||
| `scripts/fix_env_crlf.sh` | 修复 `.env` 的 CRLF 导致 agent 起不来 |
|
||||
|
||||
手动探测实例桥接:
|
||||
|
||||
```bash
|
||||
curl -sS -H "X-Hub-Token: 你的令牌" http://127.0.0.1:5001/api/hub/ping
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. 与旧版 README 的差异
|
||||
|
||||
早期中控 **仅监控 + 全平**,使用环境变量 `HUB_AGENTS` 列表.当前版本改为:
|
||||
|
||||
- **hub_settings.json**(或内置默认)管理三所 URL 与能力;
|
||||
- **三页 UI**:监控 / 行情 / 设置;
|
||||
- 通过 **hub_bridge** 只读聚合监控数据.
|
||||
|
||||
子代理 `agent.py` 仍负责持仓与全平;`HUB_AGENTS` 环境变量在新版 hub 中 **不再使用**(以设置文件为准).
|
||||
|
||||
**PM2 守护**:
|
||||
## 快速启动
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user/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 # 一次启动 3 个 agent + manual-trading-hub
|
||||
pm2 save && pm2 startup
|
||||
cp .env.example .env # 配置 HUB_BRIDGE_TOKEN 等
|
||||
# 由仓库根 deploy/pm2_start_all.sh 一并拉起,或按部署文档启动
|
||||
```
|
||||
|
||||
快捷:`bash scripts/pm2_hub.sh start|restart|logs`(同样 hub+agent 一起).
|
||||
|
||||
更细的安装顺序,反代,验收见 **《部署文档.md》**;PM2 见 **[scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md)**.
|
||||
|
||||
---
|
||||
|
||||
## 11. 日常推荐流程
|
||||
|
||||
1. 启动三所 **agent** + **Flask**(OKX 按需).
|
||||
2. 启动 **hub.py**,打开监控区确认持仓与关键位门控正常.
|
||||
3. 看 K 线 → **行情区** 或监控区点击合约名跳转;异常图表点 **强制刷新**.
|
||||
4. 开仓,关键位,趋势 → 点击监控卡片「实例」进入对应 Flask.
|
||||
5. 复盘,导出记录 → 点击「复盘」进入 `/records`.
|
||||
6. 异常行情 → 单户全平或全局紧急全平.
|
||||
|
||||
增加账户步骤见 **§4.4**;无需改 `hub.py` 源码,但须该户 Flask 已 `git pull` 并 **重启**(`hub_bridge` + `has_trend` + `ohlcv`),且 agent 已部署.
|
||||
|
||||
---
|
||||
|
||||
## 12. 文档索引
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [使用说明.md](./使用说明.md) | 本文 |
|
||||
| [行情区说明.md](./行情区说明.md) | K 线周期,缓存,快捷键,API |
|
||||
| [开仓计划说明.md](./开仓计划说明.md) | 计划录入,归档,胜率统计 |
|
||||
| [docs/hub-symbol-archive-kline.md](../docs/hub-symbol-archive-kline.md) | 内照明心,区间统计,永久 5m,建档与同步 |
|
||||
| [部署文档.md](./部署文档.md) | Ubuntu / PM2 / 反代 |
|
||||
| [常见问题.md](./常见问题.md) | 故障实录与排障 |
|
||||
| [README.md](./README.md) | 速览 |
|
||||
| [.env.example](./.env.example) | 环境变量模板 |
|
||||
| [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | PM2 常驻 |
|
||||
| [docs/ubuntu-server.md](../docs/ubuntu-server.md) | Ubuntu 环境总览 |
|
||||
故障排查见 [常见问题.md](./常见问题.md)。
|
||||
|
||||
@@ -1,226 +0,0 @@
|
||||
# 中控 · 局域网与反代部署说明
|
||||
|
||||
本文说明在 **局域网(IP + 端口)** 与 **宝塔/Nginx 反代(域名)** 两种场景下,如何配置中控与各实例,并实现:
|
||||
|
||||
- **从中控** 点「实例 / 策略交易 / 复盘」→ **免输入** 实例网页密码(SSO 临时链接,默认 **2 小时** 内有效,**单次使用**)
|
||||
- **浏览器直链** 实例地址(反代域名或 `http://IP:端口`)→ 进入 **`/login`**,输入统一 **`APP_USERNAME` / `APP_PASSWORD`**
|
||||
|
||||
SSO 签名复用 **`HUB_BRIDGE_TOKEN`**(与中控调实例 API 相同,三所 `.env` 与 `manual_trading_hub/.env` 保持一致).
|
||||
|
||||
**云服务器(VPS)** 的硬件,安全组,宝塔,环境变量与验收清单见 **[云服务器部署说明.md](./云服务器部署说明.md)**.
|
||||
|
||||
---
|
||||
|
||||
## 一,两种访问方式对照
|
||||
|
||||
| 项目 | 局域网 | 反代(域名) |
|
||||
|------|--------|----------------|
|
||||
| 中控地址 | `http://内网IP:5100` | `https://hub.你的域名.com` |
|
||||
| 实例地址(浏览器) | `http://内网IP:5004` 等 | `https://okx.你的域名.com` 等 |
|
||||
| `hub_settings` 里 `flask_url` | 建议写 **`http://内网IP:端口`** | 建议写 **`https://该实例域名`**(与浏览器一致) |
|
||||
| 中控本机调实例 API | 可与浏览器相同;同机也可用 `http://127.0.0.1:端口` + `HUB_PUBLIC_ORIGIN` | 同机可用 `127.0.0.1:端口` 或域名(需 Nginx 转发 `X-Hub-Token`) |
|
||||
| `HUB_PUBLIC_ORIGIN` | 若 `flask_url` 填 `127.0.0.1`,**必填** `http://内网IP` | 若 `flask_url` 已是完整域名,**可不设** |
|
||||
| 宝塔 | 可不装反代,直连端口 | 每实例一个站点 + SSL;中控单独站点 |
|
||||
| 直链登录 | 实例 `/login` | 实例 `/login` |
|
||||
| 从中控打开 | `/hub-sso?token=...` 自动登录 | 同上 |
|
||||
|
||||
---
|
||||
|
||||
## 二,共用环境变量(必配)
|
||||
|
||||
### 2.1 中控 `manual_trading_hub/.env`
|
||||
|
||||
```bash
|
||||
HUB_BRIDGE_TOKEN=请填一长串随机字符
|
||||
HUB_USERNAME=admin # 中控登录(建议设置)
|
||||
HUB_PASSWORD=你的中控密码
|
||||
HUB_SSO_TTL_SEC=7200 # 可选,默认 7200 = 2 小时
|
||||
```
|
||||
|
||||
### 2.2 三个实例 `crypto_monitor_*/.env`
|
||||
|
||||
每个目录相同(**直链**时用这套登录实例网页):
|
||||
|
||||
```bash
|
||||
HUB_BRIDGE_TOKEN=与中控完全相同
|
||||
APP_USERNAME=统一用户名
|
||||
APP_PASSWORD=统一密码
|
||||
# 云上切勿 APP_AUTH_DISABLED=true
|
||||
```
|
||||
|
||||
### 2.3 子代理
|
||||
|
||||
`CONTROL_TOKEN` 可与 `HUB_BRIDGE_TOKEN` 相同;子代理只监听 `127.0.0.1`,**不要**对公网暴露 `15200`~`15202`.
|
||||
|
||||
---
|
||||
|
||||
## 三,局域网部署(IP + 端口)
|
||||
|
||||
适用:家里/办公室内网,例如服务器 `192.168.8.6`.
|
||||
|
||||
### 3.1 端口约定(示例,以你实际为准)
|
||||
|
||||
| 服务 | 端口 |
|
||||
|------|------|
|
||||
| 中控 hub | 5100 |
|
||||
| OKX Flask | 5004 |
|
||||
| 币安 Flask | 5001 |
|
||||
| Gate | 5000 |
|
||||
| agent | 15200~15202(仅本机) |
|
||||
|
||||
### 3.2 系统设置 `hub_settings.json`(网页「系统设置」保存)
|
||||
|
||||
浏览器里你会打开的地址,应使用 **内网 IP**,不要用 `127.0.0.1`(否则别的电脑上的浏览器会连到你本机):
|
||||
|
||||
```json
|
||||
{
|
||||
"flask_url": "http://192.168.8.6:5004",
|
||||
"agent_url": "http://127.0.0.1:15201"
|
||||
}
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- **`flask_url`**:给浏览器用的实例页地址 → 写 **`http://192.168.8.6:端口`**
|
||||
- **`agent_url`**:仅中控服务器访问 → 写 **`http://127.0.0.1:1520x`**
|
||||
|
||||
各账户按上表改端口即可.
|
||||
|
||||
### 3.3 可选:`flask_url` 仍写 127.0.0.1 时
|
||||
|
||||
若坚持 `flask_url` 为 `http://127.0.0.1:5004`(仅 hub 与本机 Flask 同机),在中控 `.env` 增加:
|
||||
|
||||
```bash
|
||||
HUB_PUBLIC_ORIGIN=http://192.168.8.6
|
||||
```
|
||||
|
||||
中控会把返回给前端的链接从 `127.0.0.1` 替换为 `192.168.8.6`(端口保留).
|
||||
|
||||
### 3.4 访问方式
|
||||
|
||||
1. 中控:`http://192.168.8.6:5100` → 登录中控 → 点「实例」→ 新标签进入 OKX,**无需**再输实例密码.
|
||||
2. 直链:`http://192.168.8.6:5004` → 出现登录页 → 输入 `APP_USERNAME` / `APP_PASSWORD`.
|
||||
|
||||
### 3.5 防火墙
|
||||
|
||||
内网自用:放行 `5100`,各 `APP_PORT`;**不要**对公网开放 agent 端口.
|
||||
|
||||
---
|
||||
|
||||
## 四,反代部署(域名 + 宝塔)
|
||||
|
||||
适用:云服务器,对外用 HTTPS 域名.
|
||||
|
||||
### 4.1 域名规划(示例)
|
||||
|
||||
| 站点 | 反代到 |
|
||||
|------|--------|
|
||||
| `hub.example.com` | `127.0.0.1:5100` |
|
||||
| `okx.example.com` | `127.0.0.1:5004` |
|
||||
| `binance.example.com` | `127.0.0.1:5001` |
|
||||
| `gate.example.com` | `127.0.0.1:5000` |
|
||||
|
||||
Flask / hub 进程仍只监听 **127.0.0.1** 或 `0.0.0.0` 本机端口,由 Nginx 对外提供 HTTPS.
|
||||
|
||||
### 4.2 宝塔操作要点
|
||||
|
||||
1. 每个域名 → **反向代理** → 目标 `http://127.0.0.1:对应端口`.
|
||||
2. 申请 **SSL**(Let’s Encrypt).
|
||||
3. **不要**再给实例站加一层宝塔「访问密码」(避免与 Flask `/login` 重复);直链鉴权用 **`APP_USERNAME` / `APP_PASSWORD`** 即可.
|
||||
4. 自定义 Nginx 配置中保留 WebSocket/大 body 如需;确保代理头:
|
||||
|
||||
```nginx
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
```
|
||||
|
||||
中控请求实例 API 时会带 **`X-Hub-Token`**,Nginx 默认会转发请求头,一般无需额外配置.
|
||||
|
||||
### 4.3 `hub_settings` 示例(反代)
|
||||
|
||||
```json
|
||||
{
|
||||
"flask_url": "https://okx.example.com",
|
||||
"agent_url": "http://127.0.0.1:15201"
|
||||
}
|
||||
```
|
||||
|
||||
- 浏览器与 SSO 链接使用 **`https://okx.example.com`**.
|
||||
- 中控服务器拉 `/api/hub/*` 仍走本机 `agent_url`;`flask_url` 用域名时,hub 会请求 `https://okx.example.com/api/...`(同机可通即可).
|
||||
|
||||
同机部署时也可:
|
||||
|
||||
- `flask_url`: `http://127.0.0.1:5004`
|
||||
- `HUB_PUBLIC_ORIGIN`: `https://okx.example.com`
|
||||
|
||||
仅当**所有实例共用一个对外 IP,靠端口区分**时才适合用 `HUB_PUBLIC_ORIGIN`;**每实例独立域名**时,请直接在 `flask_url` 写该实例域名.
|
||||
|
||||
### 4.4 中控 `.env`(反代建议)
|
||||
|
||||
```bash
|
||||
HUB_BRIDGE_TOKEN=...
|
||||
HUB_USERNAME=...
|
||||
HUB_PASSWORD=...
|
||||
HUB_COOKIE_SECURE=true # 中控为 HTTPS 时建议开启
|
||||
```
|
||||
|
||||
### 4.5 访问方式
|
||||
|
||||
1. `https://hub.example.com` 登录中控 → 点「打开实例」→ `https://okx.example.com/hub-sso?...` → 进入系统.
|
||||
2. 地址栏直接输入 `https://okx.example.com` → `/login` → 实例账号密码.
|
||||
|
||||
---
|
||||
|
||||
## 五,SSO 行为说明(2 小时)
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| 有效期 | 默认 **7200 秒(2 小时)**,`HUB_SSO_TTL_SEC` 可改 |
|
||||
| 单次使用 | 同一链接成功登录后 **不能再用**;需在中控重新点「打开实例」 |
|
||||
| 密钥 | 复用 **`HUB_BRIDGE_TOKEN`** |
|
||||
| 直链 | 无 token → 正常 **`/login`** |
|
||||
|
||||
---
|
||||
|
||||
## 六,部署与重启顺序
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor_user
|
||||
# 各实例
|
||||
pm2 restart crypto_okx crypto_binance crypto_gate # 名称以你为准
|
||||
|
||||
cd manual_trading_hub
|
||||
pm2 restart manual-trading-hub manual-agent-binance manual-agent-okx manual-agent-gate
|
||||
```
|
||||
|
||||
改 `hub_settings` 或 `.env` 后重启 **hub + 对应实例 Flask**(`hub_bridge` 与 `/hub-sso` 在实例进程内).
|
||||
|
||||
---
|
||||
|
||||
## 七,验收清单
|
||||
|
||||
- [ ] 三实例 `.env` 与中控 `HUB_BRIDGE_TOKEN` 一致
|
||||
- [ ] 三实例 `APP_USERNAME` / `APP_PASSWORD` 一致
|
||||
- [ ] 局域网:`flask_url` 为 `http://IP:端口`;反代:`flask_url` 为 `https://域名`
|
||||
- [ ] 已登录中控 → 点「实例」→ **无**实例登录页
|
||||
- [ ] 隐身窗口直链实例域名/IP → **有** `/login`
|
||||
- [ ] 复制「打开实例」完整 URL,用过一次后再开 → 失效并回到登录页
|
||||
|
||||
---
|
||||
|
||||
## 八,常见问题
|
||||
|
||||
**Q:从中控打开仍要登录?**
|
||||
- 检查实例是否已 `git pull` 并重启(需有 `/hub-sso`).
|
||||
- `HUB_BRIDGE_TOKEN` 是否三所一致.
|
||||
- `hub_settings` 里该账户 `key` 是否与 `install_on_app(exchange=...)` 一致(如 `okx`,`binance`,`gate`,`gate`).
|
||||
|
||||
**Q:直链也要登录中控?**
|
||||
- 不应.直链只走实例 `/login`.若跳到中控,检查是否点错链接或 Nginx 配错站点.
|
||||
|
||||
**Q:链接多久失效?**
|
||||
- 签发后 **2 小时**内且 **未使用过**;过期或已用需在中控重新点打开.
|
||||
|
||||
更多故障见 [常见问题.md](./常见问题.md),[部署文档.md](./部署文档.md).
|
||||
@@ -1,85 +0,0 @@
|
||||
# 开仓计划
|
||||
|
||||
中控顶栏 **开仓计划**(`/plan`)用于记录开仓前的计划,跟踪进行中条目,并在填写结果后归档;支持按币种,趋势周期,入场方案统计胜率.
|
||||
|
||||
## 入口
|
||||
|
||||
- 顶栏:**资金概况** 与 **监控区** 之间 → **开仓计划**
|
||||
- 路由:`/plan`
|
||||
|
||||
## 页面结构
|
||||
|
||||
| 区域 | 功能 |
|
||||
|------|------|
|
||||
| 左侧 · 新建计划 | 填写计划字段,保存后进入「进行中」 |
|
||||
| 左侧 · 进行中 | 修改,删除,填写结果并归档 |
|
||||
| 右侧 · 计划历史 | 一行一条摘要,点击查看详情 |
|
||||
| 右侧 · 数据统计 | 胜率表(可切换维度与时间范围) |
|
||||
|
||||
## 字段说明
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| 日期 | 计划日期(日期选择器,可手输 `YYYY-MM-DD`) |
|
||||
| 交易所 | 三所:binance / okx / gate(来自 hub 已启用账户) |
|
||||
| 币种 | 输入 `BTC` 或 `BTC/USDT`,自动规范为 `XXX/USDT` |
|
||||
| 类型 | 趋势单 / 波段单 / 日内短线 |
|
||||
| 趋势周期 | 5m / 15m / 30m / 1h / 4h / 1d |
|
||||
| 入场周期 | 1m / 5m / 15m / 30m / 1h |
|
||||
| 方向 | 多 / 空 |
|
||||
| 目标位 | 文本 |
|
||||
| 当前区间 | 文本 |
|
||||
| 入场方案 | **仅进行中**填写:突破 / 假突破 / 箱体拐点(根据实际进场选择;归档前必选) |
|
||||
| 结果 | **仅进行中**可填:盈 / 亏;**必选其一才归档** |
|
||||
| 盈亏 | **可选**数字(U),不参与是否归档 |
|
||||
| 备注 | 文本 |
|
||||
|
||||
## 业务流程
|
||||
|
||||
1. **新建** → 状态 `active`(进行中),**不含入场方案**
|
||||
2. **进行中** → 选择/修改 **入场方案**(根据实际进场填写),可改备注,价位等
|
||||
3. **删除** → 仅 **未填结果** 的进行中计划可删
|
||||
4. **归档** → 在进行中选择 **盈/亏** 并点「填写结果并归档」→ 状态 `archived`,移入计划历史
|
||||
|
||||
## 数据统计
|
||||
|
||||
- **默认**:全部历史
|
||||
- **时间**:全部 / 本周 / 本月 / 自选区间
|
||||
- **维度 Tab**:币种 | 趋势周期 | 入场方案
|
||||
- **胜率**:盈利 ÷ (盈利 + 亏损),仅统计已归档且结果=盈/亏 的计划
|
||||
|
||||
## API
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/entry-plans/meta` | 枚举项 + 交易所列表 |
|
||||
| GET | `/api/entry-plans?status=active\|archived` | 列表 |
|
||||
| GET | `/api/entry-plans/{id}` | 详情 |
|
||||
| POST | `/api/entry-plans` | 新建 |
|
||||
| PATCH | `/api/entry-plans/{id}` | 更新;写入 `result` 时自动归档 |
|
||||
| DELETE | `/api/entry-plans/{id}` | 删除(仅 active) |
|
||||
| GET | `/api/entry-plans/stats` | 统计;参数 `dimension`,`period`,`date_from`,`date_to` |
|
||||
|
||||
## 存储
|
||||
|
||||
- SQLite:`manual_trading_hub/data/hub_entry_plans.db`
|
||||
- 环境变量:`HUB_ENTRY_PLAN_DB_PATH`(可选自定义路径)
|
||||
|
||||
## 部署
|
||||
|
||||
```bash
|
||||
git pull
|
||||
pm2 restart manual-trading-hub
|
||||
```
|
||||
|
||||
浏览器访问 `/plan` 并 **Ctrl+F5** 强刷静态资源.
|
||||
|
||||
## 相关代码
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `hub_entry_plan_lib.py` | 库表,CRUD,统计 |
|
||||
| `manual_trading_hub/hub.py` | REST API |
|
||||
| `manual_trading_hub/static/plan.js` | 前端逻辑 |
|
||||
| `manual_trading_hub/static/index.html` | 页面 DOM |
|
||||
| `tests/test_hub_entry_plan_lib.py` | 单元测试 |
|
||||
@@ -1,50 +0,0 @@
|
||||
# 中控数据看板说明
|
||||
|
||||
入口:**`/dashboard`**(顶栏「数据看板」).
|
||||
|
||||
## 能力
|
||||
|
||||
| 区块 | 说明 |
|
||||
|------|------|
|
||||
| **总览 KPI** | 交易日,平仓盈亏,笔数,浮盈亏,资金合计,实盘持仓 |
|
||||
| **分户明细** | 三户资金/交易账户,今日盈亏,浮盈亏,备注;未启用显示「未监控」 |
|
||||
| **平仓明细** | 当日平仓流水(合约,方向,结果,盈亏,时间) |
|
||||
| **风险预警** | 单户单日平仓亏损 ≥ 资金合计 **5%** 时横幅 + 卡片高亮 |
|
||||
|
||||
纯数据聚合,**不调用 AI**.交易日口径与实例一致(`TRADING_DAY_RESET_HOUR`,默认 8 点).
|
||||
|
||||
## 刷新机制(SSE)
|
||||
|
||||
与监控区 board 类似,采用 **后台聚合 + SSE 推送版本号**:
|
||||
|
||||
1. `hub.py` 启动后 `dashboard_store` 每 **60s**(`DASHBOARD_POLL_INTERVAL_SEC`)聚合三户数据到内存快照.
|
||||
2. 浏览器打开看板页后连接 `GET /api/dashboard/stream`(`event: dashboard`).
|
||||
3. 收到新版本号后拉取 `GET /api/dashboard/daily` 快照并局部渲染,**无整页轮询闪烁**.
|
||||
4. 监控区触发 board 刷新(全平,撤单等)时,会一并 `request_refresh` 看板,尽量与实盘同步.
|
||||
5. 「立即刷新」→ `POST /api/dashboard/refresh` 触发下一轮聚合.
|
||||
|
||||
可选环境变量:`HUB_DASHBOARD_SSE_HEARTBEAT_SEC`(默认 25,SSE 心跳间隔).
|
||||
|
||||
## 主题与样式
|
||||
|
||||
- 跟随中控顶栏 **亮/暗主题**(`theme.js`),使用 `--panel` / `--border` / `--accent` 等变量.
|
||||
- 卡片采用 **柔光阴影**(非霓虹渐变背景);亮色主题下为浅灰投影,暗色主题为轻微内高光.
|
||||
- 盈亏仍用绿/红语义色,与全局一致.
|
||||
|
||||
## API
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/dashboard/daily` | 当前交易日快照(含 `dashboard_version`) |
|
||||
| GET | `/api/dashboard/stream` | SSE 版本推送 |
|
||||
| POST | `/api/dashboard/refresh` | 请求立即重聚合 |
|
||||
|
||||
`GET /api/ping` 含 `dashboard_version`,`dashboard_poll_interval_sec` 等字段.
|
||||
|
||||
## 相关文件
|
||||
|
||||
- `hub_dashboard.py` — 聚合逻辑
|
||||
- `hub_dashboard_cache.py` — 后台轮询 + SSE
|
||||
- `static/dashboard.js` / `dashboard.css` — 前端
|
||||
|
||||
部署后 `git pull` 并 `pm2 restart manual-trading-hub`.
|
||||
@@ -1,268 +0,0 @@
|
||||
# 本地数据备份与迁移到云服务器
|
||||
|
||||
本文说明如何把 **本机** 上运行的 `crypto_monitor`(三实例 + 中控)的**业务数据**迁到 **云 VPS**,并正确改配置.
|
||||
**不迁移** 本机 Python 虚拟环境(`.venv`),云上重新 `pip install` 即可.
|
||||
|
||||
相关:[云服务器部署说明.md](./云服务器部署说明.md) · [部署文档.md](./部署文档.md)
|
||||
|
||||
---
|
||||
|
||||
## 一,要迁什么,不迁什么
|
||||
|
||||
### 必须迁移(业务数据)
|
||||
|
||||
| 路径(每个实例目录下) | 内容 |
|
||||
|------------------------|------|
|
||||
| `crypto.db`(或 `.env` 里 `DB_PATH` 指向的文件) | 监控单,关键位,交易记录,复盘,运行时开关等 **SQLite 全库** |
|
||||
| `static/images/`(或 `UPLOAD_DIR`) | 上传图,复盘截图等 |
|
||||
| `static/images/order_charts/`(或 `ORDER_CHART_DIR`) | 订单 K 线图(若开启) |
|
||||
|
||||
三个实例 **各有一份独立库**:
|
||||
|
||||
- `crypto_monitor_binance/crypto.db`
|
||||
- `crypto_monitor_okx/crypto.db`
|
||||
- `crypto_monitor_gate/crypto.db`
|
||||
- `crypto_monitor_gate/crypto.db`
|
||||
|
||||
### 中控额外迁移
|
||||
|
||||
| 路径 | 内容 |
|
||||
|------|------|
|
||||
| `manual_trading_hub/hub_settings.json` | 账户 URL,启用状态,能力勾选(网页「系统设置」保存的文件) |
|
||||
| `manual_trading_hub/hub_ai_summaries.json` | 中控 AI 今日总结(`/ai`) |
|
||||
| `manual_trading_hub/hub_ai_chat.json` | 中控 AI 聊天会话 |
|
||||
|
||||
### 不要直接覆盖拷贝(需在云上重写)
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| 各目录 `.env` | 含 API 密钥:可在云上**手工新建**,从本机抄密钥,但须改 **`flask_url`,代理,公网相关项**(见下文) |
|
||||
| `.venv/`,`__pycache__/` | 云上重建 |
|
||||
| PM2 日志 | 无需迁 |
|
||||
|
||||
### 可选
|
||||
|
||||
- 本机 `manual_trading_hub/.env` 里的 `HUB_BRIDGE_TOKEN`,`HUB_PASSWORD` 等:记下后在云上填入,**不要**把含密钥的 `.env` 发到公开网盘.
|
||||
|
||||
---
|
||||
|
||||
## 二,迁移前准备(本地)
|
||||
|
||||
### 1. 停服务(避免数据库半写入)
|
||||
|
||||
```bash
|
||||
# 本机:停中控与子代理
|
||||
cd manual_trading_hub
|
||||
pm2 stop manual-trading-hub manual-agent-binance manual-agent-okx manual-agent-gate
|
||||
|
||||
# 本机:停三个 Flask(进程名以你 pm2 list 为准)
|
||||
pm2 stop crypto_okx crypto_binance crypto_gate
|
||||
# 或各目录 ecosystem 里的名字
|
||||
```
|
||||
|
||||
未用 PM2 时,结束对应 Python/Flask 进程后再备份.
|
||||
|
||||
### 2. 确认数据库文件位置
|
||||
|
||||
各实例目录下查看 `.env` 中 `DB_PATH`(默认 `crypto.db`).若存在 `crypto.db-wal`,`crypto.db-shm`,**必须先停服务** 再备份.
|
||||
|
||||
---
|
||||
|
||||
## 三,本地备份(推荐用自带脚本)
|
||||
|
||||
每个实例目录执行(会备份 **库 + static/images**):
|
||||
|
||||
```bash
|
||||
cd crypto_monitor_okx
|
||||
bash scripts/backup_data.sh
|
||||
# 默认输出到 /root/backups/crypto_monitor_okx/YYYY-MM-DD/
|
||||
# 本机可改环境变量:BACKUP_ROOT=~/crypto_backups bash scripts/backup_data.sh
|
||||
```
|
||||
|
||||
对 `crypto_monitor_binance`,`crypto_monitor_gate`,`crypto_monitor_gate` **各执行一次**.
|
||||
|
||||
脚本产物示例:
|
||||
|
||||
```text
|
||||
~/crypto_backups/crypto_monitor_okx/2026-05-21/
|
||||
crypto.db
|
||||
static_images.tar.gz
|
||||
manifest.txt
|
||||
```
|
||||
|
||||
### 手工打包(不用脚本时)
|
||||
|
||||
在仓库根目录示例:
|
||||
|
||||
```bash
|
||||
BACKUP=~/crypto_migrate_$(date +%Y%m%d)
|
||||
mkdir -p "$BACKUP"
|
||||
|
||||
for dir in crypto_monitor_okx crypto_monitor_binance crypto_monitor_gate crypto_monitor_gate; do
|
||||
tar -czf "$BACKUP/${dir}.tar.gz" \
|
||||
-C "$dir" crypto.db static/images 2>/dev/null || \
|
||||
tar -czf "$BACKUP/${dir}.tar.gz" -C "$dir" crypto.db
|
||||
done
|
||||
|
||||
cp manual_trading_hub/hub_settings.json "$BACKUP/" 2>/dev/null || true
|
||||
cp manual_trading_hub/hub_ai_summaries.json "$BACKUP/" 2>/dev/null || true
|
||||
cp manual_trading_hub/hub_ai_chat.json "$BACKUP/" 2>/dev/null || true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四,上传到云服务器
|
||||
|
||||
在**你电脑**上(把 `USER`,`云IP` 换成实际值):
|
||||
|
||||
```bash
|
||||
# 打包整个备份目录
|
||||
tar -czf crypto_migrate.tar.gz -C ~ crypto_backups # 或你的 BACKUP 路径
|
||||
|
||||
scp crypto_migrate.tar.gz USER@云IP:/tmp/
|
||||
scp manual_trading_hub/hub_settings.json USER@云IP:/tmp/ # 若单独备份
|
||||
```
|
||||
|
||||
大文件可用 **rsync**(支持断点续传):
|
||||
|
||||
```bash
|
||||
rsync -avz --progress ~/crypto_backups/ USER@云IP:/tmp/crypto_backups/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五,云上恢复数据
|
||||
|
||||
假设代码已在 `/opt/crypto_monitor_user`(`git clone` 或 `rsync` 代码均可,**代码与数据分开**).
|
||||
|
||||
```bash
|
||||
ssh USER@云IP
|
||||
cd /opt/crypto_monitor_user
|
||||
|
||||
# 解压(若用 scp 单包)
|
||||
tar -xzf /tmp/crypto_migrate.tar.gz -C /tmp
|
||||
|
||||
# 按实例恢复(示例:OKX)
|
||||
pm2 stop crypto_okx 2>/dev/null || true
|
||||
cp /tmp/crypto_backups/crypto_monitor_okx/2026-05-21/crypto.db crypto_monitor_okx/crypto.db
|
||||
tar -xzf /tmp/crypto_backups/crypto_monitor_okx/2026-05-21/static_images.tar.gz -C crypto_monitor_okx/
|
||||
# 若 tar 里是 static/images 目录结构,确认解压后路径为 crypto_monitor_okx/static/images
|
||||
|
||||
# 对其余三所重复同样步骤
|
||||
```
|
||||
|
||||
恢复中控设置:
|
||||
|
||||
```bash
|
||||
cp /tmp/hub_settings.json manual_trading_hub/hub_settings.json
|
||||
# 或解压备份里带的 hub_settings.json
|
||||
```
|
||||
|
||||
**权限**(避免 Flask 写库失败):
|
||||
|
||||
```bash
|
||||
sudo chown -R 运行用户:运行用户 /opt/crypto_monitor_user/crypto_monitor_*/crypto.db
|
||||
sudo chown -R 运行用户:运行用户 /opt/crypto_monitor_user/crypto_monitor_*/static/images
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六,云上必须改的配置(比迁移本身更重要)
|
||||
|
||||
数据文件原样拷过去不够,**.env 与 hub_settings 要按云环境改**.
|
||||
|
||||
### 1. 各实例 `crypto_monitor_*/.env`
|
||||
|
||||
从本机**抄写** API 密钥等,并调整:
|
||||
|
||||
| 项 | 本地常见 | 云上建议 |
|
||||
|----|----------|----------|
|
||||
| `OKX_SOCKS_PROXY` 等 | `socks5h://127.0.0.1:1080` | **留空**(直连),除非云上仍访问不了交易所 |
|
||||
| `APP_AUTH_DISABLED` | 可能为 true(本机) | **false** 或未设置 |
|
||||
| `APP_USERNAME` / `APP_PASSWORD` | 可有 | 设统一强密码(直链登录) |
|
||||
| `HUB_BRIDGE_TOKEN` | 有 | 与中控 **完全一致** |
|
||||
|
||||
### 2. `manual_trading_hub/.env`
|
||||
|
||||
见 [云服务器部署说明.md](./云服务器部署说明.md):`HUB_PASSWORD`,`HUB_BRIDGE_TOKEN`,`HUB_COOKIE_SECURE=true` 等.
|
||||
|
||||
### 3. `hub_settings.json` 里的 URL
|
||||
|
||||
**必须**改成浏览器能打开的地址:
|
||||
|
||||
| 字段 | 云上 |
|
||||
|------|------|
|
||||
| `flask_url` | `https://okx.你的域名.com`(每实例不同子域) |
|
||||
| `agent_url` | `http://127.0.0.1:15201`(保持本机,勿写公网 IP) |
|
||||
|
||||
本机若是 `http://192.168.x.x:5004` 或 `http://127.0.0.1:5004`,上云后**一定要改**,否则「打开实例」会指错地址.
|
||||
|
||||
---
|
||||
|
||||
## 七,云上启动与验收
|
||||
|
||||
```bash
|
||||
# 依赖(各目录 venv + manual_trading_hub)
|
||||
# 见 云服务器部署说明.md,部署文档.md
|
||||
|
||||
cd /opt/crypto_monitor_user
|
||||
# 先三实例 Flask,再 manual_trading_hub ecosystem
|
||||
pm2 start ...
|
||||
pm2 save
|
||||
```
|
||||
|
||||
验收:
|
||||
|
||||
- [ ] 各实例网页能登录,**交易记录 / 关键位 / 监控单** 与本地一致
|
||||
- [ ] 复盘图片能显示(`static/images` 路径正确)
|
||||
- [ ] 中控监控卡片能读到持仓;`hub_settings` 账户 URL 正确
|
||||
- [ ] 本机已 **停止** 或不再用同一 API Key 同时跑两套(避免重复下单)
|
||||
|
||||
---
|
||||
|
||||
## 八,迁移策略建议
|
||||
|
||||
### 方案 A:一次性切换(简单)
|
||||
|
||||
1. 本地停 PM2 → 备份 → 上传 → 云上恢复 → 改配置 → 只跑云端.
|
||||
2. 适合能接受 **短暂停机**(几十分钟).
|
||||
|
||||
### 方案 B:先云后停本地(稳一点)
|
||||
|
||||
1. 云上先部署代码,空库跑通;
|
||||
2. 临近切换时再备份本地**最新**库覆盖云上;
|
||||
3. 切换时刻停本地,启云上.
|
||||
4. 减少「备份到上线」之间的数据空窗.
|
||||
|
||||
### 注意
|
||||
|
||||
- **同一交易所 API Key 不要本地和云上同时自动交易**,以免重复挂单.
|
||||
- 迁移后第一次在云上打开,建议先看监控单,持仓是否与预期一致,再放开自动逻辑.
|
||||
|
||||
---
|
||||
|
||||
## 九,常见问题
|
||||
|
||||
**Q:只拷 `crypto.db` 不够吗?**
|
||||
- 复盘,上传相关功能还依赖 `static/images`;建议库 + 图片一起迁.
|
||||
|
||||
**Q:迁移后 OKX 监控单没了?**
|
||||
- 查是否拷错目录(三所各一个库),或恢复后用了空库路径(`DB_PATH` 不一致).
|
||||
|
||||
**Q:图片 404?**
|
||||
- 检查 `static/images` 是否解压到实例目录下;数据库里路径若为相对路径,一般与目录结构一致即可.
|
||||
|
||||
**Q:本地还用 SOCKS,云上要不要?**
|
||||
- 云上通常 **不需要** SSH 隧道;见 [云服务器部署说明.md](./云服务器部署说明.md) 与此前说明:直连稳定后去掉 `*_SOCKS_PROXY`.
|
||||
|
||||
---
|
||||
|
||||
## 十,相关脚本
|
||||
|
||||
各实例目录:
|
||||
|
||||
```bash
|
||||
bash scripts/backup_data.sh
|
||||
```
|
||||
|
||||
环境变量:`BACKUP_ROOT`,`BACKUP_RETENTION_DAYS`,`BACKUP_INSTANCE`(见脚本内注释).
|
||||
@@ -1,130 +0,0 @@
|
||||
# 行情区(K 线)说明
|
||||
|
||||
中控 **行情区** `/market` 提供多交易所 K 线查看:按需拉取,本地 SQLite 缓存,可选技术指标与持仓价格线.数据经各实例 Flask 的 `/api/hub/ohlcv`(底层 `hub_ohlcv_lib` + ccxt)获取.
|
||||
|
||||
相关代码:`manual_trading_hub/static/chart.js`,`hub_kline_store.py`(仓库根目录),`hub.py` 的 `/api/chart/*`.
|
||||
|
||||
---
|
||||
|
||||
## 1. 入口与导航
|
||||
|
||||
| 方式 | 说明 |
|
||||
|------|------|
|
||||
| 顶栏 **行情区** | 打开 `/market` |
|
||||
| 监控区持仓 | 点击合约名(**打开行情区**)→ 跳转 `/market?exchange_key=...&symbol=...`,并带入入场/止损/止盈等标记(`sessionStorage`) |
|
||||
| 全屏工具条 | K 线全屏时可在顶部切换交易所,币种,周期并 **加载** |
|
||||
|
||||
---
|
||||
|
||||
## 2. 支持的周期
|
||||
|
||||
下拉框与后端 `CHART_TIMEFRAMES` 一致:
|
||||
|
||||
| 周期 | 数字快捷键(分钟) |
|
||||
|------|-------------------|
|
||||
| 1m | `1`(稍停或 Enter 确认;连按 `1`→`5` 为 15m) |
|
||||
| 5m | `5` |
|
||||
| 15m | `15` |
|
||||
| 1h | `60` |
|
||||
| 2h | `120` |
|
||||
| 4h | `240` |
|
||||
| 12h | `720` |
|
||||
| 1d | `1440` |
|
||||
| 1w | `10080` |
|
||||
|
||||
- 快捷键仅在行情页,且焦点不在输入框/下拉框时生效.
|
||||
- **全屏**:按 **`F`** 切换;全屏时 **`Esc`** 退出.
|
||||
- 无效或已移除的周期(如 URL 带 `6h`)会回退为默认 **5m**.
|
||||
|
||||
---
|
||||
|
||||
## 3. 数据拉取与本地库
|
||||
|
||||
| 项 | 说明 |
|
||||
|------|------|
|
||||
| **策略** | 先读本地库,不足或过期则向对应实例拉取并写入库;Hub **后台轮询** 增量更新尾部 K 线 |
|
||||
| **库文件** | 默认 `manual_trading_hub/data/hub_kline.db`(不纳入 Git) |
|
||||
| **保留** | 默认 **15 天**(`HUB_KLINE_RETENTION_DAYS`),每次请求顺带清理更早数据 |
|
||||
| **根数** | 日内周期约 **1000** 根;`1d` / `1w` 约 **500** 根 |
|
||||
| **刷新** | Hub 约 **5 秒** 轮询:① 监控区**有持仓**的合约(默认周期 `5m`)② 行情页 **watch** 的交易所+币种+周期(页面打开时每 25s 续期).浏览器经 **SSE** 收 `chart_version` 后拉 `/api/chart/ohlcv`.**加载** 读库;**强制刷新** 全量重拉 |
|
||||
| **分页** | OKX/Gate 等单次常限 ~300 根,中控会自动分页补全 |
|
||||
| **12h** | 若交易所无原生 12h 或 K 线间隔异常,会从 **1h** 聚合生成 |
|
||||
|
||||
环境变量(`manual_trading_hub/.env`):
|
||||
|
||||
```bash
|
||||
# HUB_KLINE_RETENTION_DAYS=15
|
||||
# HUB_KLINE_DB_PATH=/opt/crypto_monitor_user/manual_trading_hub/data/hub_kline.db
|
||||
# HUB_CHART_POLL_INTERVAL=5
|
||||
# HUB_CHART_POSITION_TIMEFRAME=5m
|
||||
# HUB_CHART_WATCH_TTL_SEC=45
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 图表功能
|
||||
|
||||
- **主图**:K 线 + 成交量(Lightweight Charts).
|
||||
- **价格轴**:「自动」切换是否跟随最新价缩放.
|
||||
- **技术指标**(可选勾选):EMA 21/55,MACD,RSI(含 30/70 参考线);副图自上而下为 MACD,RSI.
|
||||
- **持仓标记**(从监控跳转时):展示入场,止损,止盈,张数,**浮盈亏**(约 5 秒随监控快照刷新),委托摘要;K 线上绘制对应价格线.趋势回调若止盈为程序监控,止盈栏显示「程序监控」且不与止损同价误显.
|
||||
- **趋势保本移交**:移交到下单监控后,持仓卡止盈/止损与「交易所止盈止损」与实例 **下单监控** 计划价一致(不再清空为程序监控占位);交易所仅市价只减仓单时也会按价格推断展示.
|
||||
- **拖动止损线**:鼠标靠近红色止损线(⟷)可上下拖动;松手确认后调用与监控区相同的 **挂止盈/止损** API(先撤全部条件单再挂新止损+止盈).须已有有效止盈价(交易所条件单或计划止盈);仅改止损,不改止盈时止盈价沿用当前上下文.
|
||||
- **背离**:MACD/RSI 与价格简易背离标注(箭头 + 图例说明).
|
||||
|
||||
---
|
||||
|
||||
## 5. HTTP API(中控)
|
||||
|
||||
须登录(与监控区相同,`/api/ping` 等白名单除外).
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/chart/meta` | 已启用交易所列表,周期列表,各周期 limit,保留天数 |
|
||||
| GET | `/api/chart/ohlcv` | 查询参数:`exchange_key`,`symbol`,`timeframe`,可选 `refresh=1` 强制刷新 |
|
||||
| POST | `/api/chart/watch` | 行情页订阅(JSON:`exchange_key`,`symbol`,`timeframe`),45s 内需续期 |
|
||||
| POST | `/api/chart/unwatch` | 离开行情页取消订阅 |
|
||||
| GET | `/api/chart/stream` | SSE:`event: chart`,含 `chart_version` 与各 `series` 版本 |
|
||||
| GET | `/api/chart/poll/meta` | 当前轮询状态与各 series 版本 |
|
||||
|
||||
实例侧(中控转发):
|
||||
|
||||
| 路径 | 说明 |
|
||||
|------|------|
|
||||
| GET | `/api/hub/ohlcv` | 各 `crypto_monitor_*` 经 `hub_bridge` 注册;参数 `symbol`,`timeframe`,`since_ms`,`limit` |
|
||||
|
||||
---
|
||||
|
||||
## 6. 部署与升级注意
|
||||
|
||||
1. **hub** 与 **三实例 Flask** 均需 `git pull` 到含 `hub_ohlcv_lib.py`,`hub_kline_store.py` 的版本.
|
||||
2. 重启:`pm2 restart manual-trading-hub` 及 `crypto_binance`,`crypto_okx`,`crypto_gate`,``(名称以你环境为准).
|
||||
3. 浏览器 **强刷**(`chart.js` 带版本 query,避免旧前端缓存).
|
||||
4. 周期或拉取逻辑升级后,对异常图表点一次 **强制刷新**,必要时可删 `data/hub_kline.db` 后重拉(会丢失本地缓存,不影响策略库).
|
||||
|
||||
回滚标签说明见 [SNAPSHOT_ROLLBACK.md](./SNAPSHOT_ROLLBACK.md).
|
||||
|
||||
---
|
||||
|
||||
## 7. 常见问题
|
||||
|
||||
| 现象 | 处理 |
|
||||
|------|------|
|
||||
| 只显示约 300 根 | `git pull` 实例与 hub,强制刷新;确认 `hub_ohlcv_lib` 已含分页逻辑 |
|
||||
| 12h 错乱或过少 | 强制刷新;Gate 等无原生 12h 时依赖 1h 聚合,需实例 OHLCV 正常 |
|
||||
| 周期下拉无某项 | 以当前 `CHART_TIMEFRAMES` 为准;已移除 3m/10m/20m/30m/6h/8h 等 |
|
||||
| 快捷键无效 | 确认在行情页;全屏用 **F**;数字键勿在币种输入框内按 |
|
||||
| 持仓线不显示 | 须从监控区点击合约进入;或清除标记后重新跳转 |
|
||||
|
||||
更多中控共性问题见 [常见问题.md](./常见问题.md).
|
||||
|
||||
---
|
||||
|
||||
## 8. 文档索引
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [使用说明.md](./使用说明.md) | 中控总览(含行情区摘要) |
|
||||
| [行情区说明.md](./行情区说明.md) | 本文 |
|
||||
| [部署文档.md](./部署文档.md) | PM2 / 反代 / 验收 |
|
||||
| [.env.example](./.env.example) | `HUB_KLINE_*` 等变量 |
|
||||
@@ -1,94 +0,0 @@
|
||||
# 资金概况 — 使用说明
|
||||
|
||||
中控顶栏 **资金概况**(`/funds`)汇总三所账户的 **资金账户 + 交易账户** 余额,不含浮盈亏;未监控账户不参与合计,但仍会在分户列表中灰显展示.
|
||||
|
||||
---
|
||||
|
||||
## 1. 口径
|
||||
|
||||
| 项目 | 规则 |
|
||||
|------|------|
|
||||
| **单户总资金** | `资金账户 USDT + 交易账户 USDT` |
|
||||
| **总资金** | 所有 **已启用且未被环境强制关闭** 的账户之和 |
|
||||
| **未监控** | 设置页未勾选「启用」或 `HUB_DISABLED_IDS` 强制关闭 → **跳过合计** |
|
||||
| **缺数据** | 资金户,交易户任一侧缺失 → 该户当日快照 **跳过**(不估,不补 0) |
|
||||
| **交易日** | 北京时间 `TRADING_DAY_RESET_HOUR`(默认 **8:00**)切日,与三所统计一致 |
|
||||
| **曲线粒度** | 每个交易日 **1 个点** |
|
||||
| **统计起点** | 默认 **2026-06-09**(`HUB_FUND_HISTORY_START_DAY`);此前不记,不展示 |
|
||||
| **历史保留** | 自起点起最多 **180** 个交易日(`HUB_FUND_HISTORY_DAYS`) |
|
||||
| **最大回撤** | 基于 **总资金曲线**(分户同理),峰值到谷底的最大跌幅(U 与 %) |
|
||||
|
||||
> 与实例统计页「最大回撤」不同:实例统计来自 **平仓盈亏累计**;资金概况来自 **账户余额曲线**.
|
||||
|
||||
---
|
||||
|
||||
## 2. 页面说明
|
||||
|
||||
### 总览
|
||||
|
||||
- **总资金**:当前监控板最新一轮聚合的实时合计(资金户+交易户齐全才计入)
|
||||
- **累计盈亏**:相对统计起点(`HUB_FUND_HISTORY_START_DAY`)首个快照的总资金变动(U / %);顶栏大字绿涨红跌,一眼可看盈亏。含出入金影响,口径同权益曲线,不含浮盈
|
||||
- **较昨日**:相对上一交易日快照点的变动(U)
|
||||
- **最大回撤**:总资金历史曲线的峰值回撤(U / %)
|
||||
- **总资金曲线**:近 180 交易日
|
||||
|
||||
### 分户卡片
|
||||
|
||||
每户展示:总资金,资金户,交易户,最大回撤,迷你曲线.
|
||||
|
||||
- **已监控**:正常统计
|
||||
- **未监控**:显示「未参与合计」,无曲线
|
||||
- **余额未齐**:已监控但 API 未返回完整资金/交易户
|
||||
|
||||
---
|
||||
|
||||
## 3. 数据从哪来
|
||||
|
||||
```
|
||||
监控板每 5 秒聚合(board_store)
|
||||
└→ 各实例 GET /api/hub/account
|
||||
funding_usdt / trading_usdt
|
||||
└→ 写入 hub_fund_history.json(按交易日去重更新当日)
|
||||
|
||||
资金概况页 GET /api/hub/fund-overview
|
||||
├→ 实时:读 board 缓存
|
||||
└→ 曲线/回撤:读 hub_fund_history.json
|
||||
```
|
||||
|
||||
- 存储文件:`manual_trading_hub/hub_fund_history.json`(不在 Git 中)
|
||||
- 旧 AI 快照 `hub_ai_fund_history.json` 会在首次读取时 **自动合并** 到新文件
|
||||
- AI 教练生成上下文时也会写入同日快照(与监控板共用逻辑)
|
||||
|
||||
---
|
||||
|
||||
## 4. 环境变量
|
||||
|
||||
| 变量 | 默认 | 说明 |
|
||||
|------|------|------|
|
||||
| `HUB_FUND_HISTORY_DAYS` | `180` | 资金快照保留交易日数(与起点取较晚边界) |
|
||||
| `HUB_FUND_HISTORY_START_DAY` | `2026-06-09` | 曲线/回撤统计起始交易日 |
|
||||
| `TRADING_DAY_RESET_HOUR` | `8` | 切日整点(北京),与三所 `.env` 建议一致 |
|
||||
| `HUB_BOARD_POLL_INTERVAL` | `5` | 监控聚合间隔(秒),影响快照刷新频率 |
|
||||
|
||||
---
|
||||
|
||||
## 5. API
|
||||
|
||||
`GET /api/hub/fund-overview`(需中控登录,与监控区相同)
|
||||
|
||||
返回字段概要:
|
||||
|
||||
- `totals.total_usdt` — 当前总资金
|
||||
- `totals.day_delta_usdt` — 较昨日变动
|
||||
- `totals.period_delta_usdt` / `period_delta_pct` / `start_usdt` — 相对曲线起点累计盈亏
|
||||
- `totals.series[]` — `{ day, total_usdt }` 总曲线
|
||||
- `totals.drawdown` — `{ peak_usdt, max_drawdown_u, max_drawdown_pct }`
|
||||
- `accounts[]` — 分户实时余额,曲线,回撤,日/累计变动,`monitored` 标记
|
||||
|
||||
---
|
||||
|
||||
## 6. 相关文档
|
||||
|
||||
- [使用说明.md](./使用说明.md) — 中控总览
|
||||
- [AI教练说明.md](./AI教练说明.md) — AI 上下文中的资金快照文本
|
||||
- [部署文档.md](./部署文档.md) — 重启 `manual-trading-hub` 后生效
|
||||
Reference in New Issue
Block a user