refactor: 移除 gate_bot,统一为三所架构并更新文档
删除 crypto_monitor_gate_bot 目录,中控与子代理改为 binance/okx/gate 三账户; 文档与 UI 文案「四所」改为「三所」;新增清库前一次性配置备份脚本。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+130
-130
@@ -1,130 +1,130 @@
|
||||
# 账户冷静期 / 日冻结风控
|
||||
|
||||
四所实例(币安 / OKX / Gate / Gate 趋势)共用 `account_risk_lib.py`。
|
||||
**仅用户主动平仓**计入风控;交易所止盈/止损、空仓同步、改保本/改委托等**不触发**冷静期。
|
||||
|
||||
## 状态展示
|
||||
|
||||
实例页顶、中控监控卡片账户名旁显示风控徽章:
|
||||
|
||||
| 状态 | 含义 | 倒计时 |
|
||||
|------|------|--------|
|
||||
| 正常 | 可新开仓 | 无 |
|
||||
| 1h冻结 | 冷静期中(通常为复盘后缩短的 1 小时) | 剩余时间,如 `1h冻结 · 52m 08s` |
|
||||
| 4h冻结 | 冷静期中(默认 4 小时) | 剩余时间,如 `4h冻结 · 3h 12m` |
|
||||
| 日冻结 | 当日禁止一切新开仓 | 至下一 **交易日切点**(`TRADING_DAY_RESET_HOUR`) |
|
||||
|
||||
- 倒计时每秒刷新;到期后徽章自动恢复为 **正常**(下次轮询/API 刷新会再次对齐服务端状态)。
|
||||
- 鼠标悬停徽章可见完整说明(含解除时刻,如有)。
|
||||
|
||||
## 什么算「手动平仓」(计入风控)
|
||||
|
||||
以下操作通过 `close_source` 登记为 **用户主动平仓**:
|
||||
|
||||
| 来源标识 | 操作 |
|
||||
|----------|------|
|
||||
| `user_instance` | 实例页删单/手动平仓(`del_order`) |
|
||||
| `user_hub` | 中控「平仓」「全平」「紧急全平」 |
|
||||
| `user_trend_stop` | 趋势计划 **「结束计划」**(手动结束) |
|
||||
|
||||
**不算**手动平仓(不触发风控):
|
||||
|
||||
- 趋势 **「保本移交下单监控」**
|
||||
- 中控/实例修改委托、挂止盈止损、移动保本
|
||||
- 交易所止盈/止损/条件单成交
|
||||
- 后台 `reconcile_external_closes` 空仓同步(即使记账为「外部平仓」)
|
||||
- 监控轮询自动止盈/止损/保本
|
||||
|
||||
## 触发规则
|
||||
|
||||
| 事件 | 行为 |
|
||||
|------|------|
|
||||
| 第 1 次用户主动平仓 | 默认 **4h** 冷静期 |
|
||||
| 第 2 次用户主动平仓(同一交易日) | **日冻结** |
|
||||
| 复盘勾选任意情绪标签 | **日冻结** |
|
||||
| 复盘:离场=手动平仓 且说明非空 | 将当前冷静期降为 **1h**(须处于 4h 档冷静期中) |
|
||||
|
||||
情绪标签:怕踏空、报复开仓、盈利飘了、拿不住单、扛单、重仓违规。
|
||||
|
||||
### 复盘缩短为 1h
|
||||
|
||||
任选一种方式,并填写说明:
|
||||
|
||||
| 方式 | 必填 |
|
||||
|------|------|
|
||||
| **复盘表单**提交 | 离场触发 = **手动平仓**;**离场补充** 非空(不是下方「备注」) |
|
||||
| **核对修改**保存 | 结果 = **手动平仓**;**备注** 非空 |
|
||||
|
||||
说明:
|
||||
|
||||
- 中控全平 / 实例手动平仓后,只要在 4h 窗口内完成上述操作即可降为 1h。
|
||||
- 复盘保存后会同步更新 `last_close_at_ms`,倒计时以 **最后一次手动平仓 + 当前档位数** 为准,不会继续读库内旧 4h 结束时间。
|
||||
- 1h 窗口已结束后,即使库里残留旧 `cooloff_until_ms`,状态也会恢复 **正常**。
|
||||
- 若超过「平仓 + 1h」才复盘,则从 **保存复盘时刻** 起再计 1h(不延长原 4h)。
|
||||
- **止盈 / 保本止盈 / 止损** 等自动平仓不触发风控,也不会刷新冷静期。
|
||||
- 代码更新后需 **重启对应实例** 并硬刷新页面。
|
||||
|
||||
### 倒计时与标签
|
||||
|
||||
- 结束时刻 = `last_close_at_ms + cooloff_hours`(`APP_TIMEZONE` 默认北京时间)
|
||||
- 1h / 4h 标签按实际剩余时长判断,与倒计时一致
|
||||
- 切交易日后,若冷静期已过期,自动清库内残留字段
|
||||
|
||||
## 环境变量
|
||||
|
||||
```env
|
||||
RISK_CONTROL_ENABLED=true
|
||||
RISK_COOLING_HOURS_MANUAL=4
|
||||
RISK_COOLING_HOURS_MANUAL_JOURNAL=1
|
||||
RISK_MANUAL_CLOSE_DAILY_LIMIT=2
|
||||
RISK_MOOD_ISSUES_DAILY_FREEZE=true
|
||||
TRADING_DAY_RESET_HOUR=8
|
||||
APP_TIMEZONE=Asia/Shanghai
|
||||
```
|
||||
|
||||
`RISK_COOLING_HOURS_EXTERNAL` 已废弃(外部平仓不再触发风控)。
|
||||
|
||||
## API 与 `risk_status` 字段
|
||||
|
||||
| 接口 | 说明 |
|
||||
|------|------|
|
||||
| `GET /api/account_snapshot` | 实例页轮询,含 `risk_status` |
|
||||
| `GET /api/account_risk_status` | hub_bridge 专用 |
|
||||
| `GET /api/hub/monitor` | 中控监控板,每账户含 `risk_status` |
|
||||
| `POST /api/hub/account-risk/user-close` | 中控登记用户平仓,`body: { source, count }` |
|
||||
|
||||
`risk_status` 主要字段:
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `status` | `normal` / `freeze_1h` / `freeze_4h` / `freeze_daily` / `freeze_position` |
|
||||
| `status_label` | 中文标签 |
|
||||
| `can_trade` | 是否允许新开仓(仅风控维度) |
|
||||
| `reason` | 悬停提示文案 |
|
||||
| `active_count` / `max_active_positions` | 当前活跃持仓与 `.env` 中 `MAX_ACTIVE_POSITIONS` |
|
||||
| `cooloff_until_ms` | 1h/4h 冷静期结束时间戳(毫秒) |
|
||||
| `freeze_until_ms` | 倒计时结束时间戳(日冻结为下一交易日切点) |
|
||||
| `freeze_remaining_sec` | 服务端计算的剩余秒数(供调试) |
|
||||
|
||||
**仓位上限冻结**:当 **计入上限的** 活跃持仓数(不含趋势回调)≥ 实例 `.env` 的 `MAX_ACTIVE_POSITIONS`(默认 1)且账户无时间类冻结时,徽章显示 **仓位上限冻结**;此时 **新开仓** 被禁止,但 **顺势加仓**(在已有同向监控持仓上加仓)仍可用。仅存在趋势回调持仓时不触发该冻结。时间冻结(1h/4h/日)优先展示。
|
||||
|
||||
`risk_status.can_roll`:仓位上限冻结时为 `true`,表示顺势加仓不受该冻结限制。
|
||||
|
||||
## 前端倒计时
|
||||
|
||||
- 共用脚本:`static/account_risk_badge.js?v=4`
|
||||
- 样式:`static/account_risk_badge.css`
|
||||
- 展示格式:`4h冻结 · 3h 12m`;日冻结为距下一交易日切点剩余时间
|
||||
- 倒计时优先用服务端 `freeze_remaining_sec` 推算结束时刻,避免绝对时间戳与时区/脏数据偏差
|
||||
- 服务端在冷静期**已结束**或锚点无效时**自动清库**,避免重启后误读旧 `account_risk_state` 仍显示冻结
|
||||
- 无效的未来 `last_close_at_ms` **不会**被当作「现在」重启计时
|
||||
- 若当日手动平仓**已复盘**(journal 有说明)且 1h 窗口已过,即使 risk 表被误写也会强制恢复 **正常**
|
||||
- 勿与交易记录列表中的历史平仓时间混淆:风控只看 `account_risk_state` 表内 **最后一次用户主动平仓** 及其复盘结果
|
||||
|
||||
## 相关代码
|
||||
|
||||
- `account_risk_lib.py` — 状态机、`enrich_risk_status_countdown`、`apply_position_limit_risk`、`on_user_initiated_close`
|
||||
- `hub_bridge.py` — `/api/hub/account-risk/user-close`
|
||||
- `manual_trading_hub/hub.py` — 中控平仓成功后调用 user-close
|
||||
- `strategy_trend_register.py` — `stop_trend_pullback` 结束计划时登记风控
|
||||
- `tests/test_account_risk_lib.py`
|
||||
# 账户冷静期 / 日冻结风控
|
||||
|
||||
三所实例(币安 / OKX / Gate / Gate)共用 `account_risk_lib.py`。
|
||||
**仅用户主动平仓**计入风控;交易所止盈/止损、空仓同步、改保本/改委托等**不触发**冷静期。
|
||||
|
||||
## 状态展示
|
||||
|
||||
实例页顶、中控监控卡片账户名旁显示风控徽章:
|
||||
|
||||
| 状态 | 含义 | 倒计时 |
|
||||
|------|------|--------|
|
||||
| 正常 | 可新开仓 | 无 |
|
||||
| 1h冻结 | 冷静期中(通常为复盘后缩短的 1 小时) | 剩余时间,如 `1h冻结 · 52m 08s` |
|
||||
| 4h冻结 | 冷静期中(默认 4 小时) | 剩余时间,如 `4h冻结 · 3h 12m` |
|
||||
| 日冻结 | 当日禁止一切新开仓 | 至下一 **交易日切点**(`TRADING_DAY_RESET_HOUR`) |
|
||||
|
||||
- 倒计时每秒刷新;到期后徽章自动恢复为 **正常**(下次轮询/API 刷新会再次对齐服务端状态)。
|
||||
- 鼠标悬停徽章可见完整说明(含解除时刻,如有)。
|
||||
|
||||
## 什么算「手动平仓」(计入风控)
|
||||
|
||||
以下操作通过 `close_source` 登记为 **用户主动平仓**:
|
||||
|
||||
| 来源标识 | 操作 |
|
||||
|----------|------|
|
||||
| `user_instance` | 实例页删单/手动平仓(`del_order`) |
|
||||
| `user_hub` | 中控「平仓」「全平」「紧急全平」 |
|
||||
| `user_trend_stop` | 趋势计划 **「结束计划」**(手动结束) |
|
||||
|
||||
**不算**手动平仓(不触发风控):
|
||||
|
||||
- 趋势 **「保本移交下单监控」**
|
||||
- 中控/实例修改委托、挂止盈止损、移动保本
|
||||
- 交易所止盈/止损/条件单成交
|
||||
- 后台 `reconcile_external_closes` 空仓同步(即使记账为「外部平仓」)
|
||||
- 监控轮询自动止盈/止损/保本
|
||||
|
||||
## 触发规则
|
||||
|
||||
| 事件 | 行为 |
|
||||
|------|------|
|
||||
| 第 1 次用户主动平仓 | 默认 **4h** 冷静期 |
|
||||
| 第 2 次用户主动平仓(同一交易日) | **日冻结** |
|
||||
| 复盘勾选任意情绪标签 | **日冻结** |
|
||||
| 复盘:离场=手动平仓 且说明非空 | 将当前冷静期降为 **1h**(须处于 4h 档冷静期中) |
|
||||
|
||||
情绪标签:怕踏空、报复开仓、盈利飘了、拿不住单、扛单、重仓违规。
|
||||
|
||||
### 复盘缩短为 1h
|
||||
|
||||
任选一种方式,并填写说明:
|
||||
|
||||
| 方式 | 必填 |
|
||||
|------|------|
|
||||
| **复盘表单**提交 | 离场触发 = **手动平仓**;**离场补充** 非空(不是下方「备注」) |
|
||||
| **核对修改**保存 | 结果 = **手动平仓**;**备注** 非空 |
|
||||
|
||||
说明:
|
||||
|
||||
- 中控全平 / 实例手动平仓后,只要在 4h 窗口内完成上述操作即可降为 1h。
|
||||
- 复盘保存后会同步更新 `last_close_at_ms`,倒计时以 **最后一次手动平仓 + 当前档位数** 为准,不会继续读库内旧 4h 结束时间。
|
||||
- 1h 窗口已结束后,即使库里残留旧 `cooloff_until_ms`,状态也会恢复 **正常**。
|
||||
- 若超过「平仓 + 1h」才复盘,则从 **保存复盘时刻** 起再计 1h(不延长原 4h)。
|
||||
- **止盈 / 保本止盈 / 止损** 等自动平仓不触发风控,也不会刷新冷静期。
|
||||
- 代码更新后需 **重启对应实例** 并硬刷新页面。
|
||||
|
||||
### 倒计时与标签
|
||||
|
||||
- 结束时刻 = `last_close_at_ms + cooloff_hours`(`APP_TIMEZONE` 默认北京时间)
|
||||
- 1h / 4h 标签按实际剩余时长判断,与倒计时一致
|
||||
- 切交易日后,若冷静期已过期,自动清库内残留字段
|
||||
|
||||
## 环境变量
|
||||
|
||||
```env
|
||||
RISK_CONTROL_ENABLED=true
|
||||
RISK_COOLING_HOURS_MANUAL=4
|
||||
RISK_COOLING_HOURS_MANUAL_JOURNAL=1
|
||||
RISK_MANUAL_CLOSE_DAILY_LIMIT=2
|
||||
RISK_MOOD_ISSUES_DAILY_FREEZE=true
|
||||
TRADING_DAY_RESET_HOUR=8
|
||||
APP_TIMEZONE=Asia/Shanghai
|
||||
```
|
||||
|
||||
`RISK_COOLING_HOURS_EXTERNAL` 已废弃(外部平仓不再触发风控)。
|
||||
|
||||
## API 与 `risk_status` 字段
|
||||
|
||||
| 接口 | 说明 |
|
||||
|------|------|
|
||||
| `GET /api/account_snapshot` | 实例页轮询,含 `risk_status` |
|
||||
| `GET /api/account_risk_status` | hub_bridge 专用 |
|
||||
| `GET /api/hub/monitor` | 中控监控板,每账户含 `risk_status` |
|
||||
| `POST /api/hub/account-risk/user-close` | 中控登记用户平仓,`body: { source, count }` |
|
||||
|
||||
`risk_status` 主要字段:
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `status` | `normal` / `freeze_1h` / `freeze_4h` / `freeze_daily` / `freeze_position` |
|
||||
| `status_label` | 中文标签 |
|
||||
| `can_trade` | 是否允许新开仓(仅风控维度) |
|
||||
| `reason` | 悬停提示文案 |
|
||||
| `active_count` / `max_active_positions` | 当前活跃持仓与 `.env` 中 `MAX_ACTIVE_POSITIONS` |
|
||||
| `cooloff_until_ms` | 1h/4h 冷静期结束时间戳(毫秒) |
|
||||
| `freeze_until_ms` | 倒计时结束时间戳(日冻结为下一交易日切点) |
|
||||
| `freeze_remaining_sec` | 服务端计算的剩余秒数(供调试) |
|
||||
|
||||
**仓位上限冻结**:当 **计入上限的** 活跃持仓数(不含趋势回调)≥ 实例 `.env` 的 `MAX_ACTIVE_POSITIONS`(默认 1)且账户无时间类冻结时,徽章显示 **仓位上限冻结**;此时 **新开仓** 被禁止,但 **顺势加仓**(在已有同向监控持仓上加仓)仍可用。仅存在趋势回调持仓时不触发该冻结。时间冻结(1h/4h/日)优先展示。
|
||||
|
||||
`risk_status.can_roll`:仓位上限冻结时为 `true`,表示顺势加仓不受该冻结限制。
|
||||
|
||||
## 前端倒计时
|
||||
|
||||
- 共用脚本:`static/account_risk_badge.js?v=4`
|
||||
- 样式:`static/account_risk_badge.css`
|
||||
- 展示格式:`4h冻结 · 3h 12m`;日冻结为距下一交易日切点剩余时间
|
||||
- 倒计时优先用服务端 `freeze_remaining_sec` 推算结束时刻,避免绝对时间戳与时区/脏数据偏差
|
||||
- 服务端在冷静期**已结束**或锚点无效时**自动清库**,避免重启后误读旧 `account_risk_state` 仍显示冻结
|
||||
- 无效的未来 `last_close_at_ms` **不会**被当作「现在」重启计时
|
||||
- 若当日手动平仓**已复盘**(journal 有说明)且 1h 窗口已过,即使 risk 表被误写也会强制恢复 **正常**
|
||||
- 勿与交易记录列表中的历史平仓时间混淆:风控只看 `account_risk_state` 表内 **最后一次用户主动平仓** 及其复盘结果
|
||||
|
||||
## 相关代码
|
||||
|
||||
- `account_risk_lib.py` — 状态机、`enrich_risk_status_countdown`、`apply_position_limit_risk`、`on_user_initiated_close`
|
||||
- `hub_bridge.py` — `/api/hub/account-risk/user-close`
|
||||
- `manual_trading_hub/hub.py` — 中控平仓成功后调用 user-close
|
||||
- `strategy_trend_register.py` — `stop_trend_pullback` 结束计划时登记风控
|
||||
- `tests/test_account_risk_lib.py`
|
||||
|
||||
+45
-45
@@ -1,45 +1,45 @@
|
||||
# 每日自动划转(四所统一)
|
||||
|
||||
## 行为
|
||||
|
||||
在 `.env` 开启 `AUTO_TRANSFER_ENABLED=true` 后,监控轮询在**北京时间 `AUTO_TRANSFER_BJ_HOUR` 整点所在小时**内(默认 8:00–8:59)执行一次(按 **UTC 自然日** 去重):
|
||||
|
||||
| 交易账户 (`AUTO_TRANSFER_TO`,默认 swap) | 动作 |
|
||||
|------------------------------------------|------|
|
||||
| 余额 **低于** `AUTO_TRANSFER_AMOUNT` | 从 `AUTO_TRANSFER_FROM`(默认 funding)划入差额 |
|
||||
| 余额 **高于** `AUTO_TRANSFER_AMOUNT` | 将多余划回 `AUTO_TRANSFER_FROM` |
|
||||
| 与目标相差 < 0.01U | 跳过,不写划转 |
|
||||
| 存在 **active** 持仓(`order_monitors`,或 Gate 趋势回调已开仓计划) | **不划转**,写账簿 `skipped`,并**企业微信**说明「持仓中,本次资金无划转」 |
|
||||
|
||||
## 配置示例(目标 50U)
|
||||
|
||||
```env
|
||||
AUTO_TRANSFER_ENABLED=true
|
||||
AUTO_TRANSFER_AMOUNT=50
|
||||
AUTO_TRANSFER_FROM=funding
|
||||
AUTO_TRANSFER_TO=swap
|
||||
AUTO_TRANSFER_BJ_HOUR=8
|
||||
```
|
||||
|
||||
`AUTO_TRANSFER_AMOUNT` 与 `DAILY_START_CAPITAL`(每日开仓基数)**独立**。
|
||||
|
||||
API Key 须具备万向划转权限(与手动划转相同)。
|
||||
|
||||
## 用脚本更新四所 `.env`
|
||||
|
||||
详见 **[env-sync-scripts.md](./env-sync-scripts.md)**。常用命令:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
|
||||
# 仅补全划转相关项
|
||||
python scripts/sync_four_exchange_transfer_env.py
|
||||
|
||||
# 目标 50U 并开启自动划转
|
||||
python scripts/sync_four_exchange_transfer_env.py --set-amount 50 --enable-auto-transfer
|
||||
|
||||
# 计仓 + 划转一并补全
|
||||
python scripts/sync_four_exchange_env.py --set-transfer-amount 50 --enable-auto-transfer
|
||||
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate crypto-monitor-gate-bot
|
||||
```
|
||||
# 每日自动划转(三所统一)
|
||||
|
||||
## 行为
|
||||
|
||||
在 `.env` 开启 `AUTO_TRANSFER_ENABLED=true` 后,监控轮询在**北京时间 `AUTO_TRANSFER_BJ_HOUR` 整点所在小时**内(默认 8:00–8:59)执行一次(按 **UTC 自然日** 去重):
|
||||
|
||||
| 交易账户 (`AUTO_TRANSFER_TO`,默认 swap) | 动作 |
|
||||
|------------------------------------------|------|
|
||||
| 余额 **低于** `AUTO_TRANSFER_AMOUNT` | 从 `AUTO_TRANSFER_FROM`(默认 funding)划入差额 |
|
||||
| 余额 **高于** `AUTO_TRANSFER_AMOUNT` | 将多余划回 `AUTO_TRANSFER_FROM` |
|
||||
| 与目标相差 < 0.01U | 跳过,不写划转 |
|
||||
| 存在 **active** 持仓(`order_monitors`,或 Gate回调已开仓计划) | **不划转**,写账簿 `skipped`,并**企业微信**说明「持仓中,本次资金无划转」 |
|
||||
|
||||
## 配置示例(目标 50U)
|
||||
|
||||
```env
|
||||
AUTO_TRANSFER_ENABLED=true
|
||||
AUTO_TRANSFER_AMOUNT=50
|
||||
AUTO_TRANSFER_FROM=funding
|
||||
AUTO_TRANSFER_TO=swap
|
||||
AUTO_TRANSFER_BJ_HOUR=8
|
||||
```
|
||||
|
||||
`AUTO_TRANSFER_AMOUNT` 与 `DAILY_START_CAPITAL`(每日开仓基数)**独立**。
|
||||
|
||||
API Key 须具备万向划转权限(与手动划转相同)。
|
||||
|
||||
## 用脚本更新三所 `.env`
|
||||
|
||||
详见 **[env-sync-scripts.md](./env-sync-scripts.md)**。常用命令:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
|
||||
# 仅补全划转相关项
|
||||
python scripts/sync_four_exchange_transfer_env.py
|
||||
|
||||
# 目标 50U 并开启自动划转
|
||||
python scripts/sync_four_exchange_transfer_env.py --set-amount 50 --enable-auto-transfer
|
||||
|
||||
# 计仓 + 划转一并补全
|
||||
python scripts/sync_four_exchange_env.py --set-transfer-amount 50 --enable-auto-transfer
|
||||
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate
|
||||
```
|
||||
|
||||
+81
-81
@@ -1,81 +1,81 @@
|
||||
# 单日开仓次数限制(四所统一)
|
||||
|
||||
各交易实例(Binance / OKX / Gate / Gate_bot)在 `.env` 中独立配置,互不影响。
|
||||
|
||||
## 交易日口径
|
||||
|
||||
- 以 **北京时间** `TRADING_DAY_RESET_HOUR`(默认 **8:00**)切分交易日,与统计、顶栏「交易日」一致。
|
||||
- **次日恢复**:过了切日时刻后 `session_date` 变为新日期,计数自动归零,无需清库。
|
||||
|
||||
## 计数口径
|
||||
|
||||
每成功新建一条 `order_monitors` 记录计 **1 次**,包括:
|
||||
|
||||
- 人工「实盘下单」
|
||||
- 关键位自动开仓
|
||||
- 其他写入 `order_monitors` 的成功开仓
|
||||
|
||||
平仓后再开仍算新的一单。当日总次数到硬上限后 **当天不再允许新开**(即使已空仓)。
|
||||
|
||||
## 环境变量
|
||||
|
||||
在「交易执行 / 人工风控」段配置:
|
||||
|
||||
```env
|
||||
# 【单日开仓 AI 提醒】本交易日开仓次数达到该值时,企业微信推送 AI 克制提醒(不拦单)
|
||||
DAILY_OPEN_ALERT_THRESHOLD=5
|
||||
|
||||
# 【单日开仓硬上限】本交易日开仓次数 >= 该值后,禁止一切新开仓直至下一交易日;0=不启用
|
||||
DAILY_OPEN_HARD_LIMIT=0
|
||||
```
|
||||
|
||||
### 配置示例
|
||||
|
||||
```env
|
||||
# 保守户:3 次提醒,5 次封死
|
||||
DAILY_OPEN_ALERT_THRESHOLD=3
|
||||
DAILY_OPEN_HARD_LIMIT=5
|
||||
|
||||
# 仅提醒、不封(与旧版行为接近)
|
||||
DAILY_OPEN_ALERT_THRESHOLD=5
|
||||
DAILY_OPEN_HARD_LIMIT=0
|
||||
|
||||
# 严格户:到 3 次即封
|
||||
DAILY_OPEN_ALERT_THRESHOLD=2
|
||||
DAILY_OPEN_HARD_LIMIT=3
|
||||
```
|
||||
|
||||
建议 `DAILY_OPEN_ALERT_THRESHOLD <= DAILY_OPEN_HARD_LIMIT`(硬上限为 0 时除外)。
|
||||
|
||||
## 程序行为
|
||||
|
||||
| 次数 | 行为 |
|
||||
|------|------|
|
||||
| 未达提醒阈值 | 正常开仓 |
|
||||
| 达到 `DAILY_OPEN_ALERT_THRESHOLD` | 成功开仓后 AI 企业微信提醒 |
|
||||
| 达到 `DAILY_OPEN_HARD_LIMIT`(>0) | `precheck_risk` 拒绝人工/关键位开仓;顶栏 `can_trade=false` |
|
||||
|
||||
硬限制与以下规则 **同时生效**(取交集):
|
||||
|
||||
- `TRADING_DAY_RESET_OPEN_GUARD_ENABLED`:切日前禁止新开
|
||||
- `MAX_ACTIVE_POSITIONS`:同时持仓上限
|
||||
- Gate_bot:`precheck_trend_pullback_start` 同样校验单日硬上限
|
||||
|
||||
## 页面与接口
|
||||
|
||||
- 顶栏 / `api/account_snapshot` 返回 `opens_today`、`daily_open_hard_limit`、`daily_open_alert_threshold`。
|
||||
- 达硬上限时提示:`本交易日开仓 N/M 已达上限,次日 8:00 后恢复`(`M` 为配置的硬上限)。
|
||||
|
||||
## 部署
|
||||
|
||||
修改各实例 `.env` 后重启对应 pm2 进程,例如:
|
||||
|
||||
```bash
|
||||
pm2 restart crypto_binance crypto_okx crypto_gate crypto_gate_bot
|
||||
```
|
||||
|
||||
## 实现位置
|
||||
|
||||
- 共享逻辑:`daily_open_limit_lib.py`
|
||||
- 四所 `app.py`:`precheck_risk`、`can_trade`、`api/account_snapshot`、开仓成功后的 AI 提醒文案
|
||||
- 单元测试:`tests/test_daily_open_limit_lib.py`
|
||||
# 单日开仓次数限制(三所统一)
|
||||
|
||||
各交易实例(Binance / OKX / Gate)在 `.env` 中独立配置,互不影响。
|
||||
|
||||
## 交易日口径
|
||||
|
||||
- 以 **北京时间** `TRADING_DAY_RESET_HOUR`(默认 **8:00**)切分交易日,与统计、顶栏「交易日」一致。
|
||||
- **次日恢复**:过了切日时刻后 `session_date` 变为新日期,计数自动归零,无需清库。
|
||||
|
||||
## 计数口径
|
||||
|
||||
每成功新建一条 `order_monitors` 记录计 **1 次**,包括:
|
||||
|
||||
- 人工「实盘下单」
|
||||
- 关键位自动开仓
|
||||
- 其他写入 `order_monitors` 的成功开仓
|
||||
|
||||
平仓后再开仍算新的一单。当日总次数到硬上限后 **当天不再允许新开**(即使已空仓)。
|
||||
|
||||
## 环境变量
|
||||
|
||||
在「交易执行 / 人工风控」段配置:
|
||||
|
||||
```env
|
||||
# 【单日开仓 AI 提醒】本交易日开仓次数达到该值时,企业微信推送 AI 克制提醒(不拦单)
|
||||
DAILY_OPEN_ALERT_THRESHOLD=5
|
||||
|
||||
# 【单日开仓硬上限】本交易日开仓次数 >= 该值后,禁止一切新开仓直至下一交易日;0=不启用
|
||||
DAILY_OPEN_HARD_LIMIT=0
|
||||
```
|
||||
|
||||
### 配置示例
|
||||
|
||||
```env
|
||||
# 保守户:3 次提醒,5 次封死
|
||||
DAILY_OPEN_ALERT_THRESHOLD=3
|
||||
DAILY_OPEN_HARD_LIMIT=5
|
||||
|
||||
# 仅提醒、不封(与旧版行为接近)
|
||||
DAILY_OPEN_ALERT_THRESHOLD=5
|
||||
DAILY_OPEN_HARD_LIMIT=0
|
||||
|
||||
# 严格户:到 3 次即封
|
||||
DAILY_OPEN_ALERT_THRESHOLD=2
|
||||
DAILY_OPEN_HARD_LIMIT=3
|
||||
```
|
||||
|
||||
建议 `DAILY_OPEN_ALERT_THRESHOLD <= DAILY_OPEN_HARD_LIMIT`(硬上限为 0 时除外)。
|
||||
|
||||
## 程序行为
|
||||
|
||||
| 次数 | 行为 |
|
||||
|------|------|
|
||||
| 未达提醒阈值 | 正常开仓 |
|
||||
| 达到 `DAILY_OPEN_ALERT_THRESHOLD` | 成功开仓后 AI 企业微信提醒 |
|
||||
| 达到 `DAILY_OPEN_HARD_LIMIT`(>0) | `precheck_risk` 拒绝人工/关键位开仓;顶栏 `can_trade=false` |
|
||||
|
||||
硬限制与以下规则 **同时生效**(取交集):
|
||||
|
||||
- `TRADING_DAY_RESET_OPEN_GUARD_ENABLED`:切日前禁止新开
|
||||
- `MAX_ACTIVE_POSITIONS`:同时持仓上限
|
||||
- Gate:`precheck_trend_pullback_start` 同样校验单日硬上限
|
||||
|
||||
## 页面与接口
|
||||
|
||||
- 顶栏 / `api/account_snapshot` 返回 `opens_today`、`daily_open_hard_limit`、`daily_open_alert_threshold`。
|
||||
- 达硬上限时提示:`本交易日开仓 N/M 已达上限,次日 8:00 后恢复`(`M` 为配置的硬上限)。
|
||||
|
||||
## 部署
|
||||
|
||||
修改各实例 `.env` 后重启对应 pm2 进程,例如:
|
||||
|
||||
```bash
|
||||
pm2 restart crypto_binance crypto_okx crypto_gate
|
||||
```
|
||||
|
||||
## 实现位置
|
||||
|
||||
- 共享逻辑:`daily_open_limit_lib.py`
|
||||
- 三所 `app.py`:`precheck_risk`、`can_trade`、`api/account_snapshot`、开仓成功后的 AI 提醒文案
|
||||
- 单元测试:`tests/test_daily_open_limit_lib.py`
|
||||
|
||||
+116
-116
@@ -1,116 +1,116 @@
|
||||
# 四所 `.env` 同步脚本说明
|
||||
|
||||
在**仓库根目录**执行。仅处理四所实例目录下的 `.env`,**不覆盖** API 密钥与已存在的自定义值;若某目录无 `.env` 会 `SKIP`(需先 `cp .env.example .env`)。
|
||||
|
||||
| 目录 |
|
||||
|------|
|
||||
| `crypto_monitor_binance` |
|
||||
| `crypto_monitor_okx` |
|
||||
| `crypto_monitor_gate` |
|
||||
| `crypto_monitor_gate_bot` |
|
||||
|
||||
修改 `.env` 后须 **`pm2 restart`** 对应实例后生效。
|
||||
|
||||
---
|
||||
|
||||
## 一键同步(推荐)
|
||||
|
||||
`scripts/sync_four_exchange_env.py`:依次执行**计仓** + **自动划转** 两个子脚本。
|
||||
|
||||
```bash
|
||||
cd /path/to/crypto_monitor
|
||||
git pull
|
||||
|
||||
# 仅补全缺失项(已有值保留)
|
||||
python scripts/sync_four_exchange_env.py
|
||||
|
||||
# 预览,不写文件
|
||||
python scripts/sync_four_exchange_env.py --dry-run
|
||||
|
||||
# 划转目标 50U 并开启自动划转(计仓仍只补缺失项)
|
||||
python scripts/sync_four_exchange_env.py --set-transfer-amount 50 --enable-auto-transfer
|
||||
|
||||
# 无仓后切换全仓杠杆(须先确认交易所无持仓)
|
||||
python scripts/sync_four_exchange_env.py --set-mode full_margin
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--dry-run` | 只打印将做的变更,不写 `.env` |
|
||||
| `--set-mode risk\|full_margin` | 强制四所 `POSITION_SIZING_MODE` |
|
||||
| `--set-transfer-amount U` | 强制四所 `AUTO_TRANSFER_AMOUNT` |
|
||||
| `--enable-auto-transfer` | 强制四所 `AUTO_TRANSFER_ENABLED=true` |
|
||||
|
||||
---
|
||||
|
||||
## 仅自动划转
|
||||
|
||||
`scripts/sync_four_exchange_transfer_env.py`
|
||||
|
||||
行为说明见 [auto-transfer-daily.md](./auto-transfer-daily.md)。
|
||||
|
||||
```bash
|
||||
# 补全缺失项
|
||||
python scripts/sync_four_exchange_transfer_env.py
|
||||
python scripts/sync_four_exchange_transfer_env.py --dry-run
|
||||
|
||||
# 目标 50U 并开启
|
||||
python scripts/sync_four_exchange_transfer_env.py --set-amount 50 --enable-auto-transfer
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--dry-run` | 预览 |
|
||||
| `--set-amount U` | 强制 `AUTO_TRANSFER_AMOUNT` |
|
||||
| `--enable-auto-transfer` | 强制 `AUTO_TRANSFER_ENABLED=true` |
|
||||
|
||||
**缺项默认**(未使用 `--set-amount` 且文件中无该键时):
|
||||
|
||||
1. 若已有 `AUTO_TRANSFER_AMOUNT` → 保留
|
||||
2. 否则若存在 `DAILY_START_CAPITAL` → 沿用其值
|
||||
3. 否则 → **50**
|
||||
|
||||
补全时会写入(若缺失):`AUTO_TRANSFER_FROM=funding`、`AUTO_TRANSFER_TO=swap`、`TRANSFER_CCY=USDT`、`AUTO_TRANSFER_BJ_HOUR=8`;币安额外补 `BINANCE_FUNDING_INCLUDE_SPOT=false`。
|
||||
|
||||
---
|
||||
|
||||
## 仅计仓模式
|
||||
|
||||
`scripts/sync_four_exchange_position_sizing_env.py`
|
||||
|
||||
行为说明见 [position-sizing-mode.md](./position-sizing-mode.md)。
|
||||
|
||||
```bash
|
||||
# 补全缺失项(默认 risk、FULL_MARGIN_BUFFER_RATIO=0.98)
|
||||
python scripts/sync_four_exchange_position_sizing_env.py
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --dry-run
|
||||
|
||||
# 无仓后切全仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode full_margin
|
||||
|
||||
# 无仓后切回以损定仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode risk
|
||||
|
||||
# 强制缓冲比例
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-buffer 0.98
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--dry-run` | 预览 |
|
||||
| `--set-mode risk\|full_margin` | 强制 `POSITION_SIZING_MODE`(**须无持仓**后 restart) |
|
||||
| `--set-buffer RATIO` | 强制 `FULL_MARGIN_BUFFER_RATIO` |
|
||||
|
||||
---
|
||||
|
||||
## 部署后重启
|
||||
|
||||
```bash
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate crypto-monitor-gate-bot
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [计仓模式](./position-sizing-mode.md)
|
||||
- [每日自动划转](./auto-transfer-daily.md)
|
||||
- [部署说明](../deploy/README.md)
|
||||
# 三所 `.env` 同步脚本说明
|
||||
|
||||
在**仓库根目录**执行。仅处理三所实例目录下的 `.env`,**不覆盖** API 密钥与已存在的自定义值;若某目录无 `.env` 会 `SKIP`(需先 `cp .env.example .env`)。
|
||||
|
||||
| 目录 |
|
||||
|------|
|
||||
| `crypto_monitor_binance` |
|
||||
| `crypto_monitor_okx` |
|
||||
| `crypto_monitor_gate` |
|
||||
| `crypto_monitor_gate` |
|
||||
|
||||
修改 `.env` 后须 **`pm2 restart`** 对应实例后生效。
|
||||
|
||||
---
|
||||
|
||||
## 一键同步(推荐)
|
||||
|
||||
`scripts/sync_four_exchange_env.py`:依次执行**计仓** + **自动划转** 两个子脚本。
|
||||
|
||||
```bash
|
||||
cd /path/to/crypto_monitor
|
||||
git pull
|
||||
|
||||
# 仅补全缺失项(已有值保留)
|
||||
python scripts/sync_four_exchange_env.py
|
||||
|
||||
# 预览,不写文件
|
||||
python scripts/sync_four_exchange_env.py --dry-run
|
||||
|
||||
# 划转目标 50U 并开启自动划转(计仓仍只补缺失项)
|
||||
python scripts/sync_four_exchange_env.py --set-transfer-amount 50 --enable-auto-transfer
|
||||
|
||||
# 无仓后切换全仓杠杆(须先确认交易所无持仓)
|
||||
python scripts/sync_four_exchange_env.py --set-mode full_margin
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--dry-run` | 只打印将做的变更,不写 `.env` |
|
||||
| `--set-mode risk\|full_margin` | 强制三所 `POSITION_SIZING_MODE` |
|
||||
| `--set-transfer-amount U` | 强制三所 `AUTO_TRANSFER_AMOUNT` |
|
||||
| `--enable-auto-transfer` | 强制三所 `AUTO_TRANSFER_ENABLED=true` |
|
||||
|
||||
---
|
||||
|
||||
## 仅自动划转
|
||||
|
||||
`scripts/sync_four_exchange_transfer_env.py`
|
||||
|
||||
行为说明见 [auto-transfer-daily.md](./auto-transfer-daily.md)。
|
||||
|
||||
```bash
|
||||
# 补全缺失项
|
||||
python scripts/sync_four_exchange_transfer_env.py
|
||||
python scripts/sync_four_exchange_transfer_env.py --dry-run
|
||||
|
||||
# 目标 50U 并开启
|
||||
python scripts/sync_four_exchange_transfer_env.py --set-amount 50 --enable-auto-transfer
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--dry-run` | 预览 |
|
||||
| `--set-amount U` | 强制 `AUTO_TRANSFER_AMOUNT` |
|
||||
| `--enable-auto-transfer` | 强制 `AUTO_TRANSFER_ENABLED=true` |
|
||||
|
||||
**缺项默认**(未使用 `--set-amount` 且文件中无该键时):
|
||||
|
||||
1. 若已有 `AUTO_TRANSFER_AMOUNT` → 保留
|
||||
2. 否则若存在 `DAILY_START_CAPITAL` → 沿用其值
|
||||
3. 否则 → **50**
|
||||
|
||||
补全时会写入(若缺失):`AUTO_TRANSFER_FROM=funding`、`AUTO_TRANSFER_TO=swap`、`TRANSFER_CCY=USDT`、`AUTO_TRANSFER_BJ_HOUR=8`;币安额外补 `BINANCE_FUNDING_INCLUDE_SPOT=false`。
|
||||
|
||||
---
|
||||
|
||||
## 仅计仓模式
|
||||
|
||||
`scripts/sync_four_exchange_position_sizing_env.py`
|
||||
|
||||
行为说明见 [position-sizing-mode.md](./position-sizing-mode.md)。
|
||||
|
||||
```bash
|
||||
# 补全缺失项(默认 risk、FULL_MARGIN_BUFFER_RATIO=0.98)
|
||||
python scripts/sync_four_exchange_position_sizing_env.py
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --dry-run
|
||||
|
||||
# 无仓后切全仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode full_margin
|
||||
|
||||
# 无仓后切回以损定仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode risk
|
||||
|
||||
# 强制缓冲比例
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-buffer 0.98
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--dry-run` | 预览 |
|
||||
| `--set-mode risk\|full_margin` | 强制 `POSITION_SIZING_MODE`(**须无持仓**后 restart) |
|
||||
| `--set-buffer RATIO` | 强制 `FULL_MARGIN_BUFFER_RATIO` |
|
||||
|
||||
---
|
||||
|
||||
## 部署后重启
|
||||
|
||||
```bash
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate
|
||||
```
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [计仓模式](./position-sizing-mode.md)
|
||||
- [每日自动划转](./auto-transfer-daily.md)
|
||||
- [部署说明](../deploy/README.md)
|
||||
|
||||
+135
-135
@@ -1,135 +1,135 @@
|
||||
# 内照明心与永久 K 线
|
||||
|
||||
## 概述
|
||||
|
||||
「内照明心」页(`/archive`)用于 **复盘语录 + 交易记录回顾 + 按需 K 线**。左侧维护每日复盘语录(最多 100 条);右侧按日期区间列出开仓记录,展示区间统计,并可展开 K 线图表对照单笔交易。
|
||||
|
||||
与行情区 `hub_kline.db`(15 天滚动缓存)**完全独立**:档案库只增不删,从建档起永久保留。
|
||||
|
||||
## 页面布局
|
||||
|
||||
| 区域 | 说明 |
|
||||
|------|------|
|
||||
| **复盘语录** | 左栏;按日期添加/编辑/删除,一日一条 |
|
||||
| **日期与筛选** | 顶栏:本日 / 本周 / 本月 / 自选区间;盈利单、亏损单、犯病、交易所、搜索 |
|
||||
| **区间统计** | 统计栏随日期选择自动更新(见下) |
|
||||
| **K 线图表** | 默认折叠;点「图表」或展开后按需加载 |
|
||||
| **交易记录** | 默认展开;犯病行 **红色字体**(无红底);可编辑标签与备注 |
|
||||
|
||||
## 日期区间
|
||||
|
||||
交易日按北京时间 **8:00** 切日(`TRADING_DAY_RESET_HOUR`)。
|
||||
|
||||
| 模式 | 范围 |
|
||||
|------|------|
|
||||
| **本日** | 可选单个交易日(默认当前交易日) |
|
||||
| **本周** | 当周周一至当前交易日 |
|
||||
| **本月** | 当月 1 日至当前交易日 |
|
||||
| **区间** | 自选 `date_from`~`date_to`(含首尾交易日) |
|
||||
|
||||
## 区间统计(统计栏)
|
||||
|
||||
基于当前 **列表筛选结果**(含盈利/亏损/犯病勾选、合约搜索;交易所下拉仍限定数据源):
|
||||
|
||||
| 指标 | 说明 |
|
||||
|------|------|
|
||||
| 总开仓次数 | 区间内开仓笔数 |
|
||||
| 盈利单 / 亏损单 | 盈亏 > 0 / < 0 的笔数(持平不计) |
|
||||
| 平均盈利 / 平均亏损 | 盈利单、亏损单各自的均值(U) |
|
||||
| 最大盈利 / 最大亏损 | 单笔最大盈利、最大亏损(U) |
|
||||
| 犯病次数 / 占比 | `behavior_tag = sick` 的笔数及占开仓比例 |
|
||||
| 盈亏 | 区间内全部已平仓盈亏合计 |
|
||||
| 剔除犯病盈亏 | 排除犯病单后的盈亏合计 |
|
||||
| 各交易所 | 每所同上分项 |
|
||||
|
||||
在搜索框输入币种(如 `BTC`)后,统计栏与下方列表同步按该条件收窄。
|
||||
|
||||
## 数据约定
|
||||
|
||||
| 项 | 约定 |
|
||||
|----|------|
|
||||
| 交易来源 | 四所 `trade_records` + 未落库的 `strategy_trade_snapshots`,经 `/api/hub/trades/archive` 拉取 |
|
||||
| 犯病标签 | 中控 `trade_overlay.behavior_tag = sick` |
|
||||
| K 线真源 | 仅 **5m** 写入 `hub_symbol_archive.db` |
|
||||
| 建档种子 | 该币 **最早开仓** 向前 **30 天** 5m |
|
||||
| 增量同步 | 默认每 **4 小时** 补新 5m 至当前 |
|
||||
| 展示周期 | Tab:**5m / 15m / 1h / 4h**,默认 **15m** |
|
||||
| 视窗模式 | **持仓过程**(锚平仓,默认)/ **进场决策**(锚开仓) |
|
||||
| 时间跳转 | 输入 `YYYY-MM-DD HH:MM` 后点「跳转」 |
|
||||
|
||||
## 存储
|
||||
|
||||
- 默认路径:`manual_trading_hub/data/hub_symbol_archive.db`
|
||||
- 环境变量:`HUB_ARCHIVE_DB_PATH`
|
||||
- 表:
|
||||
- `archive_meta` — 建档元数据
|
||||
- `archive_bars_5m` — 永久 5m K 线
|
||||
- `archive_trade_cache` — 从实例同步的交易快照
|
||||
- `trade_overlay` — 犯病标签与备注(仅中控)
|
||||
- `archive_review_quotes` — 复盘语录
|
||||
|
||||
## API(中控 FastAPI)
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/archive/meta` | 周期、交易所、同步间隔等 |
|
||||
| GET | `/api/archive/daily-trades` | 区间交易列表与统计(见 query) |
|
||||
| GET | `/api/archive/quotes` | 复盘语录列表 |
|
||||
| POST | `/api/archive/quotes` | 新增语录 |
|
||||
| PATCH | `/api/archive/quotes/{id}` | 更新语录 |
|
||||
| DELETE | `/api/archive/quotes/{id}` | 删除语录 |
|
||||
| GET | `/api/archive/ohlcv` | K 线视窗(`timeframe` / `mode` / `anchor_ms` / `at`) |
|
||||
| PATCH | `/api/archive/trade/{exchange_key}/{trade_id}` | 更新标签/备注 |
|
||||
| POST | `/api/archive/sync` | 立即同步四所交易 + K 线 |
|
||||
|
||||
`GET /api/archive/daily-trades` 主要 query:
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `period` | `today` / `week` / `month` / `range` |
|
||||
| `trading_day` | 本日模式下的交易日 `YYYY-MM-DD` |
|
||||
| `date_from` / `date_to` | 区间模式起止日 |
|
||||
| `exchange_key` | 可选,按交易所筛选 |
|
||||
| `filter_profit` / `filter_loss` / `filter_sick` | 过滤列表与统计 |
|
||||
| `search` | 合约 / 交易所 / 备注搜索(同步过滤列表与统计) |
|
||||
|
||||
返回 `stats` 含 `open_count`、`win_count`、`loss_count`、`win_rate`、`avg_win`、`avg_loss`、`profit_loss_ratio`、`max_win`、`max_loss`、`sick_count`、`sick_pct`、`pnl_total`、`pnl_ex_sick`、`by_exchange`。
|
||||
|
||||
实例侧:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/hub/trades/archive` | 近 N 天已平仓(`days` / `limit`) |
|
||||
|
||||
## 后台任务
|
||||
|
||||
Hub 启动后在 lifespan 中运行 `hub-archive-sync`:
|
||||
|
||||
1. 对各启用交易所调用 `/api/hub/trades/archive`
|
||||
2. 写入 `archive_trade_cache`
|
||||
3. 未建档币种:拉 30 天 5m 种子
|
||||
4. 已建档币种:增量补 5m
|
||||
|
||||
间隔:`HUB_ARCHIVE_SYNC_INTERVAL_SEC`(默认 14400)。
|
||||
|
||||
## 代码位置
|
||||
|
||||
- `hub_symbol_archive_lib.py` — 库表、区间统计、种子、增量、聚合
|
||||
- `hub_trades_lib.py` — `fetch_trades_for_archive`
|
||||
- `hub_bridge.py` — 实例 `/api/hub/trades/archive`
|
||||
- `manual_trading_hub/hub.py` — 路由与后台同步
|
||||
- `manual_trading_hub/static/archive.js` — 内照明心前端
|
||||
|
||||
## 与行情区的区别
|
||||
|
||||
| | 行情区 | 内照明心 |
|
||||
|--|--------|----------|
|
||||
| DB | `hub_kline.db` | `hub_symbol_archive.db` |
|
||||
| 保留 | 15 天滚动删除 | 建档起永久 |
|
||||
| 周期 | 多周期直存/拉取 | 仅存 5m,高周期聚合 |
|
||||
| 用途 | 实时看盘 | 复盘语录与交易回顾 |
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [中控平仓与交易记录](trend-hub-close-and-trade-records.md)
|
||||
- [中控使用说明](../manual_trading_hub/使用说明.md)
|
||||
# 内照明心与永久 K 线
|
||||
|
||||
## 概述
|
||||
|
||||
「内照明心」页(`/archive`)用于 **复盘语录 + 交易记录回顾 + 按需 K 线**。左侧维护每日复盘语录(最多 100 条);右侧按日期区间列出开仓记录,展示区间统计,并可展开 K 线图表对照单笔交易。
|
||||
|
||||
与行情区 `hub_kline.db`(15 天滚动缓存)**完全独立**:档案库只增不删,从建档起永久保留。
|
||||
|
||||
## 页面布局
|
||||
|
||||
| 区域 | 说明 |
|
||||
|------|------|
|
||||
| **复盘语录** | 左栏;按日期添加/编辑/删除,一日一条 |
|
||||
| **日期与筛选** | 顶栏:本日 / 本周 / 本月 / 自选区间;盈利单、亏损单、犯病、交易所、搜索 |
|
||||
| **区间统计** | 统计栏随日期选择自动更新(见下) |
|
||||
| **K 线图表** | 默认折叠;点「图表」或展开后按需加载 |
|
||||
| **交易记录** | 默认展开;犯病行 **红色字体**(无红底);可编辑标签与备注 |
|
||||
|
||||
## 日期区间
|
||||
|
||||
交易日按北京时间 **8:00** 切日(`TRADING_DAY_RESET_HOUR`)。
|
||||
|
||||
| 模式 | 范围 |
|
||||
|------|------|
|
||||
| **本日** | 可选单个交易日(默认当前交易日) |
|
||||
| **本周** | 当周周一至当前交易日 |
|
||||
| **本月** | 当月 1 日至当前交易日 |
|
||||
| **区间** | 自选 `date_from`~`date_to`(含首尾交易日) |
|
||||
|
||||
## 区间统计(统计栏)
|
||||
|
||||
基于当前 **列表筛选结果**(含盈利/亏损/犯病勾选、合约搜索;交易所下拉仍限定数据源):
|
||||
|
||||
| 指标 | 说明 |
|
||||
|------|------|
|
||||
| 总开仓次数 | 区间内开仓笔数 |
|
||||
| 盈利单 / 亏损单 | 盈亏 > 0 / < 0 的笔数(持平不计) |
|
||||
| 平均盈利 / 平均亏损 | 盈利单、亏损单各自的均值(U) |
|
||||
| 最大盈利 / 最大亏损 | 单笔最大盈利、最大亏损(U) |
|
||||
| 犯病次数 / 占比 | `behavior_tag = sick` 的笔数及占开仓比例 |
|
||||
| 盈亏 | 区间内全部已平仓盈亏合计 |
|
||||
| 剔除犯病盈亏 | 排除犯病单后的盈亏合计 |
|
||||
| 各交易所 | 每所同上分项 |
|
||||
|
||||
在搜索框输入币种(如 `BTC`)后,统计栏与下方列表同步按该条件收窄。
|
||||
|
||||
## 数据约定
|
||||
|
||||
| 项 | 约定 |
|
||||
|----|------|
|
||||
| 交易来源 | 三所 `trade_records` + 未落库的 `strategy_trade_snapshots`,经 `/api/hub/trades/archive` 拉取 |
|
||||
| 犯病标签 | 中控 `trade_overlay.behavior_tag = sick` |
|
||||
| K 线真源 | 仅 **5m** 写入 `hub_symbol_archive.db` |
|
||||
| 建档种子 | 该币 **最早开仓** 向前 **30 天** 5m |
|
||||
| 增量同步 | 默认每 **4 小时** 补新 5m 至当前 |
|
||||
| 展示周期 | Tab:**5m / 15m / 1h / 4h**,默认 **15m** |
|
||||
| 视窗模式 | **持仓过程**(锚平仓,默认)/ **进场决策**(锚开仓) |
|
||||
| 时间跳转 | 输入 `YYYY-MM-DD HH:MM` 后点「跳转」 |
|
||||
|
||||
## 存储
|
||||
|
||||
- 默认路径:`manual_trading_hub/data/hub_symbol_archive.db`
|
||||
- 环境变量:`HUB_ARCHIVE_DB_PATH`
|
||||
- 表:
|
||||
- `archive_meta` — 建档元数据
|
||||
- `archive_bars_5m` — 永久 5m K 线
|
||||
- `archive_trade_cache` — 从实例同步的交易快照
|
||||
- `trade_overlay` — 犯病标签与备注(仅中控)
|
||||
- `archive_review_quotes` — 复盘语录
|
||||
|
||||
## API(中控 FastAPI)
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/archive/meta` | 周期、交易所、同步间隔等 |
|
||||
| GET | `/api/archive/daily-trades` | 区间交易列表与统计(见 query) |
|
||||
| GET | `/api/archive/quotes` | 复盘语录列表 |
|
||||
| POST | `/api/archive/quotes` | 新增语录 |
|
||||
| PATCH | `/api/archive/quotes/{id}` | 更新语录 |
|
||||
| DELETE | `/api/archive/quotes/{id}` | 删除语录 |
|
||||
| GET | `/api/archive/ohlcv` | K 线视窗(`timeframe` / `mode` / `anchor_ms` / `at`) |
|
||||
| PATCH | `/api/archive/trade/{exchange_key}/{trade_id}` | 更新标签/备注 |
|
||||
| POST | `/api/archive/sync` | 立即同步三所交易 + K 线 |
|
||||
|
||||
`GET /api/archive/daily-trades` 主要 query:
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `period` | `today` / `week` / `month` / `range` |
|
||||
| `trading_day` | 本日模式下的交易日 `YYYY-MM-DD` |
|
||||
| `date_from` / `date_to` | 区间模式起止日 |
|
||||
| `exchange_key` | 可选,按交易所筛选 |
|
||||
| `filter_profit` / `filter_loss` / `filter_sick` | 过滤列表与统计 |
|
||||
| `search` | 合约 / 交易所 / 备注搜索(同步过滤列表与统计) |
|
||||
|
||||
返回 `stats` 含 `open_count`、`win_count`、`loss_count`、`win_rate`、`avg_win`、`avg_loss`、`profit_loss_ratio`、`max_win`、`max_loss`、`sick_count`、`sick_pct`、`pnl_total`、`pnl_ex_sick`、`by_exchange`。
|
||||
|
||||
实例侧:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| GET | `/api/hub/trades/archive` | 近 N 天已平仓(`days` / `limit`) |
|
||||
|
||||
## 后台任务
|
||||
|
||||
Hub 启动后在 lifespan 中运行 `hub-archive-sync`:
|
||||
|
||||
1. 对各启用交易所调用 `/api/hub/trades/archive`
|
||||
2. 写入 `archive_trade_cache`
|
||||
3. 未建档币种:拉 30 天 5m 种子
|
||||
4. 已建档币种:增量补 5m
|
||||
|
||||
间隔:`HUB_ARCHIVE_SYNC_INTERVAL_SEC`(默认 14400)。
|
||||
|
||||
## 代码位置
|
||||
|
||||
- `hub_symbol_archive_lib.py` — 库表、区间统计、种子、增量、聚合
|
||||
- `hub_trades_lib.py` — `fetch_trades_for_archive`
|
||||
- `hub_bridge.py` — 实例 `/api/hub/trades/archive`
|
||||
- `manual_trading_hub/hub.py` — 路由与后台同步
|
||||
- `manual_trading_hub/static/archive.js` — 内照明心前端
|
||||
|
||||
## 与行情区的区别
|
||||
|
||||
| | 行情区 | 内照明心 |
|
||||
|--|--------|----------|
|
||||
| DB | `hub_kline.db` | `hub_symbol_archive.db` |
|
||||
| 保留 | 15 天滚动删除 | 建档起永久 |
|
||||
| 周期 | 多周期直存/拉取 | 仅存 5m,高周期聚合 |
|
||||
| 用途 | 实时看盘 | 复盘语录与交易回顾 |
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [中控平仓与交易记录](trend-hub-close-and-trade-records.md)
|
||||
- [中控使用说明](../manual_trading_hub/使用说明.md)
|
||||
|
||||
+147
-147
@@ -1,147 +1,147 @@
|
||||
# lib/ 共用模块结构
|
||||
|
||||
四所实例与中控共用的 Python 库、模板与静态资源统一放在仓库根目录的 **`lib/`** 下。部署单元(`crypto_monitor_*`、`manual_trading_hub`)仍保持独立目录与 PM2 配置不变。
|
||||
|
||||
**重构前快照 Git 标签**:`pre-lib-modularization`(可用 `git checkout pre-lib-modularization` 查看旧布局)。
|
||||
|
||||
---
|
||||
|
||||
## 顶层目录
|
||||
|
||||
```
|
||||
crypto_monitor/
|
||||
├── crypto_monitor_binance/ # 四所:各自 app + .env + PM2
|
||||
├── crypto_monitor_gate/
|
||||
├── crypto_monitor_gate_bot/
|
||||
├── crypto_monitor_okx/
|
||||
├── manual_trading_hub/ # 中控 + 子代理 agent
|
||||
│
|
||||
├── lib/ # 共用模块(本说明)
|
||||
│ ├── strategy/
|
||||
│ ├── key_monitor/
|
||||
│ ├── trade/
|
||||
│ ├── hub/
|
||||
│ ├── ai/
|
||||
│ ├── instance/
|
||||
│ ├── exchange/
|
||||
│ ├── common/
|
||||
│ └── paths.py
|
||||
│
|
||||
├── brand/ # 各所共用图标
|
||||
├── docs/
|
||||
├── deploy/
|
||||
├── scripts/
|
||||
├── tests/
|
||||
├── requirements.txt
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## lib/ 子包说明
|
||||
|
||||
| 子包 | 职责 | 主要模块 |
|
||||
|------|------|----------|
|
||||
| **`lib/strategy/`** | 策略交易(顺势加仓、趋势回调、快照与记录) | `strategy_register.py`、`strategy_trend_register.py`、`strategy_db.py`、`strategy_roll_*`、`strategy_trend_*` |
|
||||
| **`lib/strategy/templates/`** | 策略页 Jinja 模板(原 `strategy_templates/`) | `strategy_trading_page.html`、`strategy_roll_panel.html` 等 |
|
||||
| **`lib/key_monitor/`** | 关键位监控、斐波、假突破、止盈止损方案 | `key_monitor_lib.py`、`fib_key_monitor_lib.py`、`key_sl_tp_lib.py` 等 |
|
||||
| **`lib/trade/`** | 下单监控展示、计仓、账户风控、手动 SL/TP | `order_monitor_display_lib.py`、`position_sizing_lib.py`、`account_risk_lib.py` 等 |
|
||||
| **`lib/hub/`** | 中控 API、K 线、归档、计仓器、SSO/Bridge | `hub_bridge.py`、`hub_kline_store.py`、`hub_trades_lib.py` 等 |
|
||||
| **`lib/ai/`** | AI 复盘与文本生成 | `ai_client.py`、`ai_review_lib.py` |
|
||||
| **`lib/instance/`** | 中控 iframe 嵌入、导航、复盘图表 | `instance_embed_lib.py`、`focus_chart_lib.py`、`journal_chart_lib.py` |
|
||||
| **`lib/instance/templates/`** | 嵌入页片段(原 `embed_templates/`) | `embed_page_fragment.html` |
|
||||
| **`lib/exchange/`** | 特定交易所工具 | `gate_transfer_lib.py`、`okx_orders_lib.py` 等 |
|
||||
| **`lib/common/`** | 跨功能小工具 | `form_submit_lib.py`、`wechat_notify_lib.py` 等 |
|
||||
| **`lib/common/static/`** | 四所与中控共用的 JS/CSS(原根目录 `static/`) | `instance_theme.js`、`strategy_roll.js` 等 |
|
||||
|
||||
> **说明**:`hub_*` 命名表示「中控侧能力或行情聚合」,但部分模块(如 `hub_volume_rank_lib`、`hub_market_info_lib`)四所 `app.py` 也会调用,并非中控独占。
|
||||
|
||||
---
|
||||
|
||||
## 路径辅助函数
|
||||
|
||||
`lib/paths.py` 集中维护资源目录,避免硬编码:
|
||||
|
||||
```python
|
||||
from lib.paths import strategy_templates_dir, embed_templates_dir, common_static_dir
|
||||
|
||||
strategy_templates_dir() # .../lib/strategy/templates
|
||||
embed_templates_dir() # .../lib/instance/templates
|
||||
common_static_dir() # .../lib/common/static
|
||||
```
|
||||
|
||||
可选传入 `repo_root`(字符串或 `Path`),默认使用 `lib/` 的上级目录即仓库根。
|
||||
|
||||
---
|
||||
|
||||
## Python 导入约定
|
||||
|
||||
各部署目录在启动时将 **仓库根** 加入 `sys.path`(与重构前相同):
|
||||
|
||||
```python
|
||||
_REPO_ROOT = os.path.dirname(BASE_DIR) # 或 Path(__file__).resolve().parent.parent
|
||||
if _REPO_ROOT not in sys.path:
|
||||
sys.path.insert(0, _REPO_ROOT)
|
||||
```
|
||||
|
||||
之后使用 **`lib.<子包>.<模块>`** 形式导入,例如:
|
||||
|
||||
```python
|
||||
from lib.strategy.strategy_db import init_strategy_tables
|
||||
from lib.key_monitor.key_monitor_lib import check_key_monitors
|
||||
from lib.hub.hub_bridge import install_on_app
|
||||
from lib.ai.ai_client import ai_review
|
||||
```
|
||||
|
||||
策略注册仍在各所 `app.py` 末尾:
|
||||
|
||||
```python
|
||||
from lib.strategy.strategy_register import install_strategy_trading
|
||||
from lib.strategy.strategy_trend_register import install_strategy_trend
|
||||
|
||||
install_strategy_trading(app, _REPO_ROOT, app_module=sys.modules[__name__])
|
||||
install_strategy_trend(app, _REPO_ROOT, app_module=sys.modules[__name__])
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 静态资源与 URL
|
||||
|
||||
- 四所页面仍通过 **`/static/...`** 访问共用脚本;`hub_bridge.install_instance_theme_static` 从 `lib/common/static/` 提供部分根级静态路由。
|
||||
- 各所目录下 **`static/`**(图标、上传图片等)仍为实例私有,未迁入 `lib/`。
|
||||
- 中控 `manual_trading_hub/hub.py` 通过 `_REPO_ROOT / "lib" / "common" / "static"` 挂载与四所共用的 badge、复盘 JS 等。
|
||||
|
||||
---
|
||||
|
||||
## 测试
|
||||
|
||||
在仓库根执行(需将根目录置于 Python 路径,或从根目录运行):
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor
|
||||
python -m unittest discover -s tests -p "test_*.py"
|
||||
```
|
||||
|
||||
测试文件内统一 `from lib.<子包>.<模块> import ...`。使用 `@patch` 时目标写完整模块路径,例如 `lib.hub.hub_calculator_lib._resolve_market`。
|
||||
|
||||
---
|
||||
|
||||
## 迁移脚本
|
||||
|
||||
一次性迁移由 `scripts/migrate_to_lib.py` 完成(移动文件 + 批量改写 import)。**不要在已迁移后的仓库上重复执行**。
|
||||
|
||||
---
|
||||
|
||||
## 后续可选整理
|
||||
|
||||
- 四所 `app.py` 体量接近,可逐步抽取公共 `exchange_app` 基座(改动面大,单独规划)。
|
||||
- `manual_trading_hub/okx_orders_lib.py` 为 agent 本地副本,可与 `lib/exchange/okx_orders_lib.py` 合并去重。
|
||||
- 可引入 `pyproject.toml` + `pip install -e .`,替代 `sys.path.insert`(长期维护更规范)。
|
||||
|
||||
---
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [README.md](../README.md) — 总览与部署
|
||||
- [策略交易说明.md](../策略交易说明.md)
|
||||
- [manual_trading_hub/使用说明.md](../manual_trading_hub/使用说明.md)
|
||||
# lib/ 共用模块结构
|
||||
|
||||
三所实例与中控共用的 Python 库、模板与静态资源统一放在仓库根目录的 **`lib/`** 下。部署单元(`crypto_monitor_*`、`manual_trading_hub`)仍保持独立目录与 PM2 配置不变。
|
||||
|
||||
**重构前快照 Git 标签**:`pre-lib-modularization`(可用 `git checkout pre-lib-modularization` 查看旧布局)。
|
||||
**移除 gate_bot 前快照 Git 标签**:`pre-remove-gate-bot`。
|
||||
|
||||
---
|
||||
|
||||
## 顶层目录
|
||||
|
||||
```
|
||||
crypto_monitor/
|
||||
├── crypto_monitor_binance/ # 三所:各自 app + .env + PM2
|
||||
├── crypto_monitor_gate/
|
||||
├── crypto_monitor_okx/
|
||||
├── manual_trading_hub/ # 中控 + 子代理 agent
|
||||
│
|
||||
├── lib/ # 共用模块(本说明)
|
||||
│ ├── strategy/
|
||||
│ ├── key_monitor/
|
||||
│ ├── trade/
|
||||
│ ├── hub/
|
||||
│ ├── ai/
|
||||
│ ├── instance/
|
||||
│ ├── exchange/
|
||||
│ ├── common/
|
||||
│ └── paths.py
|
||||
│
|
||||
├── brand/ # 各所共用图标
|
||||
├── docs/
|
||||
├── deploy/
|
||||
├── scripts/
|
||||
├── tests/
|
||||
├── requirements.txt
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## lib/ 子包说明
|
||||
|
||||
| 子包 | 职责 | 主要模块 |
|
||||
|------|------|----------|
|
||||
| **`lib/strategy/`** | 策略交易(顺势加仓、趋势回调、快照与记录) | `strategy_register.py`、`strategy_trend_register.py`、`strategy_db.py`、`strategy_roll_*`、`strategy_trend_*` |
|
||||
| **`lib/strategy/templates/`** | 策略页 Jinja 模板(原 `strategy_templates/`) | `strategy_trading_page.html`、`strategy_roll_panel.html` 等 |
|
||||
| **`lib/key_monitor/`** | 关键位监控、斐波、假突破、止盈止损方案 | `key_monitor_lib.py`、`fib_key_monitor_lib.py`、`key_sl_tp_lib.py` 等 |
|
||||
| **`lib/trade/`** | 下单监控展示、计仓、账户风控、手动 SL/TP | `order_monitor_display_lib.py`、`position_sizing_lib.py`、`account_risk_lib.py` 等 |
|
||||
| **`lib/hub/`** | 中控 API、K 线、归档、计仓器、SSO/Bridge | `hub_bridge.py`、`hub_kline_store.py`、`hub_trades_lib.py` 等 |
|
||||
| **`lib/ai/`** | AI 复盘与文本生成 | `ai_client.py`、`ai_review_lib.py` |
|
||||
| **`lib/instance/`** | 中控 iframe 嵌入、导航、复盘图表 | `instance_embed_lib.py`、`focus_chart_lib.py`、`journal_chart_lib.py` |
|
||||
| **`lib/instance/templates/`** | 嵌入页片段(原 `embed_templates/`) | `embed_page_fragment.html` |
|
||||
| **`lib/exchange/`** | 特定交易所工具 | `gate_transfer_lib.py`、`okx_orders_lib.py` 等 |
|
||||
| **`lib/common/`** | 跨功能小工具 | `form_submit_lib.py`、`wechat_notify_lib.py` 等 |
|
||||
| **`lib/common/static/`** | 三所与中控共用的 JS/CSS(原根目录 `static/`) | `instance_theme.js`、`strategy_roll.js` 等 |
|
||||
|
||||
> **说明**:`hub_*` 命名表示「中控侧能力或行情聚合」,但部分模块(如 `hub_volume_rank_lib`、`hub_market_info_lib`)三所 `app.py` 也会调用,并非中控独占。
|
||||
|
||||
---
|
||||
|
||||
## 路径辅助函数
|
||||
|
||||
`lib/paths.py` 集中维护资源目录,避免硬编码:
|
||||
|
||||
```python
|
||||
from lib.paths import strategy_templates_dir, embed_templates_dir, common_static_dir
|
||||
|
||||
strategy_templates_dir() # .../lib/strategy/templates
|
||||
embed_templates_dir() # .../lib/instance/templates
|
||||
common_static_dir() # .../lib/common/static
|
||||
```
|
||||
|
||||
可选传入 `repo_root`(字符串或 `Path`),默认使用 `lib/` 的上级目录即仓库根。
|
||||
|
||||
---
|
||||
|
||||
## Python 导入约定
|
||||
|
||||
各部署目录在启动时将 **仓库根** 加入 `sys.path`(与重构前相同):
|
||||
|
||||
```python
|
||||
_REPO_ROOT = os.path.dirname(BASE_DIR) # 或 Path(__file__).resolve().parent.parent
|
||||
if _REPO_ROOT not in sys.path:
|
||||
sys.path.insert(0, _REPO_ROOT)
|
||||
```
|
||||
|
||||
之后使用 **`lib.<子包>.<模块>`** 形式导入,例如:
|
||||
|
||||
```python
|
||||
from lib.strategy.strategy_db import init_strategy_tables
|
||||
from lib.key_monitor.key_monitor_lib import check_key_monitors
|
||||
from lib.hub.hub_bridge import install_on_app
|
||||
from lib.ai.ai_client import ai_review
|
||||
```
|
||||
|
||||
策略注册仍在各所 `app.py` 末尾:
|
||||
|
||||
```python
|
||||
from lib.strategy.strategy_register import install_strategy_trading
|
||||
from lib.strategy.strategy_trend_register import install_strategy_trend
|
||||
|
||||
install_strategy_trading(app, _REPO_ROOT, app_module=sys.modules[__name__])
|
||||
install_strategy_trend(app, _REPO_ROOT, app_module=sys.modules[__name__])
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 静态资源与 URL
|
||||
|
||||
- 三所页面仍通过 **`/static/...`** 访问共用脚本;`hub_bridge.install_instance_theme_static` 从 `lib/common/static/` 提供部分根级静态路由。
|
||||
- 各所目录下 **`static/`**(图标、上传图片等)仍为实例私有,未迁入 `lib/`。
|
||||
- 中控 `manual_trading_hub/hub.py` 通过 `_REPO_ROOT / "lib" / "common" / "static"` 挂载与三所共用的 badge、复盘 JS 等。
|
||||
|
||||
---
|
||||
|
||||
## 测试
|
||||
|
||||
在仓库根执行(需将根目录置于 Python 路径,或从根目录运行):
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor
|
||||
python -m unittest discover -s tests -p "test_*.py"
|
||||
```
|
||||
|
||||
测试文件内统一 `from lib.<子包>.<模块> import ...`。使用 `@patch` 时目标写完整模块路径,例如 `lib.hub.hub_calculator_lib._resolve_market`。
|
||||
|
||||
---
|
||||
|
||||
## 迁移脚本
|
||||
|
||||
一次性迁移由 `scripts/migrate_to_lib.py` 完成(移动文件 + 批量改写 import)。**不要在已迁移后的仓库上重复执行**。
|
||||
|
||||
---
|
||||
|
||||
## 后续可选整理
|
||||
|
||||
- 三所 `app.py` 体量接近,可逐步抽取公共 `exchange_app` 基座(改动面大,单独规划)。
|
||||
- `manual_trading_hub/okx_orders_lib.py` 为 agent 本地副本,可与 `lib/exchange/okx_orders_lib.py` 合并去重。
|
||||
- 可引入 `pyproject.toml` + `pip install -e .`,替代 `sys.path.insert`(长期维护更规范)。
|
||||
|
||||
---
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [README.md](../README.md) — 总览与部署
|
||||
- [策略交易说明.md](../策略交易说明.md)
|
||||
- [manual_trading_hub/使用说明.md](../manual_trading_hub/使用说明.md)
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
# 实盘下单 · 预估盈亏比
|
||||
|
||||
## 功能
|
||||
|
||||
四所(Binance / OKX / Gate / Gate趋势)**实盘下单监控**表单中,在「开仓」按钮前显示 **预估盈亏比**。
|
||||
|
||||
- **价格模式**:填完币种、方向、止损价、止盈价后,调用 `GET /api/order_defaults` 取标记价,按几何距离计算 RR。
|
||||
- **百分比模式**:填完币种、方向、止损%、止盈% 后拉快照校验币种,再显示 RR(`止盈% / 止损%`)。
|
||||
- **固定盈亏比模式**:不显示预估盈亏比(盈亏比由输入框直接指定;仍保留原有「预估止盈」)。
|
||||
|
||||
- **以损定仓**(`POSITION_SIZING_MODE=risk`):预估风险 = 当前交易基数 × `risk%`。
|
||||
- **全仓杠杆**(`full_margin`):预估风险 = 合约可用 × 缓冲比例 × 杠杆(BTC/ETH 与山寨按 `.env` 配置)× 止损距离比例,与开仓时 `calc_risk_amount_from_plan` 一致。
|
||||
|
||||
## 前端实现
|
||||
|
||||
- 共享脚本:`static/manual_order_rr_preview.js`
|
||||
- 各所 `templates/index.html` 引入并在 `MANUAL_MIN_PLANNED_RR` 定义后执行:
|
||||
```js
|
||||
ManualOrderRrPreview.wire({ minRr: MANUAL_MIN_PLANNED_RR });
|
||||
```
|
||||
- 展示元素:`#order-rr-preview`(开仓按钮左侧)
|
||||
- 颜色:≥ 最低要求为绿色,低于为红色,无效/取价失败为红色或灰色
|
||||
|
||||
## 与提交校验
|
||||
|
||||
提交时仍走原有 `calcClientRr` / `calcClientRrFromPct` 与 `rejectManualOrderRr`;预估仅用于下单前参考,不替代服务端风控。
|
||||
|
||||
## 校验记录
|
||||
|
||||
- `node --check static/manual_order_rr_preview.js`
|
||||
- `tests/test_manual_order_rr_preview.py`:RR 公式与四所 `calc_rr_ratio` 口径一致
|
||||
# 实盘下单 · 预估盈亏比
|
||||
|
||||
## 功能
|
||||
|
||||
三所(Binance / OKX / Gate)**实盘下单监控**表单中,在「开仓」按钮前显示 **预估盈亏比**。
|
||||
|
||||
- **价格模式**:填完币种、方向、止损价、止盈价后,调用 `GET /api/order_defaults` 取标记价,按几何距离计算 RR。
|
||||
- **百分比模式**:填完币种、方向、止损%、止盈% 后拉快照校验币种,再显示 RR(`止盈% / 止损%`)。
|
||||
- **固定盈亏比模式**:不显示预估盈亏比(盈亏比由输入框直接指定;仍保留原有「预估止盈」)。
|
||||
|
||||
- **以损定仓**(`POSITION_SIZING_MODE=risk`):预估风险 = 当前交易基数 × `risk%`。
|
||||
- **全仓杠杆**(`full_margin`):预估风险 = 合约可用 × 缓冲比例 × 杠杆(BTC/ETH 与山寨按 `.env` 配置)× 止损距离比例,与开仓时 `calc_risk_amount_from_plan` 一致。
|
||||
|
||||
## 前端实现
|
||||
|
||||
- 共享脚本:`static/manual_order_rr_preview.js`
|
||||
- 各所 `templates/index.html` 引入并在 `MANUAL_MIN_PLANNED_RR` 定义后执行:
|
||||
```js
|
||||
ManualOrderRrPreview.wire({ minRr: MANUAL_MIN_PLANNED_RR });
|
||||
```
|
||||
- 展示元素:`#order-rr-preview`(开仓按钮左侧)
|
||||
- 颜色:≥ 最低要求为绿色,低于为红色,无效/取价失败为红色或灰色
|
||||
|
||||
## 与提交校验
|
||||
|
||||
提交时仍走原有 `calcClientRr` / `calcClientRrFromPct` 与 `rejectManualOrderRr`;预估仅用于下单前参考,不替代服务端风控。
|
||||
|
||||
## 校验记录
|
||||
|
||||
- `node --check static/manual_order_rr_preview.js`
|
||||
- `tests/test_manual_order_rr_preview.py`:RR 公式与三所 `calc_rr_ratio` 口径一致
|
||||
|
||||
@@ -1,57 +1,57 @@
|
||||
# 计仓模式(四所统一)
|
||||
|
||||
## 配置
|
||||
|
||||
在各实例 `.env` 中设置(**仅能通过 env 切换,修改后须重启进程**):
|
||||
|
||||
```env
|
||||
# risk(默认)= 以损定仓
|
||||
# full_margin = 全仓杠杆(合约可用保证金 × 比例)
|
||||
POSITION_SIZING_MODE=risk
|
||||
FULL_MARGIN_BUFFER_RATIO=0.98
|
||||
```
|
||||
|
||||
切换为全仓杠杆前:**交易所须无持仓**(`MAX_ACTIVE_POSITIONS` 默认 1,全仓模式会强制单仓)。
|
||||
|
||||
## 模式说明
|
||||
|
||||
| 模式 | 保证金计算 | 杠杆 | 允许入口 |
|
||||
|------|------------|------|----------|
|
||||
| `risk` | `RISK_PERCENT` × 交易资金,按止损距离反推 | 表单可选 / 同步交易所 | 实盘人工、关键位自动、趋势回调、顺势加仓 |
|
||||
| `full_margin` | **合约账户可用 USDT × `FULL_MARGIN_BUFFER_RATIO`**(保留 2 位小数) | BTC/ETH **10x**,其它 **5x**(与 `BTC_LEVERAGE`/`ALT_LEVERAGE` 一致) | **实盘人工下单**、**关键位触价开仓**;阻力/支撑仅提醒 |
|
||||
|
||||
全仓模式下:
|
||||
|
||||
- 仍校验 **计划盈亏比**(实盘用 `MANUAL_MIN_PLANNED_RR`;触价开仓用 `KEY_AUTO_MIN_PLANNED_RR`)。
|
||||
- 下单张数由 `prepare_order_amount` + 交易所 `amount_to_precision` 决定。
|
||||
- `order_monitors.initial_stop_loss` 仍记录**开仓时**止损快照;交易记录复盘以该快照为准。
|
||||
- 已存在的 **箱体突破 / 收敛突破 / 斐波 / 假突破** 监控:进程启动时**自动撤销**并企业微信通知。
|
||||
|
||||
## 不允许(全仓模式)
|
||||
|
||||
- 关键位:箱体突破、收敛突破、斐波、假突破(添加时拒绝;已存在则启动时撤销)。
|
||||
- 趋势回调、顺势加仓(策略入口返回明确错误)。
|
||||
|
||||
**允许:** 关键位 **回调触价开仓** / **突破触价开仓**(程序盯价、触达/穿越计划入场后市价成交,无交易所挂单;全仓下仅允许一条待触发)。
|
||||
|
||||
## 用脚本更新四所 `.env`
|
||||
|
||||
详见 **[env-sync-scripts.md](./env-sync-scripts.md)**。常用命令:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
|
||||
# 仅补全计仓相关项(缺省 risk、缓冲 0.98)
|
||||
python scripts/sync_four_exchange_position_sizing_env.py
|
||||
|
||||
# 无仓后切换全仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode full_margin
|
||||
|
||||
# 无仓后切回以损定仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode risk
|
||||
|
||||
# 计仓 + 划转一并补全
|
||||
python scripts/sync_four_exchange_env.py
|
||||
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate crypto-monitor-gate-bot
|
||||
```
|
||||
# 计仓模式(三所统一)
|
||||
|
||||
## 配置
|
||||
|
||||
在各实例 `.env` 中设置(**仅能通过 env 切换,修改后须重启进程**):
|
||||
|
||||
```env
|
||||
# risk(默认)= 以损定仓
|
||||
# full_margin = 全仓杠杆(合约可用保证金 × 比例)
|
||||
POSITION_SIZING_MODE=risk
|
||||
FULL_MARGIN_BUFFER_RATIO=0.98
|
||||
```
|
||||
|
||||
切换为全仓杠杆前:**交易所须无持仓**(`MAX_ACTIVE_POSITIONS` 默认 1,全仓模式会强制单仓)。
|
||||
|
||||
## 模式说明
|
||||
|
||||
| 模式 | 保证金计算 | 杠杆 | 允许入口 |
|
||||
|------|------------|------|----------|
|
||||
| `risk` | `RISK_PERCENT` × 交易资金,按止损距离反推 | 表单可选 / 同步交易所 | 实盘人工、关键位自动、趋势回调、顺势加仓 |
|
||||
| `full_margin` | **合约账户可用 USDT × `FULL_MARGIN_BUFFER_RATIO`**(保留 2 位小数) | BTC/ETH **10x**,其它 **5x**(与 `BTC_LEVERAGE`/`ALT_LEVERAGE` 一致) | **实盘人工下单**、**关键位触价开仓**;阻力/支撑仅提醒 |
|
||||
|
||||
全仓模式下:
|
||||
|
||||
- 仍校验 **计划盈亏比**(实盘用 `MANUAL_MIN_PLANNED_RR`;触价开仓用 `KEY_AUTO_MIN_PLANNED_RR`)。
|
||||
- 下单张数由 `prepare_order_amount` + 交易所 `amount_to_precision` 决定。
|
||||
- `order_monitors.initial_stop_loss` 仍记录**开仓时**止损快照;交易记录复盘以该快照为准。
|
||||
- 已存在的 **箱体突破 / 收敛突破 / 斐波 / 假突破** 监控:进程启动时**自动撤销**并企业微信通知。
|
||||
|
||||
## 不允许(全仓模式)
|
||||
|
||||
- 关键位:箱体突破、收敛突破、斐波、假突破(添加时拒绝;已存在则启动时撤销)。
|
||||
- 趋势回调、顺势加仓(策略入口返回明确错误)。
|
||||
|
||||
**允许:** 关键位 **回调触价开仓** / **突破触价开仓**(程序盯价、触达/穿越计划入场后市价成交,无交易所挂单;全仓下仅允许一条待触发)。
|
||||
|
||||
## 用脚本更新三所 `.env`
|
||||
|
||||
详见 **[env-sync-scripts.md](./env-sync-scripts.md)**。常用命令:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
|
||||
# 仅补全计仓相关项(缺省 risk、缓冲 0.98)
|
||||
python scripts/sync_four_exchange_position_sizing_env.py
|
||||
|
||||
# 无仓后切换全仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode full_margin
|
||||
|
||||
# 无仓后切回以损定仓
|
||||
python scripts/sync_four_exchange_position_sizing_env.py --set-mode risk
|
||||
|
||||
# 计仓 + 划转一并补全
|
||||
python scripts/sync_four_exchange_env.py
|
||||
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate
|
||||
```
|
||||
|
||||
+41
-41
@@ -1,41 +1,41 @@
|
||||
# Chrome 桌面快捷方式图标说明
|
||||
|
||||
## 图标从哪来?
|
||||
|
||||
用 Chrome **「创建快捷方式」** 或 **「安装应用」** 时,桌面/开始菜单图标**不是**操作系统自带的,而是浏览器从**你打开的网站**读取的,优先级大致为:
|
||||
|
||||
1. `manifest.webmanifest` 里的 `icons`(192×192、512×512)
|
||||
2. `link rel="apple-touch-icon"`(约 180×180)
|
||||
3. `link rel="icon"` / `favicon.ico`
|
||||
4. 若都没有 → 灰色地球或网页标题首字
|
||||
|
||||
本仓库已在 **中控** 与 **四所监控页** 配置统一品牌图标(深色圆角底 + 青绿趋势线 + 简化的 K 线),与页面 UI 一致。PNG/ICO 由 **Pillow** 生成,避免损坏的 favicon 出现花屏。
|
||||
|
||||
## 文件位置
|
||||
|
||||
| 位置 | 访问路径 |
|
||||
|------|----------|
|
||||
| 源稿 | `brand/icon.svg`、`brand/icons/*.png` |
|
||||
| 中控 | `manual_trading_hub/static/icons/` → `/assets/icons/...` |
|
||||
| 四所 | `crypto_monitor_*/static/icons/` → `/static/icons/...` |
|
||||
|
||||
## 重新生成 / 同步
|
||||
|
||||
```bash
|
||||
python scripts/generate_brand_icons.py
|
||||
python scripts/sync_brand_icons.py
|
||||
git pull # 服务器部署后
|
||||
pm2 restart …
|
||||
```
|
||||
|
||||
## 快捷方式仍显示旧图标?
|
||||
|
||||
Chrome / Windows 会**缓存** favicon:
|
||||
|
||||
1. 浏览器打开站点,**Ctrl+F5** 强刷
|
||||
2. 删除旧快捷方式,重新「创建快捷方式」
|
||||
3. 必要时清除 Chrome 站点数据(该域名)后再创建
|
||||
|
||||
## 自定义图标
|
||||
|
||||
可替换 `brand/icon.svg` 后重新运行上面两条命令;或把设计好的 `icon-192.png`、`icon-512.png` 放入 `brand/icons/` 再 `sync_brand_icons.py`。
|
||||
# Chrome 桌面快捷方式图标说明
|
||||
|
||||
## 图标从哪来?
|
||||
|
||||
用 Chrome **「创建快捷方式」** 或 **「安装应用」** 时,桌面/开始菜单图标**不是**操作系统自带的,而是浏览器从**你打开的网站**读取的,优先级大致为:
|
||||
|
||||
1. `manifest.webmanifest` 里的 `icons`(192×192、512×512)
|
||||
2. `link rel="apple-touch-icon"`(约 180×180)
|
||||
3. `link rel="icon"` / `favicon.ico`
|
||||
4. 若都没有 → 灰色地球或网页标题首字
|
||||
|
||||
本仓库已在 **中控** 与 **三所监控页** 配置统一品牌图标(深色圆角底 + 青绿趋势线 + 简化的 K 线),与页面 UI 一致。PNG/ICO 由 **Pillow** 生成,避免损坏的 favicon 出现花屏。
|
||||
|
||||
## 文件位置
|
||||
|
||||
| 位置 | 访问路径 |
|
||||
|------|----------|
|
||||
| 源稿 | `brand/icon.svg`、`brand/icons/*.png` |
|
||||
| 中控 | `manual_trading_hub/static/icons/` → `/assets/icons/...` |
|
||||
| 三所 | `crypto_monitor_*/static/icons/` → `/static/icons/...` |
|
||||
|
||||
## 重新生成 / 同步
|
||||
|
||||
```bash
|
||||
python scripts/generate_brand_icons.py
|
||||
python scripts/sync_brand_icons.py
|
||||
git pull # 服务器部署后
|
||||
pm2 restart …
|
||||
```
|
||||
|
||||
## 快捷方式仍显示旧图标?
|
||||
|
||||
Chrome / Windows 会**缓存** favicon:
|
||||
|
||||
1. 浏览器打开站点,**Ctrl+F5** 强刷
|
||||
2. 删除旧快捷方式,重新「创建快捷方式」
|
||||
3. 必要时清除 Chrome 站点数据(该域名)后再创建
|
||||
|
||||
## 自定义图标
|
||||
|
||||
可替换 `brand/icon.svg` 后重新运行上面两条命令;或把设计好的 `icon-192.png`、`icon-512.png` 放入 `brand/icons/` 再 `sync_brand_icons.py`。
|
||||
|
||||
@@ -1,184 +1,184 @@
|
||||
# 趋势回调:中控平仓与交易记录(检阅备忘)
|
||||
|
||||
本文档汇总 **中控手动结束趋势计划**、**交易记录 / 策略记录** 写入规则,以及 **四所展示统一**、**补仓表计价** 相关修复,便于自行检阅与排错。
|
||||
|
||||
适用仓库:`crypto_monitor`(Binance / OKX / Gate / Gate Bot + `manual_trading_hub`)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 中控手动平仓会不会写交易记录?
|
||||
|
||||
**会。** 在实例已部署 **`80226ee` 及之后** 代码并 **重启对应 Flask** 的前提下:
|
||||
|
||||
中控点击 **「结束计划」** → 实例执行市价平仓 + 结束计划 → **同时写入**:
|
||||
|
||||
| 目标 | 表 | 页面入口 |
|
||||
|------|-----|----------|
|
||||
| 策略记录 | `strategy_trade_snapshots` | 顶栏 **策略交易记录** → 左栏「趋势回调记录」 |
|
||||
| 交易记录 | `trade_records` | 顶栏 **交易记录与复盘** |
|
||||
|
||||
手动结束的结果字段为 **「手动平仓」**(亏损时也不会被改成「止损」)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 调用链(四所统一)
|
||||
|
||||
```
|
||||
manual_trading_hub
|
||||
POST /api/trend/{exchange_id}/stop
|
||||
→ 实例 POST /api/hub/trend/stop/{plan_id}
|
||||
→ stop_trend_pullback(pid)
|
||||
→ 市价平仓 + 撤单
|
||||
→ _finalize_plan(cfg, conn, row, "手动平仓", exit_price)
|
||||
```
|
||||
|
||||
共用实现:`strategy_trend_register.py`(四所同一套,Gate Bot 的 `stop_trend_pullback` 也调用 `_finalize_plan`)。
|
||||
|
||||
---
|
||||
|
||||
## 3. `_finalize_plan` 写入顺序(修复后)
|
||||
|
||||
1. 写 **策略快照** `save_trend_plan_snapshot` → `strategy_trade_snapshots`
|
||||
2. 撤该品种挂单
|
||||
3. 若尚无 `trade_records.trend_plan_id = 计划ID`:
|
||||
- 更新当日 session 资金
|
||||
- **`insert_trade_record`** 写入交易记录
|
||||
4. 更新 `trend_pullback_plans.status`(`stopped_manual` / `stopped_sl` / `stopped_tp`)
|
||||
5. **`conn.commit()`** 一次提交
|
||||
|
||||
要点:**先写交易记录,再结束计划**,避免「计划已结束、交易记录未写入」的半成功状态。
|
||||
|
||||
---
|
||||
|
||||
## 4. 曾出现的 Bug(#4 ONDO 漏记)
|
||||
|
||||
**现象**:策略记录有(止损 -2.71U),**交易记录没有**。
|
||||
|
||||
**原因**:Gate Bot 的 `insert_trade_record` 曾 **缺少 `entry_reason` 参数**,而 `_finalize_plan` 固定传入 `entry_reason="趋势回调"`,触发:
|
||||
|
||||
```text
|
||||
TypeError: insert_trade_record() got an unexpected keyword argument 'entry_reason'
|
||||
```
|
||||
|
||||
策略快照在异常 **之前** 已插入,交易记录插入失败,故只出现在策略记录页。
|
||||
|
||||
**修复提交**:`80226ee`
|
||||
|
||||
- Gate Bot `insert_trade_record` 增加 `entry_reason`
|
||||
- `_call_insert_trade_record`:按各所函数 **签名过滤** 参数,避免未知字段导致失败
|
||||
- 调整写入顺序:交易记录 → 计划结束 → commit
|
||||
|
||||
---
|
||||
|
||||
## 5. 历史漏记补录
|
||||
|
||||
对已结束、策略快照在、交易记录缺的计划(如 #4):
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor # 或本机仓库根目录
|
||||
|
||||
# 先预览
|
||||
python scripts/backfill_trend_trade_records.py \
|
||||
--db crypto_monitor_gate_bot/crypto.db --dry-run
|
||||
|
||||
# 确认后写入
|
||||
python scripts/backfill_trend_trade_records.py \
|
||||
--db crypto_monitor_gate_bot/crypto.db --apply
|
||||
```
|
||||
|
||||
其它所将 `--db` 换成对应 `crypto.db` 路径即可。
|
||||
|
||||
---
|
||||
|
||||
## 6. 与「保本移交」的区别
|
||||
|
||||
| 操作 | 策略记录 | 交易记录 |
|
||||
|------|----------|----------|
|
||||
| 中控 **结束计划**(手动平仓) | 计划结束时写入 | **同一时刻**写入 |
|
||||
| **保本移交** | 移交时写入策略快照 | **不立即写**;持仓移交到 `order_monitors`,**后续平仓** 再写入 `trade_records` |
|
||||
|
||||
---
|
||||
|
||||
## 7. 四所展示统一(中控 ↔ 实例)
|
||||
|
||||
### 7.1 数据 enrich 入口
|
||||
|
||||
| 场景 | 函数 |
|
||||
|------|------|
|
||||
| 实例策略页 | `enrich_trend_plan` |
|
||||
| 中控 `/api/hub/monitor` | `enrich_trend_plan_for_hub` → 同上 |
|
||||
| 补仓明细表 | `attach_trend_dca_levels` → `enrich_trend_dca_levels_with_tp` |
|
||||
|
||||
Gate Bot 在 `hub_bridge` 安装后调用 `patch_trend_hub_enrich`,与另外三所 `install_strategy_trend` 行为一致。
|
||||
|
||||
### 7.2 补仓表「触发价 / 加仓后均价」
|
||||
|
||||
**禁止**为凑均价 **反推虚构成交价**(曾错误出现做多补仓触发价 0.3941 等离谱数值)。
|
||||
|
||||
**`trend_leg_display_price`(四所唯一口径)**:
|
||||
|
||||
| 列 | 规则 |
|
||||
|----|------|
|
||||
| **触发价** | `leg_fill_prices_json` 有记录 → 实际成交价;无记录 → **计划网格价** |
|
||||
| **末档已补仓的加仓后均价** | 与顶部均价一致,取 **交易所持仓 `entry_price`**(`avg_entry_price`) |
|
||||
| **顶部均价** | 优先交易所 live `entry_price`,非计划库内估算值 |
|
||||
|
||||
修复提交:`08082eb`(移除反推成交价逻辑)。
|
||||
|
||||
### 7.3 中控静态页
|
||||
|
||||
`manual_trading_hub/static/app.js`:趋势浮盈亏计算 **优先** `trendPlan.avg_entry_price`,与计划卡一致。
|
||||
|
||||
---
|
||||
|
||||
## 8. 部署与自检
|
||||
|
||||
### 8.1 升级
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor
|
||||
git pull # 需含 80226ee、08082eb
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate crypto-monitor-gate-bot manual-trading-hub
|
||||
pm2 save
|
||||
```
|
||||
|
||||
### 8.2 手动平仓后自检
|
||||
|
||||
1. 中控结束一笔测试计划(或极小仓位)
|
||||
2. **策略交易记录**:出现对应条目
|
||||
3. **交易记录与复盘**:出现 `类型=趋势回调`、`结果=手动平仓`,且 `trend_plan_id` 与计划 ID 一致
|
||||
4. 若实例 flash / 日志出现「计划已结束但记账可能不完整」,说明 `insert_trade_record` 仍失败,需查 PM2 日志
|
||||
|
||||
### 8.3 相关代码文件
|
||||
|
||||
| 文件 | 作用 |
|
||||
|------|------|
|
||||
| `strategy_trend_register.py` | `_finalize_plan`、`_call_insert_trade_record`、`enrich_trend_plan` |
|
||||
| `strategy_trend_lib.py` | `trend_leg_display_price`、`enrich_trend_dca_levels_with_tp` |
|
||||
| `strategy_snapshot_lib.py` | 策略快照写入 |
|
||||
| `hub_bridge.py` | `/api/hub/trend/stop/<pid>` |
|
||||
| `crypto_monitor_gate_bot/app.py` | `insert_trade_record`(含 `entry_reason`) |
|
||||
| `scripts/backfill_trend_trade_records.py` | 漏记交易记录补录 |
|
||||
|
||||
### 8.4 相关提交
|
||||
|
||||
| 提交 | 说明 |
|
||||
|------|------|
|
||||
| `6a4ec69` | 中控与四所趋势展示 enrich 统一 |
|
||||
| `08082eb` | 移除补仓表反推虚构成交价 |
|
||||
| `80226ee` | 修复 Gate Bot 中控平仓漏写 `trade_records` |
|
||||
|
||||
---
|
||||
|
||||
## 9. 相关文档
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [策略交易说明.md](../策略交易说明.md) | 策略总览、策略交易记录页 |
|
||||
| [crypto_monitor_gate_bot/趋势回调策略说明.md](../crypto_monitor_gate_bot/趋势回调策略说明.md) | 趋势回调业务细则 |
|
||||
| [manual_trading_hub/使用说明.md](../manual_trading_hub/使用说明.md) | 中控监控与趋势卡布局 |
|
||||
| [hub-symbol-archive-kline.md](./hub-symbol-archive-kline.md) | 币种档案、永久 5m K 线、交易 overlay |
|
||||
|
||||
---
|
||||
|
||||
*最后整理:2026-06-07(与对话中修复项同步)*
|
||||
# 趋势回调:中控平仓与交易记录(检阅备忘)
|
||||
|
||||
本文档汇总 **中控手动结束趋势计划**、**交易记录 / 策略记录** 写入规则,以及 **三所展示统一**、**补仓表计价** 相关修复,便于自行检阅与排错。
|
||||
|
||||
适用仓库:`crypto_monitor`(Binance / OKX / + `manual_trading_hub`)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 中控手动平仓会不会写交易记录?
|
||||
|
||||
**会。** 在实例已部署 **`80226ee` 及之后** 代码并 **重启对应 Flask** 的前提下:
|
||||
|
||||
中控点击 **「结束计划」** → 实例执行市价平仓 + 结束计划 → **同时写入**:
|
||||
|
||||
| 目标 | 表 | 页面入口 |
|
||||
|------|-----|----------|
|
||||
| 策略记录 | `strategy_trade_snapshots` | 顶栏 **策略交易记录** → 左栏「趋势回调记录」 |
|
||||
| 交易记录 | `trade_records` | 顶栏 **交易记录与复盘** |
|
||||
|
||||
手动结束的结果字段为 **「手动平仓」**(亏损时也不会被改成「止损」)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 调用链(三所统一)
|
||||
|
||||
```
|
||||
manual_trading_hub
|
||||
POST /api/trend/{exchange_id}/stop
|
||||
→ 实例 POST /api/hub/trend/stop/{plan_id}
|
||||
→ stop_trend_pullback(pid)
|
||||
→ 市价平仓 + 撤单
|
||||
→ _finalize_plan(cfg, conn, row, "手动平仓", exit_price)
|
||||
```
|
||||
|
||||
共用实现:`strategy_trend_register.py`(三所同一套,各所的 `stop_trend_pullback` 也调用 `_finalize_plan`)。
|
||||
|
||||
---
|
||||
|
||||
## 3. `_finalize_plan` 写入顺序(修复后)
|
||||
|
||||
1. 写 **策略快照** `save_trend_plan_snapshot` → `strategy_trade_snapshots`
|
||||
2. 撤该品种挂单
|
||||
3. 若尚无 `trade_records.trend_plan_id = 计划ID`:
|
||||
- 更新当日 session 资金
|
||||
- **`insert_trade_record`** 写入交易记录
|
||||
4. 更新 `trend_pullback_plans.status`(`stopped_manual` / `stopped_sl` / `stopped_tp`)
|
||||
5. **`conn.commit()`** 一次提交
|
||||
|
||||
要点:**先写交易记录,再结束计划**,避免「计划已结束、交易记录未写入」的半成功状态。
|
||||
|
||||
---
|
||||
|
||||
## 4. 曾出现的 Bug(#4 ONDO 漏记)
|
||||
|
||||
**现象**:策略记录有(止损 -2.71U),**交易记录没有**。
|
||||
|
||||
**原因**:各所的 `insert_trade_record` 曾 **缺少 `entry_reason` 参数**,而 `_finalize_plan` 固定传入 `entry_reason="趋势回调"`,触发:
|
||||
|
||||
```text
|
||||
TypeError: insert_trade_record() got an unexpected keyword argument 'entry_reason'
|
||||
```
|
||||
|
||||
策略快照在异常 **之前** 已插入,交易记录插入失败,故只出现在策略记录页。
|
||||
|
||||
**修复提交**:`80226ee`
|
||||
|
||||
- `insert_trade_record` 增加 `entry_reason`
|
||||
- `_call_insert_trade_record`:按各所函数 **签名过滤** 参数,避免未知字段导致失败
|
||||
- 调整写入顺序:交易记录 → 计划结束 → commit
|
||||
|
||||
---
|
||||
|
||||
## 5. 历史漏记补录
|
||||
|
||||
对已结束、策略快照在、交易记录缺的计划(如 #4):
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor # 或本机仓库根目录
|
||||
|
||||
# 先预览
|
||||
python scripts/backfill_trend_trade_records.py \
|
||||
--db crypto_monitor_gate/crypto.db --dry-run
|
||||
|
||||
# 确认后写入
|
||||
python scripts/backfill_trend_trade_records.py \
|
||||
--db crypto_monitor_gate/crypto.db --apply
|
||||
```
|
||||
|
||||
其它所将 `--db` 换成对应 `crypto.db` 路径即可。
|
||||
|
||||
---
|
||||
|
||||
## 6. 与「保本移交」的区别
|
||||
|
||||
| 操作 | 策略记录 | 交易记录 |
|
||||
|------|----------|----------|
|
||||
| 中控 **结束计划**(手动平仓) | 计划结束时写入 | **同一时刻**写入 |
|
||||
| **保本移交** | 移交时写入策略快照 | **不立即写**;持仓移交到 `order_monitors`,**后续平仓** 再写入 `trade_records` |
|
||||
|
||||
---
|
||||
|
||||
## 7. 三所展示统一(中控 ↔ 实例)
|
||||
|
||||
### 7.1 数据 enrich 入口
|
||||
|
||||
| 场景 | 函数 |
|
||||
|------|------|
|
||||
| 实例策略页 | `enrich_trend_plan` |
|
||||
| 中控 `/api/hub/monitor` | `enrich_trend_plan_for_hub` → 同上 |
|
||||
| 补仓明细表 | `attach_trend_dca_levels` → `enrich_trend_dca_levels_with_tp` |
|
||||
|
||||
在 `hub_bridge` 安装后调用 `patch_trend_hub_enrich`,与另外三所 `install_strategy_trend` 行为一致。
|
||||
|
||||
### 7.2 补仓表「触发价 / 加仓后均价」
|
||||
|
||||
**禁止**为凑均价 **反推虚构成交价**(曾错误出现做多补仓触发价 0.3941 等离谱数值)。
|
||||
|
||||
**`trend_leg_display_price`(三所唯一口径)**:
|
||||
|
||||
| 列 | 规则 |
|
||||
|----|------|
|
||||
| **触发价** | `leg_fill_prices_json` 有记录 → 实际成交价;无记录 → **计划网格价** |
|
||||
| **末档已补仓的加仓后均价** | 与顶部均价一致,取 **交易所持仓 `entry_price`**(`avg_entry_price`) |
|
||||
| **顶部均价** | 优先交易所 live `entry_price`,非计划库内估算值 |
|
||||
|
||||
修复提交:`08082eb`(移除反推成交价逻辑)。
|
||||
|
||||
### 7.3 中控静态页
|
||||
|
||||
`manual_trading_hub/static/app.js`:趋势浮盈亏计算 **优先** `trendPlan.avg_entry_price`,与计划卡一致。
|
||||
|
||||
---
|
||||
|
||||
## 8. 部署与自检
|
||||
|
||||
### 8.1 升级
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor
|
||||
git pull # 需含 80226ee、08082eb
|
||||
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate manual-trading-hub
|
||||
pm2 save
|
||||
```
|
||||
|
||||
### 8.2 手动平仓后自检
|
||||
|
||||
1. 中控结束一笔测试计划(或极小仓位)
|
||||
2. **策略交易记录**:出现对应条目
|
||||
3. **交易记录与复盘**:出现 `类型=趋势回调`、`结果=手动平仓`,且 `trend_plan_id` 与计划 ID 一致
|
||||
4. 若实例 flash / 日志出现「计划已结束但记账可能不完整」,说明 `insert_trade_record` 仍失败,需查 PM2 日志
|
||||
|
||||
### 8.3 相关代码文件
|
||||
|
||||
| 文件 | 作用 |
|
||||
|------|------|
|
||||
| `strategy_trend_register.py` | `_finalize_plan`、`_call_insert_trade_record`、`enrich_trend_plan` |
|
||||
| `strategy_trend_lib.py` | `trend_leg_display_price`、`enrich_trend_dca_levels_with_tp` |
|
||||
| `strategy_snapshot_lib.py` | 策略快照写入 |
|
||||
| `hub_bridge.py` | `/api/hub/trend/stop/<pid>` |
|
||||
| `crypto_monitor_gate/app.py` | `insert_trade_record`(含 `entry_reason`) |
|
||||
| `scripts/backfill_trend_trade_records.py` | 漏记交易记录补录 |
|
||||
|
||||
### 8.4 相关提交
|
||||
|
||||
| 提交 | 说明 |
|
||||
|------|------|
|
||||
| `6a4ec69` | 中控与三所趋势展示 enrich 统一 |
|
||||
| `08082eb` | 移除补仓表反推虚构成交价 |
|
||||
| `80226ee` | 修复 中控平仓漏写 `trade_records` |
|
||||
|
||||
---
|
||||
|
||||
## 9. 相关文档
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [策略交易说明.md](../策略交易说明.md) | 策略总览、策略交易记录页 |
|
||||
| [crypto_monitor_gate/趋势回调策略说明.md](../crypto_monitor_gate/趋势回调策略说明.md) | 趋势回调业务细则 |
|
||||
| [manual_trading_hub/使用说明.md](../manual_trading_hub/使用说明.md) | 中控监控与趋势卡布局 |
|
||||
| [hub-symbol-archive-kline.md](./hub-symbol-archive-kline.md) | 币种档案、永久 5m K 线、交易 overlay |
|
||||
|
||||
---
|
||||
|
||||
*最后整理:2026-06-07(与对话中修复项同步)*
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
# 趋势回调策略说明
|
||||
|
||||
本文描述 **「趋势回调」** 自动交易计划的业务规则与实现口径。
|
||||
|
||||
**三所主站**(Binance / Gate / OKX)均在顶栏 **策略交易 → `/strategy`** 左栏提供同一套逻辑(共用 `strategy_trend_register.py`);各所使用各自 API 与 `crypto.db`。
|
||||
|
||||
**检阅备忘**(中控平仓、交易记录、补仓展示、漏记补录):[trend-hub-close-and-trade-records.md](./trend-hub-close-and-trade-records.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. 适用场景
|
||||
|
||||
- 各 **USDT 永续** 实例独立部署,使用各自 API 与 `crypto.db`。
|
||||
- 你已明确:**方向、止损价、补仓区间边界价、止盈价、杠杆**,并接受程序按风险预算拆分 **首仓 50% + 多档补仓 50%**。
|
||||
|
||||
---
|
||||
|
||||
## 2. 名词与参数
|
||||
|
||||
| 名称 | 含义 |
|
||||
|------|------|
|
||||
| **合约 USDT 可用余额** | **生成预览**时通过 API 读取的 **swap 账户 USDT `free`** 快照;**确认执行**时再次读取并与快照比对偏差。 |
|
||||
| **风险比例** | 默认 **5%**:指「若整笔计划在 **补仓区间远侧边界**(做多=上沿、做空=下沿)这一侧的最坏价格结构下触及止损」,目标亏损上限约为 **可用余额快照 × 风险比例**(实现上用 `calc_risk_fraction` 与 `prepare_order_amount` 反推总张数,受交易所最小张数与精度约束)。 |
|
||||
| **止损价** | 用户填写;开仓后挂 **交易所仓位类止损触发单**(全平)。 |
|
||||
| **补仓区间边界**(库字段 `add_upper`) | 用户填写;**仅在该价位与止损价构成的区间内** 才允许程序触发剩余 50% 的市价补仓。**界面文案**:做多显示「补仓上沿」,做空显示「补仓下沿」。校验:做多 `止损 < 边界价`;做空 `止损 > 边界价`。 |
|
||||
| **止盈价** | 用户填写的 **固定价格**;**不由交易所条件止盈单触发**,由应用后台 **按标记价/行情价轮询**,达到后 **市价全平**。 |
|
||||
| **杠杆** | 计划内固定写入;用于 `set_leverage` 与名义换算。 |
|
||||
| **补仓档位数** | 默认 **5** 档(环境变量 `TREND_PULLBACK_DCA_LEGS` 可调);程序在满足最小张数前提下可能 **自动减少档数**。 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 执行流程(时间顺序)
|
||||
|
||||
### 3.0 列表时间窗(交易记录 / 计划历史)
|
||||
|
||||
- **交易记录**、**计划历史**(含预览快照)列表与 **交易记录 CSV 导出** 支持 **UTC** 时间筛选(默认 UTC 当日;可选近 24h、近 7d、自定义起止)。
|
||||
- 查询参数:`win_preset`(`utc_today` / `utc_last24h` / `utc_last7d` / `custom`)、自定义时另传 `from_utc`、`to_utc`。
|
||||
- **统计分析**页仍按北京时间 `TRADING_DAY_RESET_HOUR` 切日,不受列表窗影响。
|
||||
|
||||
### 3.1 预览阶段(不下单)
|
||||
|
||||
1. **风控**:与「机器人下单监控」**互斥**——存在活跃机器人持仓或运行中趋势计划时,不可生成预览。
|
||||
2. **读取可用余额快照** `get_available_trading_usdt()`,失败则拒绝。
|
||||
3. **计算**(写入表 `trend_pullback_previews`,并跳转带 `preview_id`):
|
||||
- 在 **补仓区间边界 ↔ 止损** 区间内生成 `N` 个补仓触发价(做多从上沿向止损、做空从下沿向止损);
|
||||
- 将 **剩余 50% 计划张数** 拆成 `N` 份写入 `leg_amounts_json`。
|
||||
4. **预览有效期**:默认 **120 秒**(`TREND_PULLBACK_PREVIEW_TTL_SECONDS`),超时须重新点「生成预览」。
|
||||
|
||||
### 3.2 确认执行(实盘)
|
||||
|
||||
5. 再次校验:预览未过期;**当前可用余额**与预览快照相对偏差 ≤ `TREND_PREVIEW_MAX_BALANCE_DRIFT_PCT`(默认 **5%**),否则拒绝执行并要求重新预览。
|
||||
6. **首仓**:**立即市价** 开立 **总计划张数 × 50%**(不附带交易所止盈单)。
|
||||
7. **止损**:撤销旧条件单后,挂 **仅止损** 的仓位触发单;之后每次补仓成交会 **刷新** 止损挂单。
|
||||
7b. **保本移交下单监控**(可选):首仓完成且交易所有持仓后,可点击「保本移交下单监控」——将止损移至 **持仓均价 ± 偏移%**(默认 **+0.3%** 多 / **−0.3%** 空),仅当新止损 **优于** 当前止损时生效;**本次趋势计划随即结束**,持仓写入 **下单监控**(备注 **趋势回调计划**),交易所在 **同一时刻挂保本止损 + 计划止盈**;后续无论中控平仓或交易所手动平仓,均经下单监控轮询 **`reconcile_external_closes` / `check_order_monitors`** 写入 **交易记录**(含 `trend_plan_id`、开仓类型「趋势回调」),供人工核对。
|
||||
8. **补仓**:当价格 **穿越** 下一档触发价(做多为自上向下穿越,做空为自下向上穿越)时,按该档张数 **市价加仓**;直至 `N` 档执行完毕或计划结束。
|
||||
9. **止盈监控**:后台线程若发现价格触及止盈,则 **市价全平**。
|
||||
10. **止损触发**:若仓位被交易所止损打光,本地检测到 **持仓为 0** 后记账为 **止损** 并结束计划。
|
||||
11. **计划结束**:任一结束路径(止盈 / 止损 / 用户手动结束)均会 **撤单**(条件单 + 普通挂单,尽力而为)。
|
||||
|
||||
### 3.3 取消预览
|
||||
|
||||
用户可「取消预览」删除 `trend_pullback_previews` 中对应记录;过期记录会在新预览或页面加载时清理。
|
||||
|
||||
### 3.4 界面:计划历史与运行中浮动盈亏
|
||||
|
||||
- **计划历史(页顶卡片)**
|
||||
- 仅展示 **`trend_pullback_plans` 中已结束的计划**(`status != 'active'`,如止盈结束、止损结束、手动结束)。
|
||||
- **不包含**仅存在于 `trend_pullback_previews`、从未「确认执行」的预览。
|
||||
- 每行提供 **删除**:删除该计划行,并删除 `trade_records` 中 **`trend_plan_id` 与之相同** 且类型为「趋势回调」的记录(用于与计划一一对应的新数据;历史旧行若无 `trend_plan_id` 则不会随删)。
|
||||
- **运行中的计划(交易执行页)**
|
||||
- 在计划摘要下方展示 **浮盈亏(交易所)**:来自 Gate 当前持仓接口的 **未实现盈亏**(及标记价,若可得);与本地按均价估算可能略有差异,以交易所为准便于对照。
|
||||
- **补仓边界**按方向显示「补仓上沿」或「补仓下沿」(数值仍为 `add_upper` 字段)。
|
||||
- **手动保本**:表单可改偏移 %(默认见 `TREND_PULLBACK_MANUAL_BREAKEVEN_OFFSET_PCT`);成功后显示「已保本」时间与原止损(若与当前不同)。
|
||||
|
||||
### 3.5 交易记录与交易所「已实现盈亏」对齐
|
||||
|
||||
- 平仓时仍会写入一条 **`trade_records`**(`monitor_type=趋势回调`),其中的 **`pnl_amount` 等为本地估算**(`calc_pnl`,不含手续费、资金费等完整账单口径)。
|
||||
- 打开 **「交易执行」或「交易记录」** 页面时,若已配置 **`GATE_API_KEY` / `GATE_API_SECRET`**(不要求 `LIVE_TRADING_ENABLED=true`,只读即可),应用会按节流策略(同进程约 **25 秒**内最多一次)调用 Gate **`fetch_positions_history`(平仓历史)**,为尚未写入 `exchange_sync_key` 的趋势回调记录 **匹配一条平仓记录**,并回填:
|
||||
- **`exchange_realized_pnl`**:交易所口径已实现盈亏(与 App「历史仓位」更接近);
|
||||
- **`exchange_opened_at` / `exchange_closed_at`**:换算为应用时区(默认北京)下的开、平时间字符串。
|
||||
- **交易记录表**展示列「开仓(展示) / 平仓(展示) / 盈亏U(展示)」:对「趋势回调」行,若已同步则优先显示交易所字段(界面小字 **「所」**);未同步前仍显示本地复盘字段(小字 **「估」**)。
|
||||
- 匹配规则概要:同品种、同方向、平仓时间与本地 `closed_at` 接近,并结合 **`trend_plan_id`** 对应计划的 `opened_at` 收窄时间窗;极端情况下若短时间多笔同向同品种,仍存在错配可能,可对照 `exchange_sync_key` 与交易所记录。
|
||||
|
||||
---
|
||||
|
||||
## 4. 与「机器人下单监控」的差异
|
||||
|
||||
| 项目 | 机器人下单监控 | 趋势回调 |
|
||||
|------|------------------|----------|
|
||||
| 开仓 | 单次市价 + 条件止盈+止损 | 首仓 50% 市价 + 多档补仓 + **仅止损在交易所** |
|
||||
| 止盈 | 条件单 + 本地监控 | **仅本地监控市价止盈** |
|
||||
| 仓位基数 | 以损定仓(表单/会话基数) | **可用余额快照 × 风险比例** 推导 |
|
||||
| 移动保本 | 支持(按 R 自动上移) | **保本移交**(结束计划→下单监控;交易所 TP+SL;**无**自动 R 保本) |
|
||||
|
||||
---
|
||||
|
||||
## 5. 风险声明(必读)
|
||||
|
||||
- 市价单存在 **滑点**;极端行情下实际亏损可能 **大于** 理论 5%。
|
||||
- 补仓触发依赖应用 **轮询间隔**(`MONITOR_POLL_SECONDS`),非毫秒级高频。
|
||||
- 交易所 **最小张数 / 精度** 可能导致计划张数被截断,实际风险略低于或偏离纸面计算。
|
||||
- 请使用 **单独 API Key / 子账户**,并先在 `LIVE_TRADING_ENABLED=false` 环境验证流程(若需沙盒请自行对接测试网,本仓库默认实盘接口)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 相关环境变量
|
||||
|
||||
| 变量 | 说明 | 默认 |
|
||||
|------|------|------|
|
||||
| `TREND_PULLBACK_MANUAL_BREAKEVEN_OFFSET_PCT` | 手动保本默认偏移(相对持仓均价,%) | `0.3` |
|
||||
| `TREND_PULLBACK_DCA_LEGS` | 剩余 50% 拆档数量上限 | `5` |
|
||||
| `TREND_PULLBACK_PREVIEW_TTL_SECONDS` | 预览有效时间(秒) | `120` |
|
||||
| `TREND_PREVIEW_MAX_BALANCE_DRIFT_PCT` | 确认执行时允许「当前可用 / 预览快照」最大相对偏差(%) | `5` |
|
||||
| `MONITOR_POLL_SECONDS` | 监控轮询间隔(秒) | `3` |
|
||||
| `LIVE_TRADING_ENABLED` | 是否允许真实下单 | `false` |
|
||||
| `FULL_MARGIN_BUFFER_RATIO` | 计划保证金相对可用余额上限比例 | `0.98` |
|
||||
| `APP_TIMEZONE` | 应用墙钟与「北京日期」同步起点时区(如 `Asia/Shanghai`) | `Asia/Shanghai` |
|
||||
| `EXCHANGE_POSITION_SYNC_FROM_BJ` | 拉取 Gate **平仓历史** 的最早日期(`YYYY-MM-DD`,按 `APP_TIMEZONE` 当日 **00:00** 起算)。**留空**则从近 **90 天** 起拉取 | 空 |
|
||||
| `EXCHANGE_POSITION_HISTORY_LIMIT` | 单次拉取平仓历史条数上限(50–1000) | `200` |
|
||||
|
||||
---
|
||||
|
||||
## 7. 数据库
|
||||
|
||||
- **`trend_pullback_previews`**:未执行的预览行(含 `expires_at_ms`),执行成功或取消后删除;过期可被清理。
|
||||
- **`trend_pullback_plans`**:趋势回调计划。执行后写入一行,`status='active'` 表示运行中;止盈 / 止损 / 手动结束后变为 **`stopped_tp` / `stopped_sl` / `stopped_manual`** 等非 `active` 状态,并出现在页顶 **计划历史**。字段含快照可用余额、计划保证金、总张数、首仓张数、补仓 JSON、网格价 JSON、已补仓档数、均价、`opened_at`、`message`(结束说明)等;**`add_upper`** 存补仓区间远侧边界价(做多=上沿、做空=下沿)。
|
||||
- **`trade_records`**(`monitor_type=趋势回调`):每次计划结束插入一行;含本地估算盈亏等。新写入行带 **`trend_plan_id`** 指向 `trend_pullback_plans.id`。另含 **`exchange_realized_pnl`、`exchange_opened_at`、`exchange_closed_at`、`exchange_sync_key`**,由页面触发的交易所平仓历史同步填充(见 3.5)。
|
||||
|
||||
**CSV 导出**:交易记录导出为 **v3**,包含上述交易所对齐字段及 `trend_plan_id`。
|
||||
+158
-160
@@ -1,160 +1,158 @@
|
||||
# Ubuntu 服务器部署与环境说明
|
||||
|
||||
本文档为 **生产环境唯一推荐路径**:**Ubuntu**、**root** 用户、代码目录 **`/opt/crypto_monitor`**、进程托管 **PM2**。不使用 Windows 部署、不使用 systemd/screen/nohup 托管应用(SSH 隧道除外)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 系统要求
|
||||
|
||||
| 项 | 要求 |
|
||||
|----|------|
|
||||
| 操作系统 | **Ubuntu 22.04 LTS** 或 **24.04 LTS**(64 位) |
|
||||
| 运行用户 | **root**(下文命令均按 root 编写) |
|
||||
| 项目路径 | **`/opt/crypto_monitor`**(整仓克隆到此目录) |
|
||||
| 进程管理 | **PM2**(全局安装,见 §3) |
|
||||
| 网络 | 能 `git clone` 私有仓库;访问交易所不稳定时需 **SSH SOCKS**(见各所《部署文档》) |
|
||||
|
||||
---
|
||||
|
||||
## 2. Python 环境
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| **版本** | **Python 3.10 或 3.11**(`python3 --version` ≥ 3.10);脚本会拒绝 3.9 及以下 |
|
||||
| **虚拟环境** | 每个子项目独立 **`.venv`**(`deploy/setup_env.sh` 自动创建) |
|
||||
| **依赖文件** | 四所监控共用仓库根目录 **`requirements.txt`**;中控用 **`manual_trading_hub/requirements.txt`** |
|
||||
| **SOCKS** | 走代理时必须安装 **PySocks**(已写入 requirements) |
|
||||
|
||||
### 2.1 系统包(root)
|
||||
|
||||
```bash
|
||||
apt update
|
||||
apt install -y python3 python3-pip python3-venv curl git ca-certificates
|
||||
# 若 python3 为 3.10:
|
||||
apt install -y python3.10-venv
|
||||
# 若为 3.12:
|
||||
apt install -y python3.12-venv
|
||||
```
|
||||
|
||||
### 2.2 一键创建各目录 venv
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor
|
||||
bash deploy/setup_env.sh --install-system-deps
|
||||
# 或已是 root 且已装 venv 包:
|
||||
bash deploy/setup_env.sh
|
||||
```
|
||||
|
||||
完成后各目录使用 **`.venv/bin/python`** 运行 `app.py` / `hub.py`;**PM2 的 ecosystem 脚本已指向该解释器**。
|
||||
|
||||
---
|
||||
|
||||
## 3. Node.js 与 PM2
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| **Node.js** | 建议 **18 LTS** 或 **20 LTS**(用于安装 PM2;应用本体为 Python) |
|
||||
| **PM2** | 全局安装,托管所有 Flask 与中控/子代理 |
|
||||
|
||||
### 3.1 安装 Node + PM2(root)
|
||||
|
||||
```bash
|
||||
# 方式 A:NodeSource(示例 Node 20)
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||
apt install -y nodejs
|
||||
node -v # v20.x
|
||||
npm -v
|
||||
|
||||
npm install -g pm2
|
||||
pm2 -v
|
||||
pm2 startup # 按提示执行,保证重启后 PM2 自启
|
||||
```
|
||||
|
||||
`deploy/setup_env.sh` 在检测到 Node 时也会尝试 `npm install -g pm2`(未装 Node 则跳过并提示手动安装)。
|
||||
|
||||
### 3.2 PM2 启动顺序(推荐)
|
||||
|
||||
```bash
|
||||
# 1) 四所 Flask(在各子目录执行,或分别 start)
|
||||
cd /opt/crypto_monitor/crypto_monitor_binance && pm2 start ecosystem.config.cjs
|
||||
cd /opt/crypto_monitor/crypto_monitor_gate && pm2 start ecosystem.config.cjs
|
||||
cd /opt/crypto_monitor/crypto_monitor_gate_bot && pm2 start ecosystem.config.cjs
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx && pm2 start ecosystem.config.cjs
|
||||
|
||||
# 2) 中控 + 四子代理(一条配置 5 进程)
|
||||
cd /opt/crypto_monitor/manual_trading_hub
|
||||
pm2 start ecosystem.config.cjs
|
||||
|
||||
pm2 save
|
||||
pm2 list
|
||||
```
|
||||
|
||||
升级代码后:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor && git pull
|
||||
# 若 requirements 有变,对各目录 .venv/bin/pip install -r ...
|
||||
pm2 restart all # 或按进程名 restart
|
||||
```
|
||||
|
||||
**不要** 再用 systemd unit、screen、nohup 启动 `app.py` / `hub.py` / `agent.py`,避免与 PM2 抢端口。
|
||||
|
||||
### 3.3 常见 PM2 进程名
|
||||
|
||||
| 目录 | ecosystem 内典型名称 |
|
||||
|------|---------------------|
|
||||
| `crypto_monitor_binance` | `crypto-monitor-binance` |
|
||||
| `crypto_monitor_gate` | `crypto-monitor-gate` |
|
||||
| `crypto_monitor_gate_bot` | `crypto-monitor-gate-bot` |
|
||||
| `crypto_monitor_okx` | `crypto-monitor-okx` |
|
||||
| `manual_trading_hub` | `manual-trading-hub`、`manual-agent-*` |
|
||||
|
||||
以各目录 **`ecosystem.config.cjs`** 为准。
|
||||
|
||||
---
|
||||
|
||||
## 4. 目录与权限
|
||||
|
||||
```bash
|
||||
mkdir -p /opt
|
||||
cd /opt
|
||||
git clone https://git.bz121.com/dekun/crypto_monitor.git crypto_monitor
|
||||
chown -R root:root /opt/crypto_monitor
|
||||
```
|
||||
|
||||
- 数据库默认:各所 **`crypto.db`**(SQLite)
|
||||
- 备份目录建议:**`/root/backups`**(见 [备份与恢复.md](../备份与恢复.md))
|
||||
- **`.env`**:仅本机编辑,**勿提交 Git**;升级前 `cp .env .env.backup.$(date +%Y%m%d)`
|
||||
|
||||
---
|
||||
|
||||
## 5. SSH 动态转发(SOCKS)
|
||||
|
||||
若交易所 API 需经境外 VPS:
|
||||
|
||||
- 在本机用 **`ssh -N -D 127.0.0.1:1080 别名`** 建立隧道(配置见各所《部署文档》`~/.ssh/config`)
|
||||
- 隧道进程可用 **tmux** 或 **autossh** 保持常驻;**不必** 也不建议把 `ssh` 交给 PM2
|
||||
- 各所 `.env` 设置对应 `*_SOCKS_PROXY=socks5h://127.0.0.1:1080`
|
||||
|
||||
---
|
||||
|
||||
## 6. 部署后检查
|
||||
|
||||
```bash
|
||||
# 中控验收(需已 start hub)
|
||||
bash /opt/crypto_monitor/manual_trading_hub/scripts/verify_hub_deploy.sh
|
||||
|
||||
pm2 logs manual-trading-hub --lines 50
|
||||
curl -sS http://127.0.0.1:5100/api/monitor/board | head
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 相关文档
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [deploy/README.md](../deploy/README.md) | `setup_env.sh` 参数说明 |
|
||||
| [备份与恢复.md](../备份与恢复.md) | 数据库与 `.env` 备份 |
|
||||
| 各 `crypto_monitor_*/部署文档.md` | 交易所 SOCKS、`.env`、PM2 细节 |
|
||||
| [manual_trading_hub/部署文档.md](../manual_trading_hub/部署文档.md) | 中控 PM2、端口、反代 |
|
||||
# Ubuntu 服务器部署与环境说明
|
||||
|
||||
本文档为 **生产环境唯一推荐路径**:**Ubuntu**、**root** 用户、代码目录 **`/opt/crypto_monitor`**、进程托管 **PM2**。不使用 Windows 部署、不使用 systemd/screen/nohup 托管应用(SSH 隧道除外)。
|
||||
|
||||
---
|
||||
|
||||
## 1. 系统要求
|
||||
|
||||
| 项 | 要求 |
|
||||
|----|------|
|
||||
| 操作系统 | **Ubuntu 22.04 LTS** 或 **24.04 LTS**(64 位) |
|
||||
| 运行用户 | **root**(下文命令均按 root 编写) |
|
||||
| 项目路径 | **`/opt/crypto_monitor`**(整仓克隆到此目录) |
|
||||
| 进程管理 | **PM2**(全局安装,见 §3) |
|
||||
| 网络 | 能 `git clone` 私有仓库;访问交易所不稳定时需 **SSH SOCKS**(见各所《部署文档》) |
|
||||
|
||||
---
|
||||
|
||||
## 2. Python 环境
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| **版本** | **Python 3.10 或 3.11**(`python3 --version` ≥ 3.10);脚本会拒绝 3.9 及以下 |
|
||||
| **虚拟环境** | 每个子项目独立 **`.venv`**(`deploy/setup_env.sh` 自动创建) |
|
||||
| **依赖文件** | 三所监控共用仓库根目录 **`requirements.txt`**;中控用 **`manual_trading_hub/requirements.txt`** |
|
||||
| **SOCKS** | 走代理时必须安装 **PySocks**(已写入 requirements) |
|
||||
|
||||
### 2.1 系统包(root)
|
||||
|
||||
```bash
|
||||
apt update
|
||||
apt install -y python3 python3-pip python3-venv curl git ca-certificates
|
||||
# 若 python3 为 3.10:
|
||||
apt install -y python3.10-venv
|
||||
# 若为 3.12:
|
||||
apt install -y python3.12-venv
|
||||
```
|
||||
|
||||
### 2.2 一键创建各目录 venv
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor
|
||||
bash deploy/setup_env.sh --install-system-deps
|
||||
# 或已是 root 且已装 venv 包:
|
||||
bash deploy/setup_env.sh
|
||||
```
|
||||
|
||||
完成后各目录使用 **`.venv/bin/python`** 运行 `app.py` / `hub.py`;**PM2 的 ecosystem 脚本已指向该解释器**。
|
||||
|
||||
---
|
||||
|
||||
## 3. Node.js 与 PM2
|
||||
|
||||
| 项 | 说明 |
|
||||
|----|------|
|
||||
| **Node.js** | 建议 **18 LTS** 或 **20 LTS**(用于安装 PM2;应用本体为 Python) |
|
||||
| **PM2** | 全局安装,托管所有 Flask 与中控/子代理 |
|
||||
|
||||
### 3.1 安装 Node + PM2(root)
|
||||
|
||||
```bash
|
||||
# 方式 A:NodeSource(示例 Node 20)
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
||||
apt install -y nodejs
|
||||
node -v # v20.x
|
||||
npm -v
|
||||
|
||||
npm install -g pm2
|
||||
pm2 -v
|
||||
pm2 startup # 按提示执行,保证重启后 PM2 自启
|
||||
```
|
||||
|
||||
`deploy/setup_env.sh` 在检测到 Node 时也会尝试 `npm install -g pm2`(未装 Node 则跳过并提示手动安装)。
|
||||
|
||||
### 3.2 PM2 启动顺序(推荐)
|
||||
|
||||
```bash
|
||||
# 1) 三所 Flask(在各子目录执行,或分别 start)
|
||||
cd /opt/crypto_monitor/crypto_monitor_binance && pm2 start ecosystem.config.cjs
|
||||
cd /opt/crypto_monitor/crypto_monitor_gate && pm2 start ecosystem.config.cjs
|
||||
cd /opt/crypto_monitor/crypto_monitor_okx && pm2 start ecosystem.config.cjs
|
||||
|
||||
# 2) 中控 + 三子代理(一条配置 4 进程:hub + 3 agent)
|
||||
cd /opt/crypto_monitor/manual_trading_hub
|
||||
pm2 start ecosystem.config.cjs
|
||||
|
||||
pm2 save
|
||||
pm2 list
|
||||
```
|
||||
|
||||
升级代码后:
|
||||
|
||||
```bash
|
||||
cd /opt/crypto_monitor && git pull
|
||||
# 若 requirements 有变,对各目录 .venv/bin/pip install -r ...
|
||||
pm2 restart all # 或按进程名 restart
|
||||
```
|
||||
|
||||
**不要** 再用 systemd unit、screen、nohup 启动 `app.py` / `hub.py` / `agent.py`,避免与 PM2 抢端口。
|
||||
|
||||
### 3.3 常见 PM2 进程名
|
||||
|
||||
| 目录 | ecosystem 内典型名称 |
|
||||
|------|---------------------|
|
||||
| `crypto_monitor_binance` | `crypto-monitor-binance` |
|
||||
| `crypto_monitor_gate` | `crypto-monitor-gate` |
|
||||
| `crypto_monitor_okx` | `crypto-monitor-okx` |
|
||||
| `manual_trading_hub` | `manual-trading-hub`、`manual-agent-*` |
|
||||
|
||||
以各目录 **`ecosystem.config.cjs`** 为准。
|
||||
|
||||
---
|
||||
|
||||
## 4. 目录与权限
|
||||
|
||||
```bash
|
||||
mkdir -p /opt
|
||||
cd /opt
|
||||
git clone https://git.bz121.com/dekun/crypto_monitor.git crypto_monitor
|
||||
chown -R root:root /opt/crypto_monitor
|
||||
```
|
||||
|
||||
- 数据库默认:各所 **`crypto.db`**(SQLite)
|
||||
- 备份目录建议:**`/root/backups`**(见 [备份与恢复.md](../备份与恢复.md))
|
||||
- **`.env`**:仅本机编辑,**勿提交 Git**;升级前 `cp .env .env.backup.$(date +%Y%m%d)`
|
||||
|
||||
---
|
||||
|
||||
## 5. SSH 动态转发(SOCKS)
|
||||
|
||||
若交易所 API 需经境外 VPS:
|
||||
|
||||
- 在本机用 **`ssh -N -D 127.0.0.1:1080 别名`** 建立隧道(配置见各所《部署文档》`~/.ssh/config`)
|
||||
- 隧道进程可用 **tmux** 或 **autossh** 保持常驻;**不必** 也不建议把 `ssh` 交给 PM2
|
||||
- 各所 `.env` 设置对应 `*_SOCKS_PROXY=socks5h://127.0.0.1:1080`
|
||||
|
||||
---
|
||||
|
||||
## 6. 部署后检查
|
||||
|
||||
```bash
|
||||
# 中控验收(需已 start hub)
|
||||
bash /opt/crypto_monitor/manual_trading_hub/scripts/verify_hub_deploy.sh
|
||||
|
||||
pm2 logs manual-trading-hub --lines 50
|
||||
curl -sS http://127.0.0.1:5100/api/monitor/board | head
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 相关文档
|
||||
|
||||
| 文档 | 内容 |
|
||||
|------|------|
|
||||
| [deploy/README.md](../deploy/README.md) | `setup_env.sh` 参数说明 |
|
||||
| [备份与恢复.md](../备份与恢复.md) | 数据库与 `.env` 备份 |
|
||||
| 各 `crypto_monitor_*/部署文档.md` | 交易所 SOCKS、`.env`、PM2 细节 |
|
||||
| [manual_trading_hub/部署文档.md](../manual_trading_hub/部署文档.md) | 中控 PM2、端口、反代 |
|
||||
|
||||
Reference in New Issue
Block a user