# 策略迭代记录

> 结构：顶部「速览」是当前状态的唯一权威位置（随每次变更就地更新）；正文是按
> 时间追加的实验日志（append-only，不回改历史章节，勘误用带日期的补注）。
> 写作规范见仓库根 `CLAUDE.md`。

## 速览（最后更新 2026-08-13）

> **当前生产版本：`5.4.2-d48-riskcap-audit`**（策略类
> `VolatilityBreakoutRiskCap`，文件
> `freqtrade/strategies/volatility_breakout/v5_d48_riskcap.py`，
> 2026-08-13 在 5.4.1 定仓/信号完全不变的前提下增强真实入场与 Auditor 因果观测，dry-run 中）

### 版本沿革

| 版本 | 上线 | 相对上一版的变更 |
|---|---|---|
| V1 | — | 5m Donchian20 + ROI 止盈 + 止损 -2%（回测 -93.6%，已废弃） |
| V5（5.0-d48） | 07-08 | 重写：Donchian48 + ADX + EMA200 顺势 + BTC 200DMA 开多闸门 + 让利润跑 |
| 5.1（未单独标号） | 07-09 | ATR 风险定仓；白名单 8→12 对；同向/相关组敞口限制 |
| 5.2-d48-risk | 07-10 | 交易所端 stop-market；StoplossGuard 60m 熔断；风控回调 fail-closed |
| 5.3-d48-shortgate | 07-12 | 空头对称 BTC 200DMA 闸门 |
| 5.4-d48-riskcap-forward | 07-23 | 继承 5.3 全部信号/退出；定仓风险分母加入实际 5% 硬止损下限 |
| 5.4.1-d48-riskcap-observe | 08-03 | 不改交易判定；记录候选突破/ADX/ATR、占槽仓位 age/R 与最弱仓置换 shadow 判定 |
| **5.4.2-d48-riskcap-audit（现行）** | **08-13** | **不改交易判定；对真实允许入场冻结 candidate/occupied state/gates，供实际订单因果关联** |

### 生产当前形态

- bot1 `VolatilityBreakoutRiskCap`（db `tradesv3-v5.sqlite`），5m，12 对白名单，
  2x isolated，dry-run 中。
- 当前远端仅运行这 1 个交易策略实例；它是带 ADX、EMA200 与 BTC 200DMA 趋势过滤的
  波动率突破策略，不存在另一个独立“趋势策略”实例。
- 入场：Donchian48 突破 + ATR 扩张 + ADX>25 + EMA200 顺势。开多需 BTC 日线
  收盘 > 200DMA（`btc_bull_1d`）+ regime.json 实时总闸（fail-closed）；开空需
  BTC 日线收盘 ≤ 200DMA（对称闸门，2026-07-12 起）。
- 出场：无 ROI 上限；trailing 3%（激活 5%）；硬止损 -5%（交易所端 stop-market）。
  三个机械出场自由度（距离/锁盈时机/时间）共 9 变体已全部实证否决，出场封盘。
- 风控：ATR 定仓（每笔风险 0.75% 钱包、单笔保证金 ≤18% 钱包）；同方向 ≤2 仓，
  BTC/ETH/SOL/BNB 高相关组同方向 ≤2 仓；StoplossGuard 2h 内 2 次止损→全局暂停 1h。
- 观测：2026-08-03 起 `entry_blocked` 除原因、候选 pair 与占槽仓位外，还记录候选
  `breakout_distance` / `breakout_atr` / ADX / ATR、占槽仓位持仓小时数与当前 R，
  并运行冻结的「强信号置换最弱仓」shadow 判定；shadow 只记日志，仍然拒单，不退出
  占槽仓、不增加第三仓。
- 审计：2026-08-13 起真实允许入场额外写 `entry_approved` 决策时快照；它是 fail-open
  旁路证据，只有 Auditor 随后观察到真实订单才关联，不改变 `confirm_trade_entry` 返回值。
  Auditor schema 1.3 / prompt v4 使用运行时策略版本，显式归因 BTC gate，合并 500ms 内
  保护止损 replacement，并从日志补采零成交 terminal cancel。
- 服务器 43.164.75.52 `/data/freqtrade`：bot1 于 2026-07-23 切换为 RiskCap 生产
  dry-run，沿用 `tradesv3-v5.sqlite` 并继续管理切换前 BTC/SOL 空仓；bot2 停止。
  EntryOther（bot3）2026-07-28 随漏单机会成本裁决停止（`price_side=other` 不采纳），
  数据库与日志保留不伪造平仓；**当前远端仅 bot1 一个交易实例在跑**。
- 执行层口径（2026-07-28 核定）：入场维持 `price_side=same` 被动限价，实测漏单率
  8.5%，成交延迟中位 6.6s / 最大 57.0s（超时线 600s）。`--fee 0.00035` 的入场
  maker 前提据此成立。真实队列位置与 stop-market 真实滑点 dry-run 测不了，
  留待小资金实盘核验。

### 实验裁决表

| 日期 | 实验 | 裁决 |
|---|---|---|
| 07-08 | V1→V5：Donchian48 + 顺势过滤 + 200DMA 开多闸门 + 让利润跑 | 部署 |
| 07-09 | ATR 风险定仓 | 部署 |
| 07-09 | 白名单 8→12 对（top20 候选池 + 60d 回测筛选） | 部署 |
| 07-09 | 相关敞口限制（同向 ≤2 仓 + 主流组 ≤2 仓） | 部署 |
| 07-10 | D42 / D36 周期放宽 | 不替换；D36 曾入 bot2 前向（07-12 停） |
| 07-10 | Trail425 收紧 trailing | 否决 |
| 07-10 | Cap3 同向 3 仓 | 否决 |
| 07-10 | NoGate 对照 | 结论：200DMA 闸门不可移除 |
| 07-10 | StoplossGuard 60m 熔断 | 部署（v5.2） |
| 07-10 | 历史黑天鹅压力测试（8 窗口） | 通过；最差 FTX 小亏，DD≤8.4% |
| 07-11 | 压缩+决定性收盘过滤（GrokCombinedD48） | 曾进 bot3 前向；07-15 退役 |
| 07-12 | ATR 吊灯 3/5/8 档 | 否决 |
| 07-12 | 宽/晚 trailing 47/58/38 | 否决（Trail38 验证段翻车） |
| 07-12 | 多头牛市 4 窗口方向性验证 | 多头不通过；催生空头闸门 |
| 07-12 | 对称空头 200DMA 闸门 | 部署（v5.3） |
| 07-12 | 多头亏损归因（PnL 拆解 + 周期消融） | 结论：毛 edge 为正，费用磨损是主因；修多头=降频 |
| 07-12 | 执行成本审计 | 协议变更：回测统一 `--fee 0.00035` |
| 07-12 | 1h 多头待命变体（long_1h.py） | 待 BTC 重上 200DMA 后前向 |
| 07-13 | 滞留仓位时间止损 48/72h | 否决（Stale48 验证段翻车）；出场封盘 |
| 07-13 | 1h 多头四窗口验证（LongBreakout1H） | 实现验证通过；3/4 窗口薄利，维持待命不部署 |
| 07-13 | 白名单第一期周度复核 | XRP/BNB 两期负但收窄且样本重叠，暂不替换；07-20 复核定夺 |
| 07-15 | 前向 A/B 与执行审计校准 | 部署观测增强；确认 bot1 携带 2 个空仓导致对照不可直接归因，交易逻辑不变 |
| 07-15 | GrokCombined 前向结案 | 退役；起点敞口不等、仅 3 笔，无法证明过滤器增量 |
| 07-16 | D48 前向亏损归因与优化门槛 | 不改生产；优先研究历史流动性过滤与风险定仓一致性 |
| 07-16 | RiskCapFix + 最新活跃池 dry-run | RiskCap 通过原 12 对风险门槛；21 对活跃池回测为负，仅按用户要求启动诊断 bot3 |
| 07-16 | LiquidityGate 滚动成交额门槛三档（5000万/1亿/2亿） | 训练段否决；小币赢家贡献被门槛连带砍掉，EDGE 问题转白名单复核 |
| 07-17 | EntryOther 可成交限价前向 | 替换不可晋升的 RiskCap bot3；从 bot1 一致性快照启动，累计 20 次订单机会后裁决 |
| 07-17 | SUI 单币扩池 | 离线否决、不启动 bot2；SUI 验证段 PF 0.77，单币训练/验证均负，组合微增来自仓位槽重排 |
| 07-19 | 15m 前低斜率空头过滤（FloorSlopeV1） | 验证段否决；PF 1.220→1.218、DD 8.75%→9.89%，近 48h 的 4 笔方向性观察未能外推 |
| 07-21 | 突破后一根 5m 保持确认（Hold1V1） | 训练段否决；收益 19.26%→3.89%、PF 1.137→1.033、DD 13.01%→14.31%，不进验证 |
| 07-23 | 12 对去除 EDGE 白名单消融 | 否决；训练段 PF 1.137→1.088、DD 13.01%→18.06%，验证段改善来自仓位槽重排，EDGE 非跨窗口稳定负贡献 |
| 07-23 | RiskCap 生产替换 | 用户明确要求以已通过双窗口风险门槛的 RiskCap 替换原定仓；保留 D48 信号/退出与生产数据库，EntryOther 下线 |
| 07-23 | EntryOther bot3 重启 | 用户要求重启；`price_side=other` + `VolatilityBreakout` 5.3，续用历史库空仓；未改裁决门槛（≥20 匹配机会） |
| 07-23 | same_side_limit 机会成本（hindsight） | **不支持加仓数**；被挡 6h/24h 均价路径为负，拥堵主因是长持相关仓占槽；维持同向 ≤2 |
| 07-28 | 被动限价漏单机会成本（EntryOther 提前结案） | **不支持切 `other`，维持 `same`**；保证金口径成本 11 bp/笔 vs 收益 3.8 bp/笔（2.9 倍，非稳健）；漏单率 8.5% 为下界，真实值须实盘复核。bot3 停止 |
| 07-28 | 规模上限与市场冲击（首测） | **账户上限约 306 USDT**（1% 参与率，约束对 POWER）；小资金核验不受阻；`max_stake_wallet_fraction=0.18` 在 RiskCap 后恒不绑定 |
| 08-03 | same_side 14d 链路复核 + replacement shadow | 159 个完整 24h 拦截簇：45 先达锁盈幅度、42 先达止损、72 均未达；24h 同币去重 24 vs 29，不支持加第三仓。生产仅部署因果快照与置换 shadow，不真实换仓 |
| 08-10 | 最近两周订单链路 + 11 对 active universe 单因素复核 | 订单链路不支持改止损、追价或仓位上限；移除 inactive VANRY 的 11 对方案训练 14.26%/PF 1.136、验证 5.01%/PF 1.102，均弱于 12 对基线，**NO-GO，不改生产交易逻辑** |
| 08-13 | 本周订单 + DS V4 因果复盘 | 5 次提交、4 次成交、1 次有利撤单；不改交易逻辑。部署 schema 1.3 / prompt v4 与 ENTRY-SNAPSHOT-v1，修正版本、BTC gate、止损 replacement、终态撤单归因 |

### 回测协议标准（当前）

- 回测均在服务器容器内执行（`/data/freqtrade`，2C4G 生产机，避免与研究 bot 并行重活）。
- 12 对白名单、1000 USDT、2x isolated、最多 4 仓；训练段 `2026-01-01~05-01` 筛选，
  胜者才进验证段 `2026-05-01~07-10`。
- `--fee 0.00035`（2026-07-12 费率审计定的现实假设）；显式 `--timeframe 5m`；`--cache none`。
- ⚠️ config 的 `timeframe` 会静默覆盖策略类属性：回测必须显式传参，事后核对结果
  zip 中 strategy 段的 `timeframe` 字段；部署时 config 与策略类保持一致。
- 牛市/压力窗口用 `--datadir user_data/data/binance_stress`（BTC/ETH/BNB/SOL，2020~2026）。
- 结果 zip 按主题归档在服务器 `user_data/backtest_results/<主题>/`。

### 开放前沿（按优先级）

1. **上实盘路径**（07-28 起的主线）：执行层方向性问题已结案（维持 `same`），
   剩余门槛依次为——(a) 规模上限/市场冲击 **已于 07-28 首测**：1% 参与率下账户上限
   约 306 USDT（约束对 POWER），100~200 USDT 的核验不受阻，详见文末章节；(b) 小资金实盘
   执行核验（100~200 USDT、≥20 笔，只测真实排队成交率、stop-market 真实滑点、
   API 稳定性——**真实漏单率是首要观测项**，若显著高于 dry-run 的 8.5%，07-28 的
   `same/other` 裁决须重开；亏损属合格结果。金额窗口 213~306 USDT，取 280；
   完整步骤、中止条件与回填流程见 `docs/live-verification-runbook.md`）；
   (c) 核验滑点回填回测后再定资金量。规划数字用
   PF 1.12~1.16 区间，不上调。**容量天花板是战略约束**：12 对锁死在几百 USDT，
   去掉 POWER/EDGE/VANRY 可到约 8,755 USDT 但 edge 退化（07-16 LiquidityGate、
   07-23 EDGE 消融均已否决），无参数解。容量随白名单周度复核滚动重跑。
2. **研究线**：RiskCap 已替换 bot1 原定仓成为生产 dry-run；21 对活跃池扩展仍维持
   否决。EntryOther 已于 07-28 结案否决，bot3 停止，**当前无研究 bot 在跑**。
   趋势网格仍是独立研究方向，见 `docs/trend-grid-strategy-iterations.md`。
   注：若将来重开执行层 A/B，须先解决匹配率问题——07-28 实测两个 bot 的严格匹配
   率仅 25%（槽位路径分歧），对照 bot 需放宽 `max_open_trades` 使槽位不成约束，
   否则预注册门槛不可达。
3. **槽位 / same_side_limit**：07-23 与 08-03 两轮机会成本均不支持把同向上限从 2
   提到 3（与 Cap3 离线否决一致）。08-03 已部署因果快照与冻结的「置换最弱仓」
   shadow：候选需 `breakout_atr>=0.10` 且 `ADX>=30`，最弱占槽仓需 `current_R<=0`；
   生产仍拒单，不真实换仓。先积累非重叠 shadow 样本，再按同窗基准/单因素变体验证，
   不作时间止损重开。详见文末 07-23、08-03 same_side 章节。
4. **小币问题与风险定仓一致性**：滚动成交额门槛（LiquidityGate 三档）已于 07-16
   训练段否决——成交额不预测 pair 盈亏，门槛连带砍掉 VANRY/ADA 等小币赢家；EDGE
   的训练段+前向双差曾指向 pair 自身质量，但 07-23 的去除 EDGE 双窗口消融被否决：
   训练段显著退化，验证段改善主要来自仓位槽重排，不能按单币近期表现直接剔除。
   07-17 SUI 单币扩池也因验证段自身为负而否决，进一步确认不能把组合内贡献当成
   可移植的 pair alpha。风险定仓失配的 RiskCapFix 已通过两段风险门槛，并于 07-23
   替换原生产定仓实现。
   详见文末 07-16 归因、LiquidityGate、SUI 扩池与 07-23 EDGE 消融章节。
5. **多头逻辑不赚钱**：1h 低频多头（`research/long_1h.py`）四个牛市窗口已回测
   验证（3/4 薄利、回撤 3.5~5.5%），funding 上限过滤已实现（live-only，
   >0.05%/8h 拦多，fail-closed）。待 BTC 重上 200DMA 后以独立 dry-run 启动前向；
   启动前先同步服务器上的 long_1h.py 副本（含 funding 过滤的版本在 repo）。
6. **regime.json 六因子闸门增量未验证**：继续攒 `regime_history.jsonl`，序列够长后
   回放对比纯 200DMA 代理。

## 最近两周订单链路与 active universe 复核（2026-08-10）

- 2026-07-27～08-10 新开且已平 20 笔，净收益 +24.13 USDT、PF 1.394；26 次入场挂单中
  22 次成交、4 次零成交撤单。漏单后验不支持切主动成交，退出路径不支持调整硬止损或 trailing。
- DS V4 与确定性账本的总体裁决一致；唯一事件级 question 是旧保护止损归属假阳性，已在
  LLM Auditor schema 1.2 / prompt v3 修复。LLM 只作为第二审阅层，账本优先。
- 对实际可交易 11 对做单因素回测：训练 304 笔、+14.26%、PF 1.136、DD 11.58%；验证
  166 笔、+5.01%、PF 1.102、DD 7.88%。对应 12 对 RiskCap 基线为训练 +16.69%、
  PF 1.141、DD 11.37%，验证 +11.68%、PF 1.223、DD 7.44%。两段均未通过晋升门槛。
- 裁决：不把 inactive VANRY 的被动缺失包装成策略优化；保持信号、出场、敞口和执行参数不变。
  后续通过 Auditor 前向积累真实入场特征，再预注册单因素亏损抑制实验。
- 完整报告、已目检权益曲线和脱敏回测归档位于
  `artifacts/freqtrade-review-2026-08-10/`。

## 本周订单与 DS V4 因果复盘修复（2026-08-13）

- 窗口 08-10～08-13 共 5 次入场提交、4 次成交、1 次零成交撤单；本周新开且已平两笔
  实现 +29.34U，样本仍不足以调整信号、仓位、止损或执行参数。
- 确定性账本确认 68 次保护止损换单 successor 间隔中位 2.1ms、最大 8.5ms；DS 的
  execution question 主要是旧事件把撤单与 successor 拆开，并非已证实的保护缺口。
- 生产观测单因素升级为 `5.4.2-d48-riskcap-audit`：新增 `entry_approved` 决策时快照，
  记录 candidate、同向 occupied state 与通过的 gate。记录失败为 fail-open，不影响真实交易。
