@@ -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` 拉取失败时用固定兜底,与交易所实际上调可能短暂不一致 |
|
||||
Reference in New Issue
Block a user