Skip to content

View translation

SolImpulseBarContinuationTrendLS4H

Hypotheses

SOL 4-Hour Impulse-Bar Continuation, Long-Short (Binance USD-M, Fee-Favorable Cadence Port of the Promoted ETH-4H Impulse Expression onto the Second Validated Impulse Asset, Clamped Impulse Threshold, Tight Initial Stop, Trailing-Stop Winners, Discrete Capital-Capped)

Hypotheses

A LONG-SHORT, single-instrument, pure-OHLCV CONTINUATION strategy on SOLUSDT.BINANCE USD-M perpetual using 4-HOUR bars. This is a CADENCE + ASSET composition of two independently-VALIDATED facts in the factory, NOT a speculative new trigger or new-asset coin-flip: (1) the magnitude-outlier IMPULSE-bar continuation trigger is the factory's single strongest, repeatedly-promoted edge (ETH-1H ~1.40 promoted, ETH-4H just promoted at Sharpe 1.05, now paper_stage); and (2) SOL is the SECOND asset proven to carry this specific impulse-continuation edge (SOL-1H impulse ~0.69, paper) — i.e. SOL is on the validated ETH/SOL 'clean-continuation' axis, NOT the LINK/XRP/DOGE/AVAX/DOT 'whipsaw' axis. The only thing not yet tried is the FEE-FAVORABLE 4-HOUR cadence on SOL — the exact cadence shift that lifted the ETH expression to promotion by cutting fee drag and trading larger, cleaner per-bar impulses. The mechanism: when a single 4H bar is a magnitude outlier (its true range exceeds a clamped multiple of recent ATR), the move tends to CONTINUE in its direction over the following bars on SOL/ETH; the strategy enters in the impulse direction with a tight initial stop and trails winners. Per the analyst's explicit guidance ('pursue distinct proven assets e.g. SOL-impulse' and 'cadence/structure variants on the already-WINNING assets'), this is the highest-expected-survival expression available. Deep multi-year Binance SOL history makes it walk-forward/holdout-validatable (unlike the HL ports and liquidation strategies). ~4 clamped parameters to resist the overfitting recurring across the batch.

Hypotheses

Iteration 5 fixes ONLY the reported leverage_set_but_unused gate. The gate is a static token check: it rejects a config with leverage>1 whose code contains none of config.leverage/.leverage/self.leverage/self._lev. The prior iteration sized without referencing leverage, so it was flagged and byte-identical to 1x. This version wires leverage into position_size (leverage = float(self.config.leverage); risk_budget = equity * risk_frac * leverage; max_notional = equity * leverage) so the 3x book genuinely takes ~3x the 1x position (uncapped for typical SOL-4H ATR/stop ratios), and also caches self._leverage in __init__. All previously-passing logic — the continuous signed body-in-ATRs signal, the clamped magnitude-outlier entry gate, and the tight-stop/trailing-stop exit — is unchanged, preserving Layers 1-2 while making leverage material to the backtest.

Hypotheses

Catastrophic drawdown plus a breakeven, non-scalable edge — not optimizable. max_drawdown 79.14% (CI to 98.99%) is far past the 50% hard-abandon line (L19) and can never clear the promotion drawdown floor. profit_factor is 1.038 (below the 1.2 meaningful-edge line) and Sharpe 0.50 has a bootstrap CI [-0.29, 1.23] that straddles zero, so there is no statistically significant edge before any optimization selection bias. The +165% headline is an artifact: return_kurtosis 71.9 / skew 4.2 with single days of +106.7% (2026-08-22) and +48.5% (2026-02-06) carrying it, and end_unrealized_pct 54.3% means over half is an un-exited open position, not realized. Critically, impact_cost_pct 41.6% with capacity_usd only $578K means market impact already eats 42% of gross PnL — the edge exists only at toy scale, a promotion blocker on its own. information_ratio is -0.68 (underperforms buy-and-hold risk-adjusted) and yearly results swing violently (2026 -43.4%). This is a single-name OHLCV directional impulse-continuation; the promoted ETH-4H sibling framing does not transfer — on SOL the same mechanism produces a 79% drawdown and PF~1.0. No parameter tuning fixes an 80% drawdown or a 42% impact drag; the optimizer would curve-fit the outlier winners and fail deflated-Sharpe/holdout. Failure pattern: risk_reject/overfit single-name directional with >50% DD.