- LLM Auditor 升至 schema 1.3 / prompt v4：从运行时 `show_config` 取策略版本；BTC 200DMA
  不通过显式记 risk gate block；500ms 内同交易/用途/近似数量的保护单 successor 合并为
  replacement；从日志补采新版本开始持续观察订单的零成交 terminal cancel；真实入场订单关联
  ENTRY-SNAPSHOT-v1。首次升级不回放旧终态日志。
- 这次变更只修审计链和因果证据，不改变入场公式、限仓、RiskCap、硬止损、trailing、
  StoplossGuard 或下单价格。完整本周报告与已目检分层图位于
  `artifacts/freqtrade-week-review-2026-08-10/`。
- 04:41Z 生产验收：bot1 连续心跳为 `5.4.2-d48-riskcap-audit`；ADA #53、ZEC #54
  各保留一张有效交易所端模拟保护止损；Auditor 已出现 5.4.2/schema 1.3/prompt v4 事件，
  历史订单迁移重试已归零。回滚点为远端
  `/data/freqtrade/backups/auditor-20260813T0435Z`。

## VolatilityBreakout → V5（2026-07-08，bot1）

### 动因

V1 dry-run 23 小时亏 -1.3%（PF 0.75），六个月回测确认结构性负期望：
**-93.6%，PF 0.74**，4727 笔。亏损结构：43% 的交易打到 -2.2% 硬止损
（合计 -3581 USDT），止盈单平均只有 +1.1%~1.6%，赚亏比 0.6，胜率 56% 盖不住。
dry-run 与回测 PF 一致（0.75 vs 0.74），说明管道可信、不是运气问题。

### 变体对照（每次只动一组变量）

| 变体 | 改动 | 交易数 | 总收益 | PF | 多头/空头 |
|---|---|---|---|---|---|
| V1 | 5m, Donchian20, ROI 止盈, 止损 -2% | 4727 | -93.6% | 0.74 | -56% / -37% |
| V2 | +ADX>25 +EMA200 顺势 | 3196 | -76.4% | 0.80 | -59% / -18% |
| V3 | 放宽 ROI/止损 -4%（见下方教训，实际仍 5m） | 1590 | -74.2% | 0.82 | -70% / -4.5% |
| V4 | Donchian48 + 顺势过滤 + 无 ROI 上限 + 止损 -5% | 700 | -30.4% | 0.92 | -46% / **+15.6%** |
| V5@1h | V4 + BTC 200DMA 开多闸门，真 1h | 185 | -11.7% | 0.91 | 0%（全拦）/ -11.7% |
| V5 无闸门@1h | 对照组 | 304 | -34.8% | 0.80 | -31% / -3.9% |
| **V5@5m（部署）** | V4 + BTC 200DMA 开多闸门 | 487 | **-0.96%** | **1.00** | 0%（全拦）/ -0.96% |

关键结论：

1. **单项改动都只是止血，叠加才质变**：过滤假突破（Donchian48）、只做顺势
   （ADX+EMA200）、让利润跑（去 ROI 上限 + 移动止损 3%/5%）各贡献一部分。
2. **BTC 日线 200DMA 开多闸门贡献最大**（1h 对照：-34.8% → -11.7%，约 +23pp）。
   这半年 BTC 全程在 200DMA 下方，闸门拦掉了全部多头——等于只验证了空头腿。
3. **空头边际在 5m 不在 1h**：V5@1h 空头 -11.7%，V5@5m 打平。周期保持 5m。

### V5 当前形态

`freqtrade/strategies/volatility_breakout/v5_d48.py`，bot1 部署（db: `tradesv3-v5.sqlite`，
V1 战绩保留在 `tradesv3.sqlite`，回滚用服务器 `docker-compose.yml.bak`）。

- 5m，Donchian48 突破 + ATR 扩张 + ADX>25 + EMA200 顺势，多空双向
- 开多需 BTC 日线收盘 > 200DMA（informative pair，regime 的**可回测代理**）
- 保留 regime.json 实时开多总闸（confirm_trade_entry；2026-07-10 起 fail-closed，见 market-regime.md）
- 无 ROI 止盈上限；移动止损 3%（激活线 5%）；硬止损 -5%；杠杆 2x
- 2026-07-09 起新增 ATR 风险定仓：每笔风险预算 0.75% 钱包、单笔保证金上限
  18% 钱包，避免 `stake_amount=unlimited` 在低波动时把单笔仓位顶到 25% 钱包。
- 2026-07-09 起新增组合风险闸门：同方向最多 2 个未平仓；BTC/ETH/SOL/BNB
  高相关组同方向最多 2 个未平仓。
- 2026-07-09 起白名单扩展为 12 对：BTC、ETH、SOL、BNB、XRP、DOGE、ADA、ZEC、
  EDGE、POWER、VANRY、UNI。来源：Binance USDT-M 24h quoteVolume top20 候选池 +
  最近 60 天回测筛选。

## V5 风险定仓迭代（2026-07-09，bot1）

### 动因

上线后确认只保留 bot1（`VolatilityBreakout`，V5 逻辑合并版），停用 bot2/bot3：

- bot2 `HighVolMeanRev`：28 笔已平，-5.87 USDT；多头 -14.79，空头 +8.91。
- bot3 `RisingVolTrend`：95 笔已平，-82.21 USDT；5m 频繁换向，尤其多头 -68.64。
- V5 dry-run 样本很小但结构最好：4 笔空头，2 笔已平，已实现 +10.65 USDT。

V5 的主要问题不是信号不够，而是 `stake_amount=unlimited` + `max_open_trades=4`
会把钱包近似四等分；2x 下单笔名义敞口较大，回测最大回撤接近 46%。因此本轮只做
仓位风险预算，不动入场信号。

### 变体对照

| 变体 | 改动 | 交易数 | 总收益 | PF | 最大回撤 | 结论 |
|---|---|---:|---:|---:|---:|---|
| V5@5m 原版 | 固定等权仓位，移动止损 3%/5%，硬止损 -5% | 487 | -0.96% | 1.00 | 约 46% | 基线，接近打平但回撤过大 |
| V5 ATR 出场实验 | ATR 定仓 + ATR custom_stoploss + 趋势失效退出 | 1704 | -69.20% | 0.47 | 69.49% | **否决**：过早退出导致交易数暴增、负期望 |
| **V5 ATR 定仓（部署）** | 只加 ATR 风险定仓，保留原 V5 出场 | 491 | **+4.46%** | **1.02** | **35.52%** | 改善收益和回撤，行为接近原 V5 |

回测命令：

```bash
cd /data/freqtrade
docker compose run --rm freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/volatility_breakout \
  --strategy VolatilityBreakout \
  --timerange 20260101-20260709
```

注意：服务器历史 5m 数据实际截至 `2026-07-07 03:15 UTC`，所以这次回测不包含
2026-07-08/09 的 dry-run 前向行情。

### 关键结论

1. **先控仓位，暂不改出场**。ATR custom_stoploss 看似更贴合波动率，但在 5m
   突破策略上会过早释放仓位，导致同一段噪音里反复进出，交易数从 491 放大到 1704。
2. **ATR 定仓是低侵入改动**：入场、止损、移动止损逻辑均保持原 V5，交易数基本不变，
   平均 stake 从原先约 25% 钱包降到回测中的 189.5 USDT 量级。
3. **回撤仍偏高**：35.52% 仍不适合实盘放大，只能作为 dry-run 的下一版前向样本。
   下一轮优先做相关性敞口限制（同向最多 2 仓）和分币种白名单筛选，而不是继续加信号。

## V5 白名单扩展验证（2026-07-09，bot1）

### 动因

原 8 对白名单（BTC/ETH/SOL/BNB/XRP/DOGE/LINK/AVAX）机会偏少，不利于 dry-run
前向验证。直接使用动态 top20 又会引入过多热点噪音，因此采用两步：

1. 用 Binance USDT-M 永续 24h `quoteVolume` 排名前 20 作为候选池。
2. 补最近 60 天 5m K 线，回测筛选出表现更稳的 12 对作为固定白名单。

本轮 top20 候选池：

`BTC, ETH, SOL, LAB, EVAA, ZEC, XRP, HYPE, EDGE, DOGE, BNB, WLD, ADA, VANRY,
POWER, UNI, KAITO, NEAR, 1000PEPE, LDO`

### 变体对照

| 白名单 | 交易数 | 总收益 | PF | 最大回撤 | 结论 |
|---|---:|---:|---:|---:|---|
| 原 8 对，近 28 天（数据未补齐前） | 84 | +5.91% | 1.19 | 10.09% | 样本偏少，表现好但验证慢 |
| Top20 候选，近 60 天 | 490 | +5.09% | 1.03 | 23.75% | 机会多但边际薄，热点币拖累 |
| **筛选 12 对，近 60 天（部署）** | 284 | **+28.92%** | **1.25** | **16.52%** | 机会数增加且质量更好 |

12 对回测区间：`2026-05-10 00:00:00 -> 2026-07-09 00:00:00`。

最终部署白名单：

```text
BTC/USDT:USDT
ETH/USDT:USDT
SOL/USDT:USDT
BNB/USDT:USDT
XRP/USDT:USDT
DOGE/USDT:USDT
ADA/USDT:USDT
ZEC/USDT:USDT
EDGE/USDT:USDT
POWER/USDT:USDT
VANRY/USDT:USDT
UNI/USDT:USDT
```

12 对分币种表现：

| Pair | Trades | Total Profit |
|---|---:|---:|
| ADA/USDT:USDT | 22 | +10.41% |
| POWER/USDT:USDT | 23 | +5.70% |
| EDGE/USDT:USDT | 42 | +4.43% |
| ZEC/USDT:USDT | 22 | +4.12% |
| BTC/USDT:USDT | 17 | +3.82% |
| UNI/USDT:USDT | 13 | +3.64% |
| DOGE/USDT:USDT | 23 | +2.61% |
| ETH/USDT:USDT | 28 | +1.41% |
| VANRY/USDT:USDT | 20 | +0.73% |
| SOL/USDT:USDT | 26 | +0.18% |
| XRP/USDT:USDT | 24 | -3.61% |
| BNB/USDT:USDT | 24 | -4.53% |

### 关键结论

1. **top20 只能做候选池，不能直接部署**。LAB、EVAA、HYPE、WLD、KAITO 等热点币
   提供了更多信号，但 60 天回测多为拖累，导致 PF 只有 1.03。
2. **12 对固定白名单更适合前向验证**：交易数从原 8 对的低频样本提升到 60 天 284 笔，
   同时 PF 提升到 1.25，回撤低于 top20。
3. **仍需周度复核**：XRP/BNB 在本轮 60 天为负，但保留用于主流流动性样本；若连续两期
   仍为负，可用 LINK/AVAX 或新的 top20 强势币替换。

## V5 相关敞口限制（2026-07-09，bot1）

### 动因

V5 ATR 定仓后回撤仍有 35.52%，主要风险来自 `max_open_trades=4` 下同方向主流币共振。
本轮不改入场/出场/定仓，只在 `confirm_trade_entry` 里增加组合风险闸门：

- 同方向最多 2 个未平仓。
- BTC/ETH/SOL/BNB 高相关组同方向最多 2 个未平仓。
- 初版读取未平仓异常时 fail-open；2026-07-10 黑天鹅风控复核后改为 fail-closed，
  风控状态未知时宁可错过新仓。

### 变体对照

| 变体 | 区间 | 交易数 | 总收益 | PF | 最大回撤 | 结论 |
|---|---|---:|---:|---:|---:|---|
| V5 12 对原版 | 2026-05-10 ~ 2026-07-09 | 284 | +28.92% | 1.25 | 16.52% | 白名单筛选基线 |
| **V5 相关敞口限制（部署）** | 2026-05-10 ~ 2026-07-09 | 155 | **+22.70%** | **1.41** | **8.63%** | 收益让渡 6.22pp，回撤约减半，PF 提升 |
| **V5 相关敞口限制（部署）** | 2026-01-01 ~ 2026-07-09 | 327 | **+21.11%** | **1.16** | **21.28%** | 扩展区间仍为正，回撤低于 ATR 定仓版 |

回测命令：

```bash
cd /data/freqtrade
docker compose run --rm freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/volatility_breakout \
  --strategy VolatilityBreakout \
  --timerange 20260510-20260709 \
  --export trades \
  --cache none \
  --backtest-directory user_data/backtest_results/exposure-cap-60d

docker compose run --rm freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/volatility_breakout \
  --strategy VolatilityBreakout \
  --timerange 20260101-20260709 \
  --export trades \
  --cache none \
  --backtest-directory user_data/backtest_results/exposure-cap
```

### 关键结论

1. **相关敞口限制达成本轮目标**：60 天收益下降，但 PF 提升、最大回撤从 16.52% 降到
   8.63%，更适合作为 dry-run 前向版本。
2. **扩展区间比 ATR 定仓版更稳**：2026-01-01 ~ 2026-07-09 回测 +21.11%、PF 1.16、
   最大回撤 21.28%，明显低于 ATR 定仓版 35.52% 回撤。
3. **仍然只有空头样本**：BTC 200DMA 闸门继续拦掉全部多头；牛市多头腿仍需 dry-run
   前向验证。

### 遗留问题（下一步优先级）

1. **回测虽然改善到 PF 1.16/1.41，但仍是单一熊市空头样本**。先跑一周 dry-run 拿前向样本，
   与回测对照后再进 hyperopt（训练 1~4 月 / 验证 5~7 月切分，防过拟合）。
2. **组合风险已有第一版闸门，但还没前向验证**。下一步观察 dry-run 是否如回测一样减少
   BTC/ETH/SOL/BNB 同向共振；不要在样本不足时继续叠信号。
3. **多头逻辑零样本**：半年全程熊市被闸门全拦，牛市表现未知。
4. 数据只覆盖 2026 上半年单一市况，结论对其他 regime 外推性有限。
5. **regime.json 实时闸门的增量未验证**（上线以来一直 RISK_ON，零干预）。
   2026-07-08 起 regime_check 落盘 `regime_history.jsonl`，攒够序列后可回放量化，
   见 market-regime.md。

## V5 频率与出场优化验证（2026-07-10，bot2 前向 A/B）

### 200DMA 线上数据核验

运行中 bot1 的 `pair_candles` 分析结果确认 `btc_bull_1d` 已实际合并进每根 5m K 线，
不是只写在策略里未生效。核验时最新分析行使用 `date_1d=2026-07-09`：

- BTC 最新已收盘日线 close：`63,197`
- 200DMA：`74,234.56`
- close 相对 200DMA：`-14.87%`
- 策略列：`btc_bull_1d=false`

因此当时多头确实由 200DMA 闸门拦截。`merge_informative_pair` 使用已收盘日线，避免
把当天未完成日线带入 5m 信号。

### 测试设计

补齐 12 对 5m 数据到 2026-07-10（EDGE 上市较晚，从 2026-03-19 起），保持
ATR 定仓、2x 杠杆、同方向上限 2 和 200DMA 闸门不变，每次只修改一组参数：

- D42 / D36：Donchian 周期从 48 放宽到 42 / 36。
- Trail425：移动止损从激活 5%/回撤 3% 改为激活 4%/回撤 2.5%。
- Cap3：同方向仓位上限从 2 改为 3，主流高相关组上限仍为 2。
- NoGate：移除 200DMA，仅作闸门贡献对照，不部署。

训练区间为 `2026-01-01 ~ 2026-05-01`，验证区间为
`2026-05-01 ~ 2026-07-10`。验证段结果：

| 变体 | 交易数/日 | 总收益 | PF | 胜率 | 最大回撤 | 结论 |
|---|---:|---:|---:|---:|---:|---|
| D48 基准 | 2.49 | +11.27% | 1.180 | 55.2% | 8.52% | 基准 |
| D42 | 2.50 | +12.55% | 1.200 | 55.4% | 8.42% | 小幅改善，频率几乎不变 |
| **D36** | **2.51** | **+15.53%** | **1.257** | **58.0%** | **8.43%** | 唯一进入前向 A/B 的候选 |
| Trail425 | 2.97 | +0.13% | 1.002 | 58.2% | 11.05% | 交易增加但验证收益消失，否决 |
| Cap3 | 3.59 | +3.06% | 1.033 | 53.4% | 13.60% | 频率提升但质量/回撤恶化，否决 |
| NoGate | 5.81 | -12.55% | 0.913 | 50.9% | 21.13% | 200DMA 闸门不可移除 |

D36 全区间对比：

| 变体 | 交易数 | 交易数/日 | 总收益 | PF | 胜率 | 最大回撤 | Sharpe |
|---|---:|---:|---:|---:|---:|---:|---:|
| D48 基准 | 508 | 2.69 | +25.41% | 1.120 | 54.5% | 24.04% | 2.558 |
| **D36** | **517** | **2.74** | **+32.82%** | **1.154** | **55.7%** | **22.21%** | **3.301** |

### 部署决定

D36 在训练、验证和全区间均优于 D48，但只增加约 1.8% 交易，不能把频率安全提高到
3~5 笔/天；全区间均值检验 `p=0.152`，且仍然只有熊市空头样本，因此不替换 bot1。
自 2026-07-10 起使用 bot2 做隔离 dry-run 前向 A/B：

- bot1：`VolatilityBreakout` / D48，数据库 `tradesv3-v5.sqlite`。
- bot2：`VolatilityBreakoutD36`，数据库 `tradesv3-d36-forward.sqlite`。
- bot2 日志：`logs/freqtrade-d36-forward.log`。

