Normalize fullwidth punctuation to ASCII across codebase.

Add scripts/normalize_ambiguous_unicode.py; fix corrupted patch_instance_theme_templates.py. Preserves curly quotes in string literals; removes Git homoglyph warnings on .env.example.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-08 23:42:26 +08:00
parent aaa72c7961
commit b733e551a0
392 changed files with 71522 additions and 71369 deletions
+130 -130
View File
@@ -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
View File
@@ -1,45 +1,45 @@
# 每日自动划转三所统一
## 行为
`.env` 开启 `AUTO_TRANSFER_ENABLED=true`监控轮询在**北京时间 `AUTO_TRANSFER_BJ_HOUR` 整点所在小时**内默认 8:008:59执行一次**UTC 自然日** 去重):
| 交易账户 (`AUTO_TRANSFER_TO`默认 swap) | 动作 |
|------------------------------------------|------|
| 余额 **低于** `AUTO_TRANSFER_AMOUNT` | 从 `AUTO_TRANSFER_FROM`默认 funding划入差额 |
| 余额 **高于** `AUTO_TRANSFER_AMOUNT` | 将多余划回 `AUTO_TRANSFER_FROM` |
| 与目标相差 &lt; 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
```
# 每日自动划转(三所统一)
## 行为
`.env` 开启 `AUTO_TRANSFER_ENABLED=true`,监控轮询在**北京时间 `AUTO_TRANSFER_BJ_HOUR` 整点所在小时**内(默认 8:008:59)执行一次(**UTC 自然日** 去重):
| 交易账户 (`AUTO_TRANSFER_TO`,默认 swap) | 动作 |
|------------------------------------------|------|
| 余额 **低于** `AUTO_TRANSFER_AMOUNT` | 从 `AUTO_TRANSFER_FROM`(默认 funding)划入差额 |
| 余额 **高于** `AUTO_TRANSFER_AMOUNT` | 将多余划回 `AUTO_TRANSFER_FROM` |
| 与目标相差 &lt; 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
View File
@@ -1,81 +1,81 @@
# 单日开仓次数限制三所统一
各交易实例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`
# 单日开仓次数限制(三所统一)
各交易实例(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`
+139 -139
View File
@@ -1,139 +1,139 @@
# 三所 `.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
# 补全缺失项默认 riskFULL_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` |
---
## 共用交易 / 关键位 / 轮询项
`scripts/sync_common_trading_env.py`以 Gate `.env.example` 为基准向**币安OKX** 的 `.env` **追加缺失项**不覆盖 API 密钥与已有自定义值)。
```bash
python scripts/sync_common_trading_env.py
python scripts/sync_common_trading_env.py --dry-run
python scripts/sync_common_trading_env.py --instances crypto_monitor_okx
python scripts/sync_common_trading_env.py --apply-force-close-policy
```
补全项含`RECONCILE_*``PRICE_REFRESH_SECONDS``KEY_*` 门控`KEY_SIZING_USE_ZERO_POSITION_SNAPSHOT`**不含** `FORCE_CLOSE_*``--apply-force-close-policy` 单独处理)。
**强制清仓策略**仅 Gate 开启):
```bash
python scripts/sync_common_trading_env.py --apply-force-close-policy
```
或服务器一键`bash deploy/pull_and_restart.sh`
---
## 部署后重启
```bash
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate
```
## 相关文档
- [计仓模式](./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` |
---
## 共用交易 / 关键位 / 轮询项
`scripts/sync_common_trading_env.py`:以 Gate `.env.example` 为基准,向**币安,OKX** 的 `.env` **追加缺失项**(不覆盖 API 密钥与已有自定义值).
```bash
python scripts/sync_common_trading_env.py
python scripts/sync_common_trading_env.py --dry-run
python scripts/sync_common_trading_env.py --instances crypto_monitor_okx
python scripts/sync_common_trading_env.py --apply-force-close-policy
```
补全项含:`RECONCILE_*`,`PRICE_REFRESH_SECONDS`,`KEY_*` 门控,`KEY_SIZING_USE_ZERO_POSITION_SNAPSHOT`(**不含** `FORCE_CLOSE_*`,`--apply-force-close-policy` 单独处理).
**强制清仓策略**(仅 Gate 开启):
```bash
python scripts/sync_common_trading_env.py --apply-force-close-policy
```
或服务器一键:`bash deploy/pull_and_restart.sh`
---
## 部署后重启
```bash
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate
```
## 相关文档
- [计仓模式](./position-sizing-mode.md)
- [每日自动划转](./auto-transfer-daily.md)
- [部署说明](../deploy/README.md)
+75 -75
View File
@@ -1,8 +1,8 @@
# env 配置页说明
本文档描述各交易实例 Web 端 **「env 配置」** 页展示项含义生效方式以及与系统设置中控密钥的分工
本文档描述各交易实例 Web 端 **「env 配置」** 页展示项,含义,生效方式,以及与系统设置,中控密钥的分工.
> **不在本页展示的配置**服务端口数据库路径关键位门控轮询间隔等仍保存在实例目录 `.env` 中需 SSH 编辑或部署脚本维护见文末「隐藏项」
> **不在本页展示的配置**(服务端口,数据库路径,关键位门控,轮询间隔等)仍保存在实例目录 `.env` 中,需 SSH 编辑或部署脚本维护,见文末「隐藏项」.
---
@@ -10,66 +10,66 @@
| 原则 | 说明 |
|------|------|
| **只展示运营相关项** | 不暴露全量 `.env`避免误改基础设施 |
| **前端仅中文** | 页面只显示中文标签与说明不显示 `APP_XXX` 等变量名 |
| **只展示运营相关项** | 不暴露全量 `.env`,避免误改基础设施 |
| **前端仅中文** | 页面只显示中文标签与说明,不显示 `APP_XXX` 等变量名 |
| **账户密码不进本页** | 登录用户名/密码在 **系统设置 → 账户密码修改** 中维护 |
| **密钥自动托管** | 中控通信密钥登录会话密钥由 **首次部署脚本自动生成并写入**一次生成不轮换),本页不提供编辑 |
| **AI 仅中控配置** | OpenAI / Ollama 等 AI 项已从中控 **系统设置 → AI 配置** 统一维护并同步三所本页不再展示 |
| **保存标注** | 每项标注「保存即生效」或「需重启」含需重启项时可用「保存并重启」 |
| **密钥自动托管** | 中控通信密钥,登录会话密钥由 **首次部署脚本自动生成并写入**(一次生成,不轮换),本页不提供编辑 |
| **AI 仅中控配置** | OpenAI / Ollama 等 AI 项已从中控 **系统设置 → AI 配置** 统一维护并同步三所,本页不再展示 |
| **保存标注** | 每项标注「保存即生效」或「需重启」;含需重启项时可用「保存并重启」 |
---
## 2. 密钥分工自动生成本页不可见
## 2. 密钥分工(自动生成,本页不可见)
部署时由脚本统一生成并写入对应 `.env`已有值则跳过避免覆盖生产环境)。
部署时由脚本统一生成并写入对应 `.env`(已有值则跳过,避免覆盖生产环境).
| 类型 | 环境变量 | 写入位置 | 用途 |
|------|----------|----------|------|
| **中控通信密钥** | `HUB_BRIDGE_TOKEN` | 中控 `manual_trading_hub/.env` + 三实例 `.env`**相同值** | 中控调用实例 API`X-Hub-Token`)、iframe SSO 签发与校验 |
| **登录会话密钥** | `FLASK_SECRET_KEY` | 三实例 `.env`**三所相同** | Flask Session 签名与网页登录态相关与中控密钥 **分离** |
| **中控通信密钥** | `HUB_BRIDGE_TOKEN` | 中控 `manual_trading_hub/.env` + 三实例 `.env`(**相同值**) | 中控调用实例 API(`X-Hub-Token`),iframe SSO 签发与校验 |
| **登录会话密钥** | `FLASK_SECRET_KEY` | 三实例 `.env`(**三所相同**) | Flask Session 签名;与网页登录态相关,与中控密钥 **分离** |
| **中控会话密钥** | `HUB_SESSION_SECRET` | 中控 `.env` | 中控登录 Cookie 签名 |
| **登录账号** | `APP_USERNAME` / `APP_PASSWORD` | 三实例 `.env`建议三所统一 | 直链实例 `/login` 使用**仅在系统设置中修改** |
| **中控登录** | `HUB_USERNAME` / `HUB_PASSWORD` | 中控 `.env` | 中控网页登录**仅在中控系统设置改密** |
| **登录账号** | `APP_USERNAME` / `APP_PASSWORD` | 三实例 `.env`(建议三所统一) | 直链实例 `/login` 使用;**仅在系统设置中修改** |
| **中控登录** | `HUB_USERNAME` / `HUB_PASSWORD` | 中控 `.env` | 中控网页登录;**仅在中控系统设置改密** |
说明
说明:
- **长期密钥一次生成不轮换**`setup_env.sh` 末尾调用 `scripts/bootstrap_deploy_secrets.py`已有非占位值不会被覆盖
- **SSO 链接不变**仍为中控每次签发默认 2 小时有效单次使用`HUB_SSO_TTL_SEC`),与长期 `HUB_BRIDGE_TOKEN` 分离
- 经中控 iframe / SSO 打开实例时可免输实例密码直链 IP/域名仍走 `/login`
- 首次部署可生成随机强密码用户日后在 **系统设置** 改密不经过本页
- **长期密钥一次生成,不轮换**:`setup_env.sh` 末尾调用 `scripts/bootstrap_deploy_secrets.py`;已有非占位值不会被覆盖.
- **SSO 链接不变**:仍为中控每次签发,默认 2 小时有效,单次使用(`HUB_SSO_TTL_SEC`),与长期 `HUB_BRIDGE_TOKEN` 分离.
- 经中控 iframe / SSO 打开实例时,可免输实例密码;直链 IP/域名仍走 `/login`.
- 首次部署可生成随机强密码;用户日后在 **系统设置** 改密,不经过本页.
---
## 3. 页面布局三列卡片
## 3. 页面布局(三列卡片)
| 列 1 | 列 2 | 列 3 |
|------|------|------|
| 交易所与实盘 | 企业微信 | 交易执行 |
| 交易风控 | 账户冷静期 | 自动划转 |
| 当日资金 | 期权账户仅 OKX | |
| 当日资金 | 期权账户(仅 OKX) | |
> **AI 复盘**OpenAI / Ollama已移至中控 **系统设置 → AI 配置**保存后强制同步三所 `.env`详见 [中控AI与密钥配置.md](./中控AI与密钥配置.md)
> **AI 复盘**(OpenAI / Ollama)已移至中控 **系统设置 → AI 配置**,保存后强制同步三所 `.env`.详见 [中控AI与密钥配置.md](./中控AI与密钥配置.md).
Binance / Gate 无期权模块时第三列最后一格不显示或显示「本所无期权」
Binance / Gate 无期权模块时,第三列最后一格不显示或显示「本所无期权」.
---
## 4. 各卡片字段中文展示名
## 4. 各卡片字段(中文展示名)
### 4.1 交易所与实盘
| 中文名 | 说明 | 重启 |
|--------|------|------|
| 开启实盘下单 | 关闭时仅走本地流程不向交易所发单 | 需重启 |
| 开启实盘下单 | 关闭时仅走本地流程,不向交易所发单 | 需重启 |
| API Key | 永续子账户 API Key | 需重启 |
| API Secret | 永续子账户 Secret | 需重启 |
| API Passphrase | 仅 OKX 显示 | 需重启 |
| 保证金模式 | 全仓 / 逐仓 | 需重启 |
| 持仓模式 | 双向 / 单向净持仓等按所 | 需重启 |
| 仓位查询类型 | 仅 OKX如 SWAP | 需重启 |
| 持仓模式 | 双向 / 单向净持仓等(按所) | 需重启 |
| 仓位查询类型 | 仅 OKX:如 SWAP | 需重启 |
| 账户备注 | 企业微信推送中显示的交易所备注 | 保存即生效 |
**本卡片不包含**网页登录账号密码是否关闭登录校验中控通信密钥
**本卡片不包含**:网页登录账号密码,是否关闭登录校验,中控通信密钥.
---
@@ -77,16 +77,16 @@ Binance / Gate 无期权模块时,第三列最后一格不显示或显示「
| 中文名 | 说明 |
|--------|------|
| 机器人 Webhook | 行情风控提醒推送地址 |
| 推送超时(秒) | 可选默认 10 |
| 机器人 Webhook | 行情,风控,提醒推送地址 |
| 推送超时(秒) | 可选,默认 10 |
---
### 4.3 AI 复盘已移至中控
### 4.3 AI 复盘(已移至中控)
AI 相关环境变量`AI_PROVIDER``OPENAI_*``OLLAMA_*``AI_MODEL``AI_TIMEOUT_SECONDS`**不再在本页展示**
AI 相关环境变量(`AI_PROVIDER`,`OPENAI_*`,`OLLAMA_*`,`AI_MODEL`,`AI_TIMEOUT_SECONDS`)**不再在本页展示**.
请在中控 **系统设置 → AI 配置** 修改保存后写入中控 `.env`**强制同步** 至 OKX / Binance / Gate 三实例详见 [中控AI与密钥配置.md](./中控AI与密钥配置.md)
请在中控 **系统设置 → AI 配置** 修改;保存后写入中控 `.env`**强制同步** 至 OKX / Binance / Gate 三实例.详见 [中控AI与密钥配置.md](./中控AI与密钥配置.md).
---
@@ -103,23 +103,23 @@ AI 相关环境变量(`AI_PROVIDER`、`OPENAI_*`、`OLLAMA_*`、`AI_MODEL`、`
| 允许方向 | 多 / 空 / 双向 |
| 币种白名单开关 | |
| 白名单币种 | 逗号分隔 |
| 交易日切点北京时间 | 默认 8 点 |
| 交易日切点(北京时间) | 默认 8 点 |
| 切点前禁止新开仓 | |
| 最大同时持仓 | |
| 人工最低盈亏比 | |
| 强制清仓开关 | |
| 强制清仓整点北京 | |
| 强制清仓整点(北京) | |
---
### 4.5 交易风控日内开仓
### 4.5 交易风控(日内开仓)
| 中文名 | 说明 |
|--------|------|
| 单日开仓提醒阈值 | 达到次数后 AI 克制提醒不拦单 |
| 单日开仓硬上限 | 0 表示不启用达到后禁止新开仓 |
| 单日开仓提醒阈值 | 达到次数后 AI 克制提醒(不拦单) |
| 单日开仓硬上限 | 0 表示不启用;达到后禁止新开仓 |
详见 [daily-open-limit.md](./daily-open-limit.md)
详见 [daily-open-limit.md](./daily-open-limit.md).
---
@@ -128,12 +128,12 @@ AI 相关环境变量(`AI_PROVIDER`、`OPENAI_*`、`OLLAMA_*`、`AI_MODEL`、`
| 中文名 | 说明 |
|--------|------|
| 冷静期总开关 | |
| 手动平仓冷静小时 | |
| 复盘情绪冷静小时 | |
| 手动平仓冷静(小时) | |
| 复盘情绪冷静(小时) | |
| 日手动平仓次数上限 | |
| 情绪标签日冻结 | |
详见 [account-risk-cooldown.md](./account-risk-cooldown.md)
详见 [account-risk-cooldown.md](./account-risk-cooldown.md).
---
@@ -142,13 +142,13 @@ AI 相关环境变量(`AI_PROVIDER`、`OPENAI_*`、`OLLAMA_*`、`AI_MODEL`、`
| 中文名 | 说明 |
|--------|------|
| 启用自动划转 | |
| 目标余额U | 交易账户目标 USDT |
| 目标余额(U) | 交易账户目标 USDT |
| 划出账户 | funding / swap |
| 划入账户 | swap / funding |
| 执行整点北京时间 | |
| 执行整点(北京时间) | |
| 划转币种 | 默认 USDT |
详见 [auto-transfer-daily.md](./auto-transfer-daily.md)
详见 [auto-transfer-daily.md](./auto-transfer-daily.md).
---
@@ -156,53 +156,53 @@ AI 相关环境变量(`AI_PROVIDER`、`OPENAI_*`、`OLLAMA_*`、`AI_MODEL`、`
| 中文名 | 说明 |
|--------|------|
| 日起始基数U | |
| 回撤后基数U | |
| 盈利后基数U | |
| 日起始基数(U) | |
| 回撤后基数(U) | |
| 盈利后基数(U) | |
与自动划转目标余额相互独立若需一致请手动对齐
与自动划转目标余额相互独立;若需一致请手动对齐.
---
### 4.9 期权账户仅 OKX
### 4.9 期权账户(仅 OKX)
| 中文名 | 说明 |
|--------|------|
| 启用期权模块 | |
| 期权 API Key / Secret / Passphrase | 主账户与永续子账户分离 |
| 期权 API Key / Secret / Passphrase | 主账户,与永续子账户分离 |
| 期权账户备注 | |
| 单笔预算USDC | |
| 单笔预算(USDC) | |
| 预算缓冲比例 | |
| 默认标的 | 如 ETH |
| 最大到期天数 | 等常用策略参数 |
高级参数与完整说明见 [期权方案.md](./期权方案.md)[期权用法.md](./期权用法.md)
高级参数与完整说明见 [期权方案.md](./期权方案.md),[期权用法.md](./期权用法.md).
---
## 5. 操作说明
1. 修改后点 **保存**即时生效项立即应用需重启项写入 `.env` 但未重启进程
2. 含需重启项时点 **保存并重启**`.env` 后 PM2 重启当前实例
3. **重新加载**从磁盘重新读取 `.env` 刷新表单放弃未保存修改)。
4. 敏感项API密钥显示为掩码**留空提交表示不修改原值**
1. 修改后点 **保存**:即时生效项立即应用;需重启项写入 `.env` 但未重启进程.
2. 含需重启项时点 **保存并重启**:`.env` 后 PM2 重启当前实例.
3. **重新加载**:从磁盘重新读取 `.env` 刷新表单(放弃未保存修改).
4. 敏感项(API,密钥)显示为掩码;**留空提交表示不修改原值**.
---
## 6. 隐藏项本页不展示
## 6. 隐藏项(本页不展示)
以下仍存在于 `.env`仅供运维或 SSH 修改
以下仍存在于 `.env`,仅供运维或 SSH 修改:
- 服务`APP_HOST``APP_PORT``APP_DEBUG`
- 数据`DB_PATH``UPLOAD_DIR`
- 关键位门控全部 `KEY_*``KLINE_*`
- 轮询与同步`BALANCE_REFRESH_SECONDS``PRICE_REFRESH_SECONDS``MONITOR_POLL_SECONDS``BREAKEVEN_*``RECONCILE_*`
- 代理`OKX_SOCKS_PROXY``BINANCE_HTTP_PROXY`
- 备份`BACKUP_*`
- 中控嵌入细节`APP_ALLOW_HUB_EMBED``HUB_EMBED_*``APP_COOKIE_SECURE`
- 登录相关`APP_AUTH_DISABLED``APP_USERNAME``APP_PASSWORD``FLASK_SECRET_KEY``HUB_BRIDGE_TOKEN`
- 服务:`APP_HOST`,`APP_PORT`,`APP_DEBUG`
- 数据:`DB_PATH`,`UPLOAD_DIR`
- 关键位门控:全部 `KEY_*`,`KLINE_*`
- 轮询与同步:`BALANCE_REFRESH_SECONDS`,`PRICE_REFRESH_SECONDS`,`MONITOR_POLL_SECONDS`,`BREAKEVEN_*`,`RECONCILE_*`
- 代理:`OKX_SOCKS_PROXY`,`BINANCE_HTTP_PROXY`
- 备份:`BACKUP_*`
- 中控嵌入细节:`APP_ALLOW_HUB_EMBED`,`HUB_EMBED_*`,`APP_COOKIE_SECURE`
- 登录相关:`APP_AUTH_DISABLED`,`APP_USERNAME`,`APP_PASSWORD`,`FLASK_SECRET_KEY`,`HUB_BRIDGE_TOKEN`
后续若需要可增加「高级模式」折叠区默认关闭
后续若需要可增加「高级模式」折叠区,默认关闭.
---
@@ -211,19 +211,19 @@ AI 相关环境变量(`AI_PROVIDER`、`OPENAI_*`、`OLLAMA_*`、`AI_MODEL`、`
| 能力 | env 配置 | 系统设置 | 中控系统设置 |
|------|----------|----------|--------------|
| 登录用户名/密码 | ❌ | ✅ 账户密码修改 | ✅ 中控账户密码 |
| 交易所 API | ✅各所自配 | ❌ | ❌ |
| AI / OpenAI | ❌ | ❌ | ✅ AI 配置同步三所 |
| 交易所 API | ✅(各所自配) | ❌ | ❌ |
| AI / OpenAI | ❌ | ❌ | ✅ AI 配置(同步三所) |
| 导航/区块显示 | ❌ | ✅ 导航显示 | ✅ 显示与导航 |
| 手动资金划转 | ❌ | ✅ 永续资金划转 | ❌ |
| 数据导出 | ❌ | ✅ 数据导出 | ❌ |
| 期权兑换/划转 UI | ❌ | ✅OKX可开关 | ❌ |
| 期权兑换/划转 UI | ❌ | ✅(OKX,可开关) | ❌ |
系统设置说明见 [系统设置说明.md](./系统设置说明.md)中控 AI 与部署密钥见 [中控AI与密钥配置.md](./中控AI与密钥配置.md)
系统设置说明见 [系统设置说明.md](./系统设置说明.md);中控 AI 与部署密钥见 [中控AI与密钥配置.md](./中控AI与密钥配置.md).
---
## 8. 实现备注开发用
## 8. 实现备注(开发用)
- 白名单分组`lib/env/env_ui_manifest.py``exchange_key` 过滤
- 中文标签`ENV_UI_LABELS` 映射模板只渲染 `label` / `note`
- 全量校验仍基于 `.env.example`POST 仅接受 manifest 内 key
- 白名单分组:`lib/env/env_ui_manifest.py`(`exchange_key` 过滤)
- 中文标签:`ENV_UI_LABELS` 映射,模板只渲染 `label` / `note`
- 全量校验仍基于 `.env.example`;POST 仅接受 manifest 内 key
+135 -135
View File
@@ -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`含首尾交易日 |
## 区间统计统计栏
基于当前 **列表筛选结果**含盈利/亏损/犯病勾选合约搜索交易所下拉仍限定数据源):
| 指标 | 说明 |
|------|------|
| 总开仓次数 | 区间内开仓笔数 |
| 盈利单 / 亏损单 | 盈亏 &gt; 0 / &lt; 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`(含首尾交易日) |
## 区间统计(统计栏)
基于当前 **列表筛选结果**(含盈利/亏损/犯病勾选,合约搜索;交易所下拉仍限定数据源):
| 指标 | 说明 |
|------|------|
| 总开仓次数 | 区间内开仓笔数 |
| 盈利单 / 亏损单 | 盈亏 &gt; 0 / &lt; 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
View File
@@ -1,147 +1,147 @@
# 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/`** | 中控 APIK 线归档计仓器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)
+22 -22
View File
@@ -1,7 +1,7 @@
# 宏观关键数据 · 风控前置
中控 **系统设置** 手动录入 FOMC / CPI / 就业数据发布时间**监控区** 发布前后各 1 小时给出风险提示
**不看公布结果不解读数据**仅作波动窗口前的行为提醒**不拦截下单**与账户冷静期/日冻结独立)。
中控 **系统设置** 手动录入 FOMC / CPI / 就业数据发布时间,**监控区** 发布前后各 1 小时给出风险提示.
**不看公布结果,不解读数据**,仅作波动窗口前的行为提醒;**不拦截下单**(与账户冷静期/日冻结独立).
## 支持的数据类型
@@ -11,15 +11,15 @@
| `cpi` | 美国 CPI 通胀 |
| `employment` | 就业与劳工数据 |
每项在设置中 **名称下拉三选一****发布时间** 手动输入北京时间精确到分钟)。FOMC 只录 **一条**决议公布时刻即可)。
每项在设置中 **名称下拉三选一**,**发布时间** 手动输入(北京时间,精确到分钟).FOMC 只录 **一条**(决议公布时刻即可).
## 风险窗口
- 默认**发布时间 ±1 小时**
- 发布前 **30 分钟内**文案加强为「即将发布」
- 窗口结束后横幅自动消失设置列表中过期记录逐步不再展示
- 默认:**发布时间 ±1 小时**
- 发布前 **30 分钟内**:文案加强为「即将发布」
- 窗口结束后横幅自动消失;设置列表中过期记录逐步不再展示
环境变量可选):
环境变量(可选):
```env
HUB_MACRO_WINDOW_BEFORE_SEC=3600
@@ -30,34 +30,34 @@ HUB_MACRO_LIST_FUTURE_DAYS=60
## 监控区提示文案
读取当前监控板**任意交易所有持仓 = 有仓**否则 = 无仓
读取当前监控板:**任意交易所有持仓 = 有仓**,否则 = 无仓.
| 场景 | 提示要点 |
|------|----------|
| 无仓 · 窗口内 | 建议等待避免新开仓 |
| 有仓 · 窗口内 | 注意仓位勿加仓检查止损/减仓 |
| 即将发布30 分钟内 | 在上述基础上标注剩余分钟数 |
| 无仓 · 窗口内 | 建议等待,避免新开仓 |
| 有仓 · 窗口内 | 注意仓位,勿加仓,检查止损/减仓 |
| 即将发布(30 分钟内) | 在上述基础上标注剩余分钟数 |
## 存储
- SQLite`manual_trading_hub/data/hub_macro_calendar.db`
- 可覆盖`HUB_MACRO_CALENDAR_DB_PATH`
- SQLite:`manual_trading_hub/data/hub_macro_calendar.db`
- 可覆盖:`HUB_MACRO_CALENDAR_DB_PATH`
`macro_events``event_type`, `event_at_ms`, `note`, `created_at_ms`, `updated_at_ms`
同类型 + 同一发布时间不可重复录入
`macro_events`:`event_type`, `event_at_ms`, `note`, `created_at_ms`, `updated_at_ms`
同类型 + 同一发布时间不可重复录入.
## API均需中控登录
## API(均需中控登录)
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/macro-calendar/meta` | 类型列表与窗口说明 |
| GET | `/api/macro-calendar/events` | 设置页列表 |
| GET | `/api/macro-calendar/active` | 当前处于窗口内的事件监控横幅 |
| GET | `/api/macro-calendar/active` | 当前处于窗口内的事件(监控横幅) |
| POST | `/api/macro-calendar/events` | 新增 |
| PATCH | `/api/macro-calendar/events/{id}` | 更新 |
| DELETE | `/api/macro-calendar/events/{id}` | 删除 |
请求体示例
请求体示例:
```json
{
@@ -69,15 +69,15 @@ HUB_MACRO_LIST_FUTURE_DAYS=60
## 使用习惯
1. 每月在金十/日历查看 **FOMCCPI非农** 公布时间
1. 每月在金十/日历查看 **FOMC,CPI,非农** 公布时间
2. 中控 **系统设置 → 宏观关键数据** 录入 13 条
3. 到点前后监控区顶栏出现 **宏观风控** 横幅无操作则窗口结束后自动消失
3. 到点前后监控区顶栏出现 **宏观风控** 横幅;无操作则窗口结束后自动消失
## 与账户风控的关系
| 模块 | 时机 | 作用 |
|------|------|------|
| 宏观日历 | **事前** | 已知高波动窗口提醒等待或管仓 |
| 宏观日历 | **事前** | 已知高波动窗口,提醒等待或管仓 |
| 账户冷静期/日冻结 | **事后** | 用户主动平仓后的惩罚性限制 |
宏观提醒 **不触发** 冷静期不计入手动平仓次数
宏观提醒 **不触发** 冷静期,不计入手动平仓次数.
+31 -31
View File
@@ -1,31 +1,31 @@
# 实盘下单 · 预估盈亏比
## 功能
三所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` 口径一致
# 实盘下单 · 预估盈亏比
## 功能
三所(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` 口径一致
+73 -73
View File
@@ -1,73 +1,73 @@
# 计仓模式三所统一
## 配置
在各实例 `.env` 中设置**仅能通过 env 切换修改后须重启进程**):
```env
# risk默认= 以损定仓
# full_margin = 全仓杠杆合约可用保证金 × 比例
POSITION_SIZING_MODE=risk
FULL_MARGIN_BUFFER_RATIO=0.98
# 关键位程序自动单默认 false详见各所 关键位自动下单说明.md
KEY_AUTO_ORDER_ENABLED=false
```
切换为全仓杠杆前**交易所须无持仓**`MAX_ACTIVE_POSITIONS` 默认 1全仓模式会强制单仓)。
## 模式说明
| 模式 | 保证金计算 | 杠杆 | 允许入口 |
|------|------------|------|----------|
| `risk` | `RISK_PERCENT` × 交易资金按止损距离反推 | 表单可选 / 同步交易所 | 实盘人工关键位自动`KEY_AUTO_ORDER_ENABLED=true`)、趋势回调顺势加仓 |
| `full_margin` | **合约账户可用 USDT × `FULL_MARGIN_BUFFER_RATIO`**保留 2 位小数 | BTC/ETH **10x**其它 **5x**`BTC_LEVERAGE`/`ALT_LEVERAGE` 一致 | **实盘人工下单****关键位触价**`KEY_AUTO_ORDER_ENABLED=true`);阻力/支撑仅提醒 |
全仓模式下
- **`KEY_AUTO_ORDER_ENABLED=false`默认** 时触价程序自动单也不执行
- **`KEY_AUTO_ORDER_ENABLED=true`** 时仅触价可程序自动开仓箱体/斐波等仍禁止
- 仍校验 **计划盈亏比**实盘用 `MANUAL_MIN_PLANNED_RR`触价开仓用 `KEY_AUTO_MIN_PLANNED_RR`)。
- 下单张数由 `prepare_order_amount` + 交易所 `amount_to_precision` 决定
- `order_monitors.initial_stop_loss` 仍记录**开仓时**止损快照交易记录复盘以该快照为准
- 已存在的 **箱体突破 / 收敛突破 / 斐波 / 假突破** 监控进程启动时**自动撤销**并企业微信通知
## 不允许全仓模式
- 关键位箱体突破收敛突破斐波假突破添加时拒绝已存在则启动时撤销)。
- 趋势回调顺势加仓策略入口返回明确错误)。
**允许须 `KEY_AUTO_ORDER_ENABLED=true`):** 关键位 **回调触价开仓** / **突破触价开仓**程序盯价触达/穿越计划入场后市价成交无交易所挂单全仓下仅允许一条待触发)。
## `KEY_AUTO_ORDER_ENABLED`三所统一默认 `false`
| 计仓 | 开关 | 效果 |
|------|------|------|
| `risk` | `false` | 关闭全部关键位程序自动单含触价);顺势加仓不受影响 |
| `risk` | `true` | 关键位全套自动旧行为 |
| `full_margin` | `false` | 关闭触价自动 |
| `full_margin` | `true` | 仅触价自动 |
详见各实例目录 `关键位自动下单说明.md`
## 用脚本更新三所 `.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
```
# 计仓模式(三所统一)
## 配置
在各实例 `.env` 中设置(**仅能通过 env 切换,修改后须重启进程**):
```env
# risk(默认)= 以损定仓
# full_margin = 全仓杠杆(合约可用保证金 × 比例)
POSITION_SIZING_MODE=risk
FULL_MARGIN_BUFFER_RATIO=0.98
# 关键位程序自动单(默认 false,详见各所 关键位自动下单说明.md)
KEY_AUTO_ORDER_ENABLED=false
```
切换为全仓杠杆前:**交易所须无持仓**(`MAX_ACTIVE_POSITIONS` 默认 1,全仓模式会强制单仓).
## 模式说明
| 模式 | 保证金计算 | 杠杆 | 允许入口 |
|------|------------|------|----------|
| `risk` | `RISK_PERCENT` × 交易资金,按止损距离反推 | 表单可选 / 同步交易所 | 实盘人工,关键位自动(`KEY_AUTO_ORDER_ENABLED=true`),趋势回调,顺势加仓 |
| `full_margin` | **合约账户可用 USDT × `FULL_MARGIN_BUFFER_RATIO`**(保留 2 位小数) | BTC/ETH **10x**,其它 **5x**(`BTC_LEVERAGE`/`ALT_LEVERAGE` 一致) | **实盘人工下单**,**关键位触价**(`KEY_AUTO_ORDER_ENABLED=true`);阻力/支撑仅提醒 |
全仓模式下:
- **`KEY_AUTO_ORDER_ENABLED=false`(默认)** 时,触价程序自动单也不执行.
- **`KEY_AUTO_ORDER_ENABLED=true`** 时,仅触价可程序自动开仓;箱体/斐波等仍禁止.
- 仍校验 **计划盈亏比**(实盘用 `MANUAL_MIN_PLANNED_RR`;触价开仓用 `KEY_AUTO_MIN_PLANNED_RR`).
- 下单张数由 `prepare_order_amount` + 交易所 `amount_to_precision` 决定.
- `order_monitors.initial_stop_loss` 仍记录**开仓时**止损快照;交易记录复盘以该快照为准.
- 已存在的 **箱体突破 / 收敛突破 / 斐波 / 假突破** 监控:进程启动时**自动撤销**并企业微信通知.
## 不允许(全仓模式)
- 关键位:箱体突破,收敛突破,斐波,假突破(添加时拒绝;已存在则启动时撤销).
- 趋势回调,顺势加仓(策略入口返回明确错误).
**允许(须 `KEY_AUTO_ORDER_ENABLED=true`):** 关键位 **回调触价开仓** / **突破触价开仓**(程序盯价,触达/穿越计划入场后市价成交,无交易所挂单;全仓下仅允许一条待触发).
## `KEY_AUTO_ORDER_ENABLED`(三所统一,默认 `false`)
| 计仓 | 开关 | 效果 |
|------|------|------|
| `risk` | `false` | 关闭全部关键位程序自动单(含触价);顺势加仓不受影响 |
| `risk` | `true` | 关键位全套自动(旧行为) |
| `full_margin` | `false` | 关闭触价自动 |
| `full_margin` | `true` | 仅触价自动 |
详见各实例目录 `关键位自动下单说明.md`.
## 用脚本更新三所 `.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
View File
@@ -1,41 +1,41 @@
# Chrome 桌面快捷方式图标说明
## 图标从哪来
用 Chrome **「创建快捷方式」** 或 **「安装应用」** 时桌面/开始菜单图标**不是**操作系统自带的而是浏览器从**你打开的网站**读取的优先级大致为
1. `manifest.webmanifest` 里的 `icons`192×192512×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`.
+34 -34
View File
@@ -1,34 +1,34 @@
# 策略文档
各交易实例的人工下单策略供 UI / 复盘对齐
| 文档 | 实例 | 状态 |
|------|------|------|
| [binance-alt-trend-long.md](./binance-alt-trend-long.md) | 币安山寨·多头趋势 | v0.4 讨论稿 |
| [okx-trend-both.md](./okx-trend-both.md) | OKX·多空趋势 | v0.4 讨论稿 |
| [gate-intraday.md](./gate-intraday.md) | Gate·BTC 日内 | v0.2 |
## 约定
- **不写盈亏比趋势户**币安/OKX 止盈/止损随行情人工设定趋势 MD 不量化 RR
- **日内例外**Gate 日内 **最低 1:1** 才开仓持仓目标可动态调整见 [gate-intraday.md](./gate-intraday.md))。
- **界面趋势户 · v0.4**两级 — **反转**启动 A/B| **顺势**大分歧 A/B| **波段**小分歧);`lib/trade/entry_model_lib.py` 三所共用
- **界面短标签日内户**`假破` / `结构突破`
- **多空共用三字**方向由「做多/做空」表达不复用为「大分歧A多」等
- **自动联动**大分歧 A/B → 趋势单**小分歧 → 波段单**平仓写入交易记录 `entry_reason`复盘「填入」自动带入
- **杠杆默认**BTC/ETH **10x**其它 **5x**与开仓类型无关env `BTC_LEVERAGE` / `ALT_LEVERAGE`)。
- **日内 profile 独立**env 启用 `TRADE_SYMBOL_WHITELIST=BTC,ETH` 且限制开启时**不显示** 大分歧三项Gate);开仓类型为 **假破 / 结构突破**见 gate-intraday.md)。
- **日内 0 点出场**策略称「0 点平仓」程序为 `FORCE_CLOSE_ENABLED` + `FORCE_CLOSE_BJ_HOUR=0`交易记录 `result=强制清仓`与表单 1h/2h/4h `time_close` 无关)。
- **策略模块独立**趋势回调顺势加仓不走上述三项
## 系统实现
-`lib/trade/entry_model_lib.py`
- 趋势户表单`lib/instance/templates/order_entry_model_fields.html`
- 日内判定`is_intraday_trading_profile()`白名单仅含 BTC/ETH
- 0 点强平`force_close_before_reset()`三所 `app.py`);env `FORCE_CLOSE_ENABLED` / `FORCE_CLOSE_BJ_HOUR`
## 相关文档
- [计仓模式](../position-sizing-mode.md)
- [趋势回调策略](../trend-pullback-strategy.md)
# 策略文档
各交易实例的人工下单策略,供 UI / 复盘对齐.
| 文档 | 实例 | 状态 |
|------|------|------|
| [binance-alt-trend-long.md](./binance-alt-trend-long.md) | 币安山寨·多头趋势 | v0.4 讨论稿 |
| [okx-trend-both.md](./okx-trend-both.md) | OKX·多空趋势 | v0.4 讨论稿 |
| [gate-intraday.md](./gate-intraday.md) | Gate·BTC 日内 | v0.2 |
## 约定
- **不写盈亏比(趋势户)**:币安/OKX 止盈/止损随行情人工设定,趋势 MD 不量化 RR.
- **日内例外**:Gate 日内 **最低 1:1** 才开仓,持仓目标可动态调整(见 [gate-intraday.md](./gate-intraday.md)).
- **界面(趋势户 · v0.4)**:两级 — **反转**(启动 A/B)| **顺势**(大分歧 A/B)| **波段**(小分歧);`lib/trade/entry_model_lib.py` 三所共用.
- **界面短标签(日内户)**:`假破` / `结构突破`.
- **多空共用三字**:方向由「做多/做空」表达,不复用为「大分歧A多」等.
- **自动联动**:大分歧 A/B → 趋势单;**小分歧 → 波段单**;平仓写入交易记录 `entry_reason`;复盘「填入」自动带入.
- **杠杆默认**:BTC/ETH **10x**,其它 **5x**;与开仓类型无关(env `BTC_LEVERAGE` / `ALT_LEVERAGE`).
- **日内 profile 独立**:env 启用 `TRADE_SYMBOL_WHITELIST=BTC,ETH` 且限制开启时,**不显示** 大分歧三项(Gate);开仓类型为 **假破 / 结构突破**(见 gate-intraday.md).
- **日内 0 点出场**:策略称「0 点平仓」;程序为 `FORCE_CLOSE_ENABLED` + `FORCE_CLOSE_BJ_HOUR=0`,交易记录 `result=强制清仓`(与表单 1h/2h/4h `time_close` 无关).
- **策略模块独立**:趋势回调,顺势加仓不走上述三项.
## 系统实现
-:`lib/trade/entry_model_lib.py`
- 趋势户表单:`lib/instance/templates/order_entry_model_fields.html`
- 日内判定:`is_intraday_trading_profile()`(白名单仅含 BTC/ETH)
- 0 点强平:`force_close_before_reset()`(三所 `app.py`);env `FORCE_CLOSE_ENABLED` / `FORCE_CLOSE_BJ_HOUR`
## 相关文档
- [计仓模式](../position-sizing-mode.md)
- [趋势回调策略](../trend-pullback-strategy.md)
+194 -194
View File
@@ -1,194 +1,194 @@
# 币安山寨·多头趋势账户
> **状态**v0.4反转·启动 A/B 两级 UI 已实现策略正文 + `entry_model_lib`
---
## 1. 账户定位
| 项 | 说明 |
|----|------|
| 交易所 | 币安合约 |
| 方向 | **仅做多**`TRADE_DIRECTION=long_only` |
| 计仓 | `POSITION_SIZING_MODE=risk` |
| 关键位自动单 | `KEY_AUTO_ORDER_ENABLED=false` |
| UI profile | **趋势户**非 BTC/ETH 白名单日内 |
---
## 2. 开仓类型两级 UI · 三所共用
### 2.1 趋势户反转 / 顺势 / 波段
| 第一级 | 第二级 | code | 联动 |
|--------|--------|------|------|
| **反转** | 启动 A / 启动 B | `launch_a` / `launch_b` | 趋势单 |
| **顺势** | 大分歧 A / 大分歧 B | `big_div_a` / `big_div_b` | 趋势单 |
| **波段** | 小分歧 | `small_div` | 波段单 |
实现`lib/trade/entry_model_lib.py` + `order_entry_model_fields.html` + `order_entry_model.js`币安 / OKX / Gate 趋势户共用)。
### 2.2 杠杆与开仓类型无关
| 币种 | 默认杠杆 |
|------|----------|
| BTCETH | **10x**`BTC_LEVERAGE` |
| 其它山寨 | **5x**`ALT_LEVERAGE` |
---
## 3. 反转·启动做多讨论定稿
**性质**反转 — 在**新主升确认之前**的作战与大分歧顺势不是同一行情阶段
**周期**背离与箱体以 **4h** 为主**日线与 4h 同处筑底阶段时结构边界以日线为准**作战后半段可用 **5m** 节奏启动 A2)。
### 3.0 流程总览
```text
MACD 背离严格筛选→ 标「参考高点」
第 1 次到高点附近 → 不做V 形
回落箱内中间复杂形态不盯
第 2 次到高点附近 → 开战
├─ 见小收敛 ──────────→ 启动 AA1
└─ 不见收敛 ──────────→ 启动 B实体突破
├─ 成 → 主升后续才用顺势·大分歧 / 波段·小分歧
└─ 败 → 止损正常
跌破箱高一半 → 暂弃等再次到高点附近
仍在上半区 + 5m 不创新低 + N 字 → 启动 AA2
```
### 3.1 背离何时进入候选池MACD · 4h
全部满足才承认「有过背离」
| 规则 | 说明 |
|------|------|
| 级别 | **至少 4h** MACD 底背离 |
| 首次背离不做 | 第一段背离只观察不交易 |
| 通道式下跌不做 | 顺滑通道下滑中的背离不当反转依据 |
| 波段结构 | 有明显的波段高点低点 |
| 分段下跌 | **三段及以上**明显下跌之后才开始寻找背离 |
背离确认后**标注最后一个显著高点为「参考高点」**后文「高点附近」均相对此点)。
> 横盘**时长不量化**关键是顺序**跌 → 背离 → 背离后的震荡**而非下跌中继
### 3.2 参考高点两次摸高
| 次序 | 规则 |
|------|------|
| **第 1 次**到参考高点附近 | **不关注不做**假突破未突破都算「到过附近」— 视为 **V 形反弹**风险区 |
| 回落箱内 | 箱内复杂形态**不是主战场**不强行交易 |
| **第 2 次**到参考高点附近 | **开始关注**进入作战区 |
### 3.3 启动 B实体突破
**条件**第二次及以后靠近参考高点且**未见**再次摸高前的小收敛
| 项 | 说明 |
|----|------|
| 入场 | **实体突破**参考高点 / 箱体上沿影线刺破不算 |
| 成功 | 走出主升 → 后续单型转为顺势·大分歧 / 波段·小分歧 |
| 失败 | 突破后未主升回到箱内震荡 → **止损属正常** → 若满足 §3.4下一笔用 **启动 AA2** |
### 3.4 启动 A结构内 / 试仓含 A1 与 A2
**性质**主升**确认前**在箱内找风险可控入场**不是**小分歧
#### A1 · 第二次摸高前的小收敛
- 在第 2 次到参考高点**之前**出现**小的收敛结构** → 突破前企稳进场
- 若**看不到**小收敛不强行做 A1改走 **启动 B**§3.3)。
#### A2 · 启动 B 失败后的 5m N 字仍记启动 A
在启动 B 止损后
| 暂弃 | 可试启动 A2 |
|------|-------------|
| 回箱后继续跌且**跌破箱体高度一半** | **未**跌破箱一半 |
| 暂不看直至**再次**到参考高点附近 | 且 **5m 不创新低** |
| | 且 **突破 5m 高点** → 按 **5m N 字形突破** 试仓 |
- 5m 止损一般不大此位置**允许多次试错**突破路径约可错 2 次5m 试仓约可错 3 次 — 同一参考高点周期内具体计数实操自定)。
- **5m N 字试仓不单列开仓类型**复盘统一记 **启动 A**可备注「A2 / 5m N」)。
### 3.5 与大分歧小分歧的边界
| | 反转·启动 | 顺势·大分歧 | 波段·小分歧 |
|---|-----------|-------------|-------------|
| 前端 | 跌 → 背离 → 箱 → 两次摸高 | 主升已确立 | 主升已确立 |
| V 形 | 第 1 次摸高不做 | — | — |
| 5m N 试仓 | **启动 AA2** | — | 不同于小分歧 |
| 第三次不做 | — | — | ✓ |
---
## 4. 顺势·大分歧趋势单
**前提****主升浪已确立**上方仍有空间前端是主升里的整理**不要**求「跌 → 背离 → 箱 → 两次摸高」那条反转链
### 4.1 大分歧 A
- 4h/日线大结构向上
- 5m/15m 收敛**不创新低** 企稳进不等突破
### 4.2 大分歧 B
- 同上大级别多头结构
- **突破确认** 后入场实体突破优先
---
## 5. 波段·小分歧波段单
**前提**主升**已走出**反转链启动 A/B进行中**不做**小分歧
- **前两次**可做**第三次不做**
- 低吸为主不追突破
- 入场二次探底 → N 字突破或 5m 三均线重新多头排列
---
## 6. 纪律
1. 不做空
2. 反转首次背离不做通道跌背离不做第 1 次摸参考高点不做V 形
3. 顺势第三次小分歧不做新单小分歧不追突破
4. 止盈/止损/是否手平**随行情**本文档不量化 RR
---
## 7. 持仓与出场定性
| 单型 | 说明 |
|------|------|
| 启动 A/B | 赌新主升B 失败可转 A2未确立主升前不做小分歧 |
| 大分歧 | 可长持途中两次小分歧后远目标未到**可手平** |
| 小分歧 | 短拿常手平 |
---
## 8. 系统字段
| 操作 | 字段 |
|------|------|
| 下单 | `order_monitors.entry_model``launch_a` / `launch_b` / `big_div_a` / `big_div_b` / `small_div` |
| 平仓 | `trade_records.entry_reason` = 界面标签 |
| 复盘 | 与开仓类型一致 + 策略项 +「其他」 |
---
## 修订记录
| 版本 | 日期 | 说明 |
|------|------|------|
| v0.4 | 2026-07-06 | 反转·启动 A/B 两级 UI 上线共用 entry_model_lib |
| v0.2 | 2026-07-06 | 定稿 UI 短标签大分歧/小分歧);实现代码联动 |
| v0.1 | 2026-07-06 | 讨论稿 |
# 币安山寨·多头趋势账户
> **状态**:v0.4(反转·启动 A/B 两级 UI 已实现;策略正文 + `entry_model_lib`)
---
## 1. 账户定位
| 项 | 说明 |
|----|------|
| 交易所 | 币安合约 |
| 方向 | **仅做多**(`TRADE_DIRECTION=long_only`) |
| 计仓 | `POSITION_SIZING_MODE=risk` |
| 关键位自动单 | `KEY_AUTO_ORDER_ENABLED=false` |
| UI profile | **趋势户**(非 BTC/ETH 白名单日内) |
---
## 2. 开仓类型(两级 UI · 三所共用)
### 2.1 趋势户:反转 / 顺势 / 波段
| 第一级 | 第二级 | code | 联动 |
|--------|--------|------|------|
| **反转** | 启动 A / 启动 B | `launch_a` / `launch_b` | 趋势单 |
| **顺势** | 大分歧 A / 大分歧 B | `big_div_a` / `big_div_b` | 趋势单 |
| **波段** | 小分歧 | `small_div` | 波段单 |
实现:`lib/trade/entry_model_lib.py` + `order_entry_model_fields.html` + `order_entry_model.js`(币安 / OKX / Gate 趋势户共用).
### 2.2 杠杆(与开仓类型无关)
| 币种 | 默认杠杆 |
|------|----------|
| BTC,ETH | **10x**(`BTC_LEVERAGE`) |
| 其它山寨 | **5x**(`ALT_LEVERAGE`) |
---
## 3. 反转·启动(做多,讨论定稿)
**性质**:反转 — 在**新主升确认之前**的作战;与大分歧(顺势)不是同一行情阶段.
**周期**:背离与箱体以 **4h** 为主;**日线与 4h 同处筑底阶段时,结构边界以日线为准**.作战后半段可用 **5m** 节奏(启动 A2).
### 3.0 流程总览
```text
MACD 背离(严格筛选)→ 标「参考高点」
第 1 次到高点附近 → 不做(V 形)
回落箱内(中间复杂形态不盯)
第 2 次到高点附近 → 开战
├─ 见小收敛 ──────────→ 启动 A(A1)
└─ 不见收敛 ──────────→ 启动 B(实体突破)
├─ 成 → 主升(后续才用顺势·大分歧 / 波段·小分歧)
└─ 败 → 止损(正常)
跌破箱高一半 → 暂弃,等再次到高点附近
仍在上半区 + 5m 不创新低 + N 字 → 启动 A(A2)
```
### 3.1 背离:何时进入候选池(MACD · 4h)
全部满足才承认「有过背离」:
| 规则 | 说明 |
|------|------|
| 级别 | **至少 4h** MACD 底背离 |
| 首次背离不做 | 第一段背离只观察,不交易 |
| 通道式下跌不做 | 顺滑通道下滑中的背离,不当反转依据 |
| 波段结构 | 有明显的波段高点,低点 |
| 分段下跌 | **三段及以上**明显下跌之后,才开始寻找背离 |
背离确认后:**标注最后一个显著高点为「参考高点」**(后文「高点附近」均相对此点).
> 横盘**时长不量化**;关键是顺序:**跌 → 背离 → 背离后的震荡**,而非下跌中继.
### 3.2 参考高点:两次摸高
| 次序 | 规则 |
|------|------|
| **第 1 次**到参考高点附近 | **不关注,不做**.假突破,未突破都算「到过附近」— 视为 **V 形反弹**风险区 |
| 回落箱内 | 箱内复杂形态**不是主战场**,不强行交易 |
| **第 2 次**到参考高点附近 | **开始关注**,进入作战区 |
### 3.3 启动 B(实体突破)
**条件**:第二次(及以后)靠近参考高点,且**未见**再次摸高前的小收敛.
| 项 | 说明 |
|----|------|
| 入场 | **实体突破**参考高点 / 箱体上沿(影线刺破不算) |
| 成功 | 走出主升 → 后续单型转为顺势·大分歧 / 波段·小分歧 |
| 失败 | 突破后未主升,回到箱内震荡 → **止损属正常** → 若满足 §3.4,下一笔用 **启动 A(A2)** |
### 3.4 启动 A(结构内 / 试仓,含 A1 与 A2)
**性质**:主升**确认前**在箱内找风险可控入场;**不是**小分歧.
#### A1 · 第二次摸高前的小收敛
- 在第 2 次到参考高点**之前**,出现**小的收敛结构** → 突破前企稳进场.
- 若**看不到**小收敛,不强行做 A1,改走 **启动 B**(§3.3).
#### A2 · 启动 B 失败后的 5m N 字(仍记启动 A)
在启动 B 止损后:
| 暂弃 | 可试启动 A2 |
|------|-------------|
| 回箱后继续跌,且**跌破箱体高度一半** | **未**跌破箱一半 |
| 暂不看,直至**再次**到参考高点附近 | 且 **5m 不创新低** |
| | 且 **突破 5m 高点** → 按 **5m N 字形突破** 试仓 |
- 5m 止损一般不大;此位置**允许多次试错**(突破路径约可错 2 次;5m 试仓约可错 3 次 — 同一参考高点周期内,具体计数实操自定).
- **5m N 字试仓不单列开仓类型**,复盘统一记 **启动 A**(可备注「A2 / 5m N」).
### 3.5 与大分歧,小分歧的边界
| | 反转·启动 | 顺势·大分歧 | 波段·小分歧 |
|---|-----------|-------------|-------------|
| 前端 | 跌 → 背离 → 箱 → 两次摸高 | 主升已确立 | 主升已确立 |
| V 形 | 第 1 次摸高不做 | — | — |
| 5m N 试仓 | **启动 A(A2)** | — | 不同于小分歧 |
| 第三次不做 | — | — | ✓ |
---
## 4. 顺势·大分歧(趋势单)
**前提**:**主升浪已确立**,上方仍有空间;前端是主升里的整理,**不要**求「跌 → 背离 → 箱 → 两次摸高」那条反转链.
### 4.1 大分歧 A
- 4h/日线大结构向上
- 5m/15m 收敛,**不创新低** 企稳进(不等突破)
### 4.2 大分歧 B
- 同上大级别多头结构
- **突破确认** 后入场(实体突破优先)
---
## 5. 波段·小分歧(波段单)
**前提**:主升**已走出**;反转链(启动 A/B)进行中**不做**小分歧.
- **前两次**可做,**第三次不做**
- 低吸为主,不追突破
- 入场:二次探底 → N 字突破;或 5m 三均线重新多头排列
---
## 6. 纪律
1. 不做空
2. 反转:首次背离不做;通道跌背离不做;第 1 次摸参考高点不做(V 形)
3. 顺势:第三次小分歧不做新单;小分歧不追突破
4. 止盈/止损/是否手平:**随行情**,本文档不量化 RR
---
## 7. 持仓与出场(定性)
| 单型 | 说明 |
|------|------|
| 启动 A/B | 赌新主升;B 失败可转 A2;未确立主升前不做小分歧 |
| 大分歧 | 可长持;途中两次小分歧后远目标未到,**可手平** |
| 小分歧 | 短拿,常手平 |
---
## 8. 系统字段
| 操作 | 字段 |
|------|------|
| 下单 | `order_monitors.entry_model`:`launch_a` / `launch_b` / `big_div_a` / `big_div_b` / `small_div` |
| 平仓 | `trade_records.entry_reason` = 界面标签 |
| 复盘 | 与开仓类型一致 + 策略项 +「其他」 |
---
## 修订记录
| 版本 | 日期 | 说明 |
|------|------|------|
| v0.4 | 2026-07-06 | 反转·启动 A/B 两级 UI 上线(共用 entry_model_lib) |
| v0.2 | 2026-07-06 | 定稿 UI 短标签(大分歧/小分歧);实现代码联动 |
| v0.1 | 2026-07-06 | 讨论稿 |
+26 -26
View File
@@ -6,63 +6,63 @@
{
"title": "账户与方向",
"items": [
"本账户仅做多不做空",
"计仓模式为以损定仓risk),关键位自动单已关闭",
"已明确第一级反转 / 顺势 / 波段两级下拉已上线"
"本账户仅做多,不做空",
"计仓模式为以损定仓(risk),关键位自动单已关闭",
"已明确第一级:反转 / 顺势 / 波段(两级下拉已上线)"
]
},
{
"title": "反转 · 背离与箱体启动 A/B 共同前置",
"title": "反转 · 背离与箱体(启动 A/B 共同前置)",
"items": [
"4h MACD 底背离非首次背离非通道式下跌中的背离",
"有明显波段高/低点且三段及以上明显下跌后才认背离",
"背离后处于震荡箱体时长不量化非 V 形急跌急拉",
"已标注参考高点最后一个显著高点",
"第 1 次到参考高点附近 → 不做第 2 次到附近 → 才进入作战区"
"4h MACD 底背离(非首次背离,非通道式下跌中的背离)",
"有明显波段高/低点,且三段及以上明显下跌后才认背离",
"背离后处于震荡箱体(时长不量化;非 V 形急跌急拉)",
"已标注参考高点(最后一个显著高点)",
"第 1 次到参考高点附近 → 不做;第 2 次到附近 → 才进入作战区"
]
},
{
"title": "反转 · 启动 B实体突破",
"title": "反转 · 启动 B(实体突破)",
"items": [
"第 2 次到参考高点附近且未见再次摸高前的小收敛",
"实体突破参考高点/箱体上沿非仅影线",
"突破失败回箱止损属正常跌破箱高一半则暂弃直至再次到高点附近"
"第 2 次到参考高点附近,且未见再次摸高前的小收敛",
"实体突破参考高点/箱体上沿(非仅影线)",
"突破失败回箱止损属正常;跌破箱高一半则暂弃直至再次到高点附近"
]
},
{
"title": "反转 · 启动 A结构内含 A1 / A2",
"title": "反转 · 启动 A(结构内,含 A1 / A2)",
"items": [
"性质主升确认前不是小分歧",
"A1第 2 次摸高前出现小收敛 → 突破前企稳",
"A2启动 B 止损后未跌破箱高一半 + 5m 不创新低 + 5m N 字突破试仓",
"5m 试仓记为启动 A不单列类型);小止损允许多次试错"
"性质:主升确认前;不是小分歧",
"A1:第 2 次摸高前出现小收敛 → 突破前企稳",
"A2:启动 B 止损后,未跌破箱高一半 + 5m 不创新低 + 5m N 字突破试仓",
"5m 试仓记为启动 A(不单列类型);小止损允许多次试错"
]
},
{
"title": "顺势 · 大分歧 A / B",
"items": [
"主升已确立上方仍有空间非跌后背离筑底阶段",
"大分歧A5m/15m 收敛且不创新低企稳",
"大分歧B突破已确认优先实体突破"
"主升已确立,上方仍有空间(非跌后背离筑底阶段)",
"大分歧A:5m/15m 收敛且不创新低企稳",
"大分歧B:突破已确认,优先实体突破"
]
},
{
"title": "波段 · 小分歧",
"items": [
"主升已确立反转链进行中不做小分歧",
"主升已确立;反转链进行中不做小分歧",
"第三次小分歧 → 不做新单",
"不追突破二次探底 N 字或 5m 三均线重新多头"
"不追突破;二次探底 N 字或 5m 三均线重新多头"
]
},
{
"title": "杠杆与出场",
"items": [
"杠杆BTC/ETH 10x其它山寨 5x可选手改但须有理由",
"止盈止损随行情人工设定不在此清单量化 RR"
"杠杆:BTC/ETH 10x,其它山寨 5x(可选手改但须有理由)",
"止盈止损随行情人工设定,不在此清单量化 RR"
]
}
],
"footnotes": [
"v0.4两级 UI 已实现启动 A 含 A1 收敛与 A2B 失败后 5m N 字)。"
"v0.4:两级 UI 已实现;启动 A 含 A1 收敛与 A2(B 失败后 5m N 字)."
]
}
+13 -13
View File
@@ -6,33 +6,33 @@
{
"title": "方向与均线过滤",
"items": [
"仅交易 BTC同时仅 1 仓",
"15m 21/55/144 排列清晰多或空),纠缠则不做",
"仅交易 BTC,同时仅 1 仓",
"15m 21/55/144 排列清晰(多或空),纠缠则不做",
"1H 方向与 15m 不冲突",
"21 均线关系满足回踩支撑 / 站稳上方(多)或反弹承压 / 压在下方(空)"
"21 均线关系满足:回踩支撑 / 站稳上方(多)或反弹承压 / 压在下方(空)"
]
},
{
"title": "开仓类型 A / B",
"items": [
"已选定假破 或 结构突破二选一",
"假破扫流动性后回到结构内5m N 字 + 15m 顶/底分型齐全",
"结构突破15m 收盘价站稳关键位非仅刺破",
"止损带宽 0.4%1.5%超出则不做",
"下单前空间至少 1:1不足则不做"
"已选定:假破 或 结构突破(二选一)",
"假破:扫流动性后回到结构内,5m N 字 + 15m 顶/底分型齐全",
"结构突破:15m 收盘价站稳关键位,非仅刺破",
"止损带宽 0.4%1.5%,超出则不做",
"下单前空间至少 1:1,不足则不做"
]
},
{
"title": "一日节奏与笔数",
"items": [
"非周末在早窗 / 晚窗计划时段内",
"今日笔数未达上限 3连错未达 2 笔",
"宽幅震荡S1时降频或不做",
"0 点前须了结系统强制清仓);本清单不含手动平仓"
"非周末;在早窗 / 晚窗计划时段内",
"今日笔数未达上限 3,连错未达 2 笔",
"宽幅震荡(S1)时降频或不做",
"0 点前须了结(系统强制清仓);本清单不含手动平仓"
]
}
],
"footnotes": [
"系统FORCE_CLOSE_ENABLED 开启时北京时间 0 点自动强制清仓result=强制清仓"
"系统:FORCE_CLOSE_ENABLED 开启时,北京时间 0 点自动强制清仓(result=强制清仓)"
]
}
+28 -28
View File
@@ -6,67 +6,67 @@
{
"title": "账户与方向",
"items": [
"已选定做多或做空且与 4H/大级别结构方向一致",
"趋势户 profile非 Gate 日内 BTC/ETH 白名单",
"计仓模式为以损定仓risk),关键位自动单已关闭",
"已选定做多或做空,且与 4H/大级别结构方向一致",
"趋势户 profile(非 Gate 日内 BTC/ETH 白名单)",
"计仓模式为以损定仓(risk),关键位自动单已关闭",
"同一币种无未计划的对冲叠仓",
"已明确第一级反转 / 顺势 / 波段两级下拉已上线"
"已明确第一级:反转 / 顺势 / 波段(两级下拉已上线)"
]
},
{
"title": "反转 · 背离与箱体启动 A/B 共同前置",
"title": "反转 · 背离与箱体(启动 A/B 共同前置)",
"items": [
"做多4h MACD 底背离做空4h MACD 顶背离",
"非首次背离非通道式涨跌中的背离明显波段高低点 + 三段及以上涨/跌后才认背离",
"背离后处于震荡箱体时长不量化非 V 形急拉急杀",
"做多已标参考高点做空已标参考低点",
"第 1 次到参考极值附近 → 不做第 2 次到附近 → 才进入作战区"
"做多:4h MACD 底背离;做空:4h MACD 顶背离",
"非首次背离;非通道式涨跌中的背离;明显波段高低点 + 三段及以上涨/跌后才认背离",
"背离后处于震荡箱体(时长不量化;非 V 形急拉急杀)",
"做多:已标参考高点;做空:已标参考低点",
"第 1 次到参考极值附近 → 不做;第 2 次到附近 → 才进入作战区"
]
},
{
"title": "反转 · 启动 B实体突破",
"title": "反转 · 启动 B(实体突破)",
"items": [
"第 2 次到参考极值附近且未见再次摸极值前的小收敛",
"做多实体突破参考高点/箱顶做空实体跌破参考低点/箱底",
"第 2 次到参考极值附近,且未见再次摸极值前的小收敛",
"做多:实体突破参考高点/箱顶;做空:实体跌破参考低点/箱底",
"突破失败回箱止损属正常",
"做多跌破箱高一半暂弃做空涨破箱低一半暂弃直至再次到极值附近"
"做多:跌破箱高一半暂弃;做空:涨破箱低一半暂弃;直至再次到极值附近"
]
},
{
"title": "反转 · 启动 A结构内含 A1 / A2",
"title": "反转 · 启动 A(结构内,含 A1 / A2)",
"items": [
"性质主趋势确认前不是小分歧",
"A1第 2 次摸极值前出现小收敛 → 突破前企稳",
"A2 做多B 止损后未跌破箱一半 + 5m 不创新低 + 5m N 字",
"A2 做空B 止损后未涨破箱一半 + 5m 不创新高 + 5m 倒 N 字",
"5m 试仓记为启动 A不单列);小止损允许多次试错"
"性质:主趋势确认前;不是小分歧",
"A1:第 2 次摸极值前出现小收敛 → 突破前企稳",
"A2 做多:B 止损后未跌破箱一半 + 5m 不创新低 + 5m N 字",
"A2 做空:B 止损后未涨破箱一半 + 5m 不创新高 + 5m 倒 N 字",
"5m 试仓记为启动 A(不单列);小止损允许多次试错"
]
},
{
"title": "顺势 · 大分歧 A / B",
"items": [
"主趋势已确立非涨/跌后背离筑底/筑顶阶段",
"做多大分歧A5m/15m 收敛且不创新低做空不创新高",
"大分歧B突破已确认优先实体突破"
"主趋势已确立(非涨/跌后背离筑底/筑顶阶段)",
"做多大分歧A:5m/15m 收敛且不创新低;做空:不创新高",
"大分歧B:突破已确认,优先实体突破"
]
},
{
"title": "波段 · 小分歧",
"items": [
"主趋势已确立反转链进行中不做小分歧",
"主趋势已确立;反转链进行中不做小分歧",
"第三次小分歧 → 不做新单",
"做多二次探底 N 字 / 5m 三均线多头做空二次探顶倒 N / 5m 空头"
"做多:二次探底 N 字 / 5m 三均线多头;做空:二次探顶倒 N / 5m 空头"
]
},
{
"title": "杠杆与出场",
"items": [
"杠杆BTC/ETH 10x其它山寨 5x可选手改但须有理由",
"止盈止损随行情人工设定不在此清单量化 RR"
"杠杆:BTC/ETH 10x,其它山寨 5x(可选手改但须有理由)",
"止盈止损随行情人工设定,不在此清单量化 RR"
]
}
],
"footnotes": [
"v0.4两级 UI 反转/顺势/波段做多细则见 binance-alt-trend-long.md §3"
"v0.4:两级 UI 反转/顺势/波段;做多细则见 binance-alt-trend-long.md §3."
]
}
+101 -101
View File
@@ -1,6 +1,6 @@
# Gate·BTC 日内账户
> **状态**v0.2策略定稿**0 点强平已实现**日内 UI 隐藏平仓/委托/移动保本 **待实现**
> **状态**:v0.2(策略定稿;**0 点强平已实现**;日内 UI 隐藏平仓/委托/移动保本 **待实现**)
---
@@ -10,143 +10,143 @@
|----|------|
| 交易所 | Gate 合约 |
| 品种 | **仅 BTC** |
| 方向 | **多空都做**由过滤条件决定非手选方向 |
| 计仓 | `POSITION_SIZING_MODE=full_margin`全仓杠杆 |
| UI profile | **日内户**`TRADE_SYMBOL_WHITELIST=BTC,ETH` 且限制开启本策略只交易 BTC |
| 与趋势户关系 | **不使用** 大分歧 A/B/小分歧**不使用**「趋势单 / 波段单」手选 |
| 方向 | **多空都做**(由过滤条件决定,非手选方向) |
| 计仓 | `POSITION_SIZING_MODE=full_margin`(全仓杠杆) |
| UI profile | **日内户**(`TRADE_SYMBOL_WHITELIST=BTC,ETH` 且限制开启;本策略只交易 BTC) |
| 与趋势户关系 | **不使用** 大分歧 A/B/小分歧;**不使用**「趋势单 / 波段单」手选 |
### 资金与杠杆执行约定
### 资金与杠杆(执行约定)
| 项 | 说明 |
|----|------|
| 账户规模 | 约 300U测试阶段 |
| 日交易基数 | **50U**早 8:00 重置为 50U不延续前日阶梯 |
| 单笔阶梯 | 上一笔 **+10U / 10U** 调节下一笔基数赢 60U / 亏 40U 等 |
| 账户规模 | 约 300U(测试阶段) |
| 日交易基数 | **50U**(早 8:00 重置为 50U,不延续前日阶梯) |
| 单笔阶梯 | 上一笔 **+10U / 10U** 调节下一笔基数(赢 60U / 亏 40U 等) |
| 杠杆 | **10× 全仓** |
| 一次一单 | 同时仅 **1** 个 Gate 仓位 |
| 止损带宽 | **0.4%1.5%**结构要求更宽则 **不做** |
| 止损带宽 | **0.4%1.5%**(结构要求更宽则 **不做**) |
---
## 2. 周期分层
自上而下**先定能不能做再做哪一类**
自上而下,**先定能不能做,再做哪一类**:
| 层级 | 周期 | 作用 |
|------|------|------|
| 方向过滤 | **1H** | 大方向**不得与 15m 排列反向** |
| 均线 + 结构 | **15m** | 21/55/144 排列顶底分型结构识别**B 类收盘突破** |
| 触发 | **5m** | **A 类**N 字形突破配合 15m 分型 |
| 方法 | 裸 K + 三均线 | 形态确认入场与止损锚点 |
| 方向过滤 | **1H** | 大方向;**不得与 15m 排列反向** |
| 均线 + 结构 | **15m** | 21/55/144 排列,顶底分型,结构识别,**B 类收盘突破** |
| 触发 | **5m** | **A 类**:N 字形突破(配合 15m 分型) |
| 方法 | 裸 K + 三均线 | 形态确认,入场与止损锚点 |
**不做「趋势单」概念**持仓以 **小时**当日了结与币安/OKX 多日趋势户区分
**不做「趋势单」概念**:持仓以 **小时**,当日了结;与币安/OKX 多日趋势户区分.
---
## 3. 方向过滤必过
## 3. 方向过滤(必过)
### 3.1 15m 三均线21 / 55 / 144
### 3.1 15m 三均线(21 / 55 / 144)
| 15m 排列 | 只允许 |
|----------|--------|
| **多头排列**21 > 55 > 144 | **只做多** |
| **空头排列**21 < 55 < 144 | **只做空** |
| 纠缠粘合不符合 | **不做** |
| **多头排列**(21 > 55 > 144) | **只做多** |
| **空头排列**(21 < 55 < 144) | **只做空** |
| 纠缠,粘合,不符合 | **不做** |
### 3.2 与 1H 同向
- **做多**15m 多头排列**1H 不得为空头排列**1H 均线不能与 15m 方向相反)。
- **做空**15m 空头排列**1H 不得为多头排列**
- 1H/15m 方向冲突 → **当日该方向不做**
- **做多**:15m 多头排列,**1H 不得为空头排列**(1H 均线不能与 15m 方向相反).
- **做空**:15m 空头排列,**1H 不得为多头排列**.
- 1H/15m 方向冲突 → **当日该方向不做**.
### 3.3 21 均线关系才允许开仓
### 3.3 21 均线关系(才允许开仓)
入场须与 **21 均线** 发生有效关系避免 distant 追单
入场须与 **21 均线** 发生有效关系,避免 distant 追单:
| 方向 | 要求定性 |
| 方向 | 要求(定性) |
|------|----------------|
| **做多** | 多头排列下**回踩 21 附近获支撑** 或 **站稳 21 上方** 后再按 playbook 入场 |
| **做空** | 空头排列下**反弹 21 附近承压** 或 **压在 21 下方** 后再按 playbook 入场 |
| **做多** | 多头排列下,**回踩 21 附近获支撑** 或 **站稳 21 上方** 后再按 playbook 入场 |
| **做空** | 空头排列下,**反弹 21 附近承压** 或 **压在 21 下方** 后再按 playbook 入场 |
---
## 4. 开仓类型仅两类
## 4. 开仓类型(仅两类)
界面日后仅两个短标签全称见下表 hover / 本文):
界面日后仅两个短标签(全称见下表 hover / 本文):
| 界面标签 | 存储 code建议 | 本质 |
| 界面标签 | 存储 code(建议) | 本质 |
|----------|-------------------|------|
| **假破** | `liquidity_false_break` | 流动性扫单 → 假突破验证 → **5m N 字****15m 顶/底分型** |
| **结构突破** | `structure_breakout` | **15m 结构有效突破****收盘确认** |
| **结构突破** | `structure_breakout` | **15m 结构有效突破**(**收盘确认**) |
子结构 **不单独占主下拉**可在复盘备注或二级标签中记录
子结构 **不单独占主下拉**,可在复盘备注或二级标签中记录.
---
## 5. A 类假破流动性 / 假突破
## 5. A 类:假破(流动性 / 假突破)
**适用**关键位附近 **扫止损** 后价格 **回到结构内**陷阱确认后再反向做
**适用**:关键位附近 **扫止损** 后价格 **回到结构内**,陷阱确认后再反向做.
### 5.1 流程
```text
1H/15m 方向 + 21 均线过滤通过
→ 假突破出现扫高/扫低
→ 验证为「假」收回结构内 / 反向裸 K 确认
→ 5m 走出 N 字二次探底/探顶后沿允许方向突破
→ 15m 出现底分型(多)或顶分型(空)
→ 假突破出现(扫高/扫低)
→ 验证为「假」(收回结构内 / 反向裸 K 确认)
→ 5m 走出 N 字(二次探底/探顶后,沿允许方向突破)
→ 15m 出现底分型(多)或顶分型(空)
→ 入场
```
### 5.2 做多 / 做空对称
### 5.2 做多 / 做空(对称)
| 步骤 | 做多 | 做空 |
|------|------|------|
| 假破 | 向下扫低后快速拉回支撑/箱上 | 向上扫高后跌回阻力/箱下 |
| 5m N 字 | 扫低 → 反弹 → 不破前低 → 向上突破 | 扫高 → 回落 → 不过前高 → 向下突破 |
| 15m 确认 | **底分型** | **顶分型** |
| 止损 | 假破极值或 N 字低点 **外侧**仍须落在 0.4%1.5% | 对称 |
| 目标 | **最低 1:1**之后 **随行情动态** 部分止盈移动止损或延伸 | 对称 |
| 止损 | 假破极值或 N 字低点 **外侧**(仍须落在 0.4%1.5%) | 对称 |
| 目标 | **最低 1:1**;之后 **随行情动态** 部分止盈,移动止损或延伸 | 对称 |
### 5.3 注意
- **须等假破验证完成**扫完不追
- **5m N + 15m 分型** 为入场必要条件缺一不可
- 与大级别 **宽幅震荡S1** 叠加时假信号多优先 **降频或不做**
- **须等假破验证完成**,扫完不追.
- **5m N + 15m 分型** 为入场必要条件,缺一不可.
- 与大级别 **宽幅震荡(S1)** 叠加时假信号多,优先 **降频或不做**.
---
## 6. B 类结构突破
## 6. B 类:结构突破
**适用**15m 上结构清晰方向与均线排列一致**收盘突破** 后顺势做
**适用**:15m 上结构清晰,方向与均线排列一致,**收盘突破** 后顺势做.
### 6.1 子结构均属 B 类
### 6.1 子结构(均属 B 类)
双顶双底头肩顶/底收敛三角/楔形)、箱体等——**统一记为「结构突破」**
双顶,双底,头肩顶/底,收敛(三角/楔形),箱体等——**统一记为「结构突破」**.
### 6.2 突破确认
- **以 15m K 线收盘价为准** 突破关键位颈线箱边收敛边界等)。
- **仅刺破未收盘站稳** → **不算** 有效突破不做
- 可选**收盘突破后回踩** 再进裸 K 确认),仍须满足 21 均线关系与 **≥1:1** 空间
- **以 15m K 线收盘价为准** 突破关键位(颈线,箱边,收敛边界等).
- **仅刺破,未收盘站稳** → **不算** 有效突破,不做.
- 可选:**收盘突破后回踩** 再进(裸 K 确认),仍须满足 21 均线关系与 **≥1:1** 空间.
### 6.3 止损与目标
| 项 | 说明 |
|----|------|
| 止损 | 结构另一侧或突破位回退点 **外侧**0.4%1.5%超出则不做 |
| 目标 | 下单前 **至少 1:1**到位后 **随行情动态** 调整不写死固定 RR |
| 止损 | 结构另一侧或突破位回退点 **外侧**(0.4%1.5%,超出则不做) |
| 目标 | 下单前 **至少 1:1**;到位后 **随行情动态** 调整,不写死固定 RR |
| 空间不足 | 最近阻力/支撑导致 **达不到 1:1****不做** |
---
## 7. 行情状态辅助过滤
## 7. 行情状态(辅助过滤)
| 状态 | 特征 | Gate 动作 |
|------|------|-----------|
| **S0 趋势** | 1H/15m 排列清晰高低点有序 | 正常A/B 均可 |
| **S1 宽幅震荡** | 大箱横盘多日均线反复穿 | **降频或不做** |
| **S2 末期/选边** | 贴边收敛刚突破或假破频发 | 优先 **A 假破****B 收敛突破** |
| **S0 趋势** | 1H/15m 排列清晰,高低点有序 | 正常:A/B 均可 |
| **S1 宽幅震荡** | 大箱横盘多日,均线反复穿 | **降频或不做** |
| **S2 末期/选边** | 贴边收敛,刚突破或假破频发 | 优先 **A 假破****B 收敛突破** |
---
@@ -155,19 +155,19 @@
| 项 | 规则 |
|----|------|
| 周末 | **不开新仓** |
| 早窗 | 约 **9:00**8:0012:00 内),**计划内第 1 笔** |
| 下午 | **默认不开新仓**持仓可保留至晚窗 |
| 晚窗 | 约 **21:00**20:0023:00 内),**计划内第 2 笔** |
| 第 3 笔 | 仅当 **未连错 2 笔****早/晚有一笔为止损出场****补 1 笔** |
| 早窗 | 约 **9:00**(8:0012:00 内),**计划内第 1 笔** |
| 下午 | **默认不开新仓**(持仓可保留至晚窗) |
| 晚窗 | 约 **21:00**(20:0023:00 内),**计划内第 2 笔** |
| 第 3 笔 | 仅当 **未连错 2 笔**,**早/晚有一笔为止损出场**,**补 1 笔** |
| 日上限 | **最多 3 笔** |
| **连错 2 笔** | **当日不再开新仓**第 3 笔名额作废 |
| **连错 2 笔** | **当日不再开新仓**(第 3 笔名额作废) |
**连错计数**
**连错计数**:
| 出场 | 是否算「错 1 笔」 |
|------|------------------|
| **计划止损**触发 | ✅ 算 |
| **0 点强制清仓**系统结果 `强制清仓`且亏损 | ✅ 算 |
| **0 点强制清仓**(系统结果 `强制清仓`)且亏损 | ✅ 算 |
| 止盈 / ≥1:1 按计划平 | ❌ 不算 |
| 0 点强制清仓且盈利或平推 | ❌ 不算 |
@@ -177,53 +177,53 @@
### 9.1 盈亏比
- 开仓前**第一目标空间 ≥ 止损距离最低 1:1**
- 持仓中目标 **随行情动态** 调整本文档 **不量化** 固定止盈比例
- 开仓前:**第一目标空间 ≥ 止损距离(最低 1:1)**.
- 持仓中:目标 **随行情动态** 调整;本文档 **不量化** 固定止盈比例.
### 9.2 禁止「手动止损」
- **亏损出场** 必须来自 **开仓时设定的计划止损**交易所或监控等价执行)。
- **禁止** 盘中亏着 **手点平仓** 充当止损破坏统计与连错规则)。
- 若违规手动平亏**视为当日纪律失败建议停手**复盘结果 **不得** 记为「止损」糊弄统计
- **亏损出场** 必须来自 **开仓时设定的计划止损**(交易所或监控等价执行).
- **禁止** 盘中亏着 **手点平仓** 充当止损(破坏统计与连错规则).
- 若违规手动平亏:**视为当日纪律失败,建议停手**;复盘结果 **不得** 记为「止损」糊弄统计.
### 9.3 时间出场仅 0 点程序已实现
### 9.3 时间出场:仅 0 点(程序已实现)
- **唯一** 时间类出场**当日 0:00北京时间前必须空仓**赚赔都平)。
- **不使用** 下单表单里的 1h / 2h / 4h「开仓后 N 小时平」`time_close`);与本策略无关
- **程序兜底**三所共用Gate 已启用):
- **唯一** 时间类出场:**当日 0:00(北京时间)前必须空仓**(赚赔都平).
- **不使用** 下单表单里的 1h / 2h / 4h「开仓后 N 小时平」(`time_close`);与本策略无关.
- **程序兜底**(三所共用,Gate 已启用):
| env | 说明 |
|-----|------|
| `FORCE_CLOSE_ENABLED=true` | 开启整点强制清仓 |
| `FORCE_CLOSE_BJ_HOUR=0` | 北京时间 **0 点那一小时**00:0000:59执行 |
| `FORCE_CLOSE_BJ_HOUR=0` | 北京时间 **0 点那一小时**(00:0000:59)执行 |
- 实现`force_close_before_reset()`各实例 `app.py` 后台循环调用)。
- 行为对该小时仍 **active**`order_monitors` **市价全平**取消交易所触发单写交易记录
- **系统结果字段**`result = 强制清仓`备注含「北京时间 0:00 整点风控清仓」
- **策略口语「0 点平仓」= 系统「强制清仓」**统计连错时按 §8 盈亏判定不按字段名区分
- 实现:`force_close_before_reset()`(各实例 `app.py` 后台循环调用).
- 行为:对该小时仍 **active**`order_monitors` **市价全平**,取消交易所触发单,写交易记录.
- **系统结果字段**:`result = 强制清仓`;备注含「北京时间 0:00 整点风控清仓」.
- **策略口语「0 点平仓」= 系统「强制清仓」**,统计连错时按 §8 盈亏判定,不按字段名区分.
> **与 `TRADING_DAY_RESET_HOUR=8` 无关**后者只切 **交易日**统计8 点前禁开等),**不会**自动平仓
> **与 `TRADING_DAY_RESET_HOUR=8` 无关**:后者只切 **交易日**(统计,8 点前禁开等),**不会**自动平仓.
### 9.4 允许的出场类型统计用
### 9.4 允许的出场类型(统计用)
| 策略说法 | 系统 `result` | 说明 |
|----------|---------------|------|
| 止盈 | 止盈 / 移动止盈 / 保本止盈 等 | 计划止盈或 ≥1:1 后按计划/动态平 |
| 止损 | 止损 | 仅 **计划止损** 触发 |
| 0 点平仓 | **强制清仓** | 整点风控兜底§9.3 |
| ~~手动平仓~~ | 手动平仓 | **策略禁止**除极端技术故障等须复盘说明 |
| 0 点平仓 | **强制清仓** | 整点风控兜底(§9.3) |
| ~~手动平仓~~ | 手动平仓 | **策略禁止**(除极端技术故障等,须复盘说明) |
---
## 10. A / B 如何选择当日
## 10. A / B 如何选择(当日)
| 盘面 | 优先 |
|------|------|
| 刚扫流动性回到箱内 | **A 假破** |
| 结构清晰排列已顺收敛末端 | **B 结构突破** |
| 大箱乱扫均线粘合 | **不做** |
| 刚扫流动性,回到箱内 | **A 假破** |
| 结构清晰,排列已顺,收敛末端 | **B 结构突破** |
| 大箱乱扫,均线粘合 | **不做** |
早/晚窗 **有形态才做**无形态 = **0 笔**不占额度
早/晚窗 **有形态才做**,无形态 = **0 笔**,不占额度.
---
@@ -243,13 +243,13 @@
| 项 | 说明 |
|----|------|
| 日内 profile 判定 | `is_intraday_trading_profile()``lib/trade/entry_model_lib.py` |
| 0 点强制清仓 | `FORCE_CLOSE_ENABLED` + `FORCE_CLOSE_BJ_HOUR``force_close_before_reset()`结果 **`强制清仓`** |
| UI 标识 | 顶栏 **强制清仓 已开启** 徽章 + 持仓卡片 **倒计时**三所 + 中控 |
| 交易记录展示 | 三所 UI / 中控`强制清仓` 与止损同类 badge |
| 三所统一 | 币安 / OKX / Gate 同一函数与 env**将来改日内只需各所 `.env` 打开无需改代码** |
| 日内 profile 判定 | `is_intraday_trading_profile()`(`lib/trade/entry_model_lib.py`) |
| 0 点强制清仓 | `FORCE_CLOSE_ENABLED` + `FORCE_CLOSE_BJ_HOUR`;`force_close_before_reset()`;结果 **`强制清仓`** |
| UI 标识 | 顶栏 **强制清仓 已开启** 徽章 + 持仓卡片 **倒计时**(三所 + 中控) |
| 交易记录展示 | 三所 UI / 中控:`强制清仓` 与止损同类 badge |
| 三所统一 | 币安 / OKX / Gate 同一函数与 env;**将来改日内只需各所 `.env` 打开,无需改代码** |
Gate 当前建议 env节选):
Gate 当前建议 env(节选):
```env
FORCE_CLOSE_ENABLED=true
@@ -257,14 +257,14 @@ FORCE_CLOSE_BJ_HOUR=0
TRADING_DAY_RESET_HOUR=8
```
### 12.2 待实现UI / 纪律
### 12.2 待实现(UI / 纪律)
| 项 | 说明 |
|----|------|
| 开仓类型 | 界面 **`假破` / `结构突破`**code`liquidity_false_break` / `structure_breakout`);**无** trend/swing 手选 |
| 开仓类型 | 界面 **`假破` / `结构突破`**(code:`liquidity_false_break` / `structure_breakout`);**无** trend/swing 手选 |
| 写入字段 | `trade_records.entry_model` / 复盘下拉同两项 |
| 隐藏操作 | 日内 profile 下 **隐藏** 平仓委托移动保本**实例页 + 中控**`intraday_discipline` / `order_entry_profile=intraday` |
| 隐藏表单项 | 不展示 1h/2h/4h 时间平仓移动保本勾选避免与 §9.3 混用 |
| 隐藏操作 | 日内 profile 下 **隐藏** 平仓,委托,移动保本(**实例页 + 中控**,`intraday_discipline` / `order_entry_profile=intraday`) |
| 隐藏表单项 | 不展示 1h/2h/4h 时间平仓,移动保本勾选(避免与 §9.3 混用) |
| 后端可选 | 严格模式下拒绝 `del_order` / 改委托 API |
---
@@ -273,5 +273,5 @@ TRADING_DAY_RESET_HOUR=8
| 版本 | 日期 | 说明 |
|------|------|------|
| v0.1 | 2026-07-06 | 定稿BTC 日内1H+15m 均线A 假破5m N+15m 分型);B 结构突破15m 收盘);早1晚1/最多3笔/连错2停禁手动止损仅 0 点强平 |
| v0.2 | 2026-07-06 | §9.3/§12对齐 `FORCE_CLOSE_*` 与系统结果「强制清仓」区分 `time_close` / `TRADING_DAY_RESET_HOUR`Gate 已启用说明 |
| v0.1 | 2026-07-06 | 定稿:BTC 日内;1H+15m 均线;A 假破(5m N+15m 分型);B 结构突破(15m 收盘);早1晚1/最多3笔/连错2停;禁手动止损;仅 0 点强平 |
| v0.2 | 2026-07-06 | §9.3/§12:对齐 `FORCE_CLOSE_*` 与系统结果「强制清仓」;区分 `time_close` / `TRADING_DAY_RESET_HOUR`;Gate 已启用说明 |
+157 -157
View File
@@ -1,157 +1,157 @@
# OKX·多空趋势账户
> **状态**v0.4讨论稿反转·启动 A/B**UI 仍为 v0.2 三档**两级下拉待实现
---
## 1. 账户定位
| 项 | 说明 |
|----|------|
| 交易所 | OKX 永续合约 |
| 方向 | **做多 + 做空**`TRADE_DIRECTION=both`可按需限制 |
| 计仓 | `POSITION_SIZING_MODE=risk` |
| 关键位自动单 | `KEY_AUTO_ORDER_ENABLED=false` |
| UI profile | **趋势户**非 Gate BTC/ETH 日内白名单 |
**选方向原则**开仓前确认 4H / 日线大级别与所选「做多/做空」一致逆势单不在本策略范围内
做多侧反转细则与 [binance-alt-trend-long.md §3](./binance-alt-trend-long.md) 同构本文 **§3.2** 给出做空镜像
---
## 2. 开仓类型规划与现状
### 2.1 规划两级选择与币安共用实现
| 第一级 | 第二级 | 做多 | 做空 |
|--------|--------|------|------|
| **反转** | 启动 A / 启动 B | `launch_a` / `launch_b` | 同 code方向在表单 |
| **顺势** | 大分歧 A / B | `big_div_a` / `big_div_b` | 同左 |
| **波段** | 小分歧 | `small_div` | 同左 |
`lib/trade/entry_model_lib.py` + 共用模板/JS三所趋势户一致
### 2.2 现状下单监控 UI
两级下拉**性质** → **类型**提交 `entry_model` code
### 2.3 杠杆
BTC/ETH **10x**其它 **5x**与方向开仓类型无关
---
## 3. 反转·启动讨论定稿
**性质**反转 — 在新一轮主趋势**确认之前**作战与顺势·大分歧不是同一阶段
**周期**背离与箱体以 **4h** 为主**日线与 4h 同阶段时结构边界以日线为准**A2 可用 **5m** 节奏
### 3.1 做多跌后筑底 → 新主升
与币安 [§3](./binance-alt-trend-long.md) 一致摘要如下
```text
4h MACD 底背离严格筛选→ 标「参考高点」
第 1 次到高点附近 → 不做V 形
回落箱内 → 第 2 次到高点附近 → 开战
├─ 见小收敛 → 启动 AA1
└─ 不见收敛 → 启动 B实体突破
B 失败回箱 → 跌破箱一半暂弃否则 5m 不创新低 + N 字 → 启动 AA2
```
| 环节 | 规则 |
|------|------|
| 背离 | 4h MACD **底背离****首次**不做**通道式下跌**不做明显波段高低点 + **三段及以上**跌后才开始找背离 |
| 参考点 | 背离后标 **最后一个显著高点** |
| 两次摸高 | 第 1 次到高点附近假破/不破都算**不做**第 2 次才关注 |
| 启动 B | 无小收敛 → **实体突破**参考高点/箱顶 |
| 启动 A | A1摸高前小收敛A2B 止损后**未跌破箱一半** + **5m 不创新低** + **5m N 字** |
### 3.2 做空涨后筑顶 → 新主跌镜像
| 环节 | 做多 | 做空镜像 |
|------|------|----------------|
| 前端结构 | **跌** → 背离 → 箱 | **涨** → 背离 → 箱 |
| 背离 | 4h MACD **底背离** | 4h MACD **顶背离** |
| 背离过滤 | 首次不做**通道式下跌**不做三段及以上**跌** | 首次不做**通道式上涨**不做三段及以上**涨** |
| 参考点 | **参考高点** | **参考低点**最后一个显著低点 |
| 两次摸极值 | 第 1 次到**高点**附近不做V 形反弹 | 第 1 次到**低点**附近不做V 形下跌 |
| 作战区 | 第 2 次到**高点**附近 | 第 2 次到**低点**附近 |
| 启动 B | **实体跌破**参考低点/箱底 | 同上向下实体突破 |
| 启动 A1 | 第二次摸高前**小收敛** | 第二次摸低前**小收敛** |
| 启动 A2 | B 失败后**未跌破**箱一半**5m 不创新低****5m 高** N 字 | B 失败后**未涨破**箱一半**5m 不创新高**破 **5m 低**倒 N 字 |
| 成功后 | 主升 → 顺势大分歧 / 小分歧 | 主跌 → 顺势大分歧 / 小分歧 |
> 横盘**时长不量化**顺序为 **涨/跌 → 背离 → 背离后震荡**非趋势中继
### 3.3 与顺势波段的边界
| | 反转·启动 | 顺势·大分歧 | 波段·小分歧 |
|---|-----------|-------------|-------------|
| 做多前端 | 跌→背离→箱→两次摸高 | 主升已确立 | 主升已确立 |
| 做空前端 | 涨→背离→箱→两次摸低 | 主跌已确立 | 主跌已确立 |
| V 形 | 第 1 次摸极值不做 | — | — |
| 5m N 试仓 | **启动 AA2**非小分歧 | — | — |
| 第三次不做 | — | — | ✓ |
---
## 4. 顺势·大分歧趋势单
**前提**主趋势**已确立**上方(多)或下方(空)仍有空间**不要**求反转链§3)。
| | 做多 | 做空 |
|---|------|------|
| **大分歧 A** | 4h/日线多头5m/15m 收敛**不创新低**企稳 | 4h/日线空头5m/15m 收敛**不创新高**企稳 |
| **大分歧 B** | **向上突破**确认实体优先 | **向下突破**确认实体优先 |
---
## 5. 波段·小分歧波段单
**前提**主趋势**已走出**反转链进行中**不做**小分歧
- **前两次**可做**第三次不做**不追突破
- **做多**二次探底 → N 字或 5m 三均线重新多头
- **做空**二次探顶 → 倒 N或 5m 三均线重新空头
---
## 6. 纪律
1. 方向与大级别一致不做顺手反向单同一币种避免未计划对冲叠仓
2. **反转**首次背离不做通道式涨跌中的背离不做第 1 次摸参考极值不做V 形
3. **顺势**第三次小分歧不做小分歧不追突破
4. 止盈/止损/是否手平**随行情**本文档不量化 RR
---
## 7. 持仓与出场定性
| 单型 | 做多 | 做空 |
|------|------|------|
| 启动 A/B | 赌新主升B 失败可 A2确立前不做小分歧 | 赌新主跌同上镜像 |
| 大分歧 | 可长持两次小分歧后远目标未到可手平 | 同左 |
| 小分歧 | 短拿常手平 | 短拿常手平 |
---
## 8. 系统字段
| 操作 | 字段 |
|------|------|
| 下单现状 | `entry_model` + `trade_style`方向在订单侧 |
| 下单规划 | `launch_a` / `launch_b` + 两级 UI |
| 平仓 / 复盘 | `entry_reason` = 界面标签与币安一致 |
---
## 修订记录
| 版本 | 日期 | 说明 |
|------|------|------|
| v0.4 | 2026-07-06 | 反转·启动 A/B做多同币安 §3做空镜像);两级 UI 规划 |
| v0.3 | 2026-07-06 | 独立完整策略说明 |
| v0.2 | 2026-07-06 | 定稿 UI 短标签 |
# OKX·多空趋势账户
> **状态**:v0.4(讨论稿:反转·启动 A/B;**UI 仍为 v0.2 三档**,两级下拉待实现)
---
## 1. 账户定位
| 项 | 说明 |
|----|------|
| 交易所 | OKX 永续合约 |
| 方向 | **做多 + 做空**(`TRADE_DIRECTION=both`,可按需限制) |
| 计仓 | `POSITION_SIZING_MODE=risk` |
| 关键位自动单 | `KEY_AUTO_ORDER_ENABLED=false` |
| UI profile | **趋势户**(非 Gate BTC/ETH 日内白名单) |
**选方向原则**:开仓前确认 4H / 日线大级别与所选「做多/做空」一致;逆势单不在本策略范围内.
做多侧反转细则与 [binance-alt-trend-long.md §3](./binance-alt-trend-long.md) 同构;本文 **§3.2** 给出做空镜像.
---
## 2. 开仓类型(规划与现状)
### 2.1 规划:两级选择(与币安共用实现)
| 第一级 | 第二级 | 做多 | 做空 |
|--------|--------|------|------|
| **反转** | 启动 A / 启动 B | `launch_a` / `launch_b` | 同 code,方向在表单 |
| **顺势** | 大分歧 A / B | `big_div_a` / `big_div_b` | 同左 |
| **波段** | 小分歧 | `small_div` | 同左 |
`lib/trade/entry_model_lib.py` + 共用模板/JS,三所趋势户一致.
### 2.2 现状:下单监控 UI
两级下拉:**性质** → **类型**;提交 `entry_model` code.
### 2.3 杠杆
BTC/ETH **10x**,其它 **5x**;与方向,开仓类型无关.
---
## 3. 反转·启动(讨论定稿)
**性质**:反转 — 在新一轮主趋势**确认之前**作战;与顺势·大分歧不是同一阶段.
**周期**:背离与箱体以 **4h** 为主;**日线与 4h 同阶段时,结构边界以日线为准**;A2 可用 **5m** 节奏.
### 3.1 做多(跌后筑底 → 新主升)
与币安 [§3](./binance-alt-trend-long.md) 一致,摘要如下:
```text
4h MACD 底背离(严格筛选)→ 标「参考高点」
第 1 次到高点附近 → 不做(V 形)
回落箱内 → 第 2 次到高点附近 → 开战
├─ 见小收敛 → 启动 A(A1)
└─ 不见收敛 → 启动 B(实体突破)
B 失败回箱 → 跌破箱一半暂弃;否则 5m 不创新低 + N 字 → 启动 A(A2)
```
| 环节 | 规则 |
|------|------|
| 背离 | 4h MACD **底背离**;**首次**不做;**通道式下跌**不做;明显波段高低点 + **三段及以上**跌后才开始找背离 |
| 参考点 | 背离后标 **最后一个显著高点** |
| 两次摸高 | 第 1 次到高点附近(假破/不破都算)**不做**;第 2 次才关注 |
| 启动 B | 无小收敛 → **实体突破**参考高点/箱顶 |
| 启动 A | A1:摸高前小收敛;A2:B 止损后,**未跌破箱一半** + **5m 不创新低** + **5m N 字** |
### 3.2 做空(涨后筑顶 → 新主跌,镜像)
| 环节 | 做多 | 做空(镜像) |
|------|------|----------------|
| 前端结构 | **跌** → 背离 → 箱 | **涨** → 背离 → 箱 |
| 背离 | 4h MACD **底背离** | 4h MACD **顶背离** |
| 背离过滤 | 首次不做;**通道式下跌**不做;三段及以上**跌** | 首次不做;**通道式上涨**不做;三段及以上**涨** |
| 参考点 | **参考高点** | **参考低点**(最后一个显著低点) |
| 两次摸极值 | 第 1 次到**高点**附近不做(V 形反弹) | 第 1 次到**低点**附近不做(V 形下跌) |
| 作战区 | 第 2 次到**高点**附近 | 第 2 次到**低点**附近 |
| 启动 B | **实体跌破**参考低点/箱底 | 同上(向下实体突破) |
| 启动 A1 | 第二次摸高前**小收敛** | 第二次摸低前**小收敛** |
| 启动 A2 | B 失败后**未跌破**箱一半;**5m 不创新低**;**5m 高** N 字 | B 失败后**未涨破**箱一半;**5m 不创新高**;破 **5m 低**倒 N 字 |
| 成功后 | 主升 → 顺势大分歧 / 小分歧 | 主跌 → 顺势大分歧 / 小分歧 |
> 横盘**时长不量化**;顺序为 **涨/跌 → 背离 → 背离后震荡**,非趋势中继.
### 3.3 与顺势,波段的边界
| | 反转·启动 | 顺势·大分歧 | 波段·小分歧 |
|---|-----------|-------------|-------------|
| 做多前端 | 跌→背离→箱→两次摸高 | 主升已确立 | 主升已确立 |
| 做空前端 | 涨→背离→箱→两次摸低 | 主跌已确立 | 主跌已确立 |
| V 形 | 第 1 次摸极值不做 | — | — |
| 5m N 试仓 | **启动 A(A2)**,非小分歧 | — | — |
| 第三次不做 | — | — | ✓ |
---
## 4. 顺势·大分歧(趋势单)
**前提**:主趋势**已确立**;上方(多)或下方(空)仍有空间;**不要**求反转链(§3).
| | 做多 | 做空 |
|---|------|------|
| **大分歧 A** | 4h/日线多头;5m/15m 收敛,**不创新低**企稳 | 4h/日线空头;5m/15m 收敛,**不创新高**企稳 |
| **大分歧 B** | **向上突破**确认(实体优先) | **向下突破**确认(实体优先) |
---
## 5. 波段·小分歧(波段单)
**前提**:主趋势**已走出**;反转链进行中**不做**小分歧.
- **前两次**可做,**第三次不做**;不追突破
- **做多**:二次探底 → N 字;或 5m 三均线重新多头
- **做空**:二次探顶 → 倒 N;或 5m 三均线重新空头
---
## 6. 纪律
1. 方向与大级别一致;不做顺手反向单;同一币种避免未计划对冲叠仓
2. **反转**:首次背离不做;通道式涨跌中的背离不做;第 1 次摸参考极值不做(V 形)
3. **顺势**:第三次小分歧不做;小分歧不追突破
4. 止盈/止损/是否手平:**随行情**,本文档不量化 RR
---
## 7. 持仓与出场(定性)
| 单型 | 做多 | 做空 |
|------|------|------|
| 启动 A/B | 赌新主升;B 失败可 A2;确立前不做小分歧 | 赌新主跌;同上镜像 |
| 大分歧 | 可长持;两次小分歧后远目标未到可手平 | 同左 |
| 小分歧 | 短拿,常手平 | 短拿,常手平 |
---
## 8. 系统字段
| 操作 | 字段 |
|------|------|
| 下单(现状) | `entry_model` + `trade_style`;方向在订单侧 |
| 下单(规划) | `launch_a` / `launch_b` + 两级 UI |
| 平仓 / 复盘 | `entry_reason` = 界面标签;与币安一致 |
---
## 修订记录
| 版本 | 日期 | 说明 |
|------|------|------|
| v0.4 | 2026-07-06 | 反转·启动 A/B(做多同币安 §3;做空镜像);两级 UI 规划 |
| v0.3 | 2026-07-06 | 独立完整策略说明 |
| v0.2 | 2026-07-06 | 定稿 UI 短标签 |
+184 -184
View File
@@ -1,184 +1,184 @@
# 趋势回调中控平仓与交易记录检阅备忘
本文档汇总 **中控手动结束趋势计划****交易记录 / 策略记录** 写入规则以及 **三所展示统一****补仓表计价** 相关修复便于自行检阅与排错
适用仓库`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 # 需含 80226ee08082eb
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与对话中修复项同步*
# 趋势回调:中控平仓与交易记录(检阅备忘)
本文档汇总 **中控手动结束趋势计划**,**交易记录 / 策略记录** 写入规则,以及 **三所展示统一**,**补仓表计价** 相关修复,便于自行检阅与排错.
适用仓库:`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(与对话中修复项同步)*
+67 -67
View File
@@ -1,17 +1,17 @@
# 趋势回调策略说明
本文描述 **「趋势回调」** 自动交易计划的业务规则与实现口径
本文描述 **「趋势回调」** 自动交易计划的业务规则与实现口径.
**三所主站**Binance / Gate / OKX均在顶栏 **策略交易 → `/strategy`** 左栏提供同一套逻辑共用 `strategy_trend_register.py`);各所使用各自 API 与 `crypto.db`
**三所主站**(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)
**检阅备忘**(中控平仓,交易记录,补仓展示,漏记补录):[trend-hub-close-and-trade-records.md](./trend-hub-close-and-trade-records.md)
---
## 1. 适用场景
-**USDT 永续** 实例独立部署使用各自 API 与 `crypto.db`
- 你已明确**方向止损价补仓区间边界价止盈价杠杆**并接受程序按风险预算拆分 **首仓 50% + 多档补仓 50%**
-**USDT 永续** 实例独立部署,使用各自 API 与 `crypto.db`.
- 你已明确:**方向,止损价,补仓区间边界价,止盈价,杠杆**,并接受程序按风险预算拆分 **首仓 50% + 多档补仓 50%**.
---
@@ -19,67 +19,67 @@
| 名称 | 含义 |
|------|------|
| **合约 USDT 可用余额** | **生成预览**时通过 API 读取的 **swap 账户 USDT `free`** 快照**确认执行**时再次读取并与快照比对偏差 |
| **风险比例** | 默认 **5%**指「若整笔计划在 **补仓区间远侧边界**做多=上沿做空=下沿这一侧的最坏价格结构下触及止损」目标亏损上限约为 **可用余额快照 × 风险比例**实现上用 `calc_risk_fraction``prepare_order_amount` 反推总张数受交易所最小张数与精度约束)。 |
| **止损价** | 用户填写开仓后挂 **交易所仓位类止损触发单**全平)。 |
| **补仓区间边界**库字段 `add_upper` | 用户填写**仅在该价位与止损价构成的区间内** 才允许程序触发剩余 50% 的市价补仓**界面文案**做多显示「补仓上沿」做空显示「补仓下沿」校验做多 `止损 < 边界价`做空 `止损 > 边界价` |
| **止盈价** | 用户填写的 **固定价格****不由交易所条件止盈单触发**由应用后台 **按标记价/行情价轮询**达到后 **市价全平** |
| **杠杆** | 计划内固定写入用于 `set_leverage` 与名义换算 |
| **补仓档位数** | 默认 **5**环境变量 `TREND_PULLBACK_DCA_LEGS` 可调);程序在满足最小张数前提下可能 **自动减少档数** |
| **合约 USDT 可用余额** | **生成预览**时通过 API 读取的 **swap 账户 USDT `free`** 快照;**确认执行**时再次读取并与快照比对偏差. |
| **风险比例** | 默认 **5%**:指「若整笔计划在 **补仓区间远侧边界**(做多=上沿,做空=下沿)这一侧的最坏价格结构下触及止损」,目标亏损上限约为 **可用余额快照 × 风险比例**(实现上用 `calc_risk_fraction``prepare_order_amount` 反推总张数,受交易所最小张数与精度约束). |
| **止损价** | 用户填写;开仓后挂 **交易所仓位类止损触发单**(全平). |
| **补仓区间边界**(库字段 `add_upper`) | 用户填写;**仅在该价位与止损价构成的区间内** 才允许程序触发剩余 50% 的市价补仓.**界面文案**:做多显示「补仓上沿」,做空显示「补仓下沿」.校验:做多 `止损 < 边界价`;做空 `止损 > 边界价`. |
| **止盈价** | 用户填写的 **固定价格**;**不由交易所条件止盈单触发**,由应用后台 **按标记价/行情价轮询**,达到后 **市价全平**. |
| **杠杆** | 计划内固定写入;用于 `set_leverage` 与名义换算. |
| **补仓档位数** | 默认 **5**(环境变量 `TREND_PULLBACK_DCA_LEGS` 可调);程序在满足最小张数前提下可能 **自动减少档数**. |
---
## 3. 执行流程时间顺序
## 3. 执行流程(时间顺序)
### 3.0 列表时间窗交易记录 / 计划历史
### 3.0 列表时间窗(交易记录 / 计划历史)
- **交易记录****计划历史**含预览快照列表与 **交易记录 CSV 导出** 支持 **UTC** 时间筛选默认 UTC 当日可选近 24h近 7d自定义起止)。
- 查询参数`win_preset``utc_today` / `utc_last24h` / `utc_last7d` / `custom`)、自定义时另传 `from_utc``to_utc`
- **统计分析**页仍按北京时间 `TRADING_DAY_RESET_HOUR` 切日不受列表窗影响
- **交易记录**,**计划历史**(含预览快照)列表与 **交易记录 CSV 导出** 支持 **UTC** 时间筛选(默认 UTC 当日;可选近 24h,近 7d,自定义起止).
- 查询参数:`win_preset`(`utc_today` / `utc_last24h` / `utc_last7d` / `custom`),自定义时另传 `from_utc`,`to_utc`.
- **统计分析**页仍按北京时间 `TRADING_DAY_RESET_HOUR` 切日,不受列表窗影响.
### 3.1 预览阶段不下单
### 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`),超时须重新点「生成预览」
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 确认执行实盘
### 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. **计划结束**任一结束路径止盈 / 止损 / 用户手动结束均会 **撤单**条件单 + 普通挂单尽力而为)。
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` 中对应记录过期记录会在新预览或页面加载时清理
用户可「取消预览」删除 `trend_pullback_previews` 中对应记录;过期记录会在新预览或页面加载时清理.
### 3.4 界面计划历史与运行中浮动盈亏
### 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`);成功后显示「已保本」时间与原止损若与当前不同)。
- **计划历史(页顶卡片)**
- 仅展示 **`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` 与交易所记录
- 平仓时仍会写入一条 **`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` 与交易所记录.
---
@@ -89,17 +89,17 @@
|------|------------------|----------|
| 开仓 | 单次市价 + 条件止盈+止损 | 首仓 50% 市价 + 多档补仓 + **仅止损在交易所** |
| 止盈 | 条件单 + 本地监控 | **仅本地监控市价止盈** |
| 仓位基数 | 以损定仓表单/会话基数 | **可用余额快照 × 风险比例** 推导 |
| 移动保本 | 支持按 R 自动上移 | **保本移交**结束计划→下单监控交易所 TP+SL**无**自动 R 保本 |
| 仓位基数 | 以损定仓(表单/会话基数) | **可用余额快照 × 风险比例** 推导 |
| 移动保本 | 支持(按 R 自动上移) | **保本移交**(结束计划→下单监控;交易所 TP+SL;**无**自动 R 保本) |
---
## 5. 风险声明必读
## 5. 风险声明(必读)
- 市价单存在 **滑点**极端行情下实际亏损可能 **大于** 理论 5%
- 补仓触发依赖应用 **轮询间隔**`MONITOR_POLL_SECONDS`),非毫秒级高频
- 交易所 **最小张数 / 精度** 可能导致计划张数被截断实际风险略低于或偏离纸面计算
- 请使用 **单独 API Key / 子账户**并先在 `LIVE_TRADING_ENABLED=false` 环境验证流程若需沙盒请自行对接测试网本仓库默认实盘接口)。
- 市价单存在 **滑点**;极端行情下实际亏损可能 **大于** 理论 5%.
- 补仓触发依赖应用 **轮询间隔**(`MONITOR_POLL_SECONDS`),非毫秒级高频.
- 交易所 **最小张数 / 精度** 可能导致计划张数被截断,实际风险略低于或偏离纸面计算.
- 请使用 **单独 API Key / 子账户**,并先在 `LIVE_TRADING_ENABLED=false` 环境验证流程(若需沙盒请自行对接测试网,本仓库默认实盘接口).
---
@@ -107,23 +107,23 @@
| 变量 | 说明 | 默认 |
|------|------|------|
| `TREND_PULLBACK_MANUAL_BREAKEVEN_OFFSET_PCT` | 手动保本默认偏移相对持仓均价% | `0.3` |
| `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` |
| `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` | 单次拉取平仓历史条数上限501000 | `200` |
| `APP_TIMEZONE` | 应用墙钟与「北京日期」同步起点时区(`Asia/Shanghai`) | `Asia/Shanghai` |
| `EXCHANGE_POSITION_SYNC_FROM_BJ` | 拉取 Gate **平仓历史** 的最早日期(`YYYY-MM-DD`,`APP_TIMEZONE` 当日 **00:00** 起算).**留空**则从近 **90 天** 起拉取 | 空 |
| `EXCHANGE_POSITION_HISTORY_LIMIT` | 单次拉取平仓历史条数上限(501000) | `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)。
- **`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`
**CSV 导出**:交易记录导出为 **v3**,包含上述交易所对齐字段及 `trend_plan_id`.
+169 -169
View File
@@ -1,169 +1,169 @@
# 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 + PM2root
```bash
# 方式 ANodeSource示例 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 unitscreennohup 启动 `app.py` / `hub.py` / `agent.py`避免与 PM2 抢端口
### 3.3 常见 PM2 进程名
| 目录 | ecosystem 内典型名称 |
|------|---------------------|
| `crypto_monitor_binance` | `crypto_binance` |
| `crypto_monitor_gate` | `crypto_gate` |
| `crypto_monitor_okx` | `crypto_okx` |
| `manual_trading_hub` | `manual-trading-hub``manual-agent-*` |
以各目录 **`ecosystem.config.cjs`** 为准
### 3.4 整目录重装清库 / 去脏 PM2
保留 `.env`丢弃旧库与旧 PM2 名单时**[deploy/reinstall-plan-b.md](../deploy/reinstall-plan-b.md)**
```bash
cd /opt/crypto_monitor
bash deploy/reinstall.sh --yes
```
首次安装仍只用 `deploy/setup_env.sh`二者互不影响
---
## 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_binance` |
| `crypto_monitor_gate` | `crypto_gate` |
| `crypto_monitor_okx` | `crypto_okx` |
| `manual_trading_hub` | `manual-trading-hub`,`manual-agent-*` |
以各目录 **`ecosystem.config.cjs`** 为准.
### 3.4 整目录重装(清库 / 去脏 PM2)
保留 `.env`,丢弃旧库与旧 PM2 名单时,**[deploy/reinstall-plan-b.md](../deploy/reinstall-plan-b.md)**:
```bash
cd /opt/crypto_monitor
bash deploy/reinstall.sh --yes
```
首次安装仍只用 `deploy/setup_env.sh`,二者互不影响.
---
## 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,端口,反代 |
+25 -25
View File
@@ -1,6 +1,6 @@
# 中控 AI 与部署密钥配置
本文档说明**长期部署密钥**一次生成不轮换)、**SSO 临时链接**保持不动)、以及 **AI 配置**中控统一维护并同步三所)。
本文档说明:**长期部署密钥**(一次生成,不轮换),**SSO 临时链接**(保持不动),以及 **AI 配置**(中控统一维护并同步三所).
---
@@ -8,19 +8,19 @@
| 类型 | 变量 / 机制 | 谁维护 | 是否自动过期 |
|------|-------------|--------|--------------|
| **长期通信密钥** | `HUB_BRIDGE_TOKEN` | 部署脚本首次写入四份 `.env` | 否不轮换 |
| **长期通信密钥** | `HUB_BRIDGE_TOKEN` | 部署脚本首次写入四份 `.env` | 否,不轮换 |
| **实例 Session 签名** | `FLASK_SECRET_KEY` | 部署脚本首次写入三实例 | 否 |
| **中控 Session 签名** | `HUB_SESSION_SECRET` | 部署脚本首次写入中控 | 否 |
| **SSO 开门链接** | `/hub-sso?token=...` | 中控每次点「打开实例」签发 | 默认 2h + 单次 |
| **AI 配置** | `OPENAI_*``AI_*` 等 | 中控系统设置 → AI 配置 | 否 |
| **AI 配置** | `OPENAI_*`,`AI_*` 等 | 中控系统设置 → AI 配置 | 否 |
**SSO 保持不动**仍为随机 nonce默认 `HUB_SSO_TTL_SEC=7200`成功登录一次后链接作废长期 `HUB_BRIDGE_TOKEN` 只用于签名不会每 2 小时变化
**SSO 保持不动**:仍为随机 nonce,默认 `HUB_SSO_TTL_SEC=7200`,成功登录一次后链接作废.长期 `HUB_BRIDGE_TOKEN` 只用于签名,不会每 2 小时变化.
---
## 2. 首次部署自动生成
`bash deploy/setup_env.sh` 在复制 `.env.example` 后自动执行
`bash deploy/setup_env.sh` 在复制 `.env.example` 后自动执行:
```bash
python3 scripts/bootstrap_deploy_secrets.py
@@ -28,21 +28,21 @@ python3 scripts/bootstrap_deploy_secrets.py
| 写入项 | 位置 | 规则 |
|--------|------|------|
| `HUB_BRIDGE_TOKEN` | 中控 + 三实例同值 | 仅空或占位符时写入 |
| `FLASK_SECRET_KEY` | 三实例同值 | 仅空或占位符时写入 |
| `HUB_BRIDGE_TOKEN` | 中控 + 三实例(同值) | 仅空或占位符时写入 |
| `FLASK_SECRET_KEY` | 三实例(同值) | 仅空或占位符时写入 |
| `HUB_SESSION_SECRET` | 中控 | 仅空时写入 |
| `HUB_USERNAME` / `HUB_PASSWORD` | 中控 | 默认 admin / admin123仅空时 |
| `APP_USERNAME` / `APP_PASSWORD` | 三实例 | 默认 admin / admin123仅空时 |
| `HUB_USERNAME` / `HUB_PASSWORD` | 中控 | 默认 admin / admin123(仅空时) |
| `APP_USERNAME` / `APP_PASSWORD` | 三实例 | 默认 admin / admin123(仅空时) |
**已有非空生产值不会被覆盖**一次生成不轮换)。
**已有非空生产值不会被覆盖**(一次生成,不轮换).
子代理 `agent.py` 优先读取 `HUB_BRIDGE_TOKEN` 作为 `X-Control-Token` 校验独立配置 `CONTROL_TOKEN` 已废弃
子代理 `agent.py` 优先读取 `HUB_BRIDGE_TOKEN` 作为 `X-Control-Token` 校验;独立配置 `CONTROL_TOKEN` 已废弃.
---
## 3. 中控系统设置 → AI 配置
路径**中控 Web → 系统设置 → AI 配置** Tab
路径:**中控 Web → 系统设置 → AI 配置** Tab.
### 3.1 可配置项
@@ -50,34 +50,34 @@ python3 scripts/bootstrap_deploy_secrets.py
|--------|----------|
| AI 提供方 | `AI_PROVIDER` |
| API 地址 | `OPENAI_API_BASE` |
| API 密钥 | `OPENAI_API_KEY`掩码留空不修改 |
| API 密钥 | `OPENAI_API_KEY`(掩码,留空不修改) |
| 云端模型 | `OPENAI_MODEL` |
| Ollama 地址 | `OLLAMA_API` |
| Ollama 模型 | `AI_MODEL` |
| 请求超时(秒) | `AI_TIMEOUT_SECONDS` |
| 请求超时(秒) | `AI_TIMEOUT_SECONDS` |
### 3.2 保存行为
1. 写入 `manual_trading_hub/.env`
2. **强制同步**`crypto_monitor_okx/binance/gate/.env` 相同键
3. 自动 `pm2 restart` 中控 + 三实例`--update-env`
3. 自动 `pm2 restart` 中控 + 三实例(`--update-env`)
### 3.3 API需已登录中控
### 3.3 API(需已登录中控)
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/settings/ai-env` | 读取字段与三所同步状态 |
| POST | `/api/settings/ai-env` | body: `{ "values": {...}, "restart": true }` |
实现`lib/env/shared_env_lib.py``manual_trading_hub/hub_env_lib.py`
实现:`lib/env/shared_env_lib.py`,`manual_trading_hub/hub_env_lib.py`.
---
## 4. 实例 env 配置页变更
三所 **env 配置** 页已 **移除「AI 复盘」卡片**交易所 API企业微信交易执行等仍各所自配
三所 **env 配置** 页已 **移除「AI 复盘」卡片**.交易所 API,企业微信,交易执行等仍各所自配.
实例侧若通过 API 提交已移除的 AI 键会被白名单过滤不会写入
实例侧若通过 API 提交已移除的 AI 键,会被白名单过滤,不会写入.
---
@@ -86,18 +86,18 @@ python3 scripts/bootstrap_deploy_secrets.py
| 能力 | 实例 env | 实例系统设置 | 中控系统设置 |
|------|----------|--------------|--------------|
| 交易所 API | ✅ | ❌ | ❌ |
| OpenAI / AI | ❌ | ❌ | ✅同步三所 |
| OpenAI / AI | ❌ | ❌ | ✅(同步三所) |
| 实例登录密码 | ❌ | ✅ | ❌ |
| 中控登录密码 | ❌ | ❌ | ✅ |
| Bridge / Flask 长期密钥 | ❌自动 | ❌ | ❌自动 |
| Bridge / Flask 长期密钥 | ❌(自动) | ❌ | ❌(自动) |
| SSO 链接 | — | — | 每次打开实例自动签发 |
---
## 6. 运维提示
- 修改 AI 后若未自动重启成功手动`pm2 restart manual-trading-hub crypto_okx crypto_binance crypto_gate --update-env`
- 三所 AI 不一致时中控 AI 配置页会提示「未完全同步」**保存并同步** 即可对齐
- 备份包可选包含各 `.env`中控设置 → 备份恢复
- 修改 AI 后若未自动重启成功,手动:`pm2 restart manual-trading-hub crypto_okx crypto_binance crypto_gate --update-env`
- 三所 AI 不一致时,中控 AI 配置页会提示「未完全同步」;**保存并同步** 即可对齐
- 备份包可选包含各 `.env`(中控设置 → 备份恢复)
相关文档[env配置说明.md](./env配置说明.md)[系统设置说明.md](./系统设置说明.md)[manual_trading_hub/局域网与反代部署说明.md](../manual_trading_hub/局域网与反代部署说明.md)SSO 2h 说明
相关文档:[env配置说明.md](./env配置说明.md),[系统设置说明.md](./系统设置说明.md),[manual_trading_hub/局域网与反代部署说明.md](../manual_trading_hub/局域网与反代部署说明.md)(SSO 2h 说明)
+35 -35
View File
@@ -1,37 +1,37 @@
# OKX 期权模块 — 技术方案
> 适用范围`crypto_monitor_okx` 实例与永续子账户并行不新增 PM2 进程
> 适用范围:`crypto_monitor_okx` 实例;与永续子账户并行,不新增 PM2 进程.
## 1. 目标
在现有 OKX 监控实例中增加 **USDⓈ 本位期权买方** 能力
在现有 OKX 监控实例中增加 **USDⓈ 本位期权(买方)** 能力:
- 永续/关键位继续走 **子账户 API-A**现有 `OKX_API_*`
- 期权**主账户 API-B**`OKX_OPTIONS_API_*`
- 资金展示对齐 OKX**资金账户 / 交易账户**分币种显示 USDTUSDCUSDG
- 永续/关键位:继续走 **子账户 API-A**(现有 `OKX_API_*`)
- 期权:**主账户 API-B**(`OKX_OPTIONS_API_*`)
- 资金展示对齐 OKX:**资金账户 / 交易账户**,分币种显示 USDT,USDC,USDG
- 支持 **手动 USDT→USDC 兑换****USDC 账户划转**
- **无总资金池上限**单笔权利金上限可配置默认 10 USDC
- **无总资金池上限**;单笔权利金上限可配置(默认 10 USDC)
## 2. 交易规则硬约束
## 2. 交易规则(硬约束)
| 规则 | 说明 |
|------|------|
| 仅买方 | 开仓 `buy`平仓 `sell`禁止卖方开仓 |
| 产品 | `BTC-USD_UM` / `ETH-USD_UM`线性USDC/USDG 结算 |
| 到期 | 仅展示 ≤2 日到期合约可配置 `OKX_OPTIONS_MAX_DTE_DAYS` |
| 虚实 | 仅 **轻度实值**`OKX_OPTIONS_ITM_ONLY` |
| 合约规格 | **1 张 = 0.01 ETH/BTC**`ctMult=0.01`以接口为准 |
| 仅买方 | 开仓 `buy`,平仓 `sell`;禁止卖方开仓 |
| 产品 | `BTC-USD_UM` / `ETH-USD_UM`(线性,USDC/USDG 结算) |
| 到期 | 仅展示 ≤2 日到期合约(可配置 `OKX_OPTIONS_MAX_DTE_DAYS`) |
| 虚实 | 仅 **轻度实值**(`OKX_OPTIONS_ITM_ONLY`) |
| 合约规格 | **1 张 = 0.01 ETH/BTC**(`ctMult=0.01`,以接口为准) |
| 报价单位 | 盘口 ask/bid = **每 1 ETH/BTC** 的 USD 价 |
| 权利金 | `总权利金 = 报价 × ETH数量``张数 = ETH数量 / 0.01` |
| 单笔预算 | `≤ OKX_OPTIONS_TRADE_BUDGET_USDC`默认 10),算张数 × `OKX_OPTIONS_BUDGET_BUFFER`默认 0.95 |
| 开仓 | 限价买单价格 = 卖一 |
| 平仓 | 限价卖单价格 = 买一市价需显式开启且二次确认 |
| 权利金 | `总权利金 = 报价 × ETH数量`;`张数 = ETH数量 / 0.01` |
| 单笔预算 | `≤ OKX_OPTIONS_TRADE_BUDGET_USDC`(默认 10),算张数 × `OKX_OPTIONS_BUDGET_BUFFER`(默认 0.95) |
| 开仓 | 限价买单,价格 = 卖一 |
| 平仓 | 限价卖单,价格 = 买一(市价需显式开启且二次确认) |
| 监控 | 浮盈 / 已付权利金 ≥ 100% → 企业微信推送一次 |
## 3. 架构
```
crypto_okx单 PM2
crypto_okx(单 PM2)
├── exchange (swap) ← OKX_API_* 子账户
└── exchange_options ← OKX_OPTIONS_API_* 主账户
@@ -43,25 +43,25 @@ lib/options/
└── options_register.py # 路由 + 监控线程
```
**隔离** 期权模块只调用 `exchange_options`永续逻辑只调用 `exchange`
**隔离:** 期权模块只调用 `exchange_options`;永续逻辑只调用 `exchange`.
## 4. 资金与兑换
### 4.1 展示期权页顶栏
### 4.1 展示(期权页顶栏)
| 账户 | 币种 |
|------|------|
| 资金账户 | USDTUSDC若有 |
| 交易账户 | USDTUSDCUSDG若有 |
| 资金账户 | USDT,USDC(若有) |
| 交易账户 | USDT,USDC,USDG(若有) |
不展示「练手池」等抽象记账名称
不展示「练手池」等抽象记账名称.
### 4.2 推荐操作流程
```
资金账户 USDT
→ [手动兑换 USDT→USDC]OKX Convert API资金账户内
→ [划转到交易账户]USDC
→ [手动兑换 USDT→USDC](OKX Convert API,资金账户内)
→ [划转到交易账户](USDC)
→ 交易账户 USDC
→ [限价买入期权]
```
@@ -70,12 +70,12 @@ lib/options/
| 接口 | OKX |
|------|-----|
| 余额 | `fetch_balance`funding / trading+ `GET /api/v5/asset/balances` |
| 余额 | `fetch_balance`(funding / trading)+ `GET /api/v5/asset/balances` |
| 询价兑换 | `POST /api/v5/asset/convert/estimate-quote` |
| 确认兑换 | `POST /api/v5/asset/convert/trade` |
| 划转 | `exchange.transfer(ccy, amt, from, to)` |
## 5. 配置项`.env`
## 5. 配置项(`.env`)
```bash
OKX_OPTIONS_ENABLED=false
@@ -95,17 +95,17 @@ OKX_OPTIONS_TD_MODE=cross
OKX_OPTIONS_ALLOW_MARKET_CLOSE=false
```
修改 `.env` 后须 `pm2 restart crypto_okx`
修改 `.env` 后须 `pm2 restart crypto_okx`.
## 6. 数据库
### `options_trades`
记录本地开仓/平仓权利金翻倍提醒状态
记录本地开仓/平仓,权利金,翻倍提醒状态.
### `options_convert_log` / `options_transfer_log`
可选记录兑换与划转操作
可选记录兑换与划转操作.
## 7. HTTP 路由
@@ -124,20 +124,20 @@ OKX_OPTIONS_ALLOW_MARKET_CLOSE=false
## 8. 分阶段交付
1. **基础设施**双 API余额文档设置页说明
2. **兑换 + 划转**资金账户 USDT→USDC划转到交易户
3. **交易**:链、报价开平仓持仓
4. **监控**翻倍微信提醒
1. **基础设施**:双 API,余额,文档,设置页说明
2. **兑换 + 划转**:资金账户 USDT→USDC,划转到交易户
3. **交易**:链,报价,开平仓,持仓
4. **监控**:翻倍微信提醒
## 9. 不在一期范围
- 卖方组合单RFQ
- 卖方,组合单,RFQ
- 自动 USDT↔USDC
- `manual-agent-okx` / 中控聚合
- 币本位期权
## 10. 安全
- 期权 API**交易 + 读**禁止提币
- 期权 API:**交易 + 读**,禁止提币
- 日志不输出 Secret
- 下单前校验 `client is exchange_options`
+38 -38
View File
@@ -2,8 +2,8 @@
## 1. 前置条件
1. OKX **主账户**已开通期权USDⓈ 本位),且 App 中可见 `ETHUSD UM` / `BTCUSD UM`
2.`crypto_monitor_okx/.env` 配置 **期权专用 API**与永续子账户分开):
1. OKX **主账户**已开通期权(USDⓈ 本位),且 App 中可见 `ETHUSD UM` / `BTCUSD UM`.
2.`crypto_monitor_okx/.env` 配置 **期权专用 API**(与永续子账户分开):
```bash
OKX_OPTIONS_ENABLED=true
@@ -12,77 +12,77 @@ OKX_OPTIONS_API_SECRET=...
OKX_OPTIONS_API_PASSPHRASE=...
```
3. 重启实例`pm2 restart crypto_okx`
3. 重启实例:`pm2 restart crypto_okx`
> 永续仍用原有 `OKX_API_*`子账户);期权只用 `OKX_OPTIONS_API_*`主账户)。
> 永续仍用原有 `OKX_API_*`(子账户);期权只用 `OKX_OPTIONS_API_*`(主账户).
## 2. 资金准备
期权权利金使用 **USDC 或 USDG**不能直接用 USDT 买入
期权权利金使用 **USDC 或 USDG**,不能直接用 USDT 买入.
### 推荐步骤
1. 打开 **期权**查看顶栏
- **资金账户**USDT 余额
- **交易账户**USDC 余额买期权从这里扣
2. **币种兑换**资金账户内
1. 打开 **期权**,查看顶栏:
- **资金账户**:USDT 余额
- **交易账户**:USDC 余额(买期权从这里扣)
2. **币种兑换**(资金账户内)
- 从 USDT 兑换为 USDC
- 先点 **询价**确认预估获得量后点 **确认兑换**
- 先点 **询价**,确认预估获得量后点 **确认兑换**
3. **账户划转**
-资金账户 → 到交易账户
- 币种USDC
-:资金账户 → 到:交易账户
- 币种:USDC
- 将兑换得到的 USDC 划到交易账户
4. 确认 **交易账户 USDC** 足够支付本笔权利金
系统 **不会** 自动兑换或划转避免误动资金
系统 **不会** 自动兑换或划转,避免误动资金.
## 3. 下单流程
1. 顶栏进入 **期权**
2. 选择 **ETH****BTC**
3. 选择 **到期日**默认仅 12 日
3. 选择 **到期日**(默认仅 12 日)
4. 选择 **看涨 Call****看跌 Put**
5. 在行权价列表中选 **轻度实值** 合约
6. 查看
- **卖一价**每 1 ETH/BTC 的报价
6. 查看:
- **卖一价**(每 1 ETH/BTC 的报价)
- **张数 / ETH 数量**
- **预估权利金**USDC
7. 选择 **按预算打满**默认 10U×0.95**指定 ETH 数量**
8. 点击 **限价买入**价格 = 卖一
- **预估权利金**(USDC)
7. 选择 **按预算打满**(默认 10U×0.95)**指定 ETH 数量**
8. 点击 **限价买入**(价格 = 卖一)
### 张数说明
- **1 张 = 0.01 ETH**或 0.01 BTC— 与 OKX App「合约价值」一致
- **1 张 = 0.01 ETH**(或 0.01 BTC)— 与 OKX App「合约价值」一致
- 盘口报价是 **每 1 ETH** 的价格
报价 15.6买 0.5 ETH50 张→ 权利金 ≈ 15.6 × 0.5 = **7.8 USDC**
:报价 15.6,买 0.5 ETH(50 张)→ 权利金 ≈ 15.6 × 0.5 = **7.8 USDC**
## 4. 持仓与平仓
持仓表字段对齐 OKX合约张数开仓均价标记价浮盈收益率到期等
持仓表字段对齐 OKX:合约,张数,开仓均价,标记价,浮盈,收益率,到期等.
**平仓锁利/止损):**
**平仓(锁利/止损):**
1. 在持仓行点击 **平仓**
2. 查看 **买一价** 与预估收回
3. 确认 **限价卖出**价格 = 买一
3. 确认 **限价卖出**(价格 = 买一)
> 默认不使用市价平仓若 `.env` 开启 `OKX_OPTIONS_ALLOW_MARKET_CLOSE=true`市价按钮会出现并带风险提示
> 默认不使用市价平仓.若 `.env` 开启 `OKX_OPTIONS_ALLOW_MARKET_CLOSE=true`,市价按钮会出现并带风险提示.
## 5. 微信提醒
当某笔持仓 **未实现盈亏 ≥ 已付权利金的 100%**翻倍)时,会发 **一条** 企业微信提醒同一笔只提醒一次)。
当某笔持仓 **未实现盈亏 ≥ 已付权利金的 100%**(翻倍)时,会发 **一条** 企业微信提醒(同一笔只提醒一次).
需已配置 `WECHAT_WEBHOOK`
需已配置 `WECHAT_WEBHOOK`.
## 6. 与永续的关系
| | 永续子账户 | 期权主账户 |
| | 永续(子账户) | 期权(主账户) |
|--|----------------|----------------|
| API | `OKX_API_*` | `OKX_OPTIONS_API_*` |
| 页面 | 实盘下单 / 关键位 | 期权 |
| 资金顶栏 | USDT 资金户+交易户 | 期权页单独显示 USDC 等 |
两套资金 **不合并** 显示
两套资金 **不合并** 显示.
## 7. 配置说明
@@ -91,24 +91,24 @@ OKX_OPTIONS_API_PASSPHRASE=...
| `OKX_OPTIONS_TRADE_BUDGET_USDC` | 10 | 单笔权利金上限 |
| `OKX_OPTIONS_BUDGET_BUFFER` | 0.95 | 算张数时预留 5% 缓冲 |
| `OKX_OPTIONS_MAX_DTE_DAYS` | 2 | 最多选几天内到期 |
| `OKX_OPTIONS_ITM_MAX_DIST_USD` | 30 | 轻度实值价内不超过多少 USD |
| `OKX_OPTIONS_ITM_MAX_DIST_USD` | 30 | 轻度实值:价内不超过多少 USD |
| `OKX_OPTIONS_PROFIT_ALERT_RATIO` | 1.0 | 浮盈/权利金 ≥ 此值推送 |
## 8. 常见问题
**Q为什么买不了**
**Q:为什么买不了?**
- 交易账户 USDC 不足 → 先兑换再划转
- 卖一价过高10U 预算买不到 1 张 → 选更便宜合约或提高 `OKX_OPTIONS_TRADE_BUDGET_USDC`
- 卖一价过高,10U 预算买不到 1 张 → 选更便宜合约或提高 `OKX_OPTIONS_TRADE_BUDGET_USDC`
- 期权 API 未配置或 `OKX_OPTIONS_ENABLED=false`
**Q报价 15 是每张 15U 吗**
- 不是15 是 **每 1 ETH** 的报价每张0.01 ETH约 0.15 USDC
**Q:报价 15 是每张 15U 吗?**
- 不是.15 是 **每 1 ETH** 的报价;每张(0.01 ETH)约 0.15 USDC.
**Q子账户能开期权吗**
- 本系统期权走主账户 API子账户永续不受影响
**Q:子账户能开期权吗?**
- 本系统期权走主账户 API;子账户永续不受影响.
## 9. 风险说明
- 买方最大亏损为 **权利金**近期实值仍会时间衰减
- 买方最大亏损为 **权利金**;近期实值仍会时间衰减
- 限价单可能因无流动性未成交
- 请先在小额下验证兑换划转开平仓全流程
- 请先在小额下验证兑换,划转,开平仓全流程
+42 -42
View File
@@ -1,12 +1,12 @@
# 系统设置页说明
本文档描述各交易实例 Web 端 **「系统设置」** 页各区块功能与 env 配置页的分工以及导航显示开关规则
本文档描述各交易实例 Web 端 **「系统设置」** 页各区块功能,与 env 配置页的分工,以及导航显示开关规则.
---
## 1. 页面结构
系统设置为 **两列卡片** 布局各区块可在「导航显示」中单独开关见第 2 节)。
系统设置为 **两列卡片** 布局,各区块可在「导航显示」中单独开关(见第 2 节).
| 区块 | 默认显示 | 说明 |
|------|----------|------|
@@ -16,9 +16,9 @@
| 数据导出 | 可关 | 下载 CSV |
| 币种兑换 | 可关 | 仅 OKX 期权相关 |
| 期权资金划转 | 可关 | 仅 OKX |
| 期权设置面板 | OKX 有模块时 | 较大块占整行 |
| 期权设置面板 | OKX 有模块时 | 较大块,占整行 |
**固定不可隐藏**顶栏):关键位监控实盘下单系统设置
**固定不可隐藏**(顶栏):关键位监控,实盘下单,系统设置.
---
@@ -34,9 +34,9 @@
| 统计分析 | 统计分析 |
| 风控说明 | 风控说明 |
| env 配置 | env 配置 |
| 期权 | 期权仅 OKX 等有期权模块时有效 |
| 期权 | 期权(仅 OKX 等有期权模块时有效) |
保存后 **立即生效**无需重启中控 iframe 内嵌导航同步生效
保存后 **立即生效**,无需重启.中控 iframe 内嵌导航同步生效.
### 2.2 系统设置内区块开关
@@ -54,28 +54,28 @@
### 用途
- 修改 **直链打开实例**`/login` 使用的用户名与密码
- 写入本实例目录 `.env``APP_USERNAME``APP_PASSWORD`
- **三所建议使用相同账号**便于记忆本页仅改 **当前实例**`.env`若需三所一致请分别保存或后续做批量同步
- 修改 **直链打开实例**`/login` 使用的用户名与密码.
- 写入本实例目录 `.env``APP_USERNAME`,`APP_PASSWORD`.
- **三所建议使用相同账号**,便于记忆;本页仅改 **当前实例**`.env`,若需三所一致请分别保存或后续做批量同步.
### 与中控 / 密钥的关系
| 项目 | 是否在系统设置改 | 说明 |
|------|------------------|------|
| 网页登录密码 | ✅ | 本区块 |
| 中控通信密钥 `HUB_BRIDGE_TOKEN` | ❌ | 部署时自动生成中控与实例一致 |
| 登录会话密钥 `FLASK_SECRET_KEY` | ❌ | 部署时自动生成三所相同 |
| 交易所 API | ❌ | 在 **env 配置**各所自配 |
| AI 复盘 / OpenAI | ❌ | 在中控 **系统设置 → AI 配置**同步三所 |
| 中控通信密钥 `HUB_BRIDGE_TOKEN` | ❌ | 部署时自动生成,中控与实例一致 |
| 登录会话密钥 `FLASK_SECRET_KEY` | ❌ | 部署时自动生成,三所相同 |
| 交易所 API | ❌ | 在 **env 配置**(各所自配) |
| AI 复盘 / OpenAI | ❌ | 在中控 **系统设置 → AI 配置**(同步三所) |
### 操作流程
1. 输入 **当前密码**`.env``APP_PASSWORD` 一致)。
2. 可选填 **新用户名**不填则保持原用户名
3. 输入 **新密码****确认密码**至少 6 位)。
4. 保存后 **自动重启当前实例**PM2),请用新密码登录
1. 输入 **当前密码**(`.env``APP_PASSWORD` 一致).
2. 可选填 **新用户名**;不填则保持原用户名.
3. 输入 **新密码****确认密码**(至少 6 位).
4. 保存后 **自动重启当前实例**(PM2),请用新密码登录.
经中控 SSO 打开实例时通常无需输入实例密码改密主要影响 **直链访问**
经中控 SSO 打开实例时,通常无需输入实例密码;改密主要影响 **直链访问**.
---
@@ -83,7 +83,7 @@
### 用途
**子账户永续** 场景下**资金账户funding****交易账户swap** 之间手动划转 USDT
**子账户永续** 场景下,**资金账户(funding)****交易账户(swap)** 之间手动划转 USDT.
### 与 env 配置的关系
@@ -92,36 +92,36 @@
| **手动**划转一笔 | ✅ 本区块 | ❌ |
| **自动**每日划转规则 | ❌ | ✅「自动划转」卡片 |
自动划转规则开关目标余额整点等在 env 配置中维护见 [env配置说明.md](./env配置说明.md)
自动划转规则(开关,目标余额,整点等)在 env 配置中维护,见 [env配置说明.md](./env配置说明.md).
---
## 5. 数据导出
提供 CSV 下载版本号见页内标注):
提供 CSV 下载(版本号见页内标注):
| 链接 | 内容 |
|------|------|
| 交易记录 | 成交/订单相关导出 |
| 复盘记录 | 复盘日记 |
| 关键位当前 | 当前关键位列表 |
| 关键位(当前) | 当前关键位列表 |
| 关键位历史 | 历史关键位 |
导出为只读操作不修改配置
导出为只读操作,不修改配置.
---
## 6. 期权相关仅 OKX
## 6. 期权相关(仅 OKX)
当实例启用期权模块时系统设置可能包含
当实例启用期权模块时,系统设置可能包含:
- **币种兑换**期权账户内币种兑换操作
- **期权资金划转**期权与永续/资金账户间划转
- **期权设置面板**页内期权参数与状态大块区域
- **币种兑换**:期权账户内币种兑换操作
- **期权资金划转**:期权与永续/资金账户间划转
- **期权设置面板**:页内期权参数与状态(大块区域)
是否在顶栏显示「期权」Tab**导航显示 → 期权** 控制是否在设置页显示兑换/划转卡片由对应子开关控制
是否在顶栏显示「期权」Tab,**导航显示 → 期权** 控制;是否在设置页显示兑换/划转卡片,由对应子开关控制.
期权 env 参数API预算策略默认值**env 配置 → 期权账户** 维护见 [期权用法.md](./期权用法.md)
期权 env 参数(API,预算,策略默认值)**env 配置 → 期权账户** 维护,见 [期权用法.md](./期权用法.md).
---
@@ -129,30 +129,30 @@
| 页面 | 顶栏资金信息 | 说明 |
|------|--------------|------|
| 关键位实盘策略等 | 显示 | 含资金盈亏等 |
| 系统设置风控说明env 配置 | 隐藏资金条 | 与实盘顶栏共用组件设置类页面简化展示 |
| 关键位,实盘,策略等 | 显示 | 含资金,盈亏等 |
| 系统设置,风控说明,env 配置 | 隐藏资金条 | 与实盘顶栏共用组件,设置类页面简化展示 |
主题切换明/暗在系统设置页可用若已接入主题切换 UI)。
主题切换(明/暗)在系统设置页可用(若已接入主题切换 UI).
---
## 8. 权限与安全
- 所有设置 API 需 **已登录**或部署时 `APP_AUTH_DISABLED=true` 的联调环境)。
- 改密env 保存PM2 重启等写操作 **不接受** 仅带 `X-Hub-Token` 的中控请求修改防止中控误改实例配置)。
- 生产环境建议 `APP_AUTH_DISABLED=false`公网务必开启登录校验
- 所有设置 API 需 **已登录**(或部署时 `APP_AUTH_DISABLED=true` 的联调环境).
- 改密,env 保存,PM2 重启等写操作 **不接受** 仅带 `X-Hub-Token` 的中控请求修改(防止中控误改实例配置).
- 生产环境建议 `APP_AUTH_DISABLED=false`,公网务必开启登录校验.
---
## 9. 首次部署时的账号与密钥规划
## 9. 首次部署时的账号与密钥(规划)
以下由 **部署脚本** 自动完成**不在** 系统设置或 env 配置页手工填写
以下由 **部署脚本** 自动完成,**不在** 系统设置或 env 配置页手工填写:
1. **生成 `HUB_BRIDGE_TOKEN`** → 写入中控 + 三实例 `.env`相同)。
2. **生成 `FLASK_SECRET_KEY`** → 写入三实例 `.env`三所相同)。
3. **生成初始 `APP_USERNAME=admin``APP_PASSWORD=admin123`** → 写入三实例仅当尚未配置时);用户日后在 **系统设置** 改密
1. **生成 `HUB_BRIDGE_TOKEN`** → 写入中控 + 三实例 `.env`(相同).
2. **生成 `FLASK_SECRET_KEY`** → 写入三实例 `.env`(三所相同).
3. **生成初始 `APP_USERNAME=admin`,`APP_PASSWORD=admin123`** → 写入三实例(仅当尚未配置时);用户日后在 **系统设置** 改密.
脚本应对 **已有非空值** 跳过写入避免覆盖生产环境
脚本应对 **已有非空值** 跳过写入,避免覆盖生产环境.
---