Skip to content

View original

EthDailyGoldenCrossMomentumAtrTrail

Hypotheses

ETH Daily Golden Cross Momentum with ATR Trailing Stop

Hypotheses

A simple long-only trend-following strategy on ETHUSDT perpetual futures using daily bars. Enters long when a fast EMA crosses above a slow EMA in the context of a confirmed long-term uptrend (price above 200-day SMA), then rides the trend with an ATR-based trailing stop. Designed deliberately as a low-parameter, single-instrument, bars-only strategy to avoid the Layer-2 verification timeouts that have plagued recent multi-instrument pairs and supplementary-data strategies. ETH is chosen over BTC because BTC mean-reversion is already in the pipeline (BtcZScoreDipBuyUptrend) and we need style/instrument diversity. ETH has well-documented trend persistence during bull regimes (e.g., 2020-2021, 2023-2024 rallies) and the daily timeframe means ~3-8 trades per year with average winners of 20-40% — vastly exceeding the 0.10% round-trip futures fee. Total of 4 strategy parameters: ema_fast, ema_slow, atr_period, atr_mult.

Hypotheses

Layer-1 reported no FactoryStrategy subclass and all four required methods missing because the previous submission's code was lost in transit (previous_code arrived as '...'). This iteration restores the full implementation exactly as the hypothesis specifies: one class extending FactoryStrategy with calculate_signal, should_enter, should_exit and position_size all fully implemented; four core parameters (ema_fast, ema_slow, atr_period, atr_mult) plus the 200-day trend filter and the sizing fraction. Kept on ETHUSDT.BINANCE per the hypothesis's declared perpetual-futures venue; leverage stays 1.0 and is not referenced in sizing, so there is no inert-leverage issue. EMAs are computed over a bounded tail (O(period) per bar, not O(history)) to stay well inside the Layer-3 wall clock, and the daily golden-cross/200-SMA conjunction fires several times per year over ETH's multi-year daily history, well above the sandbox's >=1 trade requirement.

Hypotheses

Long-only EMA golden-cross momentum clone with a promotion-disqualifying drawdown, a fee-fragile profit factor, no significance, and artifact-contaminated headline — decisive abandon, not worth 2 hours. max_drawdown is 58.4% with CI to 80.5%, past the L19 >50% hard-abandon line, on a 7.5% CAGR (recovery_factor 0.84). profit_factor is 1.07, in the L18 fee-fragile band, and trading costs are large (commission 6.51% of gross, impact_cost_pct 21.2%), so the gross edge sits inside costs. It is not significant: Sharpe 0.474 with bootstrap CI [-0.228, 1.149] straddling zero, PSR 0.848. The +218% total is contaminated and inflated: return_kurtosis 100 with implausible single-day prints (2021-03-24 +108.8%, 2021-05-19 +29%) and avg_position_pct 127% on a nominally 60% long-only stake indicate a sizing/mark artifact, and end_unrealized_pct 164 means most of the headline is open-position unrealized (realized ≈ +54%). It loses in 4 of 7 years (2020/2022/2023/2024), carried by 2021 and 2025, with a -44.8% china-ban stress window. This is the EMA golden-cross / MA-momentum trend clone the factory has repeatedly killed (L41) crossed with the L30/L63 breakout graveyard. No parameter tuning fixes a >50%-drawdown, PF-1.07 momentum clone. Failure pattern: risk_reject/overfit long-only momentum clone, >50% DD, fee-fragile (L19/L18/L41).

Implementation

Long-only daily trend follower on ETHUSDT.BINANCE (USD-M perp). Enters long when the 20-EMA is above the 50-EMA (golden-cross state) AND the close is above the 200-day SMA, confirming a long-term uptrend. Rides the trend with an ATR(14) trailing stop at 3xATR below the highest close reached since entry, and also exits on a death cross (EMA spread turning negative). calculate_signal returns the continuous EMA spread ((fast-slow)/slow in percent) every bar; should_enter thresholds it against entry_spread_pct together with the cached 200-SMA filter. Sizing is 60% of account equity at 1x leverage. OHLCV-only, single instrument, daily bars, no supplementary data.

Verification Results

Verification failed (Layer 1 — static analysis): - No class extending FactoryStrategy found (line None) - Required method not implemented: position_size (line None) - Required method not implemented: should_exit (line None) - Required method not implemented: should_enter (line None) - Required method not implemented: calculate_signal (line None)

Backtest Review

Simple, clean 4-parameter single-instrument OHLCV construction; measured sample (317 trades); no liquidation

Backtest Review

avg_trade_return_pct 1.196% nominally clears fees

Backtest Review

max_drawdown 58.4% (CI to 80.5%) — past the L19 >50% hard-abandon line; recovery_factor 0.84

Backtest Review

profit_factor 1.07 — L18 fee-fragile zone; commission 6.51% of gross and impact_cost_pct 21.2% consume most of the edge

Backtest Review

Sharpe 0.474 with CI [-0.228, 1.149] straddling zero, PSR 0.848 — not significant

Backtest Review

Outlier/artifact contaminated (kurtosis 100, +108.8% single day, avg_position_pct 127% on a 60% long-only stake); end_unrealized_pct 164 (headline mostly unrealized); loses in 4 of 7 years; EMA-cross momentum clone (dead class)

Iteration History

EthDailyGoldenCrossAtrTrailLong

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['atr_mult', 'ema_fast', 'ema_slow', 'atr_period', 'sma_period', 'min_notional', 'equity_fraction'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: EthDailyGoldenCrossAtrTrailLong._ema() takes 2 positional arguments but 3 were given (bar timestamp: 1735701660000) - steady_downtrend: TypeError: EthDailyGoldenCrossAtrTrailLong._ema() takes 2 positional arguments but 3 were given (bar timestamp: 1735701660000) - flat_ranging: TypeError: EthDailyGoldenCrossAtrTrailLong._ema() takes 2 positional arguments but 3 were given (bar timestamp: 1735701660000) - volatility_spike: TypeError: EthDailyGoldenCrossAtrTrailLong._ema() takes 2 positional arguments but 3 were given (bar timestamp: 1735701660000) - zero_volume: TypeError: EthDailyGoldenCrossAtrTrailLong._ema() takes 2 positional arguments but 3 were given (bar timestamp: 1735701660000) - price_gap: TypeError: EthDailyGoldenCrossAtrTrailLong._ema() takes 2 positional arguments but 3 were given (bar timestamp: 1735701660000)
Strategy report

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