_meta: id: 29 name: "ORB Gainers V24 LossCap" description: > [DOCUMENTED FAILURE — NOT PROMOTED] V23 → V24 via single change: single_trade_loss_cap_pct=0.05 Result: +92.6% (200d), WR 58.0%, Sharpe 3.00, DD -9.0% — return -55.5pp vs V23. Also tested cap=0.10 (-33pp) and streak_max=2.0 (-36pp). All failed. Root cause: streak sizing amplifies wins AND losses symmetrically. Capping losses also caps wins proportionally → unavoidable trade-off. V23 HIMS -4.63% loss is a designed -1R at streak×2.4 — not a fixable bug. Original hypothesis: streak_sizing_max=2.5 creates structural misalignment where a single -1R trade can consume 2.5× daily_max_loss_pct worth of capital (e.g. 2.4× streak → $1,200 loss on $10k initial, while daily_max_loss_pct=0.05 intent is $500 max). Fix: after all sizing boosts (governor + streak + rolling WR), clamp sizing_capital so that risk_per_trade_pct × sizing_capital ≤ single_trade_loss_cap_pct × initial_capital. With risk_per_trade_pct=0.05 and cap=0.05: max sizing = $10,000 = initial_capital. Example (2026-04-17 HIMS): Without cap: streak 2.4× → sizing $24k → risk $1,200 → loss -4.63% of portfolio With cap: sizing clamped to $10k → risk $500 → loss ~-1.92% of portfolio Trade-off: streak bonus is capped for loss protection, but also for wins (smaller positions on winning streaks). Net effect on WR and return is the test hypothesis. Validation: V23 200d TRUE BASELINE: +109.32%, WR 58.1%, DD -12.91%, Sharpe 3.01, 160 trades Gates (200d): return ≥ +104%, single max loss ≤ $500, 2026-04-17 daily ≤ -2.5% Gates (400d): return ≥ +88%, WR ≥ 52%, DD ≤ -24% strategy_mode: orb orb_strategy: engine_family: gainers_leader live_readiness: live_ready orb_minutes: 5 sim_bar_minutes: 5 entry_direction: long_only order_timeout_minutes: 45 allow_doji_breakout: true allow_red_to_green_breakout: true min_price: 10.0 min_avg_dollar_volume: 25000000 min_atr_14: 0.50 min_atr_pct: 0.04 min_rvol: 1.5 min_abs_gap_pct: 0.02 min_premarket_dollar_vol: 1500000 max_candidates: 20 max_candidates_per_sector: 3 min_candidates_to_trade: 1 ticker_cooldown_days: 0 max_gap_pct: 0.04 min_candidate_breadth: 0.60 market_regime_spy_threshold: 0.0015 market_regime_ticker: QQQ rolling_loss_days: 7 rolling_loss_threshold: -0.07 max_simultaneous_entries: 3 min_breakout_rel_vol: 1.2 weight_rvol: 0.35 weight_gap: 0.20 weight_dollar_vol: 0.05 weight_premarket_dollar_vol: 0.25 weight_body_ratio: 0.0 weight_momentum: 0.15 atr_stop_multiplier: 0.75 breakeven_at_r: 1.0 trailing_at_r: 1.0 trailing_stop_atr_multiplier: 0.8 trailing_tighten_at_r: 2.0 trailing_stop_atr_multiplier_tight: 0.3 partial_exit_at_r: 99.0 partial_exit_pct: 0.50 risk_per_trade_pct: 0.05 max_position_pct: 0.70 daily_max_loss_pct: 0.05 max_stops_per_day: 5 exit_minutes_before_close: 5 # === CHANGE: cap single-trade loss at 5% of initial_capital (= $500 on $10k) === # Prevents streak boost from amplifying -1R losses beyond daily_max_loss intent. single_trade_loss_cap_pct: 0.05 slippage_bps: 5.0 initial_capital: 10000 compound_returns: false daily_budget_reset: true settlement_days: 1 drawdown_governor_threshold: 0.025 drawdown_governor_min_scale: 0.30 streak_sizing_win_bonus: 0.70 streak_sizing_max: 2.5 universe: source: midlarge backtest: start_date: null end_date: null lookback_trading_days: 200 cache: enabled: true dir: data/cache/intraday output: dir: runs/intraday_orb verbose: false