Skip to content
All strategies

Strategies

BTC Single-Asset Consecutive Streak Exhaustion Reversal Long-Short on BINANCE Daily (Williams 1979 Streak-Fade Pattern, Raw-Bar Color Sequence, Event-Driven)

Outcome: Abandoned

BtcDailyConsecutiveStreakExhaustionReversalLongShort

Outcome Summary

This strategy cleanly implemented the academically-documented streak-fade pattern, fading 5+ consecutive same-color BTC daily bars near 20-bar extremes both long and short, and the cited reversal frequency was even visible in the data (56% win rate, 65% on longs). But it lost money structurally: average losses were roughly twice average wins, giving profit factor 0.65, Sharpe -1.02, a -27.3% total return and a 45.8% drawdown, negative in four of seven years. The analyst abandoned it at the backtest-review gate on its second iteration, concluding the negative payoff asymmetry is intrinsic to counter-trend fading on a trending asset — not fixable by tuning — and that the thin 50-trade sample would only overfit, so it never reached optimization or risk review.

Hypothesis

Single-asset consecutive same-color bar streak exhaustion strategy on BTCUSDT.BINANCE — counts the number of consecutive same-color bars (5+ green = bullish streak; 5+ red = bearish streak) and fades the streak when statistical extreme is reached. Mechanism: (1) Track consecutive same-color streak: streak counter increments when bar[0].close has same color as bar[-1] (both up or both down), resets to 1 on color change. (2) BEARISH STREAK FADE (overbought via consecutive ups): consecutive_up_streak >=……Show moreShow less

Single-asset consecutive same-color bar streak exhaustion strategy on BTCUSDT.BINANCE — counts the number of consecutive same-color bars (5+ green = bullish streak; 5+ red = bearish streak) and fades the streak when statistical extreme is reached. Mechanism: (1) Track consecutive same-color streak: streak counter increments when bar[0].close has same color as bar[-1] (both up or both down), resets to 1 on color change. (2) BEARISH STREAK FADE (overbought via consecutive ups): consecutive_up_streak >= streak_threshold (default 5) AND bar[0].high >= 20_bar_high × (1 - proximity_pct) (default 5%, near a recent high). When the next bar produces a DOWN candle (close < open), enter SHORT. (3) BULLISH STREAK FADE (oversold via consecutive downs): consecutive_down_streak >= streak_threshold AND bar[0].low <= 20_bar_low × (1 + proximity_pct). When the next bar produces an UP candle, enter LONG. (4) FLAT otherwise. This implements Larry Williams 1979 streak-reversal pattern documented in 'How I Made One Million Dollars... Last Year... Trading Commodities', subsequently statistically validated in equities (Conrad-Hameed-Niden 1994 documents ~58% reversal probability after 5+ consecutive same-direction days). Distinct from my 20 in-pipeline event-driven BTC patterns. Heiken Ashi (in pipeline) uses TRANSFORMED candles with 3+ same-color requirement; Consecutive Streak uses RAW candles with 5+ minimum streak — different bar input AND different threshold. Distinct from RSI MR (signal-magnitude oscillator) because Streak counts DISCRETE color events. Distinct from Pin Bar/Climax (single-bar exhaustion) because requires multi-bar streak first. Translation-robust (color counting is scale-invariant). Single-asset scope = no multi-asset translation curse. Helps direction quota (90.7% long-only).

Iteration 2 fix for the Layer-2 frozen-signal failure. Root cause: calculate_signal returned 0.0 on every bar except the rare full-pattern bar (streak>=threshold + near-extreme + reversal candle), so in steady_uptrend/downtrend it was 0.0 on all 473 bars. The fix returns a CONTINUOUS streak score (down_streak - up_streak, plus a tiny close-level term) which strictly grows through any streak and therefore varies every bar in any trend, while the unchanged discrete entry pattern now sets an _armed_side flag instead……Show moreShow less

Iteration 2 fix for the Layer-2 frozen-signal failure. Root cause: calculate_signal returned 0.0 on every bar except the rare full-pattern bar (streak>=threshold + near-extreme + reversal candle), so in steady_uptrend/downtrend it was 0.0 on all 473 bars. The fix returns a CONTINUOUS streak score (down_streak - up_streak, plus a tiny close-level term) which strictly grows through any streak and therefore varies every bar in any trend, while the unchanged discrete entry pattern now sets an _armed_side flag instead of gating the return value. should_enter reads _armed_side. Critically, the opposite-side-fade EXIT was changed from testing signal's sign (which is now continuous and would flip-exit positions every bar) to testing _armed_side (a real fresh opposite fade), preserving the original exit intent. position_size's obsolete `signal == 0` guard is removed because entries gate on _armed_side and sizing is only called after should_enter approves. Stop/TP/time-stop exits, leverage consumption (equity * position_pct * leverage), imports, and config are untouched, so Layer-1 static and the already-passing streak mechanism remain intact; only the signal is now continuous.

