DogeTripleScreenWeeklyTrendDailyPullbackLong
Hypotheses
DOGE Multi-Timeframe Weekly-Trend + Daily-Pullback Long (Triple Screen)
Hypotheses
A LONG-ONLY multi-timeframe strategy on DOGEUSDT.BINANCE perpetual futures (Binance USD-M) using BOTH WEEKLY bars (trend filter) and DAILY bars (entry timing). The mechanism is Alexander Elder's 'Triple Screen Trading System' (Elder 1993 'Trading for a Living', refined in 'New Trading for a Living' 2014): higher timeframe defines the regime, lower timeframe times the entry. Specifically: enter long DOGE on the daily bar when (a) the WEEKLY trend is confirmed UP (weekly close > weekly 10-period SMA, weekly 10-SMA > weekly 40-SMA), AND (b) today's DAILY close has pulled back below the daily 20-SMA (short-term oversold within long-term uptrend). Exit on daily reclaim of the 20-SMA, ATR-based stop, or 10-day time-stop. This is structurally distinct from every pipeline strategy and every session-failed mechanism: (1) ALL 12 pipeline strategies use a SINGLE timeframe — this is the first multi-timeframe strategy; (2) DOGE has ZERO pipeline exposure (instrument diversification); (3) the combined trend+pullback signal is fundamentally different from pure trend-following (Tier 1 failed 4x), pure breakouts (Tier 2 failed 3x), pure mean reversion (sub-daily MR failed), and from the XRP 20-SMA pullback (which uses only daily, no weekly trend filter). DOGE is the chosen instrument because: (1) listed on Binance USD-M since July 2020 (5+ years multi-year data), (2) NOT deprecated — DOGE is one of the most actively traded crypto majors and is even on Binance Options (BTC/ETH/BNB/SOL/XRP/DOGE per data infrastructure spec), (3) DOGE has distinct explosive-cycle microstructure (Elon-tweet/meme-driven moves) that produces especially clean weekly trends when they occur, (4) DOGE's higher volatility (~80-120% annualized vs BTC's ~60%) means meaningful per-trade moves of 5-10% can develop within the 10-day holding window, easily clearing fee drag. The dual-timeframe filter is the structural answer to the session's failed-mechanism pattern: requiring TWO independent confirmations (weekly trend + daily pullback) before entering naturally filters out the chop-regime whipsaws that killed pure single-timeframe trend-following strategies.
Hypotheses
Implements Elder's Triple Screen exactly: the weekly timeframe defines the regime and the daily timeframe times the entry. DOGE is fed on two timeframes for the same instrument — daily as primary bar_type (self._bars), weekly as an extra bar type (self._extra_bars) — so mid-week daily bars only see the last completed weekly bar (no lookahead). Iteration-6 change is minimal and forward-only: signal/entry/exit/sizing logic, parameters, and imports are unchanged from the passing iteration-5 code; the only edit hoists the SMA/ATR helpers from nested/instance scope to MODULE-LEVEL free functions (_sma_calc/_atr_calc). This permanently eliminates the reported `_sma() takes 2 positional arguments but 3 were given` failure: the Layer-2 _StrategyProxy re-binds every callable found via dir(instance) as a MethodType with an injected self, but module-level functions are never instance attributes, never appear in dir(), and are therefore never proxied. Verified directly against StrategyVerifier.run_synthetic — passes all six synthetic scenarios — and against run_static (Layer 1 clean, only guarded-division warnings).
Hypotheses
Statistically empty result — not worth 2 hours of optimization. The triple-screen produced only 22 trades over a 6.1-year window (far below the ~100-trade measurability floor, L10), so a 3-window walk-forward plus holdout would have single-digit trades per fold and the optimizer would curve-fit noise. There is no significant edge to tune toward: Sharpe 0.246 with bootstrap CI [-0.56, 1.01] straddling zero, PSR 0.66, information_ratio -0.81 (underperforms its equal-weight benchmark). It is also economically negligible — total_return 2.57% over 6 years (~0.45% CAGR) with exposure_pct 7.47% (capital idle 92% of the time) — so even the positive per-trade edge (avg_trade_return_pct 2.39%, PF 1.28) cannot clear the promotion Sharpe/return floors. The low trade count is structural: a single-name weekly-trend + daily-pullback triple screen fires only a handful of times per year, and no parameter change within the optimizer's reach lifts it to a measurable sample without abandoning the mechanism. Failure pattern: overfit/no_edge low-trade-count single-name (L10) — unmeasured Sharpe, negligible return.
Implementation
Long-only multi-timeframe Triple Screen on DOGEUSDT.BINANCE perpetual futures. Screen 1 (weekly bars): confirms an up-regime when weekly close > weekly SMA(10) and weekly SMA(10) > weekly SMA(40). Screen 2 (daily bars): within that up-regime, enters long when the daily close pulls back below the daily SMA(20) — a short-term dip inside the long-term uptrend. Screen 3: exits on daily reclaim of the SMA(20), a 2.5x-ATR stop measured from the entry ATR, or a 10-day time stop. Position sizing is capital-relative (2% equity risk / ATR stop distance), capped at 1x equity notional.
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.
Backtest Review
Correct multi-timeframe implementation (no lookahead in the weekly filter); low drawdown (3.07%) and positive per-trade edge (avg_trade_return_pct 2.39%, PF 1.28) that clears fees
Backtest Review
Long-only spot-style trend-pullback is not a fee-dead or blowup mechanism
Backtest Review
Only 22 trades over 6.1 years — far below the ~100-trade measurability floor (L10); optimization would fit noise across single-digit-trade walk-forward folds
Backtest Review
No significant edge: Sharpe 0.246 with CI [-0.56, 1.01] straddling zero, PSR 0.66, information_ratio -0.81 (underperforms its benchmark)
Backtest Review
Economically negligible: total_return 2.57% over 6 years (~0.45% CAGR), exposure_pct 7.47% — capital idle 92% of the time
Backtest Review
Trade count is structurally capped by a single-name weekly+daily triple-screen; no parameter tuning reaches a measurable sample without abandoning the mechanism
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['risk_pct', 'daily_sma', 'atr_period', 'weekly_fast', 'weekly_slow', 'min_notional', 'atr_stop_mult', 'time_stop_days', 'max_notional_frac']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: DogeTripleScreenWeeklyTrendDailyPullbackLong._sma() takes 2 positional arguments but 3 were given (bar timestamp: 1735690800000)
- steady_downtrend: TypeError: DogeTripleScreenWeeklyTrendDailyPullbackLong._sma() takes 2 positional arguments but 3 were given (bar timestamp: 1735690800000)
- flat_ranging: TypeError: DogeTripleScreenWeeklyTrendDailyPullbackLong._sma() takes 2 positional arguments but 3 were given (bar timestamp: 1735690800000)
- volatility_spike: TypeError: DogeTripleScreenWeeklyTrendDailyPullbackLong._sma() takes 2 positional arguments but 3 were given (bar timestamp: 1735690800000)
- zero_volume: TypeError: DogeTripleScreenWeeklyTrendDailyPullbackLong._sma() takes 2 positional arguments but 3 were given (bar timestamp: 1735690800000)
- price_gap: TypeError: DogeTripleScreenWeeklyTrendDailyPullbackLong._sma() takes 2 positional arguments but 3 were given (bar timestamp: 1735690800000)
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).
Backtest and paper results are hypothetical. Trading involves risk of loss.