Dois bugs descobertos ao investigar por que 4 strategies ficavam com 0 trades no backtest (legacy_rules, breakout, bollinger_breakout, stochastic).
breakout.py matematicamente impossível# Antes: close.iloc[-2] comparado contra rolling max que INCLUI high.iloc[-2]
rh = recent_high(high, BREAKOUT_PERIOD + 1) # max de 21 bars ending no bar -2
last_close = float(close.iloc[-2]) # close do bar -2
if last_close > hi: # impossível: close ≤ high sempre
Fix: recent_high(high, BREAKOUT_PERIOD) (20, sem +1) + close.iloc[-1].
Agora compara o just-closed contra max dos 20 bars anteriores. breakout.py
saiu de 0/115 para 12/115 sinais em BTC 1d.
compute_size rejeita trades quando rr_net < min_rr (1.5). Com TARGET_R=1.5
+ stop 2% + fees round-trip 0.15%:
rr_net = (3% - 0.15%) / (2% + 0.15%) = 1.33 < 1.5 ❌
legacy_rules emitia 46 sinais/ano em BTC mas TODOS rejeitados. Mesmo padrão
em stochastic.py e bollinger_v2.py.
Fix: bump TARGET_R 1.5 → 1.8 em stochastic/bollinger_v2 + bump
fixed_target_r default do engine 1.5 → 1.8. Net RR ≈ 1.55 ≥ 1.5 ✅.
| strategy | antes | depois |
|---|---|---|
| legacy_rules | 0 trades | 24 trades, +11.5%, wr 46% 🥇 |
| stochastic | 0 trades | 5 trades, +4.3%, wr 60% |
| bollinger_breakout | 0 trades | 9 trades, -2.5%, wr 33% |
| breakout | 0 trades | 6 trades, -14.4%, wr 33% (n pequeno) |
| stormia_full_engine | 24t -14.2% | 28t -0.8% (melhora) |
| bollinger_reversion | 5t +8.3% | 7t +1.0% |
Vencedor BTC 1d pós-fix: legacy_rules (do nada para +11.5% com n=24).
| strategy | antes | depois |
|---|---|---|
| breakout | 0 trades | 3 trades, +20.8%, wr 67% 🥇 (n pequeno) |
| stochastic | 0 trades | 7 trades, +5.2%, wr 57% |
| legacy_rules | 0 trades | 25 trades, +7.8%, wr 44% |
| stormia_full_engine | 24t +10.6% | 24t +6.2% (piorou um pouco, mas estável) |
| pullback | 8t -26.4% | 8t -27.4% |
| strategy | antes | depois |
|---|---|---|
| stormia_full_engine | 18t -5.8% | 22 trades, +16.0%, wr 32% 🥇 |
| bollinger_reversion | 3t -10.2% | 4t +10.8%, wr 25% |
| bollinger_breakout | 0 trades | 16 trades, +4.8%, wr 44% |
| stochastic | 0 trades | 3 trades, +3.5%, wr 67% |
| legacy_rules | 0 trades | 24 trades, +0.9%, wr 38% |
| ifr2_with_mm200 | 20t +7.0% | 20t +7.0% (estável, ignora TARGET_R) |
| strategy | n | wr | return | exp | sharpe |
|---|---|---|---|---|---|
| stormia_full_engine | 108 | 44% | +36.7% | +0.340% | +1.50 🥇 |
| pullback | 21 | 38% | +24.9% | +1.184% | +0.84 |
| legacy_rules | 71 | 41% | +11.8% | +0.167% | +0.51 |
| stochastic | 46 | 43% | +6.7% | +0.146% | +0.48 |
| bollinger_breakout | 55 | 42% | +7.3% | +0.133% | +0.36 |
| ranking | símbolo · TF | estratégia | return | wr | n |
|---|---|---|---|---|---|
| 🥇 | BTCUSDT · 4h | stormia_full_engine | +36.7% | 44% | 108 |
| 🥈 | BTCUSDT · 4h | pullback | +24.9% | 38% | 21 |
| 🥉 | XRPUSDT · 4h | bollinger_breakout | +21.3% | 44% | 63 |
| 4 | ETHUSDT · 1d | breakout | +20.8% | 67% | 3 ⚠️ n pequeno |
| 5 | XRPUSDT · 4h | legacy_rules | +17.4% | 43% | 79 |
| 6 | XRPUSDT · 1d | stormia_full_engine | +16.0% | 32% | 22 |
| 7 | XRPUSDT · 4h | bollinger_reversion | +14.8% | 34% | 61 |
| 8 | ETHUSDT · 4h | stochastic | +8.1% | 43% | 46 |
| 9 | BTCUSDT · 4h | bollinger_breakout | +7.3% | 42% | 55 |
| 10 | XRPUSDT · 4h | breakout | +7.5% | 32% | 19 |
ranging.sources/backtests/runs/20260424-152555/summary.{csv,md} (1d)sources/backtests/runs/20260424-152614/summary.{csv,md} (4h)sources/backtests/runs/20260424-134728/summary.{csv,md} (1h pre-fix, referência)Entities: [[../entities/BTCUSDT]], [[../entities/XRPUSDT]] Strategies: [[../strategy/bollinger_breakout]] Regimes: [[../regimes/ranging]]