AdaFourHourBullishOpenGapContinuationLong
Hypotheses
ADA 4H Bullish Open-Gap Continuation Long (Inter-Bar Gap Signal)
Hypotheses
A long-only, single-instrument, single-timeframe strategy on ADAUSDT.BINANCE 4H bars (the most-reliably-fresh bar type). Implements a NEW MECHANISM operating on a DIFFERENT OBSERVABLE than every existing pipeline entry: the OPEN-vs-PRIOR-CLOSE GAP. Each 4H bar has an open that may differ from the previous bar's close — this 'inter-bar gap' reflects flow that occurred between the prior bar's close timestamp and the current bar's open timestamp (in 24/7 crypto markets, this is essentially instant, but Binance Vision bar timing produces measurable gaps from rapid order flow at the bar boundary). The mechanism: detect bars where the open is meaningfully above the prior close (bullish gap >= 0.5×ATR_14), AND the current bar's close is HIGHER than its open (the gap was sustained, not faded), AND price is in confirmed uptrend. Captures inter-bar momentum injection that no intra-bar mechanism captures. Critically distinct from every existing ADA 4H mechanism: NOT Donchian breach (uses gap, not channel), NOT bar geometry (uses INTER-bar relationship, not intra-bar), NOT z-score returns (uses gap-to-ATR ratio, not return distribution), NOT autocorrelation (no temporal-correlation math), NOT range outlier (uses open-vs-prior-close, not high-low range), NOT volume signal (gap is price-only). Three-filter conjunction: bullish-gap-magnitude + sustained-close + trend-filter. Expected ~30-50 trades/year — well above walk-forward minimum.
Hypotheses
Iteration 3 fixes the Layer-3 zero-trades failure. Diagnosis: in continuous 24/7 crypto the 4H open nearly equals the prior 4H close, so the raw inter-bar gap is only a few basis points while ATR_14 is ~1-2% of price; the old `gap >= 0.5*ATR` threshold was therefore unreachable and fired 0 times over 17336 bars. Minimal fix that preserves the mechanism: normalize the gap by its OWN rolling dispersion (standard deviation of fractional gaps in the recent window) instead of by ATR, converting the edge variable into a self-calibrating gap z-score. A fixed z-threshold (gap_mult=1.5) then selects the largest bullish gaps regardless of absolute scale, producing the intended ~30-50 continuation entries/year. All earlier-passing logic is retained: the 3-filter conjunction (gap magnitude + sustained close + uptrend) still drives should_enter via the stored booleans, imports are unchanged, and calculate_signal still returns a continuous, non-frozen diagnostic so Layer-2 stays green. Only the normalization line and the gap_mult default changed.
Hypotheses
Fundamentally negative-edge, and the premise itself is the flaw. The 'inter-bar open-vs-prior-close gap' is not a real observable in 24/7 crypto — the 4H open essentially equals the prior 4H close, so the gap is a few-bps microstructure noise variable (confirmed by the developer's own iteration-3 note: the ATR-scaled gate fired ZERO times over 17,336 bars). Normalizing that noise by its own rolling dispersion just manufactures z-score crossings without adding information. The backtest confirms no edge over a large, well-behaved sample: profit_factor 0.9297 (<1), expectancy -76/trade, Sharpe -0.548, PSR 0.311, negative in 5 of 9 years, with return_kurtosis only 2.71 (so this is a genuine no-edge, NOT an outlier-carried fit that tuning could reshape) and 8.88% fee drag on top. Optimization cannot rescue a signal built on a noise observable, and no parameter/code change makes bar-boundary gaps predictive — the mechanism is dead, not mis-tuned. Not worth the 2-hour optimization cycle.
Implementation
Long-only inter-bar gap continuation on ADAUSDT.BINANCE_SPOT 4H bars. Enters long when the current bar's open-vs-prior-close gap is a large positive outlier relative to its own recent distribution (rolling gap z-score >= 1.5), the gap is sustained (close > open), and price is above a 50-bar trend SMA. Exits on a 4% stop, 8% take-profit, 12-bar time stop, or a trend break. Price-only, single timeframe, no leverage.
Verification Results
Verification failed (Layer 3 — sandbox backtest): No trades produced
Bar type used: ADAUSDT.BINANCE_SPOT-4-HOUR-LAST-EXTERNAL, Bars processed: 17387
Diagnostics: should_enter() returned a side 0 times over 17336 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds.
Ensure your strategy produces trades with the given data and parameters.
Backtest Review
Mechanically functional after 3 iterations: 215 long entries fire, 0 dropped on size/notional — the frozen-signal and no-trades bugs are fixed
Backtest Review
Clean, non-fragile sample (kurtosis 2.71, 215 trades) means the negative result is a reliable statement, not noise
Backtest Review
profit_factor 0.9297 (<1), expectancy -76/trade, avg_trade_return negative, Sharpe -0.548, PSR 0.311 — structurally loses money
Backtest Review
The edge variable is noise: in 24/7 crypto the 4H open ~= prior 4H close, so the inter-bar gap is a few bps of microstructure; the original ATR-scaled gate fired ZERO times over 17,336 bars and the z-score 'fix' just normalizes noise until something crosses
Backtest Review
commission_pct_of_gross 8.88% — heavy fee drag on a signal with no gross edge
Backtest Review
Negative in 5 of 9 years, 13 consecutive losses, 37% max drawdown over a 2785-day drawdown duration
Backtest Review
Low kurtosis (2.71) confirms this is a genuine no-edge, not a tunable outlier-carried fit
Outcome Summary
This strategy proposed a novel mechanism — trading the 4H inter-bar open-vs-prior-close gap on ADA spot — and took three iterations just to become mechanically functional, fixing a frozen-signal bug and a no-trades bug where the original ATR-scaled gate never fired over 17,336 bars. The iteration-3 fix re-normalized the gap by its own rolling dispersion to force ~215 trades, but the backtest then showed a structurally losing system: profit factor 0.93, negative expectancy and Sharpe, a 37% drawdown, and losing years in 5 of 9, with low kurtosis confirming a real no-edge rather than noise. The analyst abandoned it at the backtest-review gate, concluding the premise itself was the flaw — the inter-bar gap is microstructure noise in 24/7 crypto, so normalizing it merely manufactures z-score crossings, and optimization could not rescue a signal with no gross edge.
Outcome Summary
A signal must rest on a real observable: the inter-bar gap is a few-bps microstructure artifact in 24/7 markets (the original ATR-scaled gate fired zero times over 17,336 bars), and normalizing noise by its own dispersion only manufactures crossings without adding predictive information — no amount of tuning rescues a mechanism whose premise is invalid.
Outcome Summary
The analyst issued an 'abandon' verdict at the pre-optimization backtest-review gate, so it never reached optimization; the decisive issue was a structurally negative edge (profit factor < 1, negative expectancy and Sharpe) built on a noise variable, since in 24/7 crypto the 4H open essentially equals the prior 4H close.
Outcome Summary
A long-only, spot ADAUSDT 4H strategy trading a brand-new observable — the inter-bar open-vs-prior-close 'gap' — entering on bullish gaps that exceeded a rolling gap z-score (gap_mult 1.5), were sustained through the bar (close > open), and occurred inside a confirmed uptrend.
Outcome Summary
Over ~8 years the base backtest fired 215 long trades with a 35% win rate, profit factor 0.93, expectancy of -76 per trade, Sharpe -0.548 (PSR 0.311), total return -16.4%, and a 37% max drawdown with 13 consecutive losses; it was negative in 5 of 9 years and carried 8.88% commission drag. Low return kurtosis (2.71) indicated this was a genuine no-edge result rather than a tunable outlier fit.
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['gap_mult', 'risk_pct', 'atr_period', 'min_notional', 'trend_period', 'max_hold_bars', 'stop_loss_pct', 'take_profit_pct']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: Frozen signal: all 449 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.
- steady_downtrend: Frozen signal: all 449 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.
- volatility_spike: Frozen signal: all 449 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.
- zero_volume: Frozen signal: all 449 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.
- price_gap: Frozen signal: all 449 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.
Backtest and paper results are hypothetical. Trading involves risk of loss.