SolIntradayOpeningRangeBreakout
Hypotheses
SOL USD-M Intraday Opening-Range Breakout, Long-Short (BINANCE Perp, 15m Bars, Trade the Session-Open Range Break at 00:00 UTC with Structural Range Stop and Same-Session Time Exit — Directional Continuation, Not Reversion, 3-Parameter)
Hypotheses
A LONG-SHORT, single-instrument intraday opening-range-breakout (ORB) strategy on SOLUSDT.BINANCE (USD-M perpetual, 15-minute bars). Each UTC day, the strategy defines an 'opening range' from the high/low of the first N 15m bars after 00:00 UTC (the daily funding-settlement / Asia-session boundary), then trades the FIRST clean break of that range in either direction and rides the continuation to session end. This is deliberately the OPPOSITE mechanism from the mean-reversion strategies that keep dying in this factory (XRP RSI(2), BNB Bollinger reversion, VWAP fades) — it BUYS strength and SELLS weakness rather than fading extremes — and it is horizon/direction-diverse from the long-only daily baskets that dominate the portfolio (85% long-only, 71% BINANCE-futures, only 5.4% short-horizon). It avoids every recent graveyard: no funding-level signal (L13), no liquidation feed (L3), no options (L23), no cross-sectional basket (L12), no cross-venue carry (L1), no Hyperliquid (L11), no 200-SMA regime timing. Only 3 parameters to keep overfitting risk (the #1 killer, 202x) low. Routed to BINANCE despite over-representation because short-horizon validation needs multi-year sub-hourly history, which Hyperliquid cannot provide (~2.5 weeks at 15m) and Bybit/Deribit have no catalogued SOL perp bars in our infra; the direction+horizon diversity this fills outweighs the venue count.
Hypotheses
Iteration 5 addresses the backtest gate (equity curve -74.91%, incoherent with the mtm-derived Sharpe) with one targeted execution fix. The previous code detected the structural stop/target intra-bar (bar low/high) but exited with a MARKET order at the bar CLOSE: on 15m SOL bars every loss was realized WORSE than the ~1% structural stop, and every target touch that reverted intra-bar was cashed out at the reverted close. With a designed 2.9:1 reward:risk that asymmetric slippage is enough on its own to invert the expectancy of a continuation edge. Entries are now venue-managed brackets (use_bracket_orders) whose STOP_MARKET and LIMIT legs fire at the actual levels; the stop/target remain STRUCTURAL (stop_frac x opening range, tp_mult x opening range) by converting each trade's distances into stop_loss_pct/take_profit_pct in should_enter(), which the base template reads when it submits the bracket. should_exit() now handles ONLY the signal exit (same-session time stop) so nothing double-exits. Signal logic, one-trade-per-day locking, the min_range_pct fee gate and the path-independent sizing that already cleared Layers 1-3 are untouched. Honest note: if intra-bar exit execution does not lift expectancy above the ~0.10% round-trip fee, the ORB continuation premise on SOL 15m is falsified and the run should be abandoned rather than re-tuned.
Hypotheses
Negative expectancy on a reliable 1139-trade / 6-year sample: avg_trade_return_pct -0.115% (below ZERO, far under the 0.15% Binance USD-M fee floor), profit_factor 0.759, expectancy -$68.95/trade, total_return -77.2%, Sharpe -0.55 (CI [-1.39,0.27]). The trades correctly implement the hypothesis (first clean break in either direction, balanced 585 long / 554 short, ride the continuation), so this is a fair test of the ORB-continuation premise on SOL 15m — and the premise is falsified: the strategy loses in EVERY vol regime (calm -32%, normal -36%, stressed -100%) and EVERY calendar year (2020-2026). Commission is only 9% of gross, so this is NOT fee-fragility — the break-continuation signal is gross-negative (win rate 0.26 with avg_win/avg_loss ~2.15 still nets negative because breaks revert far more than they follow through; skew -6.7). The 3 optimizable parameters cannot invert a PF-0.759, below-zero-expectancy signal — there is no positive gross edge to tune toward. This is iteration 5 of the same mechanism still producing a wipeout equity curve. Not worth 2 hours of optimization. abandon_class=negative_expectancy.
Implementation
SOLUSDT.BINANCE USD-M perp, 15-minute bars, long-short intraday opening-range breakout. The opening range is the high/low of the first 4 bars after 00:00 UTC; the first clean break beyond range_high*(1+buffer) goes long and beyond range_low*(1-buffer) goes short, once per UTC day, only when the opening range is at least min_range_pct wide (fee gate). Risk is structural: a stop at stop_frac x range and a target at tp_mult x range, now placed as venue-managed bracket legs so they execute INTRA-BAR at their price levels, plus a same-session time exit at 23:30 UTC (no overnight carry). Position notional is a fixed fraction of reference capital, de-risked downward only.
Verification Results
Either fix the peripheral params (breakout_buffer, min_range_pct, position_frac, exit_cutoff_min) to sensible constants and expose only the 3 the hypothesis names (e.g. range_bars, stop_frac, tp_mult), or update the hypothesis text to reflect the true tunable count. Watch IS/OOS ratio closely in optimization.
Verification Results
The hypothesis explicitly claims 'Only 3 parameters to keep overfitting risk low', but the code exposes 7 optimizable parameters in parameters['_param_bounds'] (tp_mult, stop_frac, range_bars, min_range_pct, position_frac, breakout_buffer, exit_cutoff_min). The core ORB structure is faithfully implemented, so this is not a mechanism mismatch, but the overfitting-risk argument the hypothesis leans on is weakened. The optimizer will search a 7-dimensional space, not 3.
Verification Results
Risk is low here — calculate_signal already gates entries on _range_ready (which requires range_bars bars accumulated in-session) independently of min_bars_required, so a bypassed override cannot produce a premature entry. Confirm the base honors the override or leave the internal gate as the guarantee.
Verification Results
min_bars_required(self) overrides a framework method (static-analysis base_shadow warning). If the base template ignores the override for warm-up gating, the opening-range warm-up may not be enforced before the first entry evaluation.
Verification Results
Sandbox smoke test (31 trades, 208 days) shows negative expectancy: avg_trade_return_pct -0.097% (below the ~0.10% futures round-trip fee), profit_factor 0.73, Sharpe -1.42 (CI [-4.14, 1.09]), total_return -1.96%. The designed structure is fee-viable (min_range_pct 1.4% gate, tp_mult 1.75x range, stop_frac 0.6x range → targets/stops far exceed fees), so this is unoptimized-draw territory rather than a broken mechanism — but the ORB-continuation edge on SOL 15m is unproven. The analyst should confirm on full history that intra-bar bracket execution lifts realized per-trade return above the fee floor; the developer's own note concedes abandonment if it does not. Long_win_rate (0.25) notably weaker than short_win_rate (0.40) — worth checking directional symmetry in the full backtest.
Backtest Review
Well-formed, direction-diverse mechanism (585 long / 554 short) that fairly implements the stated ORB-continuation hypothesis with a large 1139-trade / 6-year sample
Backtest Review
Structural stop/target far exceed fees by design, so this is a genuine test of the edge, not a fee-fragility artifact per se
Backtest Review
Commission is only 9% of gross — the loss is NOT fee-driven, it is the raw signal
Backtest Review
Negative expectancy on a decisive sample: avg_trade_return_pct -0.115% (BELOW ZERO, far under the 0.15% USD-M fee floor), profit_factor 0.759, expectancy -$68.95/trade, total_return -77.2%, Sharpe -0.55 (CI [-1.39, 0.27])
Backtest Review
The premise is falsified in every regime (calm -32%, normal -35%, stressed -100%) and every calendar year (2020 through 2026 all negative) — no window where ORB-continuation works
Backtest Review
Adverse payoff geometry (avg_win 835 vs avg_loss 388 but win rate only 0.26; skew -6.7, kurtosis 242) — continuation reverts against the break far more often than it follows through
Backtest Review
max_drawdown 78.4% with a 2114-day underwater duration; QA's negative-expectancy concern from the smoke test is confirmed on full history
Analysis
Backtest gate:
- metrics unreliable: Incoherent: Sharpe 0.14 disagrees in sign with total_return -74.91% — the Sharpe is computed from the mtm_equity_curve series while the return comes from the equity curve. Judge on the equity curve.
Iteration History
Verification failed (Layer 4 — QA review):
- FEE/EDGE FAILURE (trustworthy, diagnostic backtest). Realized per-trade edge is NEGATIVE: avg_trade_return_pct -0.2617% net, profit_factor 0.77, win_rate 0.33, omega 0.925, tail_ratio 0.49. Over 2131 trades the account bled to -100% and LIQUIDATED (2023-01-25). Commission is 7.77% of gross — the ORB continuation move doesn't clear the ~0.10% round-trip taker cost. breakout_buffer 0.07% is below the 0.15% fee-viability threshold (checklist #7). Classic high-turnover fee-death (L6/L16).
- RISK-CONTROL INCONSISTENCY: leverage 1.0 with a documented notional cap at equity*leverage, yet avg_position_pct 227.70% and full LIQUIDATION. A truly 1x-capped position should not liquidate under normal SOL moves nor average >100% of equity. Either the cap isn't enforced against the engine's actual margin, or risk-based sizing on narrow ranges repeatedly maxes to the cap while the bleeding account shrinks beneath it into liquidation. The stated primary safety failed.
- The code otherwise faithfully implements the hypothesis: opening range from first range_bars 15m bars after 00:00 UTC, first clean break either direction, structural stop at opposite edge, same-session time exit, exactly one trade/day (1071 long + 1060 short = 2131 = data_days), long-short SOLUSDT.BINANCE 15m. Direction/instrument/timeframe/horizon all match. The block is the outcome, not a mismatch.
Iteration History
Verification failed (Layer 4 — QA review):
- THE NOTIONAL CAP IS PROVABLY NOT ENFORCED. This iteration set max_gross_frac=0.35, so position notional at entry is coded to be <= 0.35x equity, yet the backtest reports avg_position_pct 151.74% (~4.3x the intended cap) and the account STILL LIQUIDATED (2025-08-02). A position genuinely bounded at 0.35x equity on a 1x-leverage account cannot average 1.5x equity nor liquidate. This is the SAME defect across three siblings (SOL v1 cap 1.0x->227%, ETH pivots cap 1.0x->497%, SOL v2 cap 0.35x->151%), and tightening the cap did not reduce realized exposure proportionally — position_size() is not translating into actual engine exposure (likely get_account_equity base, venue default_leverage multiplying size, or exits not flattening before re-entry). Until root-caused in isolation, no backtest from this family is trustworthy.
- FEE/EDGE FAILURE PERSISTS. Despite the min_range_pct gate, 0.18% buffer, and reward>risk restructure, the strategy is still net-losing: PF 0.79, win_rate 0.30, avg_trade_return_pct -0.0713% (negative, below round-trip cost), omega 0.98, commission 9.69% of gross over 1596 trades, ending -100%. The gate only cut turnover 2131->1596; no positive edge emerged. return_kurtosis 1386 with largest_loss (-1806) ~3.7x avg_loss shows close-based stops being gapped through intrabar on a 15m perp, so the 'tight stop' doesn't bound per-trade loss.
- ORB mechanics remain faithful (opening range from first range_bars 15m bars after 00:00 UTC, first clean break either direction with min_range_pct gate, tight stop + target + same-session time exit, one trade/day = 794 long + 802 short = 1596 = data_days, long-short SOL 15m). Direction/instrument/timeframe/horizon match. The block is the outcome + sizing defect, not a mismatch.
Iteration History
Verification failed (Layer 1 — config): config.instrument_id and config.bar_type are REQUIRED (got instrument_id=None, bar_type=None). Set both to the hypothesis's instrument, e.g. instrument_id='BTCUSDT.BINANCE', bar_type='BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL'.
Iteration History
Verification failed (Layer 4 — QA review):
- FEE/EDGE FAILURE on a now-CLEAN, trustworthy backtest. With sizing fixed, metrics are diagnostic (annualized_volatility 15.85%, avg_position_pct 35.86%, liquidated=False, metrics_reliable) — and the trustworthy result proves the ORB-continuation edge is NEGATIVE: total_return -74.77%, Sharpe -2.15 (PSR 0.00, CI [-3.18,-1.18] entirely negative), PF 0.77, win_rate 0.28, omega 0.71, CAGR -21.06%. avg_trade_return_pct -0.0855% (negative, below round-trip cost), commission 9.34% of gross over 1199 trades. The min_range_pct gate, wider buffer, and R:R (stop_frac 0.6 / tp_mult 1.75) did not create a positive edge — a 28% win rate is too low for 1.75x reward; breakouts fail-and-reverse more than they continue. Definitive fee/edge verdict (L6/L16): no ORB edge on SOL 15m net of fees.
- CREDIT / RESOLVED: path-independent fixed-notional sizing (notional = min(base_capital, live_equity) * position_frac) fixed the sizing-not-enforced defect. avg_position_pct now bounded 35.86% (vs 227% at iter-1), liquidated=False, annualized_volatility 324%->15.85% — confirming the root cause was anchoring size on a mis-reported/leverage-inflated get_account_equity(). Intrabar low/high stop/target also correct (kurtosis 1386->6.8). Validated fixes, not the reason for the fail.
- ORB mechanics remain faithful (opening range from first range_bars 15m bars after 00:00 UTC, first clean break either direction with min_range_pct gate, defined stop/target + same-session time exit, one trade/day = 611 long + 588 short = 1199 = data_days, long-short SOL 15m). Alignment matches; the block is the negative edge.
Backtest and paper results are hypothetical. Trading involves risk of loss.