diff --git a/docs/修复报告-高危-2026-10-07.md b/docs/修复报告-高危-2026-10-07.md deleted file mode 100644 index 95b2cef..0000000 --- a/docs/修复报告-高危-2026-10-07.md +++ /dev/null @@ -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,非本次高危范围) -- 粉尘仍会留在交易所账户内,仅程序忽略展示与重试 diff --git a/docs/审计报告-中控实例全方位-2026-10-07.md b/docs/审计报告-中控实例全方位-2026-10-07.md deleted file mode 100644 index 9be5ec6..0000000 --- a/docs/审计报告-中控实例全方位-2026-10-07.md +++ /dev/null @@ -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/` GET 删除 | -| 影响 | 跨站可借会话触发恢复/改密等;`` 可删关键位 | -| 建议 | 状态变更一律 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)。 diff --git a/docs/审计报告-已实现盈亏曲线-中控-2026-10-13.md b/docs/审计报告-已实现盈亏曲线-中控-2026-10-13.md deleted file mode 100644 index cdd70af..0000000 --- a/docs/审计报告-已实现盈亏曲线-中控-2026-10-13.md +++ /dev/null @@ -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) diff --git a/docs/审计报告-永续删除-关键位保留-2026-10-07.md b/docs/审计报告-永续删除-关键位保留-2026-10-07.md deleted file mode 100644 index 3d0f4d3..0000000 --- a/docs/审计报告-永续删除-关键位保留-2026-10-07.md +++ /dev/null @@ -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)。 diff --git a/docs/审计报告-高危修复-2026-10-07.md b/docs/审计报告-高危修复-2026-10-07.md deleted file mode 100644 index 6801aec..0000000 --- a/docs/审计报告-高危修复-2026-10-07.md +++ /dev/null @@ -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= 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` 拉取失败时用固定兜底,与交易所实际上调可能短暂不一致 | diff --git a/更新文档.md b/更新文档.md deleted file mode 100644 index df5af60..0000000 --- a/更新文档.md +++ /dev/null @@ -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)**(含原因、改动文件、目标、验收)。最新一条:期权/对冲开仓仅认真实卖一深度。