SolWeekendVolatilityBreakout
Hypotheses
SOL Weekend Volatility Breakout
Hypotheses
Solana exhibits compressed price action during late Friday US hours as institutional flow exits, followed by amplified directional moves during the Sat-Sun illiquid window. Strategy enters on a volatility breakout from the Friday-evening consolidation range on SOLUSDT (Binance USD-M Futures, MARGIN), holds through the weekend, and exits Monday around 12:00 UTC when full liquidity returns. Entry trigger window: Friday 20:00 UTC -> Saturday 04:00 UTC. Compression defined as last 8h range < 0.6 * ATR(6) on 4h bars. Long on break above prior 24h high, short on break below prior 24h low. Funding rate filter: skip entries when |funding| > 0.03% to avoid crowded positioning. Exit: time-based at Monday 12:00 UTC, hard stop at 1.5%, trailing take-profit activated at +1.5% targeting 3%. Capital-relative sizing keeps per-trade risk under 1% of equity. Expected ~50 trades/year, targeting 1.5-2.5% avg winning trade, 50-55% win rate, Sharpe 0.8-1.2. Net of ~0.10% round-trip Binance USD-M taker fees. Risk factors: black-swan weekend dumps (hard stop required), funding spikes during illiquid hours, potential regime decay as more algos trade weekends (test stability across 2022-2026).
Hypotheses
Iteration-3 fix for the Layer-3 'No trades / entry never triggered' failure (should_enter returned a side 0 times over 12,660 bars). Measured on the actual SOLUSDT 4h catalog data, the old gate conjunction (in_entry_window AND compressed AND |24h-band breakout|>1) was satisfied on EXACTLY 0 bars across 5.8 years, because compression and a break beyond the prior 24h band are mutually contradictory on the same bar (compression = quiet; that breakout = a large move), and both were demanded simultaneously inside a 3-bar/week window. The minimal, thesis-faithful fix decouples them into an arm/trigger state machine: compression during Friday evening ARMS the setup and records the consolidation range; the breakout is then measured RELATIVE TO THAT ARMED RANGE (not the 24h band) over an extended weekend trigger window. Simulated on real data this produces 128 balanced entries (68 long / 60 short, ~22/yr) with compression_ratio=0.8, breakout_thresh=1.0 — comfortably >=1 trade for Layer 3 and near the hypothesis's cadence. Everything that already passed Layers 1-2 is preserved byte-for-byte: imports (no new/banned ones), the ATR helper, funding-rate lookup and filter, all four exits (Monday time-exit, hard stop, take-profit, trailing), and the risk-budget position sizing. Only the entry gate definition changed, which is exactly what the diagnostic asked for. Venue stays BINANCE futures (long+short required, MARGIN); leverage=1.0 with notional capped at equity, so no leverage_set_but_unused risk.
Hypotheses
Dead premise, not a code bug: the SOL weekend-volatility-breakout edge does not exist net of fees. The strategy is correctly implemented and its trades match the hypothesis, yet it produces a negative Sharpe (-2.57), profit_factor 0.68, and negative expectancy while losing money in every year 2021-2025 in BOTH long and short directions. The only positive stretch is one 2026-01-31 spike. Optimization tunes parameters over the same mechanism and cannot create a positive edge from a signal that is net-negative in every regime and both directions; a 225-trial sweep would only curve-fit that lone spike. Not iterate — no specific code change flips a genuinely negative bidirectional edge, and the implementation already matches the premise.
Implementation
SOL weekend volatility breakout on 4h bars (Binance USD-M futures). A compress->arm->break state machine: during a Friday-evening window (Fri 16:00-Sat 04:00 UTC) it detects consolidation (last 8h range < 0.8*ATR(6)), arms, and records the consolidation band; then across the weekend window (Fri 20:00-Sun 20:00 UTC) it goes long on a close breaking above the armed band / short below it. Held through the weekend, flattened Monday >=12:00 UTC, with a 1.5% hard stop, 3% take-profit, and a trailing stop that activates at +1.5% giving back 0.75%. Funding filter skips entries when |8h funding| > 0.03%. Risk-budget sizing keeps per-trade risk ~1% of equity, notional capped at equity (no leverage).
Verification Results
Verification failed (Layer 3 — sandbox backtest): No trades produced
Bar type used: SOLUSDT.BINANCE-4-HOUR-LAST-EXTERNAL, Bars processed: 37815
Diagnostics: should_enter() returned a side 0 times over 12660 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
Strategy is correctly implemented and functioning: 99 entries submitted, 0 drops, prior compression-vs-breakout contradiction bug already fixed; trades match the hypothesized bidirectional weekend-breakout mechanism (52 long / 47 short).
Backtest Review
Fundamentally negative edge: Sharpe -2.57, Sortino -4.07, profit_factor 0.68, expectancy -$136/trade, avg_trade_return negative.
Backtest Review
Loses money in every year 2021-2025; the only positive periods (2020, partial-2026) are carried by a single +4.1% day on 2026-01-31.
Backtest Review
Both directions lose independently (long win 30.8%, short win 46.8%) - not a fixable one-sided bias.
Backtest Review
Commissions are 21.4% of gross; the weekend-illiquidity edge does not exist net of Binance USD-M taker fees.
Backtest Review
Fires only ~17 trades/yr vs the ~50 hypothesized; loosening to trade more would just compound a losing pattern.
Outcome Summary
SolWeekendVolatilityBreakout set out to trade SOL's compressed Friday-evening ranges into amplified weekend breakouts, and after an earlier compression-vs-breakout contradiction bug was fixed it ran cleanly — submitting all 99 signaled entries with zero drops across long and short. The mechanics matched the hypothesis, but the economics did not: it posted a -13.44% return, a -2.57 Sharpe, a 0.68 profit factor and negative expectancy, losing money in every year from 2021 to 2025 with only a single 2026-01-31 spike as a bright spot. At the backtest-review gate the analyst ruled this a dead premise rather than a fixable bug, since no parameter tuning can create a positive edge from a signal that is net-negative in both directions and every regime. It was abandoned before optimization after 3 iterations.
Outcome Summary
A correctly implemented strategy whose signal is net-negative across all regimes and both directions cannot be rescued by parameter optimization; the weekend-illiquidity edge simply does not survive Binance USD-M taker fees.
Outcome Summary
It was abandoned at the pre-optimization backtest-review gate (verdict: abandon), where the analyst judged the weekend-volatility edge to be net-negative after fees in every regime and both directions — a dead premise rather than a code bug — so optimization was never run.
Outcome Summary
Capture amplified weekend directional moves in SOLUSDT by entering a volatility breakout from a Friday-evening compression range on Binance USD-M futures, holding through the illiquid Sat–Sun window and exiting Monday ~12:00 UTC.
Outcome Summary
Over ~99 days of data spanning 2020–2026 it fired 99 trades (52 long / 47 short) and lost money: total return -13.44%, Sharpe -2.57, Sortino -4.07, profit factor 0.68, and expectancy of -$136/trade (avg trade return -1.36%), with commissions eating 21.4% of gross. Both directions lost independently (long win rate 30.8%, short win rate 46.8%) and it was negative in every year 2021–2025.
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['exit_dow', 'risk_pct', 'exit_hour', 'atr_period', 'range_bars', 'funding_max', 'min_notional', 'entry_end_how', 'hard_stop_pct', 'tp_target_pct', 'funding_lag_ns', 'size_precision', 'breakout_thresh', 'entry_start_how', 'compression_bars', 'compression_ratio', 'max_notional_frac', 'trail_activate_pct', 'trail_giveback_pct']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: SolWeekendVolatilityBreakout._dt() takes 1 positional argument but 2 were given (bar timestamp: 1735690380000)
- steady_downtrend: TypeError: SolWeekendVolatilityBreakout._dt() takes 1 positional argument but 2 were given (bar timestamp: 1735690380000)
- flat_ranging: TypeError: SolWeekendVolatilityBreakout._dt() takes 1 positional argument but 2 were given (bar timestamp: 1735690380000)
- volatility_spike: TypeError: SolWeekendVolatilityBreakout._dt() takes 1 positional argument but 2 were given (bar timestamp: 1735690380000)
- zero_volume: TypeError: SolWeekendVolatilityBreakout._dt() takes 1 positional argument but 2 were given (bar timestamp: 1735690380000)
- price_gap: TypeError: SolWeekendVolatilityBreakout._dt() takes 1 positional argument but 2 were given (bar timestamp: 1735690380000)
Backtest and paper results are hypothetical. Trading involves risk of loss.