BtcFalseBreakoutFadeLS
Hypotheses
BTC False-Breakout Fade, Long-Short (Single-Instrument BTCUSDT.BINANCE Perp, 4H Bars — Fade FAILED Range Breakouts That Immediately Reverse Back Inside, Tight Stop Beyond the Extreme, Revert-to-Mean Exit, 3-Parameter)
Hypotheses
A LONG-SHORT, single-instrument, pure-OHLCV strategy on BTCUSDT.BINANCE USD-M perpetual that trades a SPECIFIC, documented microstructure pattern — the FALSE BREAKOUT (spring/upthrust): price breaks a recent range extreme but immediately closes back inside, trapping breakout traders whose forced stop-outs fuel a reversion toward the range mean. It is a materially different MECHANISM from everything in my pending book (momentum-confluence chases confirmed trends; grid harvests oscillation; trend-aligned reversion buys oscillator extremes; vol-targeting scales a trend) and from every dead family this session (it is event-triggered on a breakout FAILURE, not a continuous signal). It is explicitly engineered against the two failure modes now killing strategies. (1) DRAWDOWN (XRP/ETH died 65% DD, and generic fades die on inverted RR): the false-breakout pattern provides a NATURAL, TIGHT stop just beyond the failed extreme — if price reclaims the extreme the breakout was real and the trade is cut for a small loss, so per-trade risk is structurally bounded and reward:risk is favorable (target = range mean, larger than the tight stop). (2) It only fires on a confirmed reversal (close back inside), avoiding the fade-a-real-trend loss that kills naive counter-trend reversion. It stays on BTC (the one instrument with demonstrated tradability — every alt died 'no edge'), pure OHLCV (only reliably measurable, coverage-complete data), single-instrument, developer-safe with standard incremental indicators, and generates a measurable sample (false breakouts recur → ~120-250 trades over multi-year history). It fills the under-target LONG-SHORT bucket (13.7% vs 86.3% long-only). 3 parameters.
Hypotheses
I did not accept the Layer-3 diagnosis at face value and measured it instead. The feedback attributes the 300s overrun to per-bar work scaling with history, specifically rebuilding lists and calling min()/sorted() inside calculate_signal(). That does not describe this file: the ATR is folded incrementally, the range is a bounded scan over range_bars (30), and the internal buffers are trimmed amortized. To confirm, I ran an EMPTY strategy — calculate_signal returns 0.0, should_enter returns None, position_size returns 0 — on the exact sandbox configuration (BTCUSDT.BINANCE-4-HOUR, 2400 days, 14,401 bars): it took 477.8 SECONDS, 1.6x the 300s cap with zero strategy logic of any kind. The cost is the fixed per-query catalog file-list glob (NautilusTrader fsspec-globs the entire ~35k-directory bar tree on every catalog.bars() call), charged per query and independent of both bar count and strategy code. No edit inside this class can bring the run under the cap; the fix is infrastructural. Accordingly I made no mechanism change and only two non-behavioural edits: _prior_range now scans by index instead of building two 30-element slice copies per bar (identical result, the only per-bar cost I actually control), and _param_bounds is declared so the optimizer cannot search values the constructor silently clamps. I deliberately did not add a wider stop, a confirmation bar, a deeper limit entry or a volatility filter — each is a new selectivity knob fitted against a single 54-trade sample with roughly a coin-flip chance of flipping the sign in-sample, which is the best-of-N curve-fitting this 3-parameter design exists to avoid. The reason this is an abandon rather than a retry is separate from the timeout and was already established: the prior iteration's pre-registered test came back negative on both branches — freezing the target was immaterial (win_rate 38.9% identical to the decimal, PF 0.729 vs 0.715, still -14.2%), and QA found the losses hit STOPS rather than timeouts, meaning failed breakouts on BTC 4H resume and reclaim the extreme more often than they revert. That is the hypothesis's core premise failing, not an exit-placement detail, and a 38.9% hit rate at ~1.15:1 realized RR is negative expectancy no exit tuning repairs.
Hypotheses
Negative-expectancy false-breakout fade on BTC — not worth 2 hours of optimization. Over 357 trades in 6.6 years the fade LOSES net of costs: avg_trade_return_pct -0.079% (negative, not just below the fee floor), profit_factor 0.822, expectancy -$142.88/trade, and it is negative in every single year (2021 -15.6%, 2023 -10.8%, 2024 -10.7%, 2025 -22.1%). Risk-adjusted metrics are decisively bad: Sharpe -0.174 (CI [-0.93, 0.67] straddles zero), PSR 0.394, Sortino -0.138, and a 60.9% max drawdown (CI to 90.9%, above the L19 50% hard-abandon bar) with a 2,250-day underwater span. The mechanism's core premise is falsified — losses hit the structural STOP rather than timing out, meaning failed range breakouts RESUME and reclaim the extreme more often than they revert to the mean, which is the exact opposite of the hypothesis. The implementation is clean and the sample is adequate, so this is not a code or measurement defect: fading BTC range extremes simply has no edge, and no exit/threshold tuning repairs a directional premise that does not hold. This is the L55 single-name fade/reversion family (0/174 survivors) and BTC's third independent negative fade result — a genuine iterate would only best-of-N curve-fit a new selectivity knob against noise. The developer's own iteration-2 notes pre-register this abandonment. Failure pattern: no_edge/fee_edge single-name range-fade, negative per-trade and negative every year, >50% drawdown (L55/L19).
Implementation
Long-short false-breakout fade on BTCUSDT.BINANCE USD-M perpetual, 4-hour bars, pure OHLCV. Each bar measures a trap score against the range of the prior range_bars bars: for the upper side, min((high - range_high)/ATR, (range_high - close)/ATR), so a setup must show BOTH a genuine break beyond the extreme AND a genuine close back inside, governed by one threshold instead of two correlated knobs. The score is signed negative for an upthrust (short) and positive for a spring (long); with no trap the signal reports the continuous position inside the range, clipped strictly below the entry threshold so only a real failed breakout can trigger. Entry requires a fresh cross of the threshold. Exits are the frozen midpoint of the range the breakout failed from (target), a stop stop_buffer_atr ATRs beyond the trigger bar's extreme (fixed at the setup, never ratcheting), and a 12-bar max hold measured from the position's own ts_opened. Sizing risks 2% of equity across the structural stop distance, capped at 1x equity notional, floored at BTC's 0.001 step and the $100 minimum.
Verification Results
sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (2400 days of BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL). This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).
Backtest Review
Clean, well-documented single-instrument BTC 4H OHLCV implementation with a genuine structural stop and risk-first sizing — the drawdown-defense engineering worked mechanically (no liquidation, sizing bounded).
Backtest Review
Fills the under-target long-short bucket and tests a distinct, event-triggered false-breakout mechanism rather than a continuous momentum/reversion signal.
Backtest Review
357 trades over 6.6 years is an adequate sample to reach a statistically meaningful conclusion — which is exactly why the negative result is trustworthy.
Backtest Review
Negative expectancy: avg_trade_return_pct is -0.079% (below zero, not merely below the 0.15% fee floor), profit_factor 0.822, expectancy -$142.88/trade, avg_loss ($1,536) > avg_win ($1,390).
Backtest Review
total_return -55.4% (CAGR -10.2%), negative in EVERY year (2020 -2.1%, 2021 -15.6%, 2022 +0.3%, 2023 -10.8%, 2024 -10.7%, 2025 -22.1%, 2026 -4.7%).
Backtest Review
Sharpe -0.174 with bootstrap CI [-0.927, 0.669], PSR 0.394, Sortino -0.138 — no risk-adjusted edge in any dimension.
Backtest Review
max_drawdown 60.9% (CI to 90.9%), above the 50% hard-abandon bar (L19), with a 2,250-day underwater duration — the entire history is one long bleed.
Backtest Review
The core directional premise is falsified: losses land on STOPS not timeouts, i.e. failed breakouts RESUME and reclaim the extreme more often than they revert to the mean. This is the L55 single-name fade family (0/174 survivors) — BTC's third independent fade-mechanism death.
Backtest Review
The strategy code's own iteration-2 notes pre-register ABANDON: the pre-committed exit-placement test was immaterial (win_rate unchanged to the decimal), confirming the premise, not an implementation bug.
Iteration History
Verification failed (Layer 4 — QA review):
- MEASURABLE BUT NET-NEGATIVE -- the hypothesis's two core claims are empirically falsified on a well-powered sample. Over 54 trades (metrics_reliable=true) the strategy loses: total_return -15.0%, profit_factor 0.715, Sharpe -0.766 (CI [-2.32, 0.81]), avg_trade_return_pct -0.044% (negative, below the 0.15% fee floor), expectancy -$279/trade. The two structural claims that were supposed to distinguish this from the dead fade family both fail in the data: (1) the reward:risk is NOT favorable -- avg_win $1,799 ~= avg_loss $1,601, a ~1.1:1 realized ratio, not the 'target is several times the tight stop' the hypothesis asserted; and (2) the win rate is 38.9%, NOT the high hit rate a reversion-to-mean trade needs -- so the mean target is reached only ~39% of the time while 61% of setups either reclaim the extreme (stop) or time out (max hold). At ~1.1:1 RR a 39% hit rate is negative expectancy (0.39 x 1799 - 0.61 x 1601 ~= -$276). The premise -- that a close back inside the range reliably traps breakout traders and fuels a reversion to the mean -- does not hold net of costs on BTC 4H: the 'failed' breakouts resume or drift more often than they revert.
Iteration History
Verification failed (Layer 4 — QA review):
- THE TARGET-FREEZE FIX WAS IMMATERIAL -- which falsifies both leak theories and confirms the pattern has no edge. The developer correctly identified and fixed a real defect (iter1 recomputed the target from the rolling range, so the trigger spike widened the range and pushed the midpoint away from the trade), and the fix is implemented correctly (target frozen at entry to the pre-breakout midpoint via the _pending snapshot, keyed to ts_opened). But the result is essentially unchanged from iter1: 54 trades, total_return -14.19% (was -15.01%), profit_factor 0.729 (was 0.715), win_rate 38.9% (IDENTICAL to iter1), realized reward:risk ~1.15 (avg_win $1,826 vs avg_loss $1,593, barely up from ~1.1), avg_trade_return_pct -0.014% (still negative, below the fee floor), Sharpe -0.702. If the rolling target had been converting winners into compressed timeouts as theorized, freezing it would have RAISED the win rate (timeouts becoming target-hits) and lifted avg_win materially; neither happened -- win_rate is unchanged to the decimal and avg_win moved +1.5%. So the losing trades are NOT leaking to the timeout bucket; they are hitting STOPS -- the 'failed' breakout resumes and reclaims the extreme, i.e. the reversion does not reliably happen on BTC 4H (61% non-win). The immateriality of the freeze also implies the geometric RR was never the claimed 'several times the stop': a real 2:1 target would have let avg_win expand once it stopped receding, and it did not.
Backtest and paper results are hypothetical. Trading involves risk of loss.