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)
Backtest and paper results are hypothetical. Trading involves risk of loss.