运行状态更新（2026-07-12）：bot2 前向组已停止。它不是离线回测，而是曾经常驻的
dry-run 研究 bot；数据库与日志保留用于后续分析，不随生产服务启动。

### 2026-07-11：价格行为过滤器回测与 bot3 前向组

在不改变 D48/D36 出场和风险控制的前提下，研究两类因果入场过滤器：前一小时
ATR 压缩，以及突破 Donchian 后带 ATR 缓冲且收盘靠近 K 线方向边缘的“决定性收盘”。

2026-01-01 17:30 至 2026-07-10 00:00、当前 12 对白名单、1000 USDT、2x isolated、
最多 4 仓的统一回测结果：

| 策略 | 交易数 | 收益 | 最大回撤 |
|---|---:|---:|---:|
| D48 基准 | 508 | +25.41% | 24.04% |
| D48 决定性收盘 | 464 | +17.62% | 21.59% |
| **D48 压缩+决定性收盘** | **226** | **+18.03%** | **11.33%** |
| D36 基准 | 517 | +32.82% | 22.21% |
| D36 决定性收盘 | 470 | +18.31% | 19.87% |
| D36 压缩+决定性收盘 | 230 | +16.47% | 11.99% |

D48 组合版在 2026-01-01~05-10 与 05-10~07-10 两段分别为 +10.17% / +7.70%，
回撤分别为 10.56% / 8.89%。它牺牲部分总收益换取明显更低且分段稳定的回撤，
因此不替换 bot1/bot2，使用 bot3、独立数据库和日志进行 dry-run 前向验证。
- bot3：`GrokCombinedD48`，数据库 `tradesv3-grok-combined-d48-forward.sqlite`，日志
  `logs/freqtrade-grok-combined-d48-forward.log`。
- 三者共用 `config.json`（同白名单、风控与 FreqUI 账号密码），但数据库/日志独立。
- 前向观察至少 7~14 天，再比较实际信号数、PF、止损率、平均盈亏和持仓时间。

运行状态更新（2026-07-12）：bot3 前向组已停止，数据库与日志保留。生产主机只运行
bot1 D48 与 cloudflared；bot2/bot3 均归入 Compose `research` profile。后续离线回测不在
该 2C4G 生产主机并行执行。（2026-07-13 补注：bot3 已按 research profile 重启继续
前向验证，当前运行状态以顶部速览为准。）

线上策略族目录仅保留 `v5_d48.py` 与 `v5_d36.py`。被否决变体不放进运行目录，参数、
区间和结果由本节与 Git 历史保留，避免 Freqtrade 启动时加载一堆无效实验类。

## V5 黑天鹅执行保护（2026-07-10，bot1/bot2）

### 资料核对与设计取舍

服务器实际运行配置此前使用 `stoploss_on_exchange=false` 和限价止损：机器人到线后才提交
退出，遇到服务器/网络故障、API 超时或价格快速穿越时可能延迟，限价单也可能不成交。Freqtrade
官方文档确认 Binance Futures isolated 支持交易所端 stop-market，并建议崩盘场景优先 market
以降低止损限价挂空风险：