The streak-fade is correctly implemented and the academically-cited reversal frequency is even present (win_rate 0.56), but the strategy loses money structurally: avg_loss is ~2x avg_win (tail_ratio 0.51, profit_factor 0.65, Sharpe -1.02, -27% total, negative in 4 of 7 years). Fading 5+ consecutive-bar streaks near 20-bar extremes is counter-trend on an asset that trends hard out of those extremes — the frequent small reversal wins are dwarfed by the trend-continuation tail losses (largest -15,868, 45.8% DD), and daily-bar 5% stops cannot contain the -16% gap days that fade-failures produce. This negative payoff asymmetry is intrinsic to the mechanism, not a tunable parameter, and the thin 50-trade / 6.5-year sample (2.57% exposure) means optimization would only curve-fit noise. Not worth 2 hours of optimization; no specific code fix exists because the implementation is faithful to a premise that does not pay after costs.

Implementation

Single-asset long-and-short consecutive same-color-bar streak exhaustion fade on BTCUSDT.BINANCE USD-M futures daily bars, OHLCV-only (Larry Williams 1979 streak-reversal). It counts consecutive raw-candle streaks ending at the prior bar: a 5+ green streak with that bar near the 20-bar high and a current red candle arms a SHORT; a 5+ red streak with that bar near the 20-bar low and a current green candle arms a LONG. Exits on a 5% stop-loss, 10% take-profit, a fresh opposite-side fade, or an 8-bar time stop. calculate_signal returns a continuous streak score (down_streak - up_streak) every bar so the signal varies; the discrete entry pattern is captured in an _armed_side flag checked by should_enter, and the opposite-side exit also reads _armed_side. Sizes 0.60 x leverage(2.0) = ~1.2x equity notional, genuinely consuming the configured leverage.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['min_notional', 'position_pct', 'max_hold_bars', 'proximity_pct', 'stop_loss_pct', 'take_profit_pct', 'extreme_lookback', 'streak_threshold'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: Frozen signal: all 473 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - steady_downtrend: Frozen signal: all 473 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.

Backtest Review

Sharpe
-1.02
Total return
-27.30%
Max drawdown
45.77%
Trades
50
Win rate
56.0%
Profit factor
0.65

Code faithfully implements the hypothesis: raw-candle streak counting, 20-bar extreme proximity gate, long+short fades — trades match the described mechanism (20 long / 30 short).

The academic premise is even visible in the data: win_rate 0.56 (long 0.65) confirms the ~58% post-streak reversal frequency.

Clean execution: 50 entries signaled and submitted, 0 dropped for size/min-notional, metrics_reliable=true, no engine artifacts.

Net loser: Sharpe -1.02, total_return -27.3%, profit_factor 0.65, expectancy -449/trade, negative in 4 of 7 years.

Payoff structure is inverted: avg_loss (2,930) ~2x avg_win (1,501), tail_ratio 0.51, return_skew -1.82 — the reversal wins are small but trend-continuation losses are huge (largest -15,868, 45.8% max DD).

Counter-trend fading near extremes on a trending asset (BTC) is structurally adverse; daily-bar 5% stops give no intraday protection against the -16% gap days that fade-failures produce.

Only 50 trades over 6.5 years (exposure 2.57%) — far too thin for meaningful parameter optimization; a sweep would overfit to noise.

No code fix to hand back — the failure is in the premise, not the implementation.

Outcome Summary

A statistically real edge (the ~58% post-streak reversal frequency) is worthless when payoff asymmetry is inverted — counter-trend fading near extremes on a trending asset like BTC produces small wins and catastrophic tail losses that daily-bar percentage stops cannot contain, and this is intrinsic to the mechanism, not a tunable parameter.

The backtest-review analyst issued an 'abandon' verdict: the implementation was faithful but the premise loses money structurally — fading streaks near extremes is counter-trend on an asset that trends hard out of those extremes, so frequent small reversal wins are dwarfed by trend-continuation tail losses (largest -15,868), and the thin 50-trade/2.57%-exposure sample would only curve-fit noise under optimization.

A single-asset long-and-short streak-exhaustion fade on BTCUSDT daily Binance futures (2.0x leverage), implementing the Williams 1979 / Conrad-Hameed-Niden pattern: after 5+ consecutive same-color bars near a 20-bar extreme, fade the streak — short the reversal candle after an up-streak near highs, long it after a down-streak near lows.

Across 50 trades (20 long, 30 short) over ~6.5 years it returned -27.3% with Sharpe -1.02, profit factor 0.65, expectancy -449/trade and a 45.8% max drawdown; the cited reversal frequency did show up (win rate 0.56, long 0.65), but the payoff was inverted — avg loss 2,930 was ~2x avg win 1,501 (tail ratio 0.51, return skew -1.82).

Backtest and paper results are hypothetical. Trading involves risk of loss.