← Back to Reviews

20260114_134206_vol_control_atr_filter.md

# AI Review: vol_control_atr_filter (1-Minute) **Date:** Wed Jan 14 13:42:06 CET 2026 **Strategy File:** /root/trade_1m/strategies_rejected/vol_control_atr_filter.py --- ```json { "score": 35, "flags": [ "cost_sensitive", "execution", "inconsistent", "overfitting" ], "review": "## Critical Issues\n\n### 1. Same-Bar Entry/Exit Logic (Execution Risk)\n\nThe strategy detects range touches and enters **on the same bar** where `current_low <= range_low + tolerance`. At 1-minute resolution, this is unrealistic:\n\n```python\nif current_low <= range_low + tolerance and current_close > range_low:\n # Opens position immediately using current_close\n```\n\n**Problem**: You're checking if the low touched the range boundary AND the close bounced higher, then entering at the close price of that same candle. In live execution:\n- By the time you detect the touch + bounce, the bar is closed\n- Next bar's open may gap away from your assumed entry price\n- The \"bounce\" might not continue next bar\n\nThis creates **optimistic backtest fills** that won't occur in live trading. The strategy needs +1 bar delay for realistic execution.\n\n### 2. Extreme Cost Sensitivity\n\nWith 176-178 trades in early periods and declining to 148-161 later:\n- **Total cost at 0.1% round-trip**: ~17.6% to 17.8% on highest trade counts\n- **Strategy return**: 7.62% total\n- **After costs**: Deeply negative (-10% to -11%)\n\nThe validation period shows -0.56% before realistic costs. This edge is too thin for 1-minute execution.\n\n### 3. Inconsistent Performance Pattern\n\nMonthly returns show erratic behavior:\n- Early periods (2020-2022): +2.8%, +3.2%, +0.5%\n- Mid period (2023): **-1.8%** (negative)\n- Late periods: +1.0%, +1.9%\n\nThe sharp negative drawdown in one period followed by recovery suggests the strategy may be **regime-dependent**. The overall Sharpe of 0.44 masks this instability. Validation Sharpe of -1.41 confirms this doesn't generalize.\n\n### 4. Parameter Specificity (Overfitting Signals)\n\nSeveral parameters raise concerns:\n- `range_period: 60` - exactly 1 hour, reasonable\n- `atr_lookback: 120` - exactly 2 hours, reasonable\n- `min_bars_between: 2880` - exactly 48 hours (very specific)\n- `vol_entry_max: 0.0` - precise zero threshold\n- `vol_spike_disable: 2.0` - round number (good)\n- `vol_exit_high: 1.5` - round number (good)\n\nThe **48-hour cooldown** (2880 bars) is suspiciously specific and severely limits trade frequency. This feels optimized to avoid certain losing trade clusters rather than derived from theory.\n\n### 5. Range Detection Logic Weakness\n\nThe strategy uses `highest(highs, 60)` and `lowest(lows, 60)` for range boundaries, but:\n- No validation that a **range actually exists** (could be trending)\n- No minimum range width check (tight ranges → whipsaws)\n- 2% tolerance for \"touching\" is arbitrary\n- Assumes low vol = range, but low vol can also occur in directional grinds\n\n### 6. Stop Loss Ineffectiveness\n\nThe 0.15% stop loss is extremely tight (1.5 bps on BTC price), but:\n- At 1-minute bars, normal bid-ask bounce can trigger stops\n- With slippage, a 0.15% stop becomes ~0.20% realized loss\n- The strategy exits after 10 bars anyway (max hold)\n- Stop is more likely to get hit by noise than protect capital\n\n## What This Strategy Gets Right\n\n1. **Vol spike disable** (ATR z > 2) is excellent - hard stops during volatility regime shifts\n2. **Time-based exits** (10 bars) prevent runaway losses\n3. **Vol exit** (ATR z > 1.5) is smart for exiting before regime change\n4. **Round number parameters** for vol thresholds show good design\n\n## Why The Edge Fails\n\nThe core hypothesis is: \"Low vol = range = mean reversion opportunity.\"\n\n**But**:\n- The entry logic assumes you can **reactively** catch range bounces at 1-minute scale\n- By the time you see \"touched low and closed higher,\" the bounce is mostly over\n- The 10-bar holding period is correct for microstructure, but entry timing is too late\n- 48-hour cooldown suggests the strategy knows it needs to be very selective, but this creates **sparse, fragile** edge\n\n## Microstructure Reality Check\n\n1-minute range reversion strategies need:\n- **Anticipatory entries** (approach boundaries, not reaction to touches)\n- **Sub-tick execution** (maker fills at boundaries, not taker fills after bounce)\n- **Higher frequency** (dozens of small trades, not 150-180 large cooldown trades)\n\nThis strategy has the structure backwards: it waits for confirmation (bounce) then enters, when it should enter **into** the boundary touch with tight risk.\n\n## Cost Death Spiral\n\nAt 176 trades:\n- Gross return: 7.62%\n- Cost (0.1% RT): 17.6%\n- **Net: -10%**\n\nEven with perfect execution (no delay), this strategy cannot survive realistic 1-minute costs. The average trade of ~0.04% gross is **smaller than slippage**.\n\n## Validation Failure Analysis\n\nValidation Sharpe of -1.41 (vs training Sharpe 0.44) indicates:\n- Parameters are optimized to training period\n- The 48-hour cooldown likely avoids specific bad periods in training\n- Low vol regime didn't persist in validation period\n- Range detection doesn't adapt to changing market structure\n\n## Verdict\n\nThis strategy has **conceptually sound elements** (vol filtering, quick exits, regime awareness) but fails on:\n1. **Execution realism** - same-bar entry on detected bounces\n2. **Cost structure** - edge too small for trade frequency\n3. **Generalization** - works in specific training regimes, fails validation\n4. **Parameter brittleness** - 48-hour cooldown is a red flag\n\nThe score of 35/100 reflects: reasonable concept, poor execution model, fatal cost sensitivity.", "rule_suggestion": "Range reversion strategies must specify whether entries occur at boundary approach (anticipatory) or after bounce confirmation (reactive). If reactive, require +1 bar execution delay. Prohibit same-bar entries when entry logic checks both boundary touch AND price bounce within a single bar. Additionally, strategies with trade cooldowns exceeding 24 hours must justify the cooldown period with theoretical reasoning, not just performance optimization." } ```