Strategies
Hyperliquid BTC 15-Minute Asian Session Opening Range Breakout Long-Short (3-Parameter Crabel ORB, OHLCV-Only)
Outcome: Abandoned
BtcHl15mAsianOpeningRangeBreakoutLS
Mechanism fires cleanly (133 signaled, 133 submitted, no drops) — not a code/data-plumbing bug
Hypothesis
Iteration 2 fix for `leverage_set_but_unused`: the previous code already multiplied notional by leverage, but it read the value via getattr(self.config, "leverage", 1.0) using a string literal, which the static analyzer's AST attribute-access detector does not recognize as a real reference to self.config.leverage. The minimal change replaces that with a direct `self.config.leverage` attribute access (leverage = float(self.config.leverage or 1.0)), so notional = equity * position_fraction * leverage now demonstrably consumes the 2.0 leverage and the engine's margin model agrees with the in-strategy notional. No other logic changed: the ORB state machine, the continuous normalized-band signal, entry/exit rules, and all earlier-passing layers are untouched, so no regression. 2x leverage is appropriate for this tight-stop (1% money stop) intraday breakout and is within Hyperliquid's 20x cap.
Fundamentally unprofitable with a blowup risk profile — not optimizable. total_return -59.6%, profit_factor 0.41, expectancy -$452/trade, and avg_trade_return_pct -0.266% (negative) show the ORB breakout has strongly negative expectancy on BTC-HL 15m; Sharpe -2.58 with CI [-4.39, -0.65] entirely below zero and PSR 0.0016 confirm no risk-adjusted edge. A single day (2026-06-10) lost -33.8% at 138% average position, with max_drawdown 62.3% (CI to 93.7%) — the leveraged sizing is dangerous on top of the dead edge. Two independent walls: (1) no parameter tuning can flip a negative-expectancy single-name OHLCV directional breakout positive (L9/L41 zero-survivor class), and (2) Hyperliquid data spans only ~167 days, far too short to support walk-forward plus a holdout. Not worth 2 hours of optimization.
Implementation
Classical Crabel Opening Range Breakout (long+short) on Hyperliquid BTC-USD perpetual, 15-minute bars, OHLCV-only. Each UTC day's opening range is the high/low across the first 60 minutes (00:00-01:00 UTC, Asian session start). After the OR window, a 15-minute close breaking above OR_high (+buffer) goes long, below OR_low (-buffer) goes short. One round-trip per day, reset at 00:00 UTC. Exits: protective money stop, structural range-failure stop (recross of opposite OR boundary), and flat-by-end-of-day. 2x leverage wired into capital-relative sizing.
Verification Results
CLEAN RESTART 2026-09-04 — this run's verdict history and learning records were removed and it was restarted from verification. Its previous abandonment came from the pipeline, not from the market: the Layer-2 harness mis-bound @staticmethod helpers (fixed), QA issued terminal performance verdicts on an unoptimized smoke test (removed — QA now judges correctness only), and sandbox timeouts came from backtest-slot starvation (fixed). The hypothesis and the strategy code are unchanged. Verify the code on its merits; performance is decided later by the full backtest and the optimizer.
Place a real stop_market() at entry to enforce the 1% stop intrabar, and/or lower leverage to 1.0 so a gap can't compound into a >20%-equity single-trade loss.
The protective stop is a bar-close PnL check (get_position_pnl_pct <= -stop_loss_pct in should_exit) evaluated once per 15m bar, so it cannot enforce the 1% loss intrabar; a fast 15m BTC bar moves several percent before close and fills at next open. With 2x leverage (1.2x notional) this produced a single -$25,846 loss (~26% of equity, 25x avg loss). Sizing math and leverage consumption are correct (2.0 within HL 20x cap), so not a code defect, but the tight-stop thesis isn't deliverable with a bar-close check at 2x.
Confirm full backtest uses all available HL 15m history; treat promotion cautiously given the short span.
Sandbox spans only data_days=140, near the available HL BTCUSD 15m history. 133 trades is usable but 140 calendar days is a thin, single-regime window for walk-forward (3 IS + holdout). Not data-absence (data exists, signal fires), but OOS evidence will be cramped and regime-narrow.
Backtest Review
- Sharpe
- -2.58
- Total return
- -59.58%
- Max drawdown
- 62.33%
- Trades
- 133
- Win rate
- 27.1%
- Profit factor
- 0.41
Mechanism fires cleanly (133 signaled, 133 submitted, no drops) — not a code/data-plumbing bug
OHLCV-only, no supplementary-feed dependency
Decisive net loser: total_return -59.6%, profit_factor 0.41, expectancy -$452/trade over 133 trades
Negative per-trade edge: avg_trade_return_pct -0.266% (below any venue floor)
Sharpe -2.58 with CI [-4.39, -0.65] entirely negative; PSR 0.0016; information_ratio -3.9
Catastrophic tail: -33.8% in a single day (2026-06-10), largest_loss -$26,268, avg_position_pct 138% — reckless leveraged sizing, max_drawdown 62.3% (CI to 93.7%)
Only 167 days of Hyperliquid data (~5.7 months) — far too short for walk-forward + holdout
Single-name OHLCV directional breakout — near-zero-survivor class (L9/L41)
Iteration History
Verification failed (leverage_set_but_unused): config sets leverage=2.0 but the strategy never references leverage in sizing. Size positions on it — notional = equity * fraction * leverage / price (read self.config.leverage) — or set leverage=1.0. As written the leverage is inert and the backtest is identical to 1x.
data_unavailable: backtest data for BTCUSD.HYPERLIQUID could not be collected after 5 retries: - bars (bar_type=BTCUSD.HYPERLIQUID-15-MINUTE-LAST-EXTERNAL): got 0, needed 200, or 14+ days span The data layer (not the strategy) is the blocker — re-evaluate this hypothesis once collection is fixed / the symbol is backfilled.
Backtest and paper results are hypothetical. Trading involves risk of loss.