@@ -1,55 +0,0 @@
|
|||||||
# 修复报告:期权币本位高危缺陷(2026-10-07)
|
|
||||||
|
|
||||||
## 1. 目标
|
|
||||||
|
|
||||||
按审计清单修复全部 **Critical / High** 项,本地测试 + 不少于两轮审计后,再通知更新实例。
|
|
||||||
|
|
||||||
## 2. 修复对照表
|
|
||||||
|
|
||||||
| 原问题 | 修复要点 | 主要文件 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 买币增量≤0 误用整户余额 | 短重试取增量;仅用订单回执 `coin_bought`;否则回滚 | `options_coin_open_lib.py` |
|
|
||||||
| IOC 部分成交 / 51008 减半残留币 | `_sell_excess_bridge_coin` 按桥买入量封顶卖掉多余币 | `options_coin_open_lib.py` |
|
|
||||||
| 卖回扫光无关余额 | `spot_market_sell_coin_to_usdt` 尊重 `coin_amount`;桥卖按 `coin_bought` 封顶 | `options_spot_bridge_lib.py`, `sim/hooks.py` |
|
|
||||||
| 粉尘桥 `None` 拦开仓 | 用桥记录量判断粉尘;开仓前清桥 + 扫尾;holding 仅在确认无仓时清 | `options_spot_bridge_lib.py`, `options_coin_open_lib.py` |
|
|
||||||
| 握库拉盘口 | 持仓/历史:先读库再 enrich;中控快照关闭 close_preview | `options_positions_lib.py`, `options_history_lib.py`, `options_hub_lib.py` |
|
|
||||||
| 条件单嵌套开仓锁库 | `run_cond_orders_tick(get_db)`,开仓前关连接 | `options_cond_order_lib.py`, `options_register.py`, `options_monitor_lib.py` |
|
|
||||||
| 目标/翻倍握库平仓 | 传 `get_db`,收集任务后无连接再 `close_fn` | `options_target_lib.py`, `options_profit_exit_lib.py`, `options_monitor_lib.py` |
|
|
||||||
| 开仓等成交握库 | 等成交前 `commit+close`,结束后再开短连接写库 | `options_coin_open_lib.py` |
|
|
||||||
| 模拟到期卖币静默失败 | 打印 `[sim_expiry_sell]` 日志 | `sim/broker_lib.py` |
|
|
||||||
| 中控条件单不验上限 | 创建前调用 `option_position_limit_block_msg` | `hub_bridge_register.py` |
|
|
||||||
| 持仓查询失败误卖 | `None`/异常不卖币,只清粉尘 pending | `options_coin_open_lib.py` |
|
|
||||||
| 查询失败误关 holding | `positions_ok` 为假时不关 holding | `options_spot_bridge_lib.py` |
|
|
||||||
| 回滚卖币无封顶 | 回滚按桥 `coin_bought` 封顶 | `options_spot_bridge_lib.py` |
|
|
||||||
|
|
||||||
## 3. 测试
|
|
||||||
|
|
||||||
新增:`tests/test_spot_dust_and_sell_cap.py`
|
|
||||||
|
|
||||||
已跑通:
|
|
||||||
|
|
||||||
- `tests.test_spot_dust_and_sell_cap`
|
|
||||||
- `tests.test_options_partial_close_accum`
|
|
||||||
- `tests.test_options_profit_exit_recycle`
|
|
||||||
- `tests.test_options_btc_pnl_usdt`
|
|
||||||
|
|
||||||
## 4. 审计轮次
|
|
||||||
|
|
||||||
| 轮次 | 结果 |
|
|
||||||
| --- | --- |
|
|
||||||
| 修复前 | 多条 Critical/High(见审计报告 §3) |
|
|
||||||
| 第 1 轮 Bugbot | 2 High → 已修 |
|
|
||||||
| 第 2 轮 Bugbot + 人工 | 无确认残留 High/Critical |
|
|
||||||
|
|
||||||
详见:`docs/审计报告-高危修复-2026-10-07.md`
|
|
||||||
|
|
||||||
## 5. 部署建议
|
|
||||||
|
|
||||||
1. 推送本仓库后,对**所有实例**(含模拟盘「波段-复利」)远程更新并重启
|
|
||||||
2. 验证:中控平仓后自动卖回;粉尘不再显示/不拦开仓;模拟盘不再频繁「数据库锁定」
|
|
||||||
3. 若仍见旧 pending 桥:开仓流程会自动清粉尘;或重启后再试一次开仓
|
|
||||||
|
|
||||||
## 6. 未改(有意保留)
|
|
||||||
|
|
||||||
- 永续监控 `check_order_monitors` 长连接(Medium,非本次高危范围)
|
|
||||||
- 粉尘仍会留在交易所账户内,仅程序忽略展示与重试
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
# 审计报告:中控 Bridge + 实例全方位(2026-10-07)
|
|
||||||
|
|
||||||
> 基线提交:`a23fb7c`(含数据统计页与实盘说明同步)
|
|
||||||
> 对照:`docs/审计报告-高危修复-2026-10-07.md`(币本位高危闭环)
|
|
||||||
|
|
||||||
## 1. 范围
|
|
||||||
|
|
||||||
| 范围 | 内容 |
|
|
||||||
| --- | --- |
|
|
||||||
| 本仓库实例侧 | `app.py`、`lib/options/**`、`lib/instance/**`、`lib/hub/**`(Bridge)、`lib/sim/**`、`lib/env/**`、备份/远程更新 |
|
|
||||||
| 本仓库中控侧 | 仅有 **实例 Bridge**(`/api/hub/*`、`/hub_sso`);**中控前端/常驻进程**在独立仓库(如 `crypto_okx_hub`),本轮未审其 SSRF/SSE 实现 |
|
|
||||||
| 方法 | 三路并行静态审阅(Bridge 权限、资金路径回归、Web 鉴权/XSS/CSRF)+ 人工复核关键代码 + 对照 10-07 高危修复项 |
|
|
||||||
|
|
||||||
## 2. 总览
|
|
||||||
|
|
||||||
| 级别 | 数量 | 说明 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| Critical | 1 | Bridge Token 明文进 env 设置页 → 等价远程 root |
|
|
||||||
| High | 6 | 平仓后卖币回归;settings 认 Bridge Token;7 天 embed_sso;备份 tar slip;CSRF/破坏性 GET;`/options/guide` 缺模块 500 |
|
|
||||||
| Medium | 9 | 监控/条件单失败语义;close_preview 时延;Webhook;登录无限速;复盘图;journal 删路径;frame-ancestors=*;version 泄路径 |
|
|
||||||
| Low | 若干 | 密码策略、进程内 SECRET 回退、局部 XSS、SSO 可重放至过期、settings Token 用 `==` |
|
|
||||||
|
|
||||||
**币本位 10-07 Critical/High 主路径**:开仓增量、卖回封顶、粉尘桥、`sweep_spot_after_options_flat`、中控条件单持仓上限等 **仍在**;本地相关单测此前已通过。
|
|
||||||
**回归**:`maybe_sell_spot_after_close` 未与 sweep 对齐。
|
|
||||||
|
|
||||||
## 3. Critical
|
|
||||||
|
|
||||||
### C1 · `HUB_BRIDGE_TOKEN` 对已登录会话明文可见
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| --- | --- |
|
|
||||||
| 位置 | `lib/env/env_schema.py`(`SENSITIVE_EXACT` 未含 `HUB_BRIDGE_TOKEN`);`/api/settings/env`;设置页 JS 明文输入框 |
|
|
||||||
| 证据 | `_is_sensitive` 仅匹配 `APP_PASSWORD` / `*_SECRET` / `*_API_KEY` 等;`HUB_BRIDGE_TOKEN` 走明文 `current` |
|
|
||||||
| 影响 | 任意已登录或持有 7 天 `embed_sso` 的会话可复制 Token,进而无 Cookie 调用 `/api/hub/update`(git pull+重启)、`/api/hub/backup/download`(含 `.env`)、平仓/条件单等 |
|
|
||||||
| 建议 | 将 `HUB_BRIDGE_TOKEN`(及 `WECHAT_WEBHOOK`)列入 `SENSITIVE_EXACT`;UI 仅显示掩码;复制走一次性确认;拆分 read/trade/admin Token |
|
|
||||||
|
|
||||||
## 4. High
|
|
||||||
|
|
||||||
### H1 · 平仓后卖币:持仓查询失败/`None` 当空仓(回归)
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| --- | --- |
|
|
||||||
| 位置 | `lib/options/options_coin_open_lib.py` · `maybe_sell_spot_after_close` |
|
|
||||||
| 证据 | `fetch_option_positions(ex) or []`;`except: pass` 后仍调用 `sell_residual_after_option_flat` |
|
|
||||||
| 对照 | 同文件 `sweep_spot_after_options_flat` 已正确拒绝 `None`/异常 |
|
|
||||||
| 调用链 | 买一平仓 / close_exec / monitor 同步卖币 |
|
|
||||||
| 影响 | API 抖动时可能市价卖掉桥/抵押币,期权仓仍在 |
|
|
||||||
| 建议 | 与 sweep 对齐;加单测 |
|
|
||||||
|
|
||||||
### H2 · Bridge Token 可认证大部分 `/api/settings/*`
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| --- | --- |
|
|
||||||
| 位置 | `lib/instance/instance_settings_register.py` · `_api_login_required` |
|
|
||||||
| 证据 | `X-Hub-Token == HUB_BRIDGE_TOKEN` → `allowed=True`;仅拦截 env **写入**,不拦 restart / backup restore / download |
|
|
||||||
| 影响 | Token 即可恢复备份(含 `.env`)、PM2 重启,无需实例密码 |
|
|
||||||
| 建议 | Bridge 只走 `/api/hub/**`;设置类 API 仅 session/embed_sso |
|
|
||||||
|
|
||||||
### H3 · `embed_sso` 默认 7 天且可进 URL
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| --- | --- |
|
|
||||||
| 位置 | `hub_bridge_register.py` `/hub_sso`;`app.py` `login_required` |
|
|
||||||
| 影响 | Referer/历史/日志泄露 → 长期全权 UI(含开仓、改密、恢复备份) |
|
|
||||||
| 建议 | TTL 缩至数小时;禁止 query 传参(仅 header/sessionStorage);绑定 Origin |
|
|
||||||
|
|
||||||
### H4 · 备份恢复 `tar.extractall` 无成员路径校验
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| --- | --- |
|
|
||||||
| 位置 | `lib/instance/backup_lib.py` · `restore_backup` |
|
|
||||||
| 影响 | 已认证用户恢复恶意包时可写穿临时目录(tar slip) |
|
|
||||||
| 建议 | Python 3.12+ `filter="data"`;或校验成员路径不越出 `tmp` |
|
|
||||||
|
|
||||||
### H5 · CSRF:`SameSite=None` + 无 CSRF Token;破坏性 GET
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| --- | --- |
|
|
||||||
| 位置 | `app.py` Cookie SameSite 默认 None;`/del_key/<id>` GET 删除 |
|
|
||||||
| 影响 | 跨站可借会话触发恢复/改密等;`<img src=/del_key/…>` 可删关键位 |
|
|
||||||
| 建议 | 状态变更一律 POST + CSRF/Origin 校验;删除改 POST |
|
|
||||||
|
|
||||||
### H6 · `/options/guide` 引用不存在的 `lib.hub.hub_strategy_lib`
|
|
||||||
|
|
||||||
| | |
|
|
||||||
| --- | --- |
|
|
||||||
| 位置 | `lib/options/options_register.py`(约 441 行) |
|
|
||||||
| 证据 | 仓库内无 `hub_strategy_lib.py`;同能力已在 `lib/common/markdown_html_lib.py` |
|
|
||||||
| 影响 | 打开期权说明页直接 ImportError/500(可用性 High,非资金) |
|
|
||||||
| 建议 | 改为 `from lib.common.markdown_html_lib import render_markdown_html` |
|
|
||||||
|
|
||||||
## 5. Medium
|
|
||||||
|
|
||||||
| ID | 主题 | 位置 | 要点 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| M1 | 监控持仓拉取失败 → `[]` | `options_monitor_lib.py` | 目标监控可能被标 expired,自动化出场中断 |
|
|
||||||
| M2 | 条件单 exit `or []` / `machine_has_option_position` 视 `None` 为空 | `options_cond_order_lib.py` | 查询失败可能误结束条件单 |
|
|
||||||
| M3 | 中控快照仍算 `close_preview` | `options_hub_lib.py` | 利于流动性展示,加重超时风险(相对 10-07「关闭 preview」有回退) |
|
|
||||||
| M4 | `WECHAT_WEBHOOK` 未脱敏 | env schema | 登录用户可读完整 webhook |
|
|
||||||
| M5 | `/login` 无限速 | `app.py` | 密码爆破 |
|
|
||||||
| M6 | 复盘静态图无 login | `options_review_register.py` | 依赖不可猜测文件名 |
|
|
||||||
| M7 | journal 删除路径未限制在 upload 根下 | `journal_images_lib.py` | DB 被投毒时可删库外文件 |
|
|
||||||
| M8 | `HUB_EMBED_FRAME_ANCESTORS=*` | `hub_bridge_auth.py` | 任意父页可嵌实例(点击劫持面) |
|
|
||||||
| M9 | `/api/hub/version` 返回本机 `repo` 绝对路径 | `instance_update_lib.py` | 信息泄露(需 Bridge Token) |
|
|
||||||
|
|
||||||
## 6. Low / 运维注意
|
|
||||||
|
|
||||||
- Bootstrap 空密码时写入 `admin123`(`scripts/bootstrap_deploy_secrets.py`)— 上线后必须改密
|
|
||||||
- `APP_AUTH_DISABLED=true` 关闭全部鉴权 — 仅本地调试
|
|
||||||
- `FLASK_SECRET_KEY` 未配置时进程随机 — 重启会话失效
|
|
||||||
- 改密最短 6 位、明文比对 `.env`
|
|
||||||
- 复盘/统计主路径有 `escapeHtml`;`options_panel.js` 等对交易所字段拼接仍有局部 XSS 面
|
|
||||||
- 远程更新依赖固定脚本 + `git pull`:Token 泄露即供应链风险(与 C1/H2 叠加)
|
|
||||||
- SSO 签名令牌在过期前可重放(无一次性消费);settings 侧 Token 比对用 `==` 而非 `hmac.compare_digest`
|
|
||||||
- `lib.hub.hub_auth` 在本仓不存在,settings 鉴权依赖 ImportError 回落(行为易混淆)
|
|
||||||
|
|
||||||
## 7. 已验证仍稳健(摘要)
|
|
||||||
|
|
||||||
- Bridge 写路径:禁市价平、中控仅全平、条件单创建有持仓上限与本机有仓拒绝
|
|
||||||
- SSO `next` 防开放重定向(`_safe_next_path`)
|
|
||||||
- 备份文件名白名单 + 路径限制在 backup 目录内
|
|
||||||
- Bridge Token 校验用 `hmac.compare_digest`
|
|
||||||
- 币本位:买币增量、卖回 `coin_amount` 封顶、粉尘桥 `positions_ok`、sweep 失败不卖
|
|
||||||
- SQLite WAL + busy_timeout;条件单/目标出场多数已「先关连接再网络」
|
|
||||||
- env 对 API Key / Passphrase / App 密码有脱敏
|
|
||||||
|
|
||||||
## 8. 建议修复优先级
|
|
||||||
|
|
||||||
1. **立刻**:C1 脱敏 `HUB_BRIDGE_TOKEN`;H1 对齐 `maybe_sell_spot_after_close`;H6 guide 导入修正
|
|
||||||
2. **本周**:H2 收紧 settings 对 Bridge Token;H3 缩短 embed_sso;H4 tar filter;H5 CSRF + `/del_key` POST
|
|
||||||
3. **随后**:M1–M3 失败语义统一;M4–M9 加固;评估中控侧独立仓库 SSRF/实例 URL 白名单
|
|
||||||
|
|
||||||
## 9. 结论
|
|
||||||
|
|
||||||
- **交易资金主路径**:10-07 高危大多仍成立,但 **平仓后卖币入口存在明确 High 回归**,应优先修。
|
|
||||||
- **中控/实例权限模型**:单一长效 `HUB_BRIDGE_TOKEN` + 明文进设置页 + 设置 API 认 Token,是本轮 **最大系统性风险**(Critical)。
|
|
||||||
- **中控 UI 仓库**未纳入本轮;实例 Bridge 与中控控制面需分开再审一轮。
|
|
||||||
|
|
||||||
修复后建议:再跑一轮 Bugbot(未提交变更)+ `tests.test_spot_dust_and_sell_cap` 等币本位单测,并人工测「持仓 API 失败时不卖币」。
|
|
||||||
|
|
||||||
## 10. 审阅来源
|
|
||||||
|
|
||||||
并行静态审阅(结果已并入上文):[Bridge 权限](f31789fc-cb2a-4838-ba28-777fbdc07de0)、[资金路径回归](b0c41cf8-fa1c-4a7c-8840-b2ba60fceb15)、[Web 鉴权/CSRF](6c69483e-2340-47c0-bdb8-0d02473dbfbf)。
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
# 审计报告:已实现盈亏曲线(实例 + 中控)(2026-10-13)
|
|
||||||
|
|
||||||
## 1. 范围
|
|
||||||
|
|
||||||
- 实例数据统计曲线:`query_realized_pnl_series_with_db` / `/api/instance/cash_curve`
|
|
||||||
- 中控桥接:`GET /api/hub/options/pnl_curve`(`crypto_okx`)
|
|
||||||
- 中控汇总:`pull_all_pnl_curves` → `build_stats_curve`(`crypto_okx_hub`)
|
|
||||||
- 真盈亏口径一致性:`realized_pnl_usdt` = 期权币盈亏 × 平仓价(卖回 VWAP 优先)
|
|
||||||
- 安全面:桥接 Token、会话鉴权、注入与信息泄露
|
|
||||||
|
|
||||||
相关提交(摘要):
|
|
||||||
|
|
||||||
| 仓库 | 提交 | 说明 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| crypto_okx | `b31f861` | 实例曲线改累计已实现盈亏 |
|
|
||||||
| crypto_okx | `117f595` | 暴露 `/api/hub/options/pnl_curve` |
|
|
||||||
| crypto_okx_hub | `f2605b1` | 中控曲线改各机叠加,不再用余额采样 |
|
|
||||||
|
|
||||||
## 2. 审计方法
|
|
||||||
|
|
||||||
1. 静态审阅实例曲线、桥接 API、中控聚合与前端绘制路径
|
|
||||||
2. Security Review 子代理(实例仓 + 中控仓;中控侧因 CRLF 噪声 diff 不完整,人工补审 `stats_agg_lib` / `bridge_client_lib`)
|
|
||||||
3. 本地单测:
|
|
||||||
|
|
||||||
```text
|
|
||||||
# crypto_okx
|
|
||||||
python -m unittest tests.test_instance_realized_pnl_curve \
|
|
||||||
tests.test_options_account_pnl tests.test_options_review_pnl_freeze -q
|
|
||||||
→ OK (12)
|
|
||||||
|
|
||||||
# crypto_okx_hub
|
|
||||||
python -m unittest tests.test_stats_realized_pnl_curve -q
|
|
||||||
→ OK (1)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 3. 安全审计结论
|
|
||||||
|
|
||||||
| 级别 | 结论 |
|
|
||||||
| --- | --- |
|
|
||||||
| Critical / High / Medium | **未发现**由本批曲线改动引入的安全缺陷 |
|
|
||||||
|
|
||||||
要点:
|
|
||||||
|
|
||||||
- `/api/hub/options/pnl_curve`:`hub_bridge_token_ok`(`hmac.compare_digest`),空 Token 拒绝
|
|
||||||
- `/api/instance/cash_curve`:`@login_required`(会话 / embed_sso)
|
|
||||||
- SQL 固定语句,`range` 仅作窗口解析,不进 SQL 拼接
|
|
||||||
- 响应为聚合点列,无凭证 / 逐笔敏感字段外泄
|
|
||||||
|
|
||||||
既有基线风险(Bridge Token 出现在设置页、长寿命 embed_sso 等)**非本批引入**,不计入本次闭环。
|
|
||||||
|
|
||||||
## 4. 正确性 / 产品审计发现
|
|
||||||
|
|
||||||
| 级别 | 位置 | 问题 | 建议 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| Medium | `crypto_okx_hub` `build_stats_curve` | 某机拉曲线失败时 `points=[]`,合计直接不含该机 → **离线瞬间合计台阶可能陡降**(上次成功值未保留) | 失败机沿用上次成功曲线,或合计仅对 `online` 且有点的机求和并在 UI 标明「部分机离线」 |
|
|
||||||
| Medium | `instance_cash_sample_lib._trade_realized_usdt` | 无 `realized_pnl_usdt` 时回退 `币盈亏×close_index_px`,**未走卖回 VWAP**;与冻结真盈亏可能不一致 | 回退改调 `resolve_true_pnl_usdt_from_trade`,或曲线只计 `realized_pnl_usdt IS NOT NULL` |
|
|
||||||
| Low | `query_realized_pnl_series_with_db` | `trade_count` 为全历史可计价平仓笔数,非当前窗口笔数 | 改名或改为窗口计数,避免与 KPI「笔数」混淆 |
|
|
||||||
| Low | 中控 KPI vs 曲线 | 表「已实现」来自窗口 stats;曲线 `latest` 为带基线的累计水平 | 文案已区分;保持即可,勿拿曲线终点直接当窗口 KPI |
|
|
||||||
| Low | 部署依赖 | 旧实例无 `pnl_curve` → 404 → 中控该机空曲线 | 全实例更新到含 `117f595` 后再看中控合计 |
|
|
||||||
| Info | 中控 summary vs curve | summary 用 overview snaps;curve 另拉 `pnl_curve` | 刷新时刻可能略不一致,属缓存架构特性 |
|
|
||||||
|
|
||||||
## 5. 口径核对(通过项)
|
|
||||||
|
|
||||||
| 项 | 状态 |
|
|
||||||
| --- | --- |
|
|
||||||
| 曲线不受划转/提现影响(不读余额采样) | 通过 |
|
|
||||||
| 累计台阶:平仓加一笔、窗口前累计作基线 | 通过(单测覆盖) |
|
|
||||||
| 中控合计:1 分钟桶 + 各机前向填充后求和 | 通过(单测覆盖) |
|
|
||||||
| 桥接与实例 UI 共用同一查询函数 | 通过 |
|
|
||||||
| 中控文案「已实现盈亏曲线」与空态提示 | 通过 |
|
|
||||||
|
|
||||||
## 6. 结论
|
|
||||||
|
|
||||||
- **安全**:本批改动在鉴权与注入面上合格,无 Critical/High/Medium 安全问题。
|
|
||||||
- **正确性**:主路径(已冻结 `realized_pnl_usdt` 的平仓累加、划转无关)成立;需关注 **中控离线掉台阶** 与 **未冻结行用指数价回退** 两条 Medium。
|
|
||||||
- **上线条件**:实例先更新(暴露 `pnl_curve`),再依赖中控合计曲线;否则部分机空白属预期。
|
|
||||||
|
|
||||||
## 7. 建议后续(非阻断)
|
|
||||||
|
|
||||||
1. 中控:离线/失败机保留上一成功曲线参与合计,或合计旁显示离线名单
|
|
||||||
2. 实例:曲线点只认已冻结 U,或回退统一走 `resolve_true_pnl_usdt_from_trade`
|
|
||||||
3. 实盘冒烟:两机各有平仓 → 中控合计 ≈ 两机曲线终点之和;一机停服刷新 → 确认合计是否异常跳变(验证第 4 节 Medium)
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
# 永续删除 / 关键位保留 — 审计报告(2026-10-07)
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
- **保留**:关键位监控(`key_monitor` 页面、`/key_*` 与 `/api/key_*` 路由、`check_key_monitors()`、`lib/key_monitor/*`、相关 DB 表)。
|
|
||||||
- **删除**:永续下单/平仓、下单监控 CRUD、自动划转/强平、仅服务于永续的 lib 与模板;期权与 hub bridge 路径不受影响。
|
|
||||||
|
|
||||||
## 已删除或下线的能力
|
|
||||||
|
|
||||||
### app.py
|
|
||||||
|
|
||||||
- 移除:`check_order_monitors`、`force_close_before_reset`、`auto_transfer_once_per_day`、`reconcile_external_close(s)`、OKX 永续开平仓与 TP/SL 同步大段逻辑。
|
|
||||||
- `place_exchange_order` / `close_exchange_order` **已物理删除**(调用方与 sim 包装一并移除)。
|
|
||||||
- `background_task()` 仅调用 `check_key_monitors()`;`if __name__` 下恢复 `threading.Thread(..., daemon=True).start()`。
|
|
||||||
- `/api/price_snapshot`:`order_prices` 恒为 `[]`,不再查询 `order_monitors`。
|
|
||||||
- `render_main_page`:`order_list` 恒为 `[]`;开仓门禁改为本地 stub(`can_trade=False`)。
|
|
||||||
- 永续相关路由改为 `redirect('/options')` 或 410 JSON:`/add_order`、`/del_order`、`/order_focus`、`/api/order_*`、`/sync_positions`、`/manual_transfer` 等。
|
|
||||||
|
|
||||||
### 删除的文件(lib / templates)
|
|
||||||
|
|
||||||
| 路径 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| `lib/trade/force_close_lib.py` | 强平 UI/逻辑 |
|
|
||||||
| `lib/trade/open_trade_gate_lib.py` | 永续开仓门禁 |
|
|
||||||
| `lib/trade/daily_open_limit_lib.py` | 日开仓上限 |
|
|
||||||
| `lib/trade/order_monitor_display_lib.py` | 下单监控展示 |
|
|
||||||
| `lib/trade/manual_sltp_lib.py` | 手动 TP/SL |
|
|
||||||
| `lib/trade/position_sizing_lib.py` | 仓位 sizing |
|
|
||||||
| `lib/trade/trade_fee_lib.py` | 手续费净盈亏 |
|
|
||||||
| `lib/trade/trade_exchange_stats_lib.py` | 成交统计回填 |
|
|
||||||
| `lib/trade/trade_stats_calendar_lib.py` | 日历统计 |
|
|
||||||
| `lib/trade/compensating_close_lib.py` | 补偿平仓 |
|
|
||||||
| `lib/common/auto_transfer_daily_lib.py` | 日自动划转 |
|
|
||||||
| `lib/exchange/gate_transfer_lib.py` | Gate 划转 |
|
|
||||||
| `lib/exchange/okx_orders_lib.py` | OKX 永续挂单查询 |
|
|
||||||
| `lib/market/reconcile_flat_lib.py` | 外部平仓对账 |
|
|
||||||
| `order_monitor_*`、`force_close_*`、`instance_transfer_panel.html`、`gate_transfer_block.html` | 永续 UI 模板 |
|
|
||||||
| `order_focus_v2.html`、`order_plan_preview_bar.html`、`order_leverage_fields.html`、`order_entry_model_fields.html`、`templates/order_focus.html` | 永续下单/聚焦页残留模板 |
|
|
||||||
|
|
||||||
### 保留的 trade 模块
|
|
||||||
|
|
||||||
- `trade_policy_lib.py`、`trade_policy_app_lib.py`、`time_close_lib.py`
|
|
||||||
- `trade_labels_lib.py`、`trade_result_lib.py`(新增 `snapshot_stop_loss`)、`entry_model_lib.py`、`account_risk_lib.py`(日记/风控仍用)
|
|
||||||
|
|
||||||
## Sim / Options
|
|
||||||
|
|
||||||
- `lib/sim/hooks.py`:移除对 `place_exchange_order` / `close_exchange_order` 的包装;保留期权/现货桥/钱包 sim 路径。
|
|
||||||
- `lib/sim/register.py`:不再向 options cfg 注入永续下单函数。
|
|
||||||
|
|
||||||
## 测试
|
|
||||||
|
|
||||||
在项目根目录执行:
|
|
||||||
|
|
||||||
```text
|
|
||||||
python -m unittest tests.test_spot_dust_and_sell_cap tests.test_options_partial_close_accum tests.test_options_profit_exit_recycle tests.test_options_btc_pnl_usdt tests.test_hub_bridge_auth -v
|
|
||||||
```
|
|
||||||
|
|
||||||
**结果**:
|
|
||||||
|
|
||||||
| 批次 | 用例数 | 结果 |
|
|
||||||
|------|--------|------|
|
|
||||||
| 期权粉尘/卖回封顶、部分平仓、翻倍出场、BTC 盈亏、hub auth、去对冲冒烟 | 22 | **OK**(2026-10-07) |
|
|
||||||
|
|
||||||
`python -c "import app"` 可导入(`APP_AUTH_DISABLED=true`)。
|
|
||||||
|
|
||||||
## 残留风险与后续可选清理
|
|
||||||
|
|
||||||
1. **DB schema**:`order_monitors` 等表仍在 `init_db()` 中创建,历史数据未迁移;仅不再读写业务逻辑。
|
|
||||||
2. **模板/静态**:`index.html` 等仍可能含永续 UI 片段(无后端路由时多为死链);可按 display_prefs 再收一层 UI。
|
|
||||||
3. **统计口径**:`compute_stats_bundle` 仍可能统计历史 `order_monitors` 开仓次数;与「零 active 监控」展示一致,但不等于删表。
|
|
||||||
4. **设置页**:「transfer」子页改为说明文案;期权/模拟划转仍在各自模块。
|
|
||||||
5. **account_risk / entry_model / trade_labels**:日记与设置仍引用,未整包删除。
|
|
||||||
|
|
||||||
## 关键位验证建议(手工)
|
|
||||||
|
|
||||||
1. 添加 BTC/ETH 关键支撑阻力 → `/key_monitor` 列表可见。
|
|
||||||
2. 观察后台线程日志无 `[key_monitor_loop]` 以外永续轮询错误。
|
|
||||||
3. `/api/price_snapshot` 返回 `key_prices` 非空(有关键位时)、`order_prices: []`。
|
|
||||||
4. 微信提醒依赖环境变量与行情;需在实盘/模拟各测一次 RS 突破通知(若已配置 webhook)。
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
# 审计报告:期权币本位 / 模拟盘锁库 / 中控超时(2026-10-07)
|
|
||||||
|
|
||||||
## 1. 范围
|
|
||||||
|
|
||||||
- 币本位开仓、平仓、卖回、粉尘桥
|
|
||||||
- SQLite `database is locked` 与中控快照超时
|
|
||||||
- 条件单、目标/翻倍出场、模拟盘到期卖币
|
|
||||||
- 中控条件单创建与持仓上限
|
|
||||||
|
|
||||||
## 2. 审计方法
|
|
||||||
|
|
||||||
1. 静态代码审阅(开仓/卖回/监控/中控快照路径)
|
|
||||||
2. Bugbot 未提交变更审阅(第 1、2 轮)
|
|
||||||
3. 本地 `unittest`(粉尘阈值、分批平仓累计、翻倍出场、BTC 盈亏折 U 等)
|
|
||||||
|
|
||||||
## 3. 第 0 轮(修复前)高危清单(摘要)
|
|
||||||
|
|
||||||
| 级别 | 问题 |
|
|
||||||
| --- | --- |
|
|
||||||
| Critical | 买币增量≤0 时误用整户余额估张数 |
|
|
||||||
| High | IOC 部分成交 / 51008 减半后未卖多余币 |
|
|
||||||
| High | 卖回扫光交易户该币(未按桥封顶) |
|
|
||||||
| High | 粉尘桥余额 `None` 时不清、拦开仓且无重试按钮 |
|
|
||||||
| High | 展示持仓/历史握库拉盘口 → 锁库/超时 |
|
|
||||||
| High | 中控快照每次算 close_preview 加重超时 |
|
|
||||||
| High | 条件单/目标/翻倍出场握库嵌套开平仓 |
|
|
||||||
| High | 模拟到期卖币失败静默吞掉 |
|
|
||||||
| High | 中控建条件单不校验持仓上限 |
|
|
||||||
| High | 持仓查询失败被当成空仓仍可能卖币(第 1 轮复现相关) |
|
|
||||||
|
|
||||||
## 4. 第 1 轮审计(修复后 Bugbot)
|
|
||||||
|
|
||||||
仍发现 2 条 High,已当场修复:
|
|
||||||
|
|
||||||
| 级别 | 位置 | 问题 | 处置 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| High | `options_spot_bridge_lib.clear_dust_pending_sell_bridges` | 持仓查询失败时 `live_uly` 为空,误关 `holding` 桥 | 持仓未确认成功时禁止关 holding |
|
|
||||||
| High | `sweep_spot_after_options_flat` | `fetch_option_positions` 返回 `None` 被当成 `[]` 后卖币 | `None` 直接失败返回,只清粉尘 pending |
|
|
||||||
|
|
||||||
## 5. 第 2 轮审计
|
|
||||||
|
|
||||||
- Bugbot:无通过校验器确认的 High/Critical 残留
|
|
||||||
- 人工复查:Critical/High 项均有对应修复;`check_order_monitors` 长连接等属 Medium,本次未纳入高危闭环
|
|
||||||
|
|
||||||
## 6. 本地测试
|
|
||||||
|
|
||||||
```text
|
|
||||||
PYTHONPATH=<repo> python -m unittest \
|
|
||||||
tests.test_spot_dust_and_sell_cap \
|
|
||||||
tests.test_options_partial_close_accum \
|
|
||||||
tests.test_options_profit_exit_recycle \
|
|
||||||
tests.test_options_btc_pnl_usdt \
|
|
||||||
-q
|
|
||||||
→ OK
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7. 结论
|
|
||||||
|
|
||||||
在「高危」范围内,经不少于两轮审计与本地单测,**未发现仍确认存在的 Critical/High 缺陷**。
|
|
||||||
建议实例更新到含本批修复的提交后,用模拟盘走一遍:开仓 → 中控平仓 → 自动卖回 → 再开仓(确认粉尘桥不再拦截)。
|
|
||||||
|
|
||||||
## 8. 残留风险(非高危,供后续)
|
|
||||||
|
|
||||||
| 级别 | 说明 |
|
|
||||||
| --- | --- |
|
|
||||||
| Medium | `app.py` 永续 `check_order_monitors` 仍单连接贯穿价格/平仓/微信 |
|
|
||||||
| Medium | 开仓路径部分阶段仍较长,极端并发下 WAL 写锁仍可能短暂排队 |
|
|
||||||
| Low | 现货 `minSz` 拉取失败时用固定兜底,与交易所实际上调可能短暂不一致 |
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
# 界面与风控更新说明(OKX 实例)
|
|
||||||
|
|
||||||
> 仓库已独立为 [crypto_okx](https://git.bz121.com/dekun/crypto_okx.git).一键部署见 [部署文档.md](./部署文档.md):
|
|
||||||
>
|
|
||||||
> \\ash
|
|
||||||
> curl -fsSL https://git.bz121.com/dekun/crypto_okx/raw/branch/main/deploy/manage.sh | bash
|
|
||||||
> \\n
|
|
||||||
|
|
||||||
与 Gate / Binance 主站对齐的列表窗,统计分品类,交易记录展示,复盘与移动保本交易所同步;OKX 仍为 **三页导航**(交易执行 / 记录复盘 / 统计),关键位监控合并在 **交易执行** 页,**无** Gate 独立「关键位监控」页与斐波限价监控.
|
|
||||||
|
|
||||||
## 顶栏导航(3 项)
|
|
||||||
|
|
||||||
| 顺序 | 名称 | 路由 | 说明 |
|
|
||||||
|------|------|------|------|
|
|
||||||
| 1 | 交易执行 | `/trade` | 关键位监控 + 实盘下单(**默认首页** `/` → `/trade`) |
|
|
||||||
| 2 | 交易记录与复盘 | `/records` | 交易记录,复盘表单,AI 历史(受顶栏 UTC 时间窗筛选) |
|
|
||||||
| 3 | 统计分析 | `/stats` | 按北京时间交易日切日 + 分品类统计块 |
|
|
||||||
|
|
||||||
## 列表时间窗(UTC,全站顶栏)
|
|
||||||
|
|
||||||
共用模块:仓库根目录 `history_window_lib.py`(与 Gate / Binance 一致).
|
|
||||||
|
|
||||||
| 项 | 说明 |
|
|
||||||
|----|------|
|
|
||||||
| 默认 | **UTC 当日**(`win_preset=utc_today`) |
|
|
||||||
| 可选 | 近 24 小时,近 7 天,自定义起止(UTC) |
|
|
||||||
| 作用范围 | 关键位历史,交易记录列表,复盘 API,AI 历史 API,导出「交易记录」「关键位历史」 |
|
|
||||||
| 与统计 | **仅影响列表/导出**;统计页仍按北京时间 `TRADING_DAY_RESET_HOUR`(默认 8:00)切日 |
|
|
||||||
| 切换 | 顶栏「列表筛选(UTC)」→ 应用(保留当前路由 query) |
|
|
||||||
|
|
||||||
## 交易记录与复盘
|
|
||||||
|
|
||||||
- 列表 **止损(开仓)**:展示 `initial_stop_loss` 快照(`display_open_stop_loss`).
|
|
||||||
- 类型列显示 `monitor_type` 与 `key_signal_type`(若有).
|
|
||||||
- 平仓入库:`stop_loss` / `initial_stop_loss` 为开仓止损快照;机器单 `entry_reason` 可按 `key_signal_type` 自动映射(箱体突破 / 收敛突破 → 四条固定关键位开仓类型文案).
|
|
||||||
- 复盘:开仓类型下拉含四条关键位固定文案 +「其他」;离场触发含 **「止盈」**;从交易记录填入时按结果与信号预填.
|
|
||||||
- 复盘 K 线图:以 **平仓时间** 为锚点向前约 `ORDER_CHART_LIMIT`(默认 100)根(`_fetch_ohlcv_ending_at`).
|
|
||||||
- `/api/journals`,`/api/reviews` 与顶栏 UTC 窗一致.
|
|
||||||
|
|
||||||
### 导出(交易记录 v3)
|
|
||||||
|
|
||||||
- 文件名:`trade_records_v3_YYYYMMDD.csv`
|
|
||||||
- 含 `key_signal_type`,`initial_stop_loss`,计划/实际 RR,`risk_amount` 等;末列「开仓类型」为有效展示文案.
|
|
||||||
- 受 UTC 列表窗限制;关键位历史导出同理.
|
|
||||||
|
|
||||||
## 实盘下单(交易执行页)
|
|
||||||
|
|
||||||
- **移动保本**:表单可勾选「启用移动保本」;触发阶梯上移后 **先撤后挂** 交易所 TP/SL(`replace_active_monitor_tpsl_on_exchange`),仅成功后才写库;企业微信提示含「交易所:已先撤后挂止盈止损」.未配置实盘 API 时仅更新本地止损.
|
|
||||||
- 开仓 TP/SL 仍通过 OKX `attachAlgoOrds`(与原有逻辑一致);重挂使用 ccxt `stopLoss` / `takeProfit` 参数,触发价经 `_okx_algo_trigger_price_str` 格式化.
|
|
||||||
|
|
||||||
## 统计分析页(`/stats`)
|
|
||||||
|
|
||||||
| 项 | 说明 |
|
|
||||||
|----|------|
|
|
||||||
| 切日 | 北京时间;边界 = `TRADING_DAY_RESET_HOUR:00`(默认 8) |
|
|
||||||
| 品类下拉 | 全部交易,下单监控,关键位箱体突破,关键位收敛结构,关键位斐波0.618,关键位斐波0.786 |
|
|
||||||
| URL | `stats_segment=`(`all` / `manual` / `key_box` / `key_conv` / `key_fib618` / `key_fib786`) |
|
|
||||||
| 与 UTC 窗 | 统计 **不** 随顶栏列表窗变化 |
|
|
||||||
|
|
||||||
## 斐波关键位监控(与 Gate / Binance 对齐)
|
|
||||||
|
|
||||||
| 项 | 说明 |
|
|
||||||
|----|------|
|
|
||||||
| 类型 | **斐波回调0.618**,**斐波回调0.786**(交易执行页关键位表单) |
|
|
||||||
| 同币互斥 | 每币仅一条斐波监控 |
|
|
||||||
| 挂单价 E | 做多 `E = H − ratio×(H−L)`;做空 `E = L + ratio×(H−L)`;SL/TP 为 L/H |
|
|
||||||
| 添加后 | 立即在 OKX 挂限价单;卡片显示 **挂E**,限价单 ID |
|
|
||||||
| 失效 | 标记价触达止盈侧且限价未成交 → 仅撤本条限价单(`cancel_fib_limit_order`) |
|
|
||||||
| 成交后 | 挂交易所 TP/SL → 写入 `order_monitors`(`monitor_type=关键位监控`,`key_signal_type=斐波回调…`)→ 从关键位表移除 |
|
|
||||||
| 轮询 | `check_fib_key_monitors()`(与箱体/收敛 `check_key_monitors()` 分离) |
|
|
||||||
| 盈亏比 | 计划 RR 须 > `KEY_AUTO_MIN_PLANNED_RR`(默认 1.5) |
|
|
||||||
| 日成交量 | 排名前 `KEY_DAILY_VOLUME_RANK_MAX`(默认 30) |
|
|
||||||
|
|
||||||
计算逻辑见仓库根目录 `fib_key_monitor_lib.py`.
|
|
||||||
|
|
||||||
## 与 Gate 的差异(其余)
|
|
||||||
|
|
||||||
- 无独立「关键位监控」导航页(斐波在 **交易执行** 页添加).
|
|
||||||
- 箱体/收敛与 Gate/Binance 相同:**门控 + RR 达标后自动市价开仓**(须 `LIVE_TRADING_ENABLED=true`).
|
|
||||||
|
|
||||||
## 交易所已实现盈亏(与 Gate 一致)
|
|
||||||
|
|
||||||
- 打开 **交易执行 / 交易记录** 等主页面时,若已配置 `OKX_API_KEY` / `OKX_API_SECRET` / `OKX_API_PASSPHRASE`(只读即可),同进程约 **25 秒**内最多调用一次 OKX **历史仓位**(`fetch_positions_history`),为未写入 `exchange_sync_key` 的记录匹配并回填 `exchange_realized_pnl`.
|
|
||||||
- 复盘列表盈亏优先展示交易所 U(旁标 **所**);本地公式估算标 **估**;人工复核优先.
|
|
||||||
- 手动强制同步:`GET /api/sync_exchange_pnl`(需登录).
|
|
||||||
- 可选 `.env`:`EXCHANGE_POSITION_SYNC_FROM_BJ`(北京时间起点),`EXCHANGE_POSITION_HISTORY_LIMIT`(默认 200).
|
|
||||||
|
|
||||||
## 企业微信推送(与 Gate 对齐)
|
|
||||||
|
|
||||||
- 平仓:`📉 … 平仓完成` 模板(盈亏 ±X.XX U,价位两位/按币价精度,账户资金 2 位小数).
|
|
||||||
- 开仓成功:与 Gate 相同的 emoji 分段(条件委托状态文案,RR/张数/名义 2 位小数).
|
|
||||||
- 移动保本:仅首次触发推送;交易所同步失败同一监控单只告警一次.
|
|
||||||
- 斐波/关键位/划转等推送数值格式与 Gate 一致(`format_wechat_scalar_2dp`).
|
|
||||||
|
|
||||||
## 配置与部署
|
|
||||||
|
|
||||||
- 详见 `.env.example` 中 OKX(`OKX_*`)与通用风控项.
|
|
||||||
- 代码更新后请 **重启 OKX 监控进程**;旧库行不做批量回填,展示字段有则用之,无则回退.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 共享更新记录
|
|
||||||
|
|
||||||
自 2026-07-16 起,期权/对冲等共享逻辑的变更统一记在仓库根目录 **[docs/更新文档.md](../docs/更新文档.md)**(含原因、改动文件、目标、验收)。最新一条:期权/对冲开仓仅认真实卖一深度。
|
|
||||||
Reference in New Issue
Block a user