- [Freqtrade Stoploss](https://www.freqtrade.io/en/stable/stoploss/)
- [Freqtrade Binance exchange notes](https://www.freqtrade.io/en/stable/exchanges/#binance)
- [Freqtrade Protections](https://www.freqtrade.io/en/stable/plugins/#protections)

因此只增加可解释、可由官方能力支撑的三层保护：

1. 配置改为交易所端 stop-market；创建失败使用 emergency market，60 秒更新移动止损。
2. 2 小时内两次亏损止损后，全局暂停开仓 1 小时。
3. 所有“是否允许扩大风险”的回调 fail-closed：未平仓读取失败、ATR/钱包异常会跳过新仓；
   `regime.json` 缺失、陈旧、解析失败或不足 6/6 数据源时拒绝开多。

未加入“BTC 15 分钟跌幅熔断”。它与交易所止损不是同层保护，而且当前没有跨市况证据支持某个
固定阈值；贸然加入会增加过拟合和急跌后追空/错过反转的风险。

### StoplossGuard 参数回测

区间 `2026-01-01 17:30 ~ 2026-07-10 00:00 UTC`，12 对、5m、2x、isolated，使用
`--enable-protections --cache none`。触发条件均为 24 根 K 线（2 小时）内两次止损，只比较
暂停时长：

| 版本 | 暂停 | 交易数 | 总收益 | PF | 最大回撤 |
|---|---:|---:|---:|---:|---:|
| D48 无熔断 | 0 | 508 | +25.41% | 1.12 | 24.04% |
| D48 Guard | 30m | 502 | +23.09% | 约 1.11 | 24.03% |
| **D48 Guard（部署）** | **60m** | **502** | **+24.47%** | **约 1.12** | **24.05%** |
| D48 Guard | 120m | 500 | +24.50% | 约 1.12 | 24.00% |
| D36 无熔断 | 0 | 517 | +32.82% | 1.154 | 22.21% |
| D36 Guard | 30m | 511 | +30.26% | 约 1.14 | 22.22% |
| **D36 Guard（部署）** | **60m** | **509** | **+33.12%** | **约 1.16** | **21.64%** |
| D36 Guard | 120m | 505 | +33.06% | 1.16 | 22.26% |

60 分钟在 D48 上只让渡 0.94pp 收益、几乎不改变回撤，在 D36 上收益和回撤均略有改善；
相比 120 分钟少限制正常恢复后的机会，因此选 60 分钟。它不会消除历史最大回撤，作用是连续
止损后停止继续扩大敞口，不应被解读成收益优化器。

### 能验证与不能验证的边界

- StoplossGuard 可由 K 线回测，结果如上；fail-closed 配置通过回调分支检查、实时 6/6
  regime 运行和 dry-run 启动日志验证。
- 交易所端 stop-market 属于执行层，OHLC 回测不能模拟订单簿滑点，dry-run 也不会真的在 Binance
  挂保护单。这里只能验证 Freqtrade 2026.6 接受配置并正常启动；实盘前仍需小资金人工核单。
- stop-market 能显著降低断网/限价不成交风险，但无法保证只亏 5%；流动性枯竭、交易所停机或价格
  跳跃仍可能产生超额滑点。
- 本区间仍为 0 多头的熊市样本，fail-closed 开多闸门对收益的影响尚不能从这组回测量化。

部署后版本：bot1 `5.2-d48-risk`，bot2 `5.2-d36-risk-forward`。

## 历史黑天鹅压力测试（2026-07-10）

### 数据与窗口选择

前述参数验证只覆盖 2026 年熊市。为避免“普通下跌回测”冒充黑天鹅验证，新增
`scripts/run_black_swan_stress.py`，用 Freqtrade 从 Binance 官方归档下载 USDT-M 永续
5m/1h/1d 与 mark/funding 数据，实测数据目录 148MB。固定测试 BTC、ETH、BNB、SOL 四个
高流动性主流合约；每个币按真实上市时间参与，2020-03 时 SOL 尚未上市，不补值。

窗口同时来自公开事件时间线和 BTC 永续日线的最差收盘/最大振幅排序：

- 2020-03-08~21：COVID Black Thursday；BTC 2020-03-12 日收跌 39.98%，日振幅 45.63%。
- 2021-05-10~25：5 月去杠杆；BTC 2021-05-19 日收跌 14.44%，日振幅 34.81%。
- 2022-05-05~17：Terra/UST；[Richmond Fed](https://www.richmondfed.org/publications/research/economic_brief/2022/eb_22-24)
  将 5 月 7 日列为 UST 抛压开始。
- 2022-06-08~20：加密借贷/3AC 传染；BTC 6 月 13 日收跌 15.41%。
- 2022-11-02~16：FTX；[AP 时间线](https://apnews.com/article/be13e3fc0e074e2edd50ba59d1f8960e)
  记录 11 月 8/9 日 BTC 连续下跌 13%/14%。
- 2024-08-01~11：日元套息/风险资产去杠杆；8 月 5 日 BTC 日内振幅 16.16%。
- 2025-10-06~18：历史最大清算潮；[Reuters](https://www.investing.com/news/stock-market-news/after-record-crypto-crash-a-rush-to-hedge-against-another-freefall-4284612)
  报道 10 月 10~11 日为当时最大 24 小时清算事件。
- 2026-02-01~11：新一轮去杠杆；BTC 2 月 5 日收跌 14.04%，次日振幅 18.95%。

每个窗口使用 1000 USDT 独立起始钱包、2x isolated、同方向上限 2；分别比较 D48/D36，
并以相同策略关闭/开启 `--enable-protections`，每次 `--cache none`。表中“市场”是窗口内
可用测试对的平均变化，不是 BTC 单币跌幅：

| 事件 | 市场 | D48 Guard 收益 / DD | D36 Guard 收益 / DD | D48 无 Guard DD |
|---|---:|---:|---:|---:|
| COVID 2020 | -39.09% | +17.08% / 3.48% | +16.72% / 3.47% | 3.32% |
| 2021-05 去杠杆 | -35.36% | +6.89% / 6.01% | +5.06% / 6.07% | 8.36% |
| Terra 2022 | -31.24% | +4.61% / 6.64% | +4.41% / 6.83% | 6.94% |
| 借贷传染 2022 | -27.61% | +8.00% / 3.31% | +8.00% / 3.31% | 3.31% |
| FTX 2022 | -26.95% | **-1.11% / 5.86%** | **-1.80% / 5.86%** | 5.86% |
| 2024-08 去杠杆 | -11.27% | +6.64% / 6.09% | +4.71% / 7.79% | 6.78% |
| 2025-10 清算潮 | -14.34% | +10.59% / 5.00% | +10.54% / 4.99% | 5.00% |
| 2026-02 去杠杆 | -18.13% | +5.88% / 2.63% | +5.88% / 2.63% | 2.63% |

### 结论与边界

1. **趋势突破结构在急跌中不是天然受害者**：8 个窗口有 7 个为正，主要因为 Donchian/EMA
   在破位后转为空头；但 2021、2024、2025 窗口仍有崩盘前多仓，不能简单理解为“永远提前做空”。
2. **熔断值得部署但不是收益增强器**：2021-05 的 D48 回撤从 8.36% 降至 6.01%，2024-08
   从 6.78% 降至 6.09%；FTX 收益却从无熔断的 -0.15% 变为 -1.11%，2025 收益也少 1.08pp。
   它的价值是停止连续扩大风险，不保证每个事件提高收益或降低回撤。
3. **最差窗口是 FTX**：D48/D36 均小亏，最大回撤约 5.86%，说明固定 5% 止损和仓位上限
   控住了 K 线模型内的账户损失，但策略没有从每次崩盘获利的保证。
4. **回测不能证明真实成交**：5m OHLC 回测假设订单可成交，不能重现盘口消失、交易所停机、
   API 故障或 stop-market 滑点。因此交易所端 stop-market 与小资金实盘核单仍是必要的执行保护；
   “回测 DD 低于 8%”绝不能解读为黑天鹅实盘损失上限。
5. **样本有幸存者偏差**：固定四个今天仍高流动性的主流币，没有覆盖已归零/下架币种；当前
   白名单中的新币也没有足够历史。压力测试证明的是当前主流组合在这些窗口的模型行为。

### 偏差审计

- Freqtrade `lookahead-analysis` 对单一 BTC 分别检查 D48/D36 各 20 个信号，结果均为
  `has_bias: No`，entry/exit 零偏差、`biased_indicators` 为空。
- 四币组合检查会报交易级偏差，但 `biased_indicators` 仍为空。隔离复核确认这是
  `confirm_trade_entry` 的“同方向最多两仓”依赖其他币当前持仓所造成的路径差异：检查器逐笔
  截断回测时组合持仓状态会变化；不是 Donchian/EMA/200DMA 使用未来数据。
- `recursive-analysis` 在 210/300/500/1000 根预热下，ATR/ATR baseline/ADX 差异约为 0；
  EMA200 最大差异 0.055%。删除不参与信号的 informative `date_1d` 元数据列后，最终结果为
  `No lookahead bias on indicators found`。

复现：

```bash
cd /data/freqtrade
docker compose run --rm --no-deps freqtrade download-data \
  --config user_data/config.json \
  --datadir user_data/data/binance_stress \
  --pairs BTC/USDT:USDT ETH/USDT:USDT BNB/USDT:USDT SOL/USDT:USDT \
  --timerange 20200101-20260710 \
  --timeframes 5m 1h 1d
python3 scripts/run_black_swan_stress.py
# 只从已有 zip 重建汇总：
python3 scripts/run_black_swan_stress.py --summary-only
```

结果保存在服务器 `user_data/backtest_results/black-swan/`；`summary.json` 含 32 组完整指标。

### 教训：config 的 timeframe 会覆盖策略类属性

`config.json` 里 `"timeframe": "5m"` 静默覆盖策略类的 `timeframe = "1h"`，
导致 V3/V4 曾被误当 1h 结果解读。规避：

- 回测显式传 `--timeframe`；事后核对结果 zip 中 strategy 段的 `timeframe` 字段（实际值）。
- 部署时保证 config 与策略类两处一致。

## V5 出场研究：ATR 吊灯跟踪与宽 trailing（2026-07-12，全部否决）

### 动机与设计

与社区趋势突破系统对照后，V5 唯一没有实证数据的差异点是出场形态：社区常用
「更长通道 / N×ATR 跟踪」，V5 用固定 3% trailing（激活 5%）+ 硬止损 -5%。且定仓
按 3×ATR 预算风险、出场却全币种一刀切固定百分比，两者不自洽。因此在
`strategies/research/exit_research.py` 增加吊灯变体：`use_custom_stoploss` 以
N×ATR(14) 距离逐根收紧（`stoploss_from_absolute` 含杠杆换算），关闭固定 trailing，
硬止损 -5% 保留为初始与保底。N 取 3/5/8 三档，与不改动的基准同批回测。

协议沿用频率优化一节：12 对白名单、1000 USDT、2x isolated、最多 4 仓、显式
`--timeframe 5m`、`--cache none`，训练段 `2026-01-01 ~ 2026-05-01` 筛选，胜者才进
验证段。训练段结果：

| 变体 | 交易数/日 | 总收益 | PF | 胜率 | 平均持仓 | 最大回撤 |
|---|---:|---:|---:|---:|---:|---:|
| D48 基准 | 2.81 | +13.81% | 1.10 | 54.2% | 12:00 | 16.52% |
| Chand3（3×ATR） | 9.54 | -63.56% | 0.48 | 23.4% | 1:04 | 64.16% |
| Chand5（5×ATR） | 5.27 | -28.27% | 0.79 | 34.1% | 3:56 | 32.57% |
| Chand8（8×ATR） | 2.94 | +6.07% | 1.05 | 32.9% | 10:20 | 20.04% |

### 结论

1. **三档全部否决，无一进入验证段**。失败单调且机制清晰：5m ATR 相对趋势波段太小，
   从进场即跟踪的吊灯把趋势单在回调中震出——Chand3 交易数是基准 3.4 倍、平均持仓
   从 12 小时缩到 1 小时；即使 8×ATR（距离已接近硬止损）仍全面劣于基准。
2. 结合 Trail425 的否决，「收紧/改造 trailing」已两轮实证失败；固定 3%/5% trailing
   在该 5m 系统上继续保留。「ATR 距离应与 ATR 定仓自洽」的直觉不成立：定仓用 ATR
   是控制单笔风险预算，出场跟得太贴则直接破坏趋势跟随的让利润奔跑属性。
3. `exit_research.py` 中同文件的滞留仓位退出（stale 48h/72h）与 EMA200 反向失效
   两组变体为此前起草、尚未回测，结果目录 `backtest_results/exit-research/` 已建。

### 宽/晚 trailing（同日，验证段否决）

吊灯否决后，从基准盈亏结构反推另一个方向：全区间胜率 54.5% 但平均盈利仅为平均
亏损的 0.93 倍，怀疑 3%/5% trailing 锁盈过早。前两轮实验（Trail425、吊灯）都朝
「更紧」测，「更宽/更晚」未测过。三个变体：Trail47（4%/激活 7%）、Trail58
（5%/激活 8%）、Trail38（回撤仍 3%、激活推迟到 8%，隔离「晚锁盈」单因子）。

训练段（2026-01-01~05-01，基准 +13.81% / PF 1.10 / DD 16.52%）：

| 变体 | 交易数 | 总收益 | PF | 胜率 | 最大回撤 |
|---|---:|---:|---:|---:|---:|
| Trail47 | 258 | +2.87% | 1.02 | 43.4% | 23.36% |
| Trail58 | 217 | +10.01% | 1.08 | 41.5% | 21.86% |
| Trail38 | 268 | +18.25% | 1.13 | 43.7% | 14.00% |

放宽回撤距离（4%/5%）全面恶化；Trail38 训练段三项全胜且盈亏比修复到约 1.46，
进入验证段（2026-05-01~07-10）：

| 变体 | 交易数 | 总收益 | PF | 胜率 | 最大回撤 |
|---|---:|---:|---:|---:|---:|
| D48 基准 | 174 | +11.27% | 1.18 | 55.2% | 8.52% |
| Trail38 | 129 | +4.35% | 1.07 | 42.6% | 11.98% |

Trail38 验证段三项全败，训练段优势是对 1~4 月行情的拟合，否决。

**出场结论**：收紧（Trail425）、ATR 吊灯（3/5/8 档）、放宽/晚锁（47/58/38）三轮
共 7 个出场变体在同一协议下全部否决，固定 3% trailing / 激活 5% / 硬止损 -5% 是
目前实证最优出场。除非出现新市况样本，出场变体实验封盘。

复现（服务器 /data/freqtrade）：

```bash
docker compose run --rm --no-deps freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/research \
  --strategy-list ExitBaselineD48 D48Chand3 D48Chand5 D48Chand8 \
  --timeframe 5m --timerange 20260101-20260501 --cache none --export trades
```

注意：该版本 freqtrade 未按 `--export-filename` 落盘，结果写到默认
`backtest_results/backtest-result-<时间戳>.zip`，已手工移入
`backtest_results/exit-research/chandelier-train-2026-07-12_08-13-58.zip`。

## 多头侧历史牛市验证与对称空头闸门（2026-07-12）

### 动机与数据

2026 样本是零多头的熊市空头样本，「200DMA 放行后的多头逻辑」从未被数据检验。
复用黑天鹅压力测试已下载的 `binance_stress` 数据（BTC/ETH/BNB/SOL 永续，
2020~2026，5m/1h/1d），选四个 BTC 站上 200DMA 的牛市窗口回测生产版 D48。
定位是**方向性证据**：四大主流币有幸存者偏差、老行情微观结构与费率不同、
D48 参数选自 2026 数据，因此数字不用于参数校准。regime.json 闸门只在
live/dry-run 生效，回测由 `btc_bull_1d` 代理，正好隔离出可回测的多头逻辑。

### 牛市窗口结果（生产版 D48，无修改）

| 窗口 | 总收益 | PF | 多头收益 | 空头收益 | 最大水下 |
|---|---:|---:|---:|---:|---:|
| 2020-10-01~2021-04-15 | -51.40% | 0.86 | -8.77% | -42.63% | 53.74% |
| 2021-07-20~2021-11-10 | -27.61% | 0.83 | -3.59% | -24.02% | 31.32% |
| 2023-01-01~2023-07-01 | -34.25% | 0.81 | -7.80% | -26.45% | 35.88% |
| 2024-10-01~2025-01-01 | -25.22% | 0.77 | -4.86% | -20.37% | 29.22% |

两个结论：

1. **多头方向性验证不通过**：四个最有利的历史窗口多头全部小亏（-3.6%~-8.8%），
   零例外。以现有参数，V5 是熊市空头系统，不是全天候趋势系统；2026 的 PF 1.12
   是「熊市空头 PF」。
2. **主要出血点是牛市空头，根因是闸门不对称**：开多有 BTC 200DMA + regime.json
   两道闸，开空只看 5m EMA200，牛市每次回调跌破 5m EMA200 即追空、被主升浪轧空，
   每窗口亏 -20%~-43%，占总亏损八成以上。2026 样本 BTC 全程在 200DMA 下方，
   该缺陷暴露不出来。

### 对称空头闸门（research/short_gate.py，D48ShortGate）

修复镜像现有已验证的多头闸门：BTC 日线收盘 ≤ 200DMA 才允许开空
（`btc_bull_1d` 为真时清零 `enter_short`），零新指标、零新参数。两条通过标准：

1. **2026 全区间与基准一字不差**（BTC 全程在 200DMA 下方，闸门恒放行）：
   实测 508 笔 / +25.41% / PF 1.12 / 回撤 24.04%，0 多 508 空，完全一致。零成本确认。
2. **牛市窗口止血**：

| 窗口 | 无闸门 | 加闸门 | 剩余亏损构成 |
|---|---:|---:|---|
| 2020-10~2021-04 | -51.40% | -4.60% | 基本只剩多头亏损 |
| 2021-07~11 | -27.61% | -23.24% | 前段 BTC 确在 200DMA 下方，98 笔空单遇 V 型反转 -15.9% |
| 2023-01~07 | -34.25% | -15.67% | 年初 200DMA 拉锯期放行 12 笔空单 |
| 2024-10~2025-01 | -25.22% | -8.57% | 基本只剩多头亏损 |

四窗口合计亏损从约 -138% 收窄到约 -52%。未收敛到多头侧水平的部分不是闸门失灵，
而是牛市中段 BTC 确实会跌破 200DMA（2021-07、2023 初），闸门如实放行后遭遇
V 型反转——这是单一均线闸门固有的拉锯成本。

### 空头闸门定位与边界

- 该改动是**保险，不是收益优化**：对 2026 生产行为零影响，作用是市况翻多后把
  「牛市巨亏 -25%~-51%」压到「牛市躺平小亏 -5%~-23%」。
- 多头逻辑本身不赚钱的问题仍未解决，加闸门后牛市里系统近似闲置；在多头逻辑
  被修好之前，这是当前证据能支撑的最好状态。
- 复现：服务器 `/data/freqtrade`，`--strategy D48ShortGate --strategy-path
  user_data/strategies/research`，2026 段用默认 datadir 与 12 对白名单，牛市窗口用
  `--datadir user_data/data/binance_stress --pairs BTC/ETH/BNB/SOL`，均显式
  `--timeframe 5m --cache none`。（2026-07-13 补注：闸门并入生产 v5.3 后
  `research/short_gate.py` 已从仓库删除，复现取 Git 历史 `ed7d0ca`。）

## 多头亏损归因（2026-07-12，内部数据 + 外部检索）

内部证据（gate-bull 日志的出场分布，2020-10~2021-04 窗口近似纯多头）：
376 笔 trailing 出场平均 **+4.33%**，312 笔硬止损平均 **-5.26%**，胜率 54.5%，
期望 ≈ 0.545×4.33 − 0.455×5.26 ≈ **-0.03%/笔**，与实测一致。赢单平均 4.3% 说明
绝大多数刚过 +5% 激活线就被 3% 回撤拽出，右尾极少（最佳单笔 +28%）；输单足额付
-5.26%。同一出场几何在熊市空头为正期望，因为下跌是清算瀑布：价格快速走完
2.5%（杠杆后 5%）不回头；上涨是台阶式慢磨，2.5% 途中几乎必有 1.5% 回调先触发
trailing。**盈利引擎是「脉冲行情」，而加密的脉冲天然偏下跌方向**——多头亏损是
路径/出场几何问题，不是进场选股问题（多空胜率仅差 1~3pp）。

外部检索（grok CLI + X，2026-07-12）与内部结论收敛，补充两个稳定拖累项：
牛市正资金费率对永续多头是结构税（X 实证帖量级：牛市 long funding 年化
17~22%，2021 极端 70%+，@TheRiskProtocol 13 段牛市回测）；5m 突破单的
taker 费/滑点在高信号密度下累积成显著磨损。实践者共识：LTF 追延伸突破
R:R 差（@ohiain 等），牛市多头的主流做法是抬周期（4h/1d 通道）、回踩进场、
ATR/结构位宽出场、或干脆持现货 beta——几乎没人把 5m 紧 trailing 突破镜像做多。

候选后续实验（按性价比排序，注意样本内堆叠实验的挖掘风险）：
1. 只改信号周期：同一套过滤 5m→15m→1h→4h，看牛市窗口多头 PF 是否单调转正；
2. 逐笔拆 price PnL / funding / fee，量化磨损占比；
3. 多头入场改「突破后 N 根内回踩上轨」；
4. 消融：多头侧去掉 ATR 扩张 / ADX，检验「扩张过滤在上涨中选中衰竭段」假设。

### 实验①②结果（2026-07-12）：多头毛 edge 为正，净亏主因是交易成本

实验②（PnL 归因）：四窗口 5m 重跑加 `--export trades`（zip 在
`backtest_results/long-side/attr-5m-*.zip`），逐笔按
`profit_abs = price_pnl - fees + funding_fees` 恒等式拆解（全部 0 笔校验失败）。
多头侧（单位 USDT，1000 起始）：

| 窗口（多头） | 净亏 | 价格 PnL | 手续费 | funding |
|---|---:|---:|---:|---:|
| 2020-10~2021-04（688 笔） | -46.0 | **+221.8** | -197.7 | -70.0 |
| 2021-07~11（193 笔） | -72.9 | -7.3 | -52.1 | -13.6 |
| 2023-01~07（233 笔） | -83.0 | -1.4 | -73.5 | -8.0 |
| 2024-Q4（123 笔） | -83.9 | -29.9 | -42.0 | -12.0 |

四窗口合计：价格 +183、手续费 -365、funding -104。**结论修正**：上一节出场几何
给出的净期望 ≈ 0 已含费用；拆开后毛价格 edge 为零到正（最大牛市窗口 +22%），
把它压成一致净亏的主因是**高信号密度 × taker 费率假设**，funding 是次要稳定项
（约为手续费的 1/3⁠）。注意：回测按静态 taker 费计，生产实际用 limit 单，真实
磨损可能低于回测——该差异只会让多头毛 edge 的结论更乐观，不影响方向。

实验①（周期消融，同一套过滤只改 --timeframe，多头收益；2020/2023 窗口空头被
闸门清零，总收益即多头）：

| 窗口 | 5m | 15m | 1h | 4h |
|---|---:|---:|---:|---:|
| 2020-10~2021-04 | -4.60% | -11.61% | **+2.85%** | -4.23% |
| 2021-07~11 | -7.29% | -9.82% | **+0.02%** | +0.22% |
| 2023-01~07 | -8.30% | -23.95% | **+2.01%** | -3.63% |
| 2024-Q4 | -8.39% | -1.64% | -4.95% | -1.19% |

预设的单调性标准**不成立**（15m 普遍更差，4h 再度衰减），故「换周期」不是
干净答案；但结合实验②机制自洽：1h 笔数降 3~6 倍→费用磨损同比例下降→逼近
毛 edge（三个窗口转正，PF 1.07~1.08，仍薄）；4h 信号本身衰减（Donchian 8 天
对 3% trailing 太慢，PF 0.58~0.76）。**综合指向：修多头不是换范式，是降频摄取
同一毛 edge。**

交叉验证：压缩+决定性收盘（GrokCombinedD48，交易数约 -60%）在四个牛市窗口
结果混合——2020 主升浪 -4.60%→**+11.26%**（PF 1.13）、2024 略改善
（-8.57%→-6.29%）、2021-07 总体略好但多头略差、2023 慢牛反而恶化
（多头 -8.30%→-14.23%，笔数减半仍更差）。说明该过滤器不只降频，还改变突破
选择：利好脉冲式牛市、利空阴跌慢磨市。**多头侧至今没有通过预设标准的部署级
改法**；量化后的两条真实出路是 (a) 降低费率假设与实际费率的差距，
(b) 1h 级别的低频多头信号——两条的落地见下两小节，最终均需牛市
实盘/dry-run 样本再定。

## 执行成本审计与费率敏感性（2026-07-12，协议变更）

bot1 dry-run 数据库实测：8 笔交易中 6 笔双边按 maker 0.02% 记账（limit 单成交），
止损/trailing 走 stop-market 按 taker 0.05%。config 未设 `fee`，因此**所有历史回测
都按双边 taker 0.10%/往返计费，而真实结构 ≈ 进场 maker + 出场 taker ≈ 0.07%/往返，
高估约 30%**。用 `--fee 0.00035`（现实混合）与 `--fee 0.0002`（全 maker 乐观界）重跑：

| 样本 | taker 0.0005（旧基准） | 0.00035 现实 | 0.0002 乐观 |
|---|---:|---:|---:|
| 2026 全区间（空头引擎） | +25.41% / PF 1.12 | **+34.58% / PF 1.16** | +35.31% / PF 1.16 |
| 2020-10~2021-04 多头 | -4.60% | **+1.23%** | +4.68% |
| 2021-07~11 多头侧 | -7.29% | -5.41% | -3.65% |
| 2023-01~07 多头侧 | -8.30% | -5.95% | -4.46% |
| 2024-Q4 多头侧 | -8.39% | -7.22% | -6.37% |

结论：(1) **生产空头引擎在现实费率下比一直报告的更好**（PF 1.12→1.16，半年
+9pp），此前对「PF 太薄经不起摩擦」的担忧下修一档；(2) 费率修正只把 2020
主升浪多头翻正，其余窗口多头仍小亏——5m 多头靠降费救不回来，与归因一致
（毛 edge≈0 的窗口扣掉 funding 仍为负）。**此后回测统一用 `--fee 0.00035`
作为标准现实假设**；注意样本仅 8 笔、且回测对 limit 单成交偏乐观，实盘前仍需
更大样本复核成交率。

## 1h 多头待命变体（2026-07-12，research/long_1h.py，未部署）

按消融结论落地 `LongBreakout1H`：相对生产仅改 1h 周期 + 只做多，过滤/出场/
风控全同。2023 窗口冒烟回测（`--fee 0.00035`）：84 笔、+2.41%、PF 1.10、
回撤 5.53%，与消融一致。计划：BTC 日线重新站上 200DMA 后以独立 dry-run bot
启动攒前向样本（需独立 config 或显式 `--timeframe 1h`，防 config 覆盖）；
funding 上限过滤留作 live-only TODO。（2026-07-13 补注：funding 过滤已实现——
`confirm_trade_entry` 内 live/dry-run 生效，单期费率 > 0.05%/8h（≈年化 55%，
只拦 2021 式极端拥挤段）拦下开多，取不到费率 fail-closed，与 regime 闸同哲学；
回测模式完全惰性，四窗口验证数字不受影响。五个分支已在服务器 freqtrade
2026.6 容器内桩测通过。）

## 滞留仓位时间止损（2026-07-13，验证段否决）

### 动机

出场研究遗留项：`exit_research.py` 中 stale 48h/72h 变体（持仓超过 N 小时且
利润 ≤ +1% 即离场）此前起草未测。外部对照（KoroushAK 交易管理框架，经 Grok
对话转述）给出阈值定法「2× 平均赢家持仓时长」——基准平均持仓约 12h，对应
≈24h。时间维度是此前 7 个出场变体（全为止损距离/锁盈时机改造）未覆盖的
唯一机械化出场自由度。dry-run 中 BNB 空单挂 5 天浮亏也提供了体感样本。

### 协议与结果

沿用出场研究协议（12 对白名单、1000 USDT、2x isolated、显式 `--timeframe 5m
--cache none`），训练段 2026-01-01~05-01 筛选、验证段 2026-05-01~07-10 确认。
首轮误用默认 taker 费率（结论方向相同），按费率审计标准以 `--fee 0.00035`
重跑，下表为费率修正后数字：

训练段：

| 变体 | 交易数 | 总收益 | PF | 胜率 | 最大回撤 |
|---|---:|---:|---:|---:|---:|
| D48 基准 | 339 | +18.97% | 1.14 | 55.2% | 13.03% |
| Stale48 | 359 | +22.97% | 1.16 | 54.9% | 11.45% |
| Stale72 | 343 | +18.75% | 1.13 | 55.1% | 14.44% |

Stale48 训练段三项全胜进验证段（Stale72 已≈基准，同批带入做单调性诊断）：

| 变体 | 交易数 | 总收益 | PF | 胜率 | 最大回撤 |
|---|---:|---:|---:|---:|---:|
| D48 基准 | 177 | +14.25% | 1.23 | 55.9% | 8.93% |
| Stale48 | 194 | +10.08% | 1.15 | 54.1% | 8.76% |
| Stale72 | 181 | +14.26% | 1.23 | 55.2% | 8.65% |

### 结论

1. **Stale48 验证段收益/PF 全面落后基准，否决**。与 Trail38 同一失败模式：训练段
   优势是对 1~4 月行情的拟合。训练段 Stale72 劣于 Stale48 的非单调性本身就是
   噪声警号，验证段坐实。
2. Stale72 两段都≈基准（每段仅多 4~7 次干预），无增量、白添复杂度，否决。
3. 24h 档（2× 平均赢家）未跑：48h 已在验证段翻负，更紧的时间止损是朝已证伪
   方向加码，不测。
4. **至此机械出场自由度（距离、锁盈时机、时间）三个维度共 9 个变体全部否决**，
   固定 3% trailing / 激活 5% / 硬止损 -5% 继续保持实证最优，出场实验正式封盘。
   封盘后按惯例将 `research/exit_research.py`（含全部出场变体与从未回测的 EMA
   失效草稿）从仓库删除，参数与结果由本节及 Git 历史保留；服务器
   `user_data/strategies/research/` 下的副本待清理。

复现（服务器 /data/freqtrade，日志 /tmp/stale_bt_{train,val}_fee.log）：

```bash
docker compose run --rm --no-deps freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/research \
  --strategy-list ExitBaselineD48 D48Stale48 D48Stale72 \
  --timeframe 5m --timerange 20260101-20260501 \
  --fee 0.00035 --cache none --export trades
```

## 1h 多头变体四窗口验证（2026-07-13，维持待命）

### 动机

`LongBreakout1H` 此前只在 2023 窗口冒烟（+2.41%）。补齐其余三个牛市窗口，
既验证覆盖面，也核对落地实现与 07-12 周期消融（同过滤、旧 taker 费率）的一致性。

### 协议与结果

`--fee 0.00035`、显式 `--timeframe 1h`（日志与 strategy resolver 输出核实实际 1h）、
`--datadir user_data/data/binance_stress`、BTC/ETH/BNB/SOL、`--cache none`：

| 窗口 | 交易数 | 总收益 | PF | 最大水下 | 消融 1h 参考（旧费率） | 5m 多头侧（0.00035） |
|---|---:|---:|---:|---:|---:|---:|
| 2020-10~2021-04 | 242 | +4.54% | 1.11 | 3.46% | +2.85% | +1.23% |
| 2021-07~11 | 88 | +0.09% | 1.01 | 4.59% | +0.02% | -5.41% |
| 2023-01~07 | 84 | +2.41% | 1.10 | 5.53% | +2.01% | -5.95% |
| 2024-Q4 | 41 | -4.69% | 0.62 | 4.89% | -4.95% | -7.22% |

### 结论

1. **实现验证通过**：四窗口与消融方向一致，差值与费率下调（taker 0.05%→混合
   0.035%）方向吻合，`long_1h.py` 落地无实现偏差。
2. **相对 5m 多头全窗口占优**且回撤 3.5~5.5% 显著更低，「降频摄取同一毛 edge」
   的归因结论再次成立。
3. **但 edge 薄（PF 1.01~1.11）且非全正**（2024-Q4 PF 0.62）：不满足部署标准，
   维持待命定位——BTC 日线重上 200DMA 后以独立 dry-run 启动前向，用前向样本
   决定去留。

复现（服务器 /data/freqtrade，日志 /tmp/long1h_<窗口>.log）：

```bash
docker compose run --rm --no-deps freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/research \
  --strategy LongBreakout1H \
  --datadir user_data/data/binance_stress \
  --pairs BTC/USDT:USDT ETH/USDT:USDT BNB/USDT:USDT SOL/USDT:USDT \
  --timeframe 1h --timerange 20201001-20210415 \
  --fee 0.00035 --cache none --export trades
```

## 白名单第一期周度复核（2026-07-13，暂不替换）

### 协议

按 07-09 建立的方法复用 `scripts/refresh_top_pairs_backtest.py` 拉取 top30 候选池
（quoteVolume ≥1 亿、仅 PERPETUAL/USDT，币股与贵金属永续被合约类型过滤自动排除）
并强制并入现役 12 对；数据补到 2026-07-13。回测步骤不用脚本内置命令（其早于费率
审计），手动按协议执行：`--timerange 20260514-`、`--fee 0.00035`、显式
`--timeframe 5m`、`--cache none`，结果与筛选报告在服务器
`backtest_results/auto-whitelist/`。

### 现役 12 对两期对照（总收益）

| Pair | 上期 05-10~07-09（旧费率） | 本期 05-14~07-13（0.00035） | 状态 |
|---|---:|---:|---|
| BTC | +3.82% | +5.82% | ✓ |
| EDGE | +4.43% | +4.68% | ✓ |
| VANRY | +0.73% | +3.21% | ✓ |
| SOL | +0.18% | +2.42% | ✓ |
| ADA | +10.41% | +1.54% | ✓ 大幅回落 |
| UNI | +3.64% | +0.40% | ✓ |
| XRP | -3.61% | -0.39% | ✗✗ 两期负（触发替换规则） |
| ZEC | +4.12% | -0.63% | ✗ 首期转负 |
| BNB | -4.53% | -0.84% | ✗✗ 两期负（触发替换规则） |
| ETH | +1.41% | -1.07% | ✗ 首期转负 |
| DOGE | +2.61% | -1.40% | ✗ 首期转负 |
| POWER | +5.70% | -3.03% | ✗ 首期转负（+5.7→-3.0 大反转） |

场外候选：LAB +3.85%（68 笔，PF 1.45）、DEXE +1.63%（20 笔）、SXT +0.85%（9 笔）；
其余全负（BEAT -6.95%、VELVET -5.10%、EVAA -4.28% 等）。脚本默认规则（≥10 笔、
收益>0、PF>1）只选出 5 对：BTC/EDGE/LAB/SOL/DEXE。

### 结论：暂不替换，07-20 第二期定夺

1. XRP/BNB 名义上触发「连续两期负」，**但两期窗口重叠约 56/60 天，不是独立样本**，
   且两者亏损都大幅收窄（-3.61→-0.39、-4.53→-0.84），方向在改善——重叠窗口下的
   「连续」证据不足以支撑动生产。
2. 替换候选证据更弱：LAB 上期复核还是「热点币拖累」的反例，本期单期转正；DEXE
   仅单期样本。按 07-09 教训（top20 热点币多为拖累）不追单期强势。
3. 半数现役对本期转负与市况相关（60d 窗口 30 对池总体 -9.44%/PF 0.92），个别对
   的期间波动大（POWER +5.7→-3.0，ADA +10.4→+1.5），说明周度单期数字噪声很大，
   决策应基于趋势而非单期排名。
4. **行动**：本期不动白名单。07-20 做第二期复核（届时与上期仅重叠 ~53 天，且同为
   0.00035 费率可直接对比）：若 XRP/BNB 仍负，用当期强势候选（届时复核 LAB/DEXE
   持续性，或补测 LINK/AVAX）替换；POWER/ZEC/ETH/DOGE 进入观察名单。

### 配套：执行审计与前向对比管道（同日就绪）

- `scripts/slippage_audit.py`：止损滑点 + limit 入场成交率。首跑（6 笔）：软件
  止损平均滑 +0.35%（最差 EDGE +0.75%，杠杆后放大一倍），交易所端止损与
  trailing 滑点≈0，入场成交率 8/8。注意 dry-run 成交为模拟——软件止损滑点反映
  5m 检测延迟（真实存在），交易所端 0 滑点偏乐观，实盘前需实单复核。
- `scripts/forward_compare.py`：双 bot 同窗口对比（信号数/PF/硬止损率/持仓时长），
  bot3 满 7 天（07-18）后出第一期正式对比。注意 bot1 受同向仓位上限压制时
  信号数不可比，解读需带上在持仓位背景。

## 前向对照与执行审计校准（2026-07-15，观测增强部署）

### 动机

首次按数据库正式查看 bot1/bot3 时，旧 `forward_compare.py` 默认从 bot3 第一笔
开仓开始统计，却没有报告窗口开始前已经存在的仓位；同时把实际开仓笔数简称为
signals。bot1 在该边界已有 BNB、BTC 两个空仓，刚好占满生产策略的同方向两仓上限，
而 bot3 从空仓开始。此时 bot3 后续成交 DOGE/ETH、bot1 未成交，既可能来自过滤器，
也可能只是 bot1 无空余槽位，不能作为入场过滤优胜证据。

执行侧旧审计只给“是否成交”，没有区分唯一未平挂单是保护止损还是卡住的入场单，
也没有显示成交等待时间；9/9 成交可能掩盖接近 5 分钟才成交的过时信号。白名单脚本
仍需人工补 `--fee`/`--timeframe`，强制纳入的现役币还把真实成交额记成 0，均不符合
当前协议。

### 协议与结果

全程只读远端 SQLite/公开 Binance 行情，不跑生产机重回测；统计时点
2026-07-15 03:59 UTC。远端仍是 dry-run，下面是执行观测而非实盘成交证明。

| 审计项 | bot1 D48 | bot3 GrokCombined | 解释 |
|---|---:|---:|---|
| 对照窗口内新开/已平 | 1 / 1 | 3 / 3 | 两侧均无窗口内未平 |
| 窗口起点携带仓位 | 2 空（BNB、BTC） | 0 | A/B 起点不等价 |
| 窗口内新开仓已实现 | +2.57 USDT | +16.53 USDT | 不可归因于过滤器 |
| 携带仓位在窗内平仓的整笔收益 | +6.55 USDT | 0 | 含入窗前价格段；bot1 BTC，BNB 仍未平 |
| limit 入场成交 | 9/9 | 3/3 | 样本仍小 |
| bot1 成交延迟 | 中位 27.6s / P90 107.1s / 最大 287.4s | — | 最慢 EDGE |
| bot1 当前未平订单 | 1 张 BNB 保护 stop-market | 0 | 没有卡住的 entry/exit limit |
| bot1 硬止损价格滑点 | 均值 +0.35%，最差 EDGE +0.75% | — | 2x 后最差约 +1.50pp |

同一时点现役币 24h quoteVolume 中，EDGE 约 2144 万、POWER 约 370 万、VANRY
约 3191 万、UNI 约 7944 万 USDT，低于候选池 1 亿门槛。它们保留在 07-20 回测比较
中，但新版候选快照会显示真实成交额与 `BELOW_MIN_VOLUME`，不再用 forced=0 掩盖。

### 变更与结论

1. `forward_compare.py` 统一解析 `T`/时区 ISO 时间并转换为 SQLite UTC 文本；单列
   carried-in 多/空仓、已实现收益和 pair，起点敞口不等时显式 WARNING。
2. `slippage_audit.py` 新增未平订单角色、入场延迟中位/P90/最大值、慢成交清单，
   并同时输出原始与杠杆放大的止损滑点。
3. `refresh_top_pairs_backtest.py` 默认强制 `--timeframe 5m --fee 0.00035 --cache none`；
   forced 现役币保留真实成交额并标低流动性，新增不写文件/不启 Docker 的
   `--candidates-only` 快照模式。
4. 生产 `VolatilityBreakout` 仅增加每 pair/side/reason 最多 5 分钟一条的
   `entry_blocked` INFO 日志，记录占槽交易；信号、仓位、出场和风控返回值完全不变，
   所以版本仍为 `5.3-d48-shortgate`，不宣称策略收益优化。
5. GrokCombined 维持研究状态。晋升条件从“只看运行 7~14 天”收紧为：先取得可比
   空仓起点或用阻断日志剥离仓位上限影响，且至少一侧不足 10 笔时只作方向性阅读。
   BNB 占槽是否需要替换/退出，先量化错过信号，不重启已否决的时间止损实验。

### 验证与复现

```bash
# 本地纯 stdlib 单测、语法与补丁检查
python3 -m unittest discover -s freqtrade/scripts/tests -v
python3 -m py_compile freqtrade/scripts/*.py \
  freqtrade/strategies/volatility_breakout/v5_d48.py
git diff --check

# 远端数据库只读审计
ssh ubuntu@43.164.75.52 python3 - \
  --db /data/freqtrade/user_data/tradesv3-v5.sqlite \
  < freqtrade/scripts/slippage_audit.py
ssh ubuntu@43.164.75.52 python3 - \
  --db-a /data/freqtrade/user_data/tradesv3-v5.sqlite --label-a D48 \
  --db-b /data/freqtrade/user_data/tradesv3-grok-combined-d48-forward.sqlite \
  --label-b GrokCombined < freqtrade/scripts/forward_compare.py

# 远端只读流动性快照
cd /data/freqtrade
python3 scripts/refresh_top_pairs_backtest.py --max-candidates 30 \
  --include BTC,ETH,SOL,BNB,XRP,DOGE,ADA,ZEC,EDGE,POWER,VANRY,UNI \
  --candidates-only

# 策略部署后验证加载、版本、心跳及观测日志
docker compose run --rm --no-deps freqtrade list-strategies \
  --strategy-path user_data/strategies/volatility_breakout
docker compose restart freqtrade
grep 'strategy_version: 5.3-d48-shortgate' user_data/logs/freqtrade.log | tail -1
grep 'entry_blocked' user_data/logs/freqtrade.log | tail
```

## GrokCombined 前向结案（2026-07-15，退役）

bot3 前向数据库最终保留 3 笔已平交易、已实现 +16.53 USDT、无未平仓；但上一节已确认
对照起点不等价：bot1 在窗口开始前携带 BNB/BTC 两个空仓，bot3 从空仓开始，生产策略
同方向两仓上限会直接压制 bot1 的后续机会。3 笔样本既不足以估计 PF，也无法把差异
归因于压缩+决定性收盘过滤器。

离线证据同样不支持继续占用研究线：GrokCombined 全区间收益 +18.03%，低于 D48
+25.41%；它的价值仅是把回撤从 24.04% 降到 11.33%，但没有经过可比前向起点验证。
继续运行只能延长一个已被仓位槽位混杂的实验，不能自动修复实验设计。

结论与动作：

1. `GrokCombinedD48` 退役，不替换生产 bot1；bot3 停止并从 Compose 与 Bot Observatory
   当前注册表移除。
2. 历史 SQLite 与日志保留供审计，不删除已发生交易；研究策略文件从运行目录清理，
   离线参数和结果由本节及 Git 历史复现。
3. 后续研究 bot 必须从双方空仓的可比起点启动，并在启动前写明最小样本与晋升门槛；
   不再用“运行满若干天”代替可比性。
4. 同日评估的趋势网格属于独立策略族，过程与否决结果记录在
   `docs/trend-grid-strategy-iterations.md`，不混入本波动突破迭代正文。

## D48 前向亏损归因与优化门槛（2026-07-16，只诊断、未改策略）

### 现场快照与样本边界

统计时点为 2026-07-16 02:30 UTC。bot1、Bot Observatory 与 cloudflared 均正常，
过去 24 小时无 ERROR/CRITICAL；这里讨论的是 dry-run 交易表现，不是运行故障或实盘
成交证明。

| 指标 | 结果 |
|---|---:|
| 已平 / 未平 | 10 / 2 |
| 已平胜负 | 4 胜 / 6 负，胜率 40% |
| 已实现 | -25.48 USDT |
| 含未平浮亏 | 约 -35.62 USDT / -3.60% |
| 已平 PF | 0.44 |
| 当前/最大回撤 | 约 3.61% |
| 未平仓 | BNB、ZEC，均为 2x 空单且有保护 stop-market |

不能把这 10 笔全部视为现行 `5.3-d48-shortgate` 的同质样本：前四笔及仍未平的 BNB
在 07-08 开仓，早于 ATR 风险定仓、交易所端止损和 07-12 空头闸门。07-12 之后现行
版本只有 3 笔已平、1 笔新开，远不足以据此前向样本直接调生产参数。

### 亏损来源拆解

1. **低流动性小币是当前最集中的损失来源。** EDGE 三笔净 -7.83 USDT，POWER 两笔
   净 -11.84 USDT，合计 -19.66 USDT，占全部已实现亏损约 77%。07-16 快照中两者
   24h quoteVolume 约 1863 万和 262 万 USDT，远低于候选池 1 亿门槛；UNI、VANRY
   同样低于门槛但尚无本轮已平样本。这是待验证假设，不构成按 5 笔直接删币的证据。
2. **执行层已经不是主要矛盾。** 12/12 入场限价单成交，延迟中位 22.6s、P90 61.4s；
   最慢 EDGE 为 287.4s。三笔旧软件止损平均价格滑点 +0.349%，而启用交易所端止损后
   四笔硬止损记录价格滑点为 0；dry-run 的 0 滑点仍偏乐观，实盘前必须小资金核验。
3. **风险定仓与真实硬止损存在口径失配。** 当前仓位按
   `3×ATR / price × leverage` 估算风险，但真正最坏机械退出是固定 -5%。当 3×ATR 风险
   小于 5% 时，仓位会按较小分母放大，最终单笔账户损失可接近钱包的 0.9%，高于名义
   0.75% 风险预算；18% 单笔保证金上限只是把失配封顶，没有消除它。
4. **浮盈后反转值得记录，但不足以立即改出场。** 六笔亏损的最大有利浮动约为
   +0.85%~+4.32%，未平 BNB 曾到 +3.85% 后回撤；`+3% 后保本` 在这组小样本上看似
   有效，但属于事后观察。此前 7 个 trailing/ATR 出场变体和 48/72h 时间退出均已验证
   失败，因此该方向必须使用比普通入场过滤更严格的样本外门槛。

### 后续候选及判断逻辑

按优先级只允许以下单因素候选，不同时改入场、仓位和出场：

1. **`RiskCapFix`（P0，风险正确性）**：定仓分母改为
   `max(3×ATR/price×leverage, abs(stoploss))`，并在验收时单列双边费用、资金费与压力
   滑点。目标不是提高收益，而是让计划硬止损的账户价格风险不超过 0.75%。验证段 PF
   相对基准下降不得超过 0.02，最大回撤和最差单笔必须改善，否则不部署。
2. **`LiquidityGate`（P1，潜在 edge）**：从已闭合 K 线计算因果的滚动 quote volume，
   独立测试 5000 万/1 亿/2 亿 USDT 门槛，或用按周冻结的静态 pair 快照做 walk-forward。
   不用当前实时榜单回填历史。Freqtrade 官方说明 `VolumePairList` 不支持回测，动态
   pairlist 也不能保证历史可复现，参见
   [Pairlist](https://www.freqtrade.io/en/stable/plugins/) 与
   [Backtesting](https://www.freqtrade.io/en/stable/backtesting/)。
3. **`EntryExpiry`（P2，执行卫生）**：与当前 10 分钟入场超时对照测试 60s/120s，确认
   是否能删除接近整根 5m K 线才成交的过时突破，同时不误删盈利单。仅一笔 287s EDGE
   不能支持直接改线上超时。
4. **`BreakEven3`（P3，探索性出场）**：浮盈达到 +3% 后把硬止损推到含费用保本，原
   +5% 激活、3% trailing 保持不变。它必须同时战胜训练和验证基准；只改善当前 12 笔
   或训练段即否决，不能推翻既有“出场封盘”结论。

统一验收协议：服务器 5m、12 对、1000 USDT、2x isolated、`--fee 0.00035`、
`--cache none --enable-protections`；训练 `20260101-20260501`，训练胜者才进验证
`20260501-20260710`。收益型候选须在两段同时提高 PF、保持正收益、交易数不少于基准
70%，且 0.05% 单边费率压力不得转负；再做黑天鹅、lookahead 与 recursive 审计。
Freqtrade 的审计边界见
[Lookahead analysis](https://docs.freqtrade.io/en/stable/lookahead-analysis/) 和
[Recursive analysis](https://docs.freqtrade.io/en/stable/recursive-analysis/)。

任何通过离线门槛的候选也不能直接替换 bot1：必须从双方空仓的可比起点做独立 dry-run
A/B，至少取得 30 笔已平交易再裁决。当前生产策略、白名单、仓位、出场和服务均未因本次
诊断发生变化；07-20 白名单复核仍按原计划执行。

## RiskCapFix 回测与活跃池诊断 bot3（2026-07-16）

### 单因素实现与原 12 对验证

`VolatilityBreakoutRiskCap` 继承生产 D48，只把定仓有效风险改为
`max(3×ATR/price×leverage, abs(stoploss))`；信号、方向闸门、出场、protections、
敞口限制和杠杆完全不变。纯数学 helper 覆盖低 ATR 被固定止损封顶、高 ATR 仍由 ATR
控制、交易所最大仓位和非法输入 fail-closed；全仓库 10 项脚本单测通过。

标准协议为 12 对、5m、1000 USDT、2x、单边费率 0.035%、无缓存、启用 protections：

| 区间/策略 | 交易数 | 收益 | PF | 最大回撤 | 裁决 |
|---|---:|---:|---:|---:|---|
| 训练 D48 | 335 | +19.26% | 1.137 | 13.01% | 基准 |
| 训练 RiskCapFix | 335 | +16.69% | 1.141 | 11.37% | 风险门槛通过 |
| 验证 D48 | 175 | +13.47% | 1.220 | 8.75% | 基准 |
| 验证 RiskCapFix | 175 | +11.68% | 1.223 | 7.44% | 风险门槛通过 |

两段的交易数、胜负和持仓时间一致，说明单因素隔离成立；收益随仓位缩小而下降，PF 略升，
回撤分别下降 1.64pp 和 1.31pp。它证明风险预算修正有效，但不创造新的入场 edge。

### 最新高流动性池复核

按 2026-07-16 Binance USDT-M 24h quoteVolume≥1 亿 USDT 取得 21 对：ETH、BTC、SOL、
AKE、ZEC、HYPE、XRP、LAB、DOGE、1000PEPE、BNB、EVAA、DODOX、ONDO、ADA、NEAR、
WLD、US、PUMP、DEXE、SUI。候选配置与 bot1 完全隔离。

最近 60 天全池在启用 protections 后为 323 笔、-17.33%、PF 0.813、最大回撤 20.72%。
正收益 pair 只有 ADA +2.01%、ONDO +1.93%、BTC +1.00%、XRP +0.86%、SUI +0.85%
和 DOGE +0.16%；NEAR、DODOX、US、ETH 等拖累明显。由此得到两个结论：

1. **成交活跃只解决可交易性，不是 alpha。** 把当日热门币整体加入突破空头策略会显著
   恶化；不能用实时成交额排名代替历史方向适配。
2. **下一项可证伪的优化是两阶段交易池。** 第一阶段用成交额排除不可执行标的；第二阶段
   必须用严格因果的 pair 自身日线方向（例如日线 EMA50/200 与斜率）或滚动
   walk-forward 持续性筛选。选择窗口只能使用交易日前的数据，不能把本次 60 天赢家
   直接回填为同区间白名单。

### 启动决定与运行边界

用户明确要求在 Console 中启动并让最近活跃交易对参与 dry-run，因此 2026-07-16
03:18 UTC 启动独立 `freqtrade3`：策略版本 `5.4-d48-riskcap-forward`，21 对，8082，
全新 `tradesv3-riskcap-active-forward.sqlite`，启动时 1000 USDT、0 持仓/0 挂单。
Observatory 标签为 **RiskCap 活跃池（实验）**，明确表示它未通过活跃池离线门槛。

该 bot 只用于观察实时信号覆盖、限价成交延迟、止损与 pair 归因；不得转 live、不得替换
bot1，也不得因为运行若干天就晋升。归档位于服务器
`user_data/backtest_results/riskcap-forward/`。若继续优化，优先新增单因素
`PairDailyRegimeGate` 并按训练→验证→费率压力验证；bot3 当前数据只作后续样本外证据。

## LiquidityGate 滚动成交额门槛（2026-07-16，训练段否决）

### 动机

07-16 前向归因显示 bot1 约 77% 已实现亏损集中在 EDGE、POWER 两个 24h 成交额远低于
1 亿门槛的小币上，据此立项 P1 候选 LiquidityGate：在生产 D48 入场条件上叠加
「过去 288 根已闭合 5m K 线的滚动成交额（`volume×close` 求和 ≈ 24h quote volume）
≥ 门槛」，NaN 预热期 fail-closed。三档独立测试：5000 万 / 1 亿 / 2 亿 USDT。
信号、出场、定仓、protections 全部不动，单因素隔离。因果性：滚动窗口只含信号时刻
已闭合的 K 线，不使用实时榜单回填（`VolumePairList` 官方明确不支持回测）。

### 协议与结果

标准协议：服务器容器内、12 对、1000 USDT、2x isolated、`--fee 0.00035
--cache none --enable-protections`、显式 `--timeframe 5m`，训练段
`20260101-20260501`，基准与三档变体同一次 `--strategy-list` 运行（共享数据窗口）。

| 训练段策略 | 交易数 | 总收益 | PF | 胜率 | 最大回撤 | 裁决 |
|---|---:|---:|---:|---:|---:|---|
| D48 基准 | 335 | +19.26% | 1.14 | 55.2% | 13.01% | 基准 |
| LG50（5000 万） | 257 | +7.38% | 1.06 | 52.9% | 20.47% | 否决 |
| LG100（1 亿） | 233 | +9.40% | 1.09 | 51.9% | 17.94% | 否决（交易数 69.6%<70%） |
| LG200（2 亿） | 231 | +14.62% | 1.14 | 53.2% | 16.02% | 否决（PF 未提高，交易数 68.9%<70%） |

三档均未通过「训练段提高 PF」门槛，收益全面下降、回撤全面上升，按协议不进验证段。

### 失败机制（分对归因）

训练段基准的分对贡献推翻了「小币=亏损源」假设：EDGE 确实是训练段最差
pair（16 笔 -39.25 USDT），但 VANRY（+69.21）和 ADA（+88.54）这两个同样偏小的
pair 是前两名利润来源；POWER 75 笔基本打平（-0.74）。LG200 移除了 EDGE 的大部分
交易（-39.25→-5.23），却也把 VANRY 清零、ADA 砍到 5 笔，小币赢家的损失远大于
EDGE 止血的收益。释放的仓位槽让 ETH/ZEC/DOGE 变好（合计约 +90 USDT 改善），但
不足以补偿。结论：**成交额高低在本策略族里不预测 pair 盈亏方向**；EDGE 的问题是
pair 自身质量（训练段与前向双差），应交给白名单周度复核按 pair 表现处理，而不是
用全局成交额门槛连带杀掉小币赢家。

外部证据同向（grok 检索，2026-07-16）：Fičura 2023 记载小币侧存在流动性溢价，
砍掉低流动性币会使横截面 alpha 变薄；绝对成交额门槛无文献共识且不随市场状态缩放，
50M~2 亿属执行启发式而非回测最优。文档中「按周冻结静态 pair 快照 walk-forward」
路线未在本轮测试，若重启应改为按 pair 自身历史表现（而非成交额）做持续性筛选。

### 复现

```bash
docker compose run --rm --no-deps freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies --recursive-strategy-search \
  --strategy-list VolatilityBreakoutLG50 VolatilityBreakoutLG100 \
    VolatilityBreakoutLG200 VolatilityBreakout \
  --timerange 20260101-20260501 --timeframe 5m \
  --fee 0.00035 --cache none --enable-protections --export trades
```

结果 zip：服务器 `user_data/backtest_results/liquidity-gate/`。变体文件
`strategies/research/liquidity_gate.py` 已按规范随否决删除（本地与服务器），
实现细节见本章与 Git 历史。

## EntryOther 可成交限价 bot3（2026-07-17）

### 替换裁决

RiskCap 活跃池在启动前已经因 21 对离线回测 PF<1 被标记为不可晋升。停止前的只读前向
审计窗口为 2026-07-16 03:18 至 2026-07-17 03:47 UTC：6 笔开仓、4 笔已平、
-6.98 USDT、PF 0.49、硬止损率 75%，另有 BTC/XRP 两个 dry-run 未平仓。样本仍小，
但其研究问题没有晋升路径，故停止容器；原数据库
`tradesv3-riskcap-active-forward.sqlite` 和日志完整保留，不伪造平仓。

bot1 是生产 D48 基线，必须保留。服务器现存 dry-run 日志累计出现 18 次入场限价超时后
整单删除；POWER 2026-07-15 12:30 的实际信号通过闸门并提交订单，却因 same-side 被动
限价未成交，而同期 K 线回测错误假设成交并盈利。第一处分歧在 `order → fill`，因此复用
bot3 检验单因素 `entry_pricing.price_side=other`。

### 一致起点与运行边界

- 2026-07-17 03:49:02 UTC 使用 SQLite `.backup` 从在线 bot1 数据库建立
  `tradesv3-entry-other-forward.sqlite`，快照含 13 笔历史及 BNB/ETH 两个未平空仓。
- bot3 使用与 bot1 相同的 `VolatilityBreakout`、版本 `5.3-d48-shortgate`、12 对、5m、
  fee/保护/定仓/退出；只叠加 `research-entry-other.overlay.json`。
- 日志 `logs/freqtrade-entry-other-forward.log`，API 端口 8082，Observatory 标签
  **可成交限价（实验）**。bot1 不停机、不改配置。
- K 线同期回测中 same/other 均为 3 笔、+22.020 USDT，逐笔 JSON 完全一致；这只证明
  技术策略未漂移，不能验证盘口成交。
- 累计至少 20 个同源有效下单机会后比较：signal/gate/order 对齐率、fill rate、超时取消、
  spread、相对 mid slippage、净 PnL。若成交率不改善，或 spread+slippage 吞噬机会收益，
  则淘汰；不得仅因样本收益更高而晋升。
- `scripts/slippage_audit.py --since 2026-07-17T03:49:02Z --db ... --log ...` 同时读取
  SQLite 与日志；后者补回 Freqtrade 在零成交超时后从数据库删除的入场订单，避免把
  被删除订单漏出分母、错误报告 100% fill rate。

## SUI 单币扩池复核（2026-07-17，离线否决）

### 冻结问题与数据修正

外部初筛把 DOGE、SUI、XRP 归为高波动币中的贡献者，但 DOGE/XRP 已在生产 12 对内，
真正可检验的单因素只有「现有 12 对 + SUI」。正式协议在启动前冻结为：策略、5m、
1000 USDT、2x isolated、4 个最大仓位、费率、protections 与出场全部保持不变，只增加
`SUI/USDT:USDT`；训练/验证必须同时通过后才从 bot1 一致性快照启动 bot2。

远端预检发现 07-16 活跃池留下的 SUI 5m 数据仅从 2026-05-17 开始，第一次训练结果
因此完全等于 12 对基准，不能作为 SUI 证据。使用 `download-data --prepend` 补齐
2026-01-01 起 5m、1d、mark 与 funding 数据后，重新以 `--fee 0.00035 --cache none
--enable-protections` 跑完两段；以下仅采用补齐后的结果。

### 12 对与 12+SUI 单因素结果

| 区间 | 组合 | 交易数 | 收益 | PF | 最大回撤 | SUI 子样本 |
|---|---|---:|---:|---:|---:|---|
| 训练 01-01~05-01 | 12 对基准 | 335 | +19.26% | 1.137 | 13.01% | — |
| 训练 01-01~05-01 | 12 对 + SUI | 334 | +19.92% | 1.137 | 14.96% | 10 笔 / +24.44U / PF 1.54 |
| 验证 05-01~07-10 | 12 对基准 | 175 | +13.47% | 1.220 | 8.75% | — |
| 验证 05-01~07-10 | 12 对 + SUI | 173 | +14.00% | 1.235 | 8.87% | 5 笔 / -4.34U / PF 0.77 |

组合收益两段各增加约 0.66pp/0.53pp，但训练 PF 没有实质提高且回撤恶化 1.95pp；更
重要的是 SUI 自身在验证段为负且仅 5 笔，未通过「pair 两段均为正、PF>1」的预注册
门槛。验证段组合增加的约 5.35U 不是 SUI 直接贡献：SUI 自身 -4.34U，加入新 pair 后
同向仓位槽改变，使 BTC/DOGE/VANRY 等交易集合变化。第一处分歧在
`pair universe → same_side_limit/仓位分配`，不能把组合总收益微增解释为 SUI alpha。

### 反证与裁决

为排除 12 对槽位竞争对 SUI 的压制，又按同协议跑 SUI-only：训练 103 笔、-1.60%、
PF 0.964、DD 10.14%；验证 73 笔、-7.00%、PF 0.786、DD 7.25%。这与外部报告的
「SUI 合并期 +95U」不一致，说明该数字依赖其币对组合、排序、仓位竞争或不同策略/配置，
不能迁移为当前生产 D48 的单币结论；没有原始命令和结果 zip 时不把它升级为运行事实。

裁决：**离线否决，不启动 bot2，不修改生产 12 对**。临时研究 overlay 已删除；bot1、
bot3 与 Observatory 运行状态不变。结果保存在服务器
`user_data/backtest_results/sui-expansion/`，完整技术复核见
`docs/2026-07-17-sui-expansion-review.md`。若以后重启候选，必须先定义只使用选择日前
数据的滚动 pair 选择规则，而不是按已知 1~7 月赢家手工回填。

## 15m 前低斜率空头过滤（2026-07-19，验证段否决）

### 动机与冻结假设

对 bot1 最近 48 小时的 4 笔已平空单做信号、成交、退出和后续价格路径复核时，15m
结构图出现一个方向性观察：两笔亏损交易入场前的约 8 小时结构底分别抬高约 1.88% 和
0.51%，两笔盈利交易的结构底分别下降约 0.23% 和 0.07%。样本很小且来自事后观察，
因此只把它注册为可证伪假设，不直接修改生产。

候选 `short_15m_floor_slope_v1` 在测试前冻结为：使用原生已闭合 15m K 线，
`L(t) = rolling_min(low, 32).shift(1)`，并只在 `L(t) <= L(t-4)` 时允许生产 D48
空头信号。`shift(1)` 排除承载当前 5m 突破的 15m K 线对自身结构底的影响；预热和
缺失值 fail-closed。多头、基础信号、仓位、杠杆、出场、止损、protections 和敞口闸门
全部继承生产 D48，不作参数搜索，也不在看过验证段后调整 32/4。

### 防错检查与标准协议

实现后先运行纯函数和 Freqtrade 运行时测试：滚动底上升/持平/下降、当前突破 K 线隔离、
预热/NaN fail-closed、输入不变、15m/5m 共同收盘时点对齐，以及只改变空头入场资格。
本地全套 22 项通过（无 Freqtrade 的 2 项按预期跳过），服务器 Freqtrade 2026.6 中本
实验 10 项全部通过。服务器随后下载并核对 12 对原生 15m futures 数据；EDGE 合约从
2026-03-19 上线，其余 11 对完整覆盖固定窗口。

回测使用 12 对、1000 USDT、2x isolated、最多 4 仓，显式 `--timeframe 5m`、
`--fee 0.00035 --cache none --enable-protections`。基准和变体在同一次
`--strategy-list` 中运行；训练 `20260101-20260501`，训练胜者才进入锁定验证
`20260501-20260710`。晋级要求预先冻结为两段均正收益、PF 均高于基准且交易数不少于
基准 70%；标准验证失败便停止，不运行费率压力、黑天鹅、lookahead 或 recursive。

### 结果与裁决

| 区间/策略 | 交易数 | 收益 | PF | 胜率 | 最大回撤 | 裁决 |
|---|---:|---:|---:|---:|---:|---|
| 训练 D48 | 335 | +19.26% | 1.1367 | 55.2% | 13.01% | 基准精确复现 |
| 训练 FloorSlopeV1 | 324 | +27.15% | 1.1929 | 56.8% | 15.33% | 训练门通过，DD 恶化 2.32pp |
| 验证 D48 | 175 | +13.47% | 1.2200 | 56.0% | 8.75% | 基准 |
| 验证 FloorSlopeV1 | 177 | +13.92% | 1.2180 | 54.8% | 9.89% | **否决：PF 降低且 DD 恶化 1.14pp** |

验证段多出 2 笔并不表示过滤器创造了信号：过滤部分空头后释放了同方向仓位槽，后续候选
的成交集合和顺序随之变化。分对变化高度不稳定，例如 EDGE 改善 +28.18 USDT、ETH
改善 +18.71 USDT，但 BTC 恶化 -39.79 USDT、POWER 恶化 -17.26 USDT、ADA 恶化
-12.50 USDT。组合收益仅增加 4.41 USDT，同时胜率、PF 和回撤均变差，属于仓位槽重排
后的脆弱微增，不能解释为可部署 alpha。

裁决：**验证段否决，不做费率压力和后续审计，不启动研究 bot，不修改或重启生产。**
最近 48 小时图上的 2 胜/2 负分离是有用的假设生成线索，但不足以外推；该规则若直接
上线，反而会把训练期回撤和样本外回撤同时放大。实验落定后按规范删除 research 变体与
专用测试，结果和当时策略源码保留在服务器 zip 中。

### 复现与归档

```bash
docker compose run --rm --no-deps freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies --recursive-strategy-search \
  --strategy-list VolatilityBreakout VolatilityBreakoutFloorSlopeV1 \
  --timerange 20260101-20260501 --timeframe 5m \
  --fee 0.00035 --cache none --enable-protections --export trades \
  --backtest-directory user_data/backtest_results/floor-slope-v1/train

# 仅训练通过后执行：
docker compose run --rm --no-deps freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies --recursive-strategy-search \
  --strategy-list VolatilityBreakout VolatilityBreakoutFloorSlopeV1 \
  --timerange 20260501-20260710 --timeframe 5m \
  --fee 0.00035 --cache none --enable-protections --export trades \
  --backtest-directory user_data/backtest_results/floor-slope-v1/validation
```

训练归档 `backtest-result-2026-07-19_08-04-57.zip`，SHA-256
`426da3461eb8d3a58aa93d3c5abed58e76f8563883c50cc83f3b804b2ad469b0`；验证归档
`backtest-result-2026-07-19_08-06-48.zip`，SHA-256
`a2a1f4284f08c8e6901de2bc4c7eb529ebf33b239d7a632edcaedc7deb2bcc8d`。二者位于服务器
`user_data/backtest_results/floor-slope-v1/{train,validation}/`，zip 内含结果 JSON、
配置快照、策略源码和钱包曲线。

## 突破后一根 5m 保持确认 Hold1V1（2026-07-21，训练段否决）

### 动机与冻结规则

2026-07-20 UTC 的生产复盘先用真实 5m 分析蜡烛生成并目视检查执行图和 15m 结构图。
当天 7 个真实 D48 空头信号出现一个整齐但很小的方向性分离：ZEC 和被仓位闸拦截的
VANRY 在下一根 5m 收盘仍位于原突破下轨之外，随后延续；BTC、XRP、DOGE、ADA、
EDGE 下一根均收回原下轨以内，随后表现较弱或反向。该观察只用于注册实验，未当作已
验证 edge。

候选 `Hold1V1` 在看训练结果前冻结为：生产 D48 在已闭合 K 线 `t` 产生候选后，冻结
`L = donchian_low[t]`（多头对称冻结 `H = donchian_high[t]`），等待下一根 5m K 线
闭合；空头仅在 `close[t+1] < L` 时于下一可执行时点入场，多头仅在
`close[t+1] > H` 时入场，否则取消该候选。边界不随 `t+1` 的滚动 Donchian 更新。
基础信号、方向闸门、ATR 定仓、杠杆、出场、protections 和敞口限制全部继承生产 D48。

### 防错检查与标准协议

纯函数测试覆盖：必须等待一根 K 线、使用候选 K 线冻结边界、收回边界即取消、长短
对称、零成交量 fail-closed 和索引错位拒绝，共 5 项全部通过。Freqtrade 2026.6 能从
独立 `strategies/research` 路径同时解析未改动基线包装类与 Hold1 候选；生产策略文件、
配置、数据库和运行容器均未修改。

训练段按标准协议运行：12 对、1000 USDT、2x isolated、最多 4 仓、显式 5m、
`--fee 0.00035 --cache none --enable-protections`，基线和候选在同一次
`--strategy-list` 中比较，区间 `20260101-20260501`。预注册晋级条件为训练和后续验证
都保持正收益、PF 高于基线、交易数不少于基线 70%，并且最大回撤不恶化；训练失败即
停止，不查看验证段。

### 训练结果、订单级归因与图形复核

| 策略 | 交易数 | 收益 | PF | 胜率 | 最大回撤 | 裁决 |
|---|---:|---:|---:|---:|---:|---|
| D48 基线 | 335 | +19.26% | 1.1367 | 55.2% | 13.01% | 基准精确复现 |
| Hold1V1 | 300 | +3.89% | 1.0326 | 53.7% | 14.31% | **训练段否决** |

Hold1 少 35 笔（保留基线 89.6%，交易数门槛本身通过），但收益减少 15.37 个百分点、
PF 下降 0.104、回撤反而扩大 1.30 个百分点。在「同 pair、恰好晚 5 分钟」的 192 组
订单中，Hold1 平均每笔收益率比基线低 0.505 个百分点，只有 83/192（43.2%）改善；
其中 122 组仍在同一时刻退出，其余订单因延迟入场改变 trailing/硬止损路径。

分币种变化不是稳定的假突破过滤：EDGE、ZEC、POWER 分别改善约 +41.63、+33.06、
+20.73 USDT，但 SOL、XRP、ADA、ETH 分别恶化约 -91.17、-44.78、-44.32、
-31.91 USDT。目视检查累计收益图后确认，Hold1 并非只在某个局部阶段失效：其权益曲线
从训练早段开始长期低于基线；配对散点还显示一批原本盈利的基线交易在延迟后落到完整
硬止损。第一分歧确实位于「信号后等待确认」，但这个确认付出的延迟和路径重排成本大于
过滤快速收回的收益。

### 裁决与归档

裁决：**训练段否决，不运行验证、费率压力、黑天鹅、lookahead 或 recursive，不启动
研究 bot，不修改或重启生产。** 单日图形分离是有效的假设生成线索，但不能外推为
全样本 edge；以后不再以相同的一根 5m 固定等待规则重测。实验落定后删除 active
research 变体与专用测试，精确策略快照保留在结果 zip，冻结公式和归因保留在本节。

复现命令：

```bash
docker compose run --rm freqtrade backtesting \
  --config user_data/config.json \
  --strategy-path user_data/strategies/research \
  --strategy-list VolatilityBreakoutHold1Baseline VolatilityBreakoutHold1 \
  --timerange 20260101-20260501 --timeframe 5m \
  --fee 0.00035 --cache none --enable-protections --export trades \
  --backtest-directory user_data/backtest_results/hold1-20260721/training
```

训练归档 `backtest-result-2026-07-21_06-39-39.zip`，SHA-256
`5ec42e651ebfe2a3b44330dedd00824966c66e17bbe97ba9fdafe0417bfa873c`，位于服务器
`user_data/backtest_results/hold1-20260721/training/`；本地复核材料位于
`freqtrade/reviews/2026-07-21-hold1/`，包含相同结果、订单级摘要、累计收益/分币种/配对
散点对比图和人工目视检查记录。

## 12 对去除 EDGE 白名单消融（2026-07-23，双窗口否决）

### 冻结规则与执行

基线为当前生产 D48 的 12 对白名单；候选仅删除 `EDGE/USDT:USDT`，策略源码、初始
钱包、2x isolated、最多 4 仓、ATR 定仓、同向/相关组限仓、出场和 protections 均不变。
训练段 `20260101-20260501`，验证段 `20260501-20260710`，显式 5m、
`--fee 0.00035 --cache none --enable-protections`。预注册晋级条件为两段候选均正收益、
PF 高于基线、最大回撤不恶化、交易数不少于基线 70%，且改善不能只由不稳定的仓位槽
重排解释。

因本地 Binance 公共市场元数据请求返回地区限制 `451`，经用户明确要求改在生产服务器
运行。四次回测严格串行，每个研究容器限制为 0.75 CPU、900MB 内存；两个交易容器未
改配置、未停止、未重启。运行时策略源码 SHA-256 与仓库基线一致：
`db884cc34cb2502676088b4c519397bcc06a37f24ea74ac0960e27d32bec9691`。

### 结果与路径归因

| 窗口 | 方案 | 交易数 | 收益 | PF | 最大回撤 | 裁决 |
|---|---|---:|---:|---:|---:|---|
| 训练 | 12 对基线 | 335 | +19.26% | 1.1367 | 13.01% | 基准 |
| 训练 | 去除 EDGE | 326 | +12.32% | 1.0881 | 18.06% | **失败** |
| 验证 | 12 对基线 | 175 | +13.47% | 1.2200 | 8.75% | 基准 |
| 验证 | 去除 EDGE | 144 | +15.44% | 1.2888 | 6.97% | 通过数值门槛 |

训练段 EDGE 自身 16 笔合计亏损 39.25 USDT，但删除后释放的仓位槽新增 12 笔非 EDGE
交易，合计亏损 80.53 USDT，同时挤掉 5 笔原路径盈利 32.65 USDT；仓位槽重排净影响
为 -113.18 USDT，使候选总收益比基线少 69.36 USDT。验证段 EDGE 自身 33 笔反而盈利
38.56 USDT；候选多出的 +19.68 USDT 完全依赖另一方向的仓位槽重排（净 +56.25 USDT）。
因此 EDGE 并不是训练/验证重复的负贡献 cohort，验证段改善也不是可归因的单币质量
提升。

### 裁决与归档

裁决：**否决去除 EDGE，不修改生产白名单，不启动前向。** 第一分歧是 pair universe，
但后果通过同向最多 2 仓的组合闸门放大为路径重排；按近期单币 PnL 直接删币无法隔离
稳定 edge。以后若复核白名单，应采用滚动、预先冻结的 pair 选择规则，并把槽位机会
成本作为主要归因项。

四个原始结果 zip、配置/策略快照、审计 manifest、累计收益与归因图及人工目视记录位于
`freqtrade/reviews/2026-07-23-edge-exclusion/`。训练基线/候选 SHA-256 分别为
`cfad07b24e1aeba3a62df9a6b5e2a4e1f1b5c906cd3109398e13a71f0ccc79bc`、
`83f25319364a7ce1498d70f5a313109acdb817eca476c9f2115c2160703cb2c2`；验证基线/候选
分别为 `3544fc1daa8687b8fc18b5499c4bab2e6e38709b9ba8e21a25ec383ffc2dc825`、
`0a722e7db115aefc1504aa6058daa74e0c38c261fd8c4a32d0e69aad50fa9806`。

## RiskCap 替换生产定仓与 EntryOther 下线（2026-07-23）

用户基于当前 D48 前向可靠性顾虑，明确要求不再等待 RiskCap 的 30 笔双实例前向门槛，
直接以已通过训练/验证双窗口风险门槛的 RiskCap 替换生产定仓，并下线 EntryOther。
该决策是风险控制部署，不是新增 alpha 结论：`VolatilityBreakoutRiskCap` 继承
5.3 D48 的信号、方向闸门、组合限仓、止损、trailing 和 protections，唯一变化是低
ATR 时按实际 5% 硬止损封顶新仓 stake。

切换前 bot1 与 EntryOther 各有 BTC、SOL 两个对应 dry-run 空仓。bot1 沿用
`tradesv3-v5.sqlite`，RiskCap 因退出路径相同而继续管理原仓；启动后两个模拟
stop-market 均重新挂载。EntryOther 先调用 `stopbuy`，再将 trade 27/28 正常
`force_exit`，分别实现约 +1.68/-1.32 USDT，随后停止并移除 `freqtrade3` 容器；
数据库与日志保留。该实验结束时仍未达到预注册的 20 个严格匹配机会，因此不能形成
`price_side=other` 的晋级或否决结论。

生产运行时已核对：

- active command 使用 `--strategy VolatilityBreakoutRiskCap`；
- 心跳报告 Freqtrade 2026.6、`strategy_version: 5.4-d48-riskcap-forward`、
  `state=RUNNING`；
- `show_config` 确认 5m、2x isolated、12 对、同一入场 `price_side=same`、
  交易所端止损和原退出参数；
- RiskCap 策略与纯函数源码 SHA-256 分别为
  `0f1e7df8952cbfdd1d282ea50e1f4a6cb109a035d2503920c1a2d590e8a6d155`、
  `cd2a3c196818a89cd96055531220ecf078faf9658fc7736bf32c7da51b7c1dd9`；
- 原 compose 已备份为
  `/data/freqtrade/docker-compose.yml.pre-riskcap-20260723`。

## EntryOther bot3 重启（2026-07-23，用户要求）

同日早些时候 EntryOther 随 RiskCap 生产替换被 force_exit 并停止容器。用户随后要求
重启 bot3 以继续可成交限价前向。操作：清理 Observatory 误创建的
`tradesv3-entry-other-forward.sqlite-{wal,shm}` 空目录后，
`docker compose --profile research up -d freqtrade3`；Observatory 注册表标签改回
「EntryOther 可成交限价」、`expectedState=online`。

运行时核对：策略 `VolatilityBreakout` / `5.3-d48-shortgate`，
`entry_pricing.price_side=other`，dry-run，空仓起点，db 续用
`tradesv3-entry-other-forward.sqlite`（历史已平约 27 笔），端口 8082。裁决门槛不变：
≥20 个与 bot1 严格匹配的下单机会后再比 fill rate 与净滑点；因 bot3 非 RiskCap，
组合 PnL 不作单因素晋级依据。

## same_side_limit 机会成本（2026-07-23，hindsight 诊断，不支持加仓数）

### 动机

前向日志中 `entry_blocked reason=same_side_limit` 频繁出现，需要回答：被挡信号在
6h/24h 内是否系统性优于已成交路径，从而支持「加同向仓数 / 槽位策略」。公开突破
体系（组合风险上限、相关仓不叠加、防 overtrading）与已否决的 Cap3 提示：默认应
怀疑加槽，而非默认放行。

### 协议与结果

- **模式**：只读诊断，不改策略/配置/仓位。
- **证据**：bot1 `user_data/logs/freqtrade.log` 中
  `entry_blocked reason=same_side_limit`（07-15 观测增强后）；
  `tradesv3-v5.sqlite` 成交路径；远端 5m feather（诊断前补到 07-23）合并 bot1
  `pair_candles`。
- **机会定义**：同 pair/side 拦截日志间隔 ≤20 分钟并为一簇，取簇首时刻为机会点。
- **路径锚点**：拦截时刻后第一根 5m open；空头 MFE=(entry−low)/entry，
  MAE=(high−entry)/entry。硬止损价距按 2x×5%≈**2.5%**；trailing 激活按约 **2.5%**
  价变动近似。
- **标签**：全部为 **`hindsight_annotation`**，不可当作可部署因果漏信号，不可直接
  回测晋级。
- **脚本 / 归档**：`freqtrade/scripts/same_side_opp_cost.py`；服务器
  `user_data/backtest_results/same-side-opp-cost/`
  （`summary.json`、`blocked_opportunities.json`、`taken_paths.json`）。

| 项 | 数值 |
|---|---:|
| 原始拦截日志 | 109 |
| 去重机会（簇） | 68 |
| 窗口 | 2026-07-15 → 07-23 |
| 拦截原因 | 100% `same_side_limit` |

**被挡机会 hindsight（价格，空头有利为正）**

| 视窗 | 平均 MFE | 平均 MAE | 平均 end_ret | 触及 2.5% 止损价距 | 触及 trail 激活价距 |
|---|---:|---:|---:|---:|---:|
| 6h | +0.70% | 1.68% | **−0.69%** | 20.6% | 2.9% |
| 24h | +1.51% | 2.96% | **−0.97%** | 38.2% | 16.2% |

简化模拟（止损先到记 −2.5%，否则持有到 horizon）：6h 均约 **−0.64%**，24h 均约
**−0.58%**（4 笔路径顺序模糊已剔除）。

**与已成交空单对照（同窗前向，24 笔已平）**

| 群体 | 6h MFE | 24h MFE | 实现/终点 |
|---|---:|---:|---|
| 被挡 68 | 0.70% | 1.51% | 24h end −0.97% |
| 已成交 24 | **1.19%** | **2.54%** | 实现均约 −0.67%（合计约 −8.8 USDT） |

已成交单的 hindsight MFE **高于**被挡单 → 不支持「闸门系统性挡住了更好的单」。

**拥堵结构**

| 占槽状态 | 机会数 |
|---|---:|
| BNB#3 + ETH#14 | **35 / 68（51%）** |
| BNB#3 + ZEC#13 | 8 |
| BTC#26 + SOL#27 | 6 |
| 其它 | 分散 |

BNB#3 持仓约 **230h**（07-08→07-17），主导半个观测窗的同向占槽；已平仓平均持仓
约 **25h**。按日机会：07-16 与 07-17 爆发（17+26），其余日个位数——是时段性挤兑，
不是每日稳定缺槽。

少数 hindsight 极值（如 VANRY 24h MFE +7.6%、EDGE +6.8%）与大量 24h end −4%～−8%
并存；**均值被极值拉扯，中位 6h MFE 仅约 0.50%**，不能外推为 edge。

### 结论

1. **不支持提高同向仓数**。与 07-10 Cap3 离线否决同向；被挡平均路径为负，已成交
   MFE 更高。
2. **结构问题是长持相关仓占满双槽**，不是「2 仓太少漏金矿」。相关组闸门本次几乎未
   单独触发日志，瓶颈在全局 `max_same_side_open_trades=2`。
3. **优化顺序不变**：EntryOther（order→fill）优先；槽位默认维持 ≤2；若再研究，只
   考虑极严的「置换最弱仓」单因素假说（训练+验证双窗、防路径重排），**不重开**已
   否决的时间止损。
4. **局限**：~8 天 / 68 机会 / 24 成交；无费用与限价成交模拟；BNB 超长持仓使窗口
   依赖单笔路径；hindsight 不得写入回测晋级。

### 复现

```bash
# 服务器：补 5m 至当前（若 feather 落后）
cd /data/freqtrade
docker compose run --rm --entrypoint freqtrade freqtrade download-data \
  --exchange binance --trading-mode futures --timeframes 5m \
  --timerange 20260715- \
  --pairs BTC/USDT:USDT ETH/USDT:USDT SOL/USDT:USDT BNB/USDT:USDT \
          XRP/USDT:USDT DOGE/USDT:USDT ADA/USDT:USDT ZEC/USDT:USDT \
          EDGE/USDT:USDT POWER/USDT:USDT VANRY/USDT:USDT UNI/USDT:USDT \
  -c /freqtrade/user_data/config.json

# 跑诊断（读 log + feather + bot1 API，写 summary）
docker run --rm --network host --entrypoint python3 \
  -v /path/to/same_side_opp_cost.py:/tmp/same_side_opp_cost.py:ro \
  -v /data/freqtrade/user_data:/data/freqtrade/user_data \
  freqtradeorg/freqtrade:stable /tmp/same_side_opp_cost.py
# 输出：user_data/backtest_results/same-side-opp-cost/summary.json
```

仓库脚本：`freqtrade/scripts/same_side_opp_cost.py`。

## 被动限价漏单机会成本（2026-07-28，EntryOther 提前结案，维持 same）

### 动机

外部对照（@StepOneAi「量化心得七/九」，经 Grok 对话转述后回原帖核对）指出薄 edge
策略的回测通病是「触价即成交」——默认自己永远排在队首。核对我们的口径后确认此
批评成立且比原描述更强：Freqtrade 回测**入场按 K 线 open 无条件成交**，官方假设
原文为 "Entries happen at open-price unless a custom price logic has been specified"
与 "All orders are filled at the requested price (no slippage) as long as the price
is within the candle's high/low range"，且文档中不存在 timeout / unfilled order
概念；dry-run 同样是 "Limit orders fill once the price reaches the defined level"，
无队列模型。生产用 `price_side=same` 被动挂单，回测因此在入场上乐观两次：既拿
确定性成交，又按入场 maker 计费（`--fee 0.00035` 的构成前提）。

07-17 起以 bot3（`price_side=other`）前向检验该落差，裁决门槛为 ≥20 个严格匹配
下单机会。本次先审计其进度，发现门槛不可达，改以 hindsight 直接回答同一问题。

### 协议与结果

**（一）P1 进度审计（只读）**

| 项 | bot1（same） | bot3（other） |
|---|---|---|
| 空头入场单（07-23 起） | 8，全部 `status=open`（被动待成交） | 8，全部 `status=closed`（下单即成交） |
| 入场成交延迟 | 中位 6.6s / P90 39.8s / 最大 57.0s | 中位 0.3s / P90 0.3s / 最大 0.3s |
| 超时删单 | 0 | 0 |
| 硬止损价格滑点 | n=8，+0.000% | n=6，+0.000%（dry-run，偏乐观） |

**严格匹配机会仅 2 个**（VANRY 07-27 00:40、UNI 07-27 12:15，Δ0s），其余 6+6 笔
因槽位路径分歧落在不同 pair。匹配率 25%，按此速率到 20 个门槛需约 45 天，且两个
arm 都是 dry-run 触价成交，跑满也拿不到真实排队信息。**门槛不可达且不可用。**

**（二）漏单率与口径更正**

bot1 日志（`freqtrade.log.1` + `freqtrade.log`，覆盖 07-07~07-28，21.2 天）：47 笔
空头入场单，4 次零成交超时删单，**漏单率 8.5%**。
（更正：07-17 章节记「累计出现 18 次入场限价超时后整单删除」，该数为**所有 bot
日志之和**——bot1 4、bot2 4、旧 bot3 9、GrokCombined 2 = 19；bot1 自身仅 4 次。）

**（三）漏单 hindsight 路径（`hindsight_annotation`）**

锚点取下单时刻所属 5m K 线 open（即回测假定的成交价，也是跨价差后的近似成交价），
阈值沿用 same_side 诊断：2x 下硬止损/锁盈均按 2.5% 价距。

| 时间 | pair | 方向 | 6h | 24h |
|---|---|---|---|---|
| 07-07 12:05 | BTC | 多 | MFE +1.21% / MAE +1.31% / 末端 +0.88% | 先触止损，末端 -1.90% |
| 07-08 01:55 | AVAX | 空 | 无 feather（已非白名单） | — |
| 07-15 12:30 | POWER | 空 | MFE +2.73%（锁盈激活）/ 末端 +0.26% | 先触止损，MAE +7.20%，末端 -4.75% |
| 07-19 09:20 | ADA | 空 | MFE +0.12% / 末端 -1.09% | MFE +2.49% / 末端 +1.58% |

| 组 | MFE 中位 | MAE 中位 | 末端中位 | 先触止损 |
|---|---:|---:|---:|---:|
| 漏单 h6（n=3） | 1.21% | 1.46% | +0.26% | 0/3 |
| 已成交 h6（n=24） | 0.66% | 1.90% | -0.49% | 8/24 |
| 漏单 h24（n=3） | 2.49% | 2.77% | -1.90% | 2/3 |
| 已成交 h24（n=24） | 1.69% | 2.60% | -0.40% | 12/24 |

已成交单实际结果：n=32，中位收益 +2.22%，胜率 18/32（56%）。

**（四）跨价差成本实测**

两个匹配机会的实际成交价（均为做空）：

| pair | bot1 same | bot3 other | 差 |
|---|---:|---:|---:|
| VANRY | 0.004058 | 0.004057 | 2.5 bp 名义 |
| UNI | 3.840 | 3.839 | 2.6 bp 名义 |

跨价差 ≈ 2.5 bp 名义（1 tick）= 2x 后 5 bp 保证金；加 taker−maker 费差 3 bp 名义
= 6 bp 保证金。**切 `other` 全成本 ≈ 11 bp 保证金/笔，且 100% 的笔数都付。**

### 结论

1. **不支持切换到 `price_side=other`，维持 `same`。** 全部换算到**保证金口径**
   （单笔保证金≈15% 钱包）：成本 11 bp/笔；收益 = 8.5% 漏单率 × 每笔期望
   45 bp（= 34.58%/508 笔 = 6.8 bp 钱包 ÷ 0.15）= 3.8 bp/笔。**成本是收益的
   2.9 倍**，裁决为不切换。
   ⚠️ **该结论对真实漏单率敏感，不稳健**：漏单率升到 25% 时平衡点 44 bp 对上
   实际 45 bp，基本打平。而 dry-run 无队列模型（"Limit orders fill once the price
   reaches the defined level"），8.5% 是漏单率**下界**，真实值只会更高。
   因此**真实漏单率必须列为小资金实盘核验的首要观测项**；若实测显著高于 8.5%，
   本条裁决须重开。
   （本节初稿曾写"差 20 倍以上、结论稳健"，系把保证金口径的 11 bp 与钱包口径的
   5~7 bp 直接相比所致，单位不一致，已按上式更正。）
2. **漏单不是系统性赢家**，逆向选择假说不成立：6h 略优、24h 末端反而更差，n=3
   下差异在噪音内。被文档多次引用的 POWER 07-15 真实路径是先摸 +2.73% 锁盈线、
   24h 内反向打穿 7.2%，成交也只是小赚或平手，不是漏掉的大鱼。
3. **`--fee 0.00035` 的入场 maker 前提成立**，代价是 8.5% 漏单；回测入场乐观度
   显著小于本次核查前的担忧。上实盘的规划数字仍用 PF 1.12~1.16 区间，不上调。
4. **协议偏离须留痕**：P1 在 2/20 匹配机会时提前结案，未达 07-23 plan.md 预注册
   门槛。理由是门槛被证明不可达（匹配率 25%）且两个 arm 同为触价成交、跑满也答
   不了排队问题；同一问题改由 hindsight + 成交价实测回答。**这是提前终止，不是
   门槛通过。**
5. **仍需真钱的部分**：真实队列位置、交易所端 stop-market 真实滑点（dry-run 恒为
   +0.000%，不可能）。但这两项现在只影响精度，不再影响 `same/other` 的方向性决策。
6. 局限：n=3（AVAX 无 feather），其中 BTC 为多头且早于 07-12 空头闸门，贴近现
   生产形态的仅 POWER/ADA 两笔。裁决强度来自 20 倍量级差，不来自样本显著性。

### 复现

```bash
# 本地单测 + 语法
python3 -m unittest discover -s freqtrade/scripts/tests -v
python3 -m py_compile freqtrade/scripts/*.py

# P1 进度与成交率审计（两个 bot 分别跑）
ssh ubuntu@43.164.75.52 python3 - \
  --db /data/freqtrade/user_data/tradesv3-v5.sqlite \
  --log /data/freqtrade/user_data/logs/freqtrade.log \
  --since 2026-07-23T00:00:00Z < freqtrade/scripts/slippage_audit.py

# 漏单 hindsight（容器内跑，宿主无 pandas；默认扫 freqtrade.log.1 + freqtrade.log）
ssh ubuntu@43.164.75.52 'docker exec -i freqtrade python3 -' \
  < freqtrade/scripts/unfilled_entry_opp_cost.py
```

仓库脚本：`freqtrade/scripts/unfilled_entry_opp_cost.py`（含单测
`tests/test_unfilled_entry_opp_cost.py`）。日志轮转会带走历史漏单事件，
`freqtrade.log.1` 必须一并扫描。

## 规模上限与市场冲击（2026-07-28，首次测算，约束在小币）

### 动机

上实盘门槛里唯一从未做过、且不依赖任何前向样本的检查。OHLC 回测对任意手数都按
请求价成交，完全不含市场冲击；@StepOneAi 心得九第 5 点「规模变大后这个偏差会
压过一切」是本项目唯一未被检验的部分。目标不是提高收益，是回答「账户能开到多大
之前冲击还可忽略」。

### 协议

单笔名义占钱包比例由 RiskCap 定仓链推出：

```
margin   = wallet * risk_fraction / max(atr_loss_fraction, hard_stop_fraction)
notional = margin * leverage
```

`atr_loss_fraction ≥ hard_stop_fraction` 恒成立（RiskCap 下限），故最大名义在
下限处取到：`wallet * 0.0075 / 0.05 * 2 = **30% 钱包**`。
**附带发现：`max_stake_wallet_fraction = 0.18` 在 RiskCap 之后恒不绑定**——风险
定仓先在 15% 保证金处封顶。该常量目前是死约束，只有把 `risk_per_trade` 提到
0.009 以上才会重新生效；改风险预算时须一并复核。

参与率锚定：bot1 实测入场成交延迟中位 6.6s / P90 39.8s，即一根 300s K 线的
约 13%。取一根 5m 成交额的 1% ≈ 成交窗口内 10% 参与率，为常规保守上限。
故默认 `--participation 0.01`，同时报 0.5% / 2% 做敏感性。

**口径选择（关键）**：无条件 P10（任意时刻都能进）过于保守——策略只在 Donchian48
突破 + ATR 扩张时入场，那是高量时刻。改用 bot1 **实际入场 K 线**的成交额条件化，
容量提高约 5 倍（POWER 从 69 → 306 USDT）。**以条件化口径为准。**

### 结果

单笔最大名义 = 30% 钱包。参与率 1%，按实际入场 K 线（n=24，07-08~07-22）：

| pair | 笔数 | 入场 bar 最低成交额 | 入场 bar 中位 | 账户上限@1% |
|---|---:|---:|---:|---:|
| POWER | 3 | 9,183 | 39,581 | **306** |
| EDGE | 6 | 13,118 | 85,079 | 437 |
| VANRY | 1 | 30,188 | 30,188 | 1,006 |
| ADA | 1 | 262,653 | 262,653 | 8,755 |
| UNI | 1 | 297,122 | 297,122 | 9,904 |
| BNB | 1 | 1,055,075 | 1,055,075 | 35,169 |
| SOL | 1 | 1,473,279 | 1,473,279 | 49,109 |
| ZEC | 3 | 2,139,360 | 3,487,794 | 71,312 |
| XRP | 2 | 4,170,934 | 6,743,187 | 139,031 |
| DOGE | 1 | 8,319,233 | 8,319,233 | 277,308 |
| BTC | 3 | 22,426,104 | 71,322,001 | 747,537 |
| ETH | 1 | 53,804,804 | 53,804,804 | 1,793,493 |

**约束对 POWER：账户上限 153 / 306 / 612 USDT（参与率 0.5% / 1% / 2%）。**

小币流动性还在数量级漂移，一次测算不能当长期结论：POWER 5m 成交额中位从 2026-02
的 182,644 跌到 07 月的 6,264（**-29 倍**）；VANRY 反向，从 06 月 2,998 涨到 07 月
79,700（**+27 倍**，币安实时 24h 成交额 6,700 万 USDT，而 90 天中位口径只推出 114
万——两个流动性时代被同一个窗口混在了一起）。**首次跑用 90 天窗口得出的「账户上限
37 USDT」是窗口跨制度造成的伪结论，正确口径见上表。**

### 结论

1. **12 对白名单把账户锁死在几百 USDT 量级**（1% 参与率下 306 USDT），约束来自
   POWER / EDGE / VANRY 三个小币，它们比其余九对低 1~3 个数量级。
2. **计划中的小资金实盘执行核验（100~200 USDT）在容量上安全**：200 USDT 钱包单笔
   名义 60 USDT，占 POWER 最差入场 bar 的 0.65%。**规模上限不阻塞下一步。**
3. **容量与 edge 直接冲突，且冲突已被两次实验锁死**：去掉三个小币可把容量提到
   约 8,755 USDT（+29 倍，次约束变 ADA），但 07-23 单独去 EDGE 的双窗口消融已被
   否决（训练段 PF 1.137→1.088、DD 13.01%→18.06%），07-16 LiquidityGate 成交额
   门槛三档也在训练段否决（门槛连带砍掉小币赢家）。**扛 edge 的对恰好是限制容量
   的对**，这是典型的小市值 alpha 容量问题，目前无解，属战略取舍而非可调参数。
4. **本次只约束入场限价单**。交易所端 stop-market 一次性吃盘口深度，深度不在
   OHLCV 里；dry-run 记录的 +0.000% 滑点是假的。这仍然只能靠实单或订单簿快照测，
   与 07-28 漏单章节结论一致。
5. 局限：条件化样本 n=24，POWER 仅 3 笔、VANRY 仅 1 笔，最低值是单点而非分布。
   容量应作为**滚动复核项**（建议随白名单周度复核一并跑），不是一次性结论。

### 复现

```bash
python3 -m unittest discover -s freqtrade/scripts/tests -v

# 条件化口径（决策用）
ssh ubuntu@43.164.75.52 'docker exec -i freqtrade python3 - --entries' \
  < freqtrade/scripts/liquidity_capacity.py

# 无条件口径（对照；--days 决定窗口，跨流动性制度时会失真）
ssh ubuntu@43.164.75.52 'docker exec -i freqtrade python3 - --days 30' \
  < freqtrade/scripts/liquidity_capacity.py
```

仓库脚本：`freqtrade/scripts/liquidity_capacity.py`（含单测
`tests/test_liquidity_capacity.py`）。

## same_side 两周链路复核与最弱仓置换 shadow（2026-08-03，生产仅观测）

### 决策与证据

滚动窗口 `2026-07-20 10:22 ~ 2026-08-03 10:22 UTC` 对 bot1
`VolatilityBreakoutRiskCap` 的生产日志、`tradesv3-v5.sqlite` 交易/订单链与后续价格
路径做了复核。321 条原始 `same_side_limit` 日志按 pair/side、20 分钟间隔聚为 176 个
信号簇；159 个有完整 24h 路径，其中 45 个先达到 2x 下移动止盈激活对应的 2.5% 价距，
42 个先达到硬止损对应的 2.5% 价距，72 个均未达到。按同币 24h 非重叠去重后为
24 个潜在锁盈窗口、29 个潜在止损窗口。24h 末端方向收益均值 -0.05%、中位 -0.13%。

同期 22 个真实入场订单全部成交；日志未发现零成交超时删单，成交延迟中位 7.7s、
最大 402.4s。因此最早分歧确认在 `strategy signal -> same_side_limit`，不是订单提交或
成交层。上述后续路径是 `hindsight_annotation`，不能视为真实可成交收益；结论仍是
**不把同向上限从 2 放到 3**。

### 生产观测增强

版本升为 `5.4.1-d48-riskcap-observe`，信号、定仓、止损、退出、protections 与
`max_same_side_open_trades=2` 均不变。每条限频后的 `entry_blocked` 新增：

- 候选已分析 K 线：close、Donchian 边界、绝对突破距离、`breakout_atr`、ADX、ATR；
- 占槽仓：持仓小时数、当前 mark、当前收益率、
  `current_R = current_profit_ratio / abs(initial_stoploss)`；
- `replacement_shadow`：冻结的置换资格、原因与当前 R 最低的占槽仓。

快照异常时 shadow fail-closed 为不合格；异常不得改变原有限仓返回值。旧字段
`occupied=PAIR#id,...` 保持不变，现有机会成本脚本可继续解析。

### 单因素假设卡

```text
Hypothesis ID: same-side-replace-weakest-v1
Observed repeated pattern: 限仓同时挡到延续与反向行情，先到先占槽缺少候选质量排序。
First divergent stage: risk gate / portfolio slot allocation。
Causal formula: 候选 breakout_atr>=0.10 且 ADX>=30；占槽仓 current_R 最低者<=0。
Eligible timestamp: confirm_trade_entry 收到候选时，只用当时 analyzed candle 与持仓状态。
Baseline: 同方向第 3 个候选一律拒绝，最多 2 仓。
Single changed factor: 仅把合格候选与 current_R 最低仓做一换一；仍最多 2 仓。
Expected benefit: 减少弱仓长期占槽造成的强突破机会成本。
Failure mode: 过早兑现浮亏、增加换手和手续费、候选突破随后失败。
Training: 2026-01-01~05-01，12 对、5m、2x、1000U、fee 0.00035、protections、cache none。
Held-out validation: 2026-05-01~07-10，同一配置且不得重新调阈值。
Pass gate: 两段净收益/PF 均高于 RiskCap 基准，DD 不恶化，交易数不低于基准 70%。
Reject gate: 任一段 PF 不升、DD 恶化或增量被手续费吃掉即否决。
Forward requirement: 离线通过后先独立 dry-run；生产 shadow 本身不构成晋级证据。
```

### 部署边界与复现

本次远端只运行 shadow：即使日志显示 `eligible=true`，仍拒绝候选、不退出占槽仓、不加
第三仓。先积累非重叠 shadow 事件及完整退出路径，再实现真正的一换一回测变体；在双窗
门槛通过前，不将跨交易强制退出逻辑放入生产。

```bash
python3 -m unittest \
  freqtrade/scripts/tests/test_entry_block_observability.py \
  freqtrade/scripts/tests/test_same_side_replacement_shadow.py -v

python3 freqtrade/scripts/same_side_replacement_shadow.py \
  /data/freqtrade/user_data/logs/freqtrade.log.1 \
  /data/freqtrade/user_data/logs/freqtrade.log \
  --since 2026-08-03T00:00:00Z
```
