Skip to content

View translation

SolAdxGatedDmiMomentumLS

Hypotheses

SOL Trend-Strength-Gated DMI Momentum, Long-Short (Single-Instrument SOLUSDT.BINANCE Perp, 4H Bars — Take Directional Momentum ONLY When ADX Confirms a Real Trend, Flat in Chop, ATR-Trailing, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument, pure-OHLCV strategy on SOLUSDT.BINANCE USD-M perpetual that trades directional momentum ONLY when a trend-STRENGTH gate (ADX) confirms a genuine trend is in force, and stands flat during chop. It applies the one principle with demonstrated positive edge in this factory — the survivor's SELECTIVE directional filter (hold a position only on high-conviction confirmation, flat otherwise) — via a confirmation axis NOT used in my pending queue: trend strength (ADX/DMI), distinct from dual-timeframe agreement (BTC/XRP), EMA+swing-structure (LINK), and volume surge (ETH). This directly targets why the session's UNGATED 4H directional signals (Donchian breakout, EMA-channel, range-MR) all showed NEGATIVE per-trade expectancy: they traded in chop where directional edges do not exist. The ADX gate is the classic, robust fix — it is a measurement of whether a trend exists at all, so the strategy only takes momentum when there is a trend to ride. It is built to avoid every confirmed failure mode: NOT a daily-bar system (BNB Turtle just died UNMEASURABLE — too few daily trades), NOT an options/supplementary/low-frequency idea (die in the developer stage or unmeasurable), NOT a majors cross-sectional rotation (banned by L32). It is SIMPLE pure-OHLCV single-instrument with standard incremental indicators (developer ships it without swaps/timeouts), sits in the fee-viable / measurable zone (4H trend legs on SOL of ~2-5% dwarf the ~0.10% fee; ADX/DMI signals fire ~120-200 times over multi-year history), fills the under-target LONG-SHORT bucket (13.4% vs an 86%-long-only book), and adds SOL as a fresh single-name (distinct from the dead SOL-HL breakout — different venue and mechanism). Only 3 parameters.

Hypotheses

Straight answer first: my own pre-committed abandon criterion is met and my recommendation to the Analyst is ABANDON — this submission is not an attempt to rescue the edge. Iteration 2 said in writing that if a corrected-geometry, non-exhausted-entry version was still negative then the lagging nature of ADX is not repairable by filtering. QA has now measured exactly that, and the decisive number is not the return but that WIN RATE WAS 0.25 IN BOTH ITERATIONS, unchanged, while both mechanism fixes worked on their own terms: the DI-cross hysteresis repaired the payoff geometry (RR 0.72 -> 1.66) and the anti-exhaustion filter did remove the worst late entries (PF 0.241 -> 0.553). Neither touched directional accuracy, and 0.25 x 1776 - 0.75 x 1071 = -$359/trade is arithmetic, not a tuning problem — the entry is wrong three times in four, so no exit design or stop distance can fix it. Given that, the only change I made is a REVERT, chosen because QA showed the anti-exhaustion filter was accuracy-neutral but sample-destroying: it cut the sample from 28 to 16 trades and introduced the skew 2.08 / kurtosis 28.9 artifact that makes the remaining statistics untrustworthy, i.e. it made the abandon decision rest on two outliers. Removing it (the two ADX-level tests in should_enter and their two locked constants; the DI-cross exit hysteresis that demonstrably fixed a real defect is kept) gives the cleanest, largest-sample, correct-geometry measurement of whether this entry has any directional edge on SOL 4H. That is what a final read should look like. I expect it to remain negative, and if it is, the correct action is abandon rather than optimize: with accuracy pinned at exactly 0.25 across two independent constructions there is no positive in-sample edge for a parameter search to find, and tuning adx_gate/dmi_period/trail_atr_mult would only fit the outlier trades — which is how the earlier confluence ports in this session died on PBO. The diff is three deletions; imports, the class, the continuous ADX-weighted signal, the entry cross, the remaining exits and the sizing path are all untouched, so no earlier layer can regress. No sizing change was made for the >100% risk metrics; I agree with QA that risk-anchored quantity with an independent 1x-equity cap cannot produce a 1205% drawdown at leverage 1.0 with liquidated=false, and that belongs to an engine-side fix.

Hypotheses

Single-perp OHLCV ADX-gated directional trend with a real per-trade edge (avg_trade_return_pct 1.70%, PF 1.28) but an insignificant, promotion-disqualifying risk-adjusted signal: Sharpe 0.48 with bootstrap CI [-0.32, 1.23] straddling zero (PSR 0.77). Base Sharpe 0.48 is far below the ~1.5 promotion bar and below the L82 momentum-family optimize threshold (Sharpe >~1.3, PF >2.0); best-of-N optimization only gets deflated back by DSR/holdout, so there is no realistic path to a significant promote. It is also recency-fragile — it bleeds the calm regime (Sharpe -0.47) and 2026 is -10.2% with rolling Sharpe collapsing to -4.7, so the last-20% holdout sits in a deteriorating regime and is set up to trip the hard holdout gate. Not worth 2 hours of optimization. Note: the developer's pre-committed ABANDON rationale (WR 0.25, -$359/trade) was drawn from a 16-28 trade sandbox and is invalidated by the full 133-trade backtest (WR 0.35, positive expectancy) — the correct abandon reason is insignificant/low base Sharpe with holdout-regime fragility, not the developer's arithmetic. Failure pattern: no_edge/overfit single-perp OHLCV directional trend, sub-1.0 insignificant base Sharpe (L63/L82).

Implementation

Long/short ADX-gated DMI momentum on the SOLUSDT.BINANCE USD-M perpetual, 4H bars, pure OHLCV. The signal is the ADX-weighted DI spread ((+DI - -DI)/100 x ADX/25), continuous and monotone in both direction and trend strength. Entry requires ADX >= adx_gate (flat in chop) plus a fresh cross of the signal through +/- di_min_spread. Exits are (a) the DI cross going against the position by di_exit_margin (5 DI points of hysteresis, so a single counter-trend pullback inside an intact trend is held through), (b) ADX collapsing below 0.6 x the entry gate, and (c) an ATR trailing stop trail_atr_mult ATRs from the best close since entry. Sizing risks a locked 2% of equity to the trailing stop, capped at 1x equity gross notional and floor-rounded to SOL's whole-unit step. Three tunables: adx_gate, dmi_period, trail_atr_mult.

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

Marginal, trend-regime-dependent, tail-assisted edge: win_rate 0.35, positive expectancy depends on the ATR-trail letting winners run (avg_win 2.5x avg_loss; kurtosis 9.9) and the ADX gate avoiding chop (calm tercile -10.6%). Sharpe CI includes zero. Legitimate ADX-gated trend-follower profile, not a defect; open question is OOS persistence. Weight walk-forward/holdout heavily; confirm avg_trade_return_pct stays positive and win_rate above ~0.30; don't over-tune on the fat-tailed winners.

Backtest Review

Measurable sample: 133 trades over 6 years (well above the ~100-trade floor), so this is not the unmeasurable failure mode

Backtest Review

Genuine per-trade edge: avg_trade_return_pct 1.70% dwarfs the ~0.10% round-trip fee; PF 1.28 and RR ~2.3 (avg_win 3220 vs avg_loss 1374) — not fee-dead

Backtest Review

Risk contained: max_drawdown 14.9%, no liquidation, exposure only 26.6%

Backtest Review

Developer's pre-committed ABANDON was based on a wrong 16-28 trade sandbox (WR 0.25); the full backtest is actually better (WR 0.35, positive expectancy) — so its rationale is invalid, but that does not rescue the strategy

Backtest Review

Sharpe 0.48 with bootstrap CI [-0.32, 1.23] straddling zero and PSR 0.77 (<0.95) — risk-adjusted edge is not statistically distinguishable from zero

Backtest Review

Base Sharpe 0.48 is far below the ~1.5 promotion bar; optimization's best-of-N selection is deflated back by DSR/holdout, so there is no realistic path to a significant promote

Backtest Review

Below the L82 momentum-family optimize-authorization threshold (Sharpe >~1.3, PF >2.0); this single-TF ADX-gated variant is not the promoted dual-TF confluence class

Backtest Review

Regime/recency fragile: loses in the calm tercile (Sharpe -0.47, -10.6%); 2026 annual -10.2% with rolling Sharpe collapsing to -4.7 — the last-20% holdout sits in this deteriorating regime and is set up to fail the hard holdout gate

Backtest Review

CAGR only 4.9% over 6 years

Iteration History

Verification failed (Layer 4 — QA review): - DECISIVELY NEGATIVE EDGE -- the WORST directional result of the session, and the ADX 'trend-existence' gate did not rescue it, it made it worse. Over a measurable 28-trade / 363-day sample (metrics_reliable=true): avg_trade_return_pct -1.71%, profit_factor 0.241 (loses ~$4 for every $1 won), Sharpe -1.63 (CI [-3.29, 0.06], probabilistic_sharpe 0.024), win_rate 0.25, total_return -13.5%, expectancy -$482/trade. The reward:risk is inverted again despite the exit-hysteresis design: avg_win $611 < avg_loss $847 (RR 0.72). The hypothesis's premise -- 'the session's ungated 4H directional systems bled because they traded in chop, and ADX fixes that by only trading when a trend exists' -- is falsified: gating on ADX produced a LOWER win rate (25%) than the ungated siblings (30-41%), because ADX is a LAGGING trend-existence measure, so it confirms a trend only after it has largely run and the entry is systematically late -- buying confirmed strength near exhaustion on SOL 4H, which then mean-reverts. That is exactly the failure mode the developer flagged as most likely ('ADX is a lagging measurement... the entry is inherently late'). The DI-cross exit then cuts the occasional winner early (small win) while losers run to the ATR trail / ADX collapse (bigger loss), reproducing the inverted geometry. The 3-parameter anti-overfit surface is moot -- there is no positive in-sample edge for optimization to work on. - IMPLAUSIBLE RISK-METRIC UNITS -- verify (unchanged, engine-side). max_drawdown 14.47 (1447%, CI [7.26, 25.28]), cvar_95 1.18 are >100% despite leverage 1.0, risk_pct 0.02, a 1.0x notional cap (avg_position_pct 28.8%), and liquidated=false -- the session-wide metrics-normalization convention, not a sizing bug (the sizing is correct: risk-anchored, independent cap, floor + min-notional). Flag for engine-side confirmation only.

Iteration History

Verification failed (Layer 4 — QA review): - BOTH FIXES WORKED MECHANICALLY YET THE EDGE IS STILL DECISIVELY NEGATIVE, AND THE WIN RATE IS IMMOVABLE -- the developer's pre-committed abandon criterion is met. The DI-cross exit hysteresis repaired the geometry (avg_win $1776 > avg_loss $1071, RR 1.66, up from the inverted 0.72) and the anti-exhaustion filter cut the worst late entries (PF 0.241 -> 0.553), but the strategy remains a clear net loser: avg_trade_return_pct -1.42% (was -1.71%), profit_factor 0.553, Sharpe -0.484 (CI [-2.24, 1.09]), total_return -5.75%, expectancy -$359/trade. THE DECISIVE FACT: win_rate is still exactly 0.25 -- identical to iteration 1. Neither the anti-exhaustion entry filter nor any exit change moved directional ACCURACY: the ADX-gated DMI entry is wrong ~75% of the time regardless of how the trade is managed, so a 1.66 RR cannot save it (0.25 x 1776 - 0.75 x 1071 = -$359/trade). That is proof the entry has no directional edge, exactly the developer's own stated criterion: 'if a non-exhausted-entry, corrected-geometry version is STILL negative, then the lagging nature of ADX is not repairable by filtering and ADX-gated 4H trend continuation has no directional edge on SOL -- ABANDON rather than iterate a third time.' Compounding it, the anti-exhaustion filter thinned the sample from 28 to 16 trades, now bordering unmeasurable (skew 2.08 / kurtosis 28.9 -- a couple of trades dominate). - IMPLAUSIBLE RISK-METRIC UNITS -- verify (unchanged, engine-side). max_drawdown 12.05 (1205%, CI [5.38, 21.29]), cvar_95 1.36 are >100% despite leverage 1.0, risk_pct 0.02, a 1.0x notional cap (avg_position_pct 29.2%), and liquidated=false -- the session-wide metrics-normalization convention, not a sizing bug (sizing unchanged). Flag for engine-side confirmation only.

Iteration History

Verification failed (Layer 4 — QA review): - ABANDON CONFIRMED ON THE CLEAN, LARGER SAMPLE -- decisively negative edge, and the developer recommends abandonment up front. Reverting the sample-destroying anti-exhaustion filter (keeping only the DI-cross exit hysteresis that fixed a real geometry defect) gives the intended cleaner read: 23 trades (up from iteration 2's 16), metrics_reliable=true, avg_trade_return_pct -1.39%, profit_factor 0.462, Sharpe -0.766 (CI [-2.63, 0.88]), total_return -9.64%, expectancy -$419/trade. Win_rate is 0.304 -- essentially unchanged from the 0.25 measured across iterations 1-2 (well within noise at this n) -- so the entry is still directionally wrong ~70% of the time, and at a repaired RR (avg_win $1184 ~ avg_loss $1121, RR ~1.06) that hit rate is a clear net loss by arithmetic. This is the third measurement of the same conclusion across two independent mechanism constructions: the ADX-gated DMI entry has no directional accuracy that trade management can rescue, exactly the developer's pre-committed criterion ('if a corrected-geometry version is still negative, the lagging nature of ADX is not repairable by filtering -- ABANDON'). ADX is a lagging trend-existence measure, so it confirms trends after they have largely run; on SOL 4H that is a systematically late, near-exhaustion entry. - IMPLAUSIBLE RISK-METRIC UNITS -- verify (unchanged, engine-side). max_drawdown 13.99 (1399%, CI [6.72, 25.66]), var_95 1.04, cvar_95 1.51 are >100% despite leverage 1.0, risk_pct 0.02, a 1.0x notional cap (avg_position_pct 29.5%), and liquidated=false -- the session-wide metrics-normalization convention, not a sizing bug (sizing unchanged). Flag for engine-side confirmation only.
Strategy report

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