Implementation

Long-short single-bar impulse-continuation on SOLUSDT.BINANCE USD-M 4H bars. A magnitude-outlier gate fires when a bar's true range exceeds a clamped multiple of recent ATR; the strategy enters in the bar's direction (signed body-in-ATRs), uses a tight initial ATR stop, and trails winners with a wider ATR trailing stop. Risk-based, leverage-aware position sizing at 3x with a leverage-aware notional cap.

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.

Verification Results

Round size to SOLUSDT size precision (3). Non-blocking.

Verification Results

position_size returns Decimal(str(size)) without rounding to SOL size precision (3). The template evidently quantizes (451 trades filled), but round explicitly to avoid any precision rejection.

Verification Results

Consider sizing to a fixed fractional risk independent of leverage, letting leverage only raise the notional cap; or lower leverage/risk_frac to bring drawdown under the promotion floor. Optimizer/risk decision.

Verification Results

Leverage multiplies the per-trade risk budget (equity * risk_frac * leverage), so at 3x each trade risks 3% of equity to its stop — the direct driver of the 79% drawdown. Legitimate (and satisfies the leverage_set_but_unused gate) but means leverage scales RISK, not just headroom.

Backtest Review

Deep multi-year SOL history (13,079 bars, 451 trades) is a genuine sample

Backtest Review

avg_trade_return_pct 0.51% clears the Binance USD-M fee floor

Backtest Review

Mechanism is cleanly implemented (magnitude-outlier impulse gate, ATR trailing stop)

Backtest Review

max_drawdown 79.14% (CI to 98.99%) — far past the 50% hard-abandon line (L19); cannot clear the promotion drawdown floor

Backtest Review

profit_factor 1.038 — below the 1.2 meaningful-edge line; edge is essentially breakeven

Backtest Review

Sharpe 0.50 with bootstrap CI [-0.29, 1.23] straddling zero — not statistically significant

Backtest Review

impact_cost_pct 41.6% with capacity_usd only $578K — market impact consumes 42% of gross PnL; edge real only at toy scale

Backtest Review

Headline +165% return is outlier-driven (kurtosis 71.9, skew 4.2; single days +106.7% and +48.5%) and 54.3% of it is un-exited open-position unrealized (end_unrealized_pct)

Backtest Review

information_ratio -0.68 (underperforms buy-and-hold risk-adjusted); wildly inconsistent annually (2026 -43.4%)

Backtest Review

Single-name OHLCV directional continuation — the promoted ETH-4H sibling framing does not transfer; on SOL the same mechanism produces a 79% DD and PF~1.0

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['risk_frac', 'atr_period', 'min_notional', 'stop_atr_mult', 'trail_atr_mult', 'impulse_atr_mult'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() takes 2 positional arguments but 3 were given (bar timestamp: 1735690560000) - steady_downtrend: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() takes 2 positional arguments but 3 were given (bar timestamp: 1735690560000) - flat_ranging: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() takes 2 positional arguments but 3 were given (bar timestamp: 1735690560000) - volatility_spike: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() takes 2 positional arguments but 3 were given (bar timestamp: 1735690560000) - zero_volume: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() takes 2 positional arguments but 3 were given (bar timestamp: 1735690560000) - price_gap: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() takes 2 positional arguments but 3 were given (bar timestamp: 1735690560000)

Iteration History

Verification failed (leverage_set_but_unused): config sets leverage=3.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.

Iteration History

Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit. 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).
Strategy report

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