A LONG-ONLY, SPOT, single-instrument daily-momentum trend follower on LINKUSDT.BINANCE_SPOT. This is a deliberate FOUR-AXIS pivot away from the XRP dual-timeframe momentum-confluence idea that just collided (and that whole XRP+confluence sub-family has died overfit): (1) VENUE moves from USD-M futures to BINANCE_SPOT — the factory's highest-survival, most under-represented venue (~6% vs a >=15% target); (2) DIRECTION moves from long-short to LONG-ONLY, which is what a CASH spot account can express and what……Show moreShow less
A LONG-ONLY, SPOT, single-instrument daily-momentum trend follower on LINKUSDT.BINANCE_SPOT. This is a deliberate FOUR-AXIS pivot away from the XRP dual-timeframe momentum-confluence idea that just collided (and that whole XRP+confluence sub-family has died overfit): (1) VENUE moves from USD-M futures to BINANCE_SPOT — the factory's highest-survival, most under-represented venue (~6% vs a >=15% target); (2) DIRECTION moves from long-short to LONG-ONLY, which is what a CASH spot account can express and what removes the fragile short half that kept whipsawing XRP; (3) MECHANISM moves from two-timeframe SIGN-AGREEMENT (the exact recipe that overfit on XRP) to VOLUME/PARTICIPATION-CONFIRMED momentum — the mechanism actually advancing through the pipeline right now (SolSpotVolumeConfirmedMomentumLong, EthVolumeConfirmedMomentumLS, AvaxConvictionGatedMomentumLS, BnbDualTimeframeTrendConfluenceLS all cleared backtest_review/optimizing); (4) INSTRUMENT moves from XRP to LINK, a deeply liquid 2019-listed name absent from every recent momentum run. LINK is a strong carrier for slow spot momentum: it trends hard on DeFi/oracle-adoption cycles and spends the rest of the time ranging, so a participation-gated daily trend follower sits out the chop and only engages when volume confirms real directional demand. Only 3 free parameters over a coarse grid, directly attacking the overfit/PBO death mode.
Implements all four pivot axes of the hypothesis. (1) VENUE: BINANCE_SPOT, CASH account, leverage 1.0 - the strategy is long-only, uses no margin and has no funding-based edge, which is exactly the spot routing rule; nothing in the sizing path reads self.config.leverage. (2) DIRECTION: long-only - should_enter can only ever return OrderSide.BUY, and SELL is used solely by the base template to close an existing long. (3) MECHANISM: volume/participation-confirmed momentum, the same construction as the……Show moreShow less
Implements all four pivot axes of the hypothesis. (1) VENUE: BINANCE_SPOT, CASH account, leverage 1.0 - the strategy is long-only, uses no margin and has no funding-based edge, which is exactly the spot routing rule; nothing in the sizing path reads self.config.leverage. (2) DIRECTION: long-only - should_enter can only ever return OrderSide.BUY, and SELL is used solely by the base template to close an existing long. (3) MECHANISM: volume/participation-confirmed momentum, the same construction as the SolSpotVolumeConfirmedMomentumLong sibling that cleared backtest_review - a median (not mean) volume baseline so a prior spike cannot swallow the next genuine surge, with momentum expressed in ATR units so one threshold means the same thing in LINK's calm ranges and its DeFi-cycle expansions. There is no two-timeframe sign-agreement anywhere; the weekly term is a one-sided REGIME GATE, not a second momentum vote. (4) INSTRUMENT: LINKUSDT, a deeply liquid 2019-listed spot pair absent from recent momentum runs. The '1W regime filter' is computed from the daily closes (56-bar average plus its one-week slope) rather than by subscribing to a second 1-WEEK bar leg: it is the identical weekly information, it updates daily instead of once a week, and it keeps the strategy single-leg - no cross-leg alignment barrier and no extra-leg warm-up that could produce zero evaluated bars (the recurring multi-leg verification_loop failure mode). Entry-frequency sanity: on daily LINK the regime gate is up roughly half the time, the 0.75-ATR momentum threshold fires on ~30% of bars and a 1.5x median-volume surge on ~20-25%; the terms are positively correlated, so the joint gate is eligible on ~5% of bars and the up-cross rule converts that into roughly 40-60 round trips over LINK's full history - comfortably above the sandbox's >=1 trade requirement while keeping turnover low enough that the ~0.20% spot round-trip cost is a small fraction of a multi-week, multi-ATR trend leg. Only three parameters are free, with _param_bounds declared and the identical ranges enforced in code, directly attacking the overfit/PBO death mode called out in the hypothesis. Per-bar cost is bounded (index reads over fixed windows plus one bounded sort), and all state is re-derived from the bar buffer with no process-relative counters, so restarts and paper replay are bit-identical.
Overfit / no-generalization death (NOT fee-edge — per-trade economics clear the spot floor). Four unwaivable HARD gates fail: walk-forward is_overfitted=true with in-sample Sharpe 0.856 collapsing to out-of-sample -3.190 (all three OOS windows deeply negative: -3.14 / -3.93 / -2.50), OOS Sharpe <= 0, PBO 0.7037 > 0.5, and the holdout carries only 3 trades (< 10). Robustness confirms best-of-N noise: deflated_sharpe 0.0082 << 0.95, is_significant=false, Sharpe CI [-0.043, 1.348] straddles zero, and it does not……Show moreShow less
Overfit / no-generalization death (NOT fee-edge — per-trade economics clear the spot floor). Four unwaivable HARD gates fail: walk-forward is_overfitted=true with in-sample Sharpe 0.856 collapsing to out-of-sample -3.190 (all three OOS windows deeply negative: -3.14 / -3.93 / -2.50), OOS Sharpe <= 0, PBO 0.7037 > 0.5, and the holdout carries only 3 trades (< 10). Robustness confirms best-of-N noise: deflated_sharpe 0.0082 << 0.95, is_significant=false, Sharpe CI [-0.043, 1.348] straddles zero, and it does not survive programme-level FDR (keeps 3 of 240, candidate_p 0.9918). Per the overfit-vs-dead-premise rule, high-IS/negative-OOS is ABANDON not revise: the sensitivity surface is flat (~0.49 everywhere, no cliffs, no untried robust region), so there is nothing to tune toward, and reframing the same slow spot-momentum mechanism onto another config just overfits again — it already has, with the LINK momentum/confluence/trend-participation family dying repeatedly (LINK dual-TF confluence overfit, LINK trend-participation risk_reject at 94% DD, LINK funding-crowding fee_edge, LINK HL confluence, LINK 4H volume-breakout no_edge at -64%). The strategy is also structurally too slow to validate: 26 trades over 6.7 years, oos_vault flagged UNDERPOWERED (~5 expected trades), so optimizing over ~26 trades only curve-fits noise. Failure pattern: overfit / no-generalization (single-name spot momentum).
Implementation
Long-only, single-instrument daily trend follower on LINKUSDT.BINANCE_SPOT (CASH, leverage 1.0). It holds LINK only when three conditions coincide on the same daily series: (1) a WEEKLY UPTREND REGIME - the close is above the 8-week (56 daily bar) moving average and that average is no lower than one week ago; (2) DAILY MOMENTUM - the mom_lookback-day price change measured in ATR units is at least entry_thresh_atr; and (3) PARTICIPATION CONFIRMATION - the bar's volume is at least vol_surge_mult times the median……Show moreShow less
Long-only, single-instrument daily trend follower on LINKUSDT.BINANCE_SPOT (CASH, leverage 1.0). It holds LINK only when three conditions coincide on the same daily series: (1) a WEEKLY UPTREND REGIME - the close is above the 8-week (56 daily bar) moving average and that average is no lower than one week ago; (2) DAILY MOMENTUM - the mom_lookback-day price change measured in ATR units is at least entry_thresh_atr; and (3) PARTICIPATION CONFIRMATION - the bar's volume is at least vol_surge_mult times the median volume of the prior 60 bars. The signal returned every bar is the continuous participation-weighted momentum mom_atr * min(1, participation); the regime and surge gates live in should_enter, so the signal never flatlines. Entry requires an UP-CROSS of the threshold (previous bar not eligible) so a multi-day confirmed uptrend cannot churn round trips. Exits are structural: an ATR trailing stop at trail_atr_mult ATRs below the best close since entry (seeded at the entry price), and a weekly-regime break when the close falls exit_hyst_atr ATRs below the regime average. Sizing is risk-first - equity * risk_pct / (trail_atr_mult * ATR) - capped at 95% of equity notional, floored at LINK's 0.01 step and the $10 spot minimum. Exactly three tunable parameters (mom_lookback, vol_surge_mult, trail_atr_mult) with declared bounds; everything else locked.
Verification Results
No change required; keep the override intentional. If the base does not actually call this override, warm-up could be shorter than intended, but the internal _evaluate() guards (returning None until every window is filled) make entries safe regardless.
min_bars_required(self) overrides a framework method (flagged by static analysis as base_shadow). This appears deliberate and correct here — the override returns a value derived from the strategy's own window lengths (regime_len + slope_lag, vol_window, atr_period, mom_lookback) so warm-up is sized to the actual indicators. Confirmed the base template consumes an override of this method for warm-up gating.
Turnover is intentionally very low: the sandbox produced only 23 trades over ~2398 days, with win_rate 0.26 (trend-follower profile) and the calm vol tercile slightly negative (-2.64%, Sharpe -0.20). The joint regime+surge+cross gate is restrictive, so the full-history sample may sit near the lower end of the ~40-60 round trips the hypothesis projects. This is not a correctness defect — the code faithfully implements the edge — but the analyst should confirm the full backtest yields a statistically usable trade count before trusting the metrics, since a sub-~100-trade sample struggles to distinguish edge from noise.
Backtest Review
Sharpe
0.52
Total return
63.20%
Max drawdown
19.72%
Trades
27
Win rate
25.9%
Profit factor
2.66
Trades faithfully implement the hypothesis: 27 long-only trades, 0 shorts, ~32-day holds on BINANCE_SPOT — a clean regime+surge-gated daily trend follower, not a churner.
Classic trend-following signature with real edge: PF 2.66, total_return +63%, avg_win $14.4k vs avg_loss $1.9k, low 0.26 win rate expected for this style.
Per-trade edge enormous vs cost: avg_trade_return_pct 17.4% of notional, commission only 0.97% of gross — nowhere near fee-fragile on the expensive spot venue.
Genuinely selective, not buy-hold beta: beta 0.096, exposure 32%, max_DD 19.7% (well under the L49 <40-trade/>50%-DD trap); on the favorable spot volume-confirmed-momentum class currently advancing.
Deliberately small 3-parameter coarse-grid surface directly targeting the overfit/PBO death mode.
Only 27 trades over 7.6 years — below the ~40-60 projected. A 3-window walk-forward gets ~9 trades/window and the holdout ~5, so the optimization will be statistically underpowered and deflated-Sharpe/holdout is the real hurdle ahead.
Sharpe 0.52 is modest; alpha slightly negative (-0.016) and information_ratio -0.91 vs an extremely bullish LINK buy-hold — the risk-adjusted headroom over the benchmark is thin.
Calm vol tercile is negative (-2.2%); most of the return comes from the stressed tercile (+48.5%), so the edge is concentrated in a few big trend legs.
Analysis
Trades faithfully implement the hypothesis: 26-27 long-only spot trades, 0 shorts, ~32-day holds, regime+surge-gated — a clean, low-turnover trend follower.
Sensitivity grid is flat with zero cliff parameters (~0.49 Sharpe everywhere), and per-trade economics clear the spot fee floor by a wide margin (multi-week holds, no fee-fragility).
Catastrophic out-of-sample collapse: walk-forward is_overfitted=true with IS Sharpe 0.856 falling to OOS -3.19, and ALL three OOS windows deeply negative (-3.14 / -3.93 / -2.50).
PBO 0.704 > 0.5 — parameter selection is more likely than not overfitting.
Holdout only 3 trades (< 10 min) — forward window is statistically empty; oos_vault flagged UNDERPOWERED (~5 expected trades) — the strategy is structurally too slow (26 trades / 6.7 years) to validate out-of-sample.
Flat sensitivity grid combined with uniformly negative walk-forward OOS means the in-sample Sharpe is a fit to favorable paths, not a robust parameter region to tune toward.
Benjamini-Hochberg at q=0.10 over 240 programme candidates keeps 3. A candidate that does not survive here is not distinguishable from the programme's own noise, however good its individual statistics look.
Outcome Summary
26 trades over 6.7 years is too slow to validate OOS — optimization only curve-fits noise.
Abandoned at ANALYZING on overfit/no-generalization: is_overfitted=true, OOS Sharpe ≤ 0, PBO 0.70, holdout 3 trades, deflated Sharpe 0.008.
A long-only spot daily-momentum trend follower on LINKUSDT.BINANCE_SPOT that only engaged when a weekly uptrend regime, positive ATR-scaled daily momentum, and above-median volume participation all aligned.
Initial backtest: 27 long trades, +63.2% return, Sharpe 0.52, PF 2.66, 19.7% max DD; optimized to +99.1% and Sharpe 0.69, but walk-forward IS Sharpe 0.856 → OOS -3.19.
Backtest and paper results are hypothetical. Trading involves risk of loss.