Skip to content

View translation

DotFourHourHullMaSlopeTrendLong

Hypotheses

DOT 4H Hull Moving Average Slope Trend-Following Long

Hypotheses

A long-only single-instrument TREND-FOLLOWING strategy on DOTUSDT perpetual futures (Binance USD-M) using the Hull Moving Average (HMA) on 4-hour bars. CRITICAL DESIGN CHOICES locked in by the now-decisive feedback: (a) ZERO supplementary data dependency — 6 consecutive supp-data hypotheses failed (ETH liquidations, BTC taker_ratio, DOGE OI, BTC OI, XRP premium_index, AVAX taker_ratio); this strategy uses ONLY OHLCV. (b) NOT mean reversion (failed on alt perps), NOT contrarian short (failed on BTC funding). (c) 4H + Binance USD-M — the empirically proven verification combination. (d) NEW symbol — DOT (Polkadot) is not in the current portfolio of ADA/AVAX/BNB/BTC/ETH/LINK/LTC/NEAR/SOL. (e) NEW mechanism — Hull MA is structurally distinct from every other in-pipeline indicator: it's NOT a channel (Donchian/Keltner), NOT volume-based, NOT MACD, NOT Supertrend, NOT a basic EMA crossover. Hull MA (Hull 2005) uses a recursive weighted-moving-average construction that reduces lag without sacrificing smoothness — it tracks trend turns ~3-5 bars earlier than a same-period SMA/EMA while suppressing the same intrabar noise. (f) MAXIMALLY SIMPLE — just ONE meaningful parameter (HMA period = 20, canonical default) plus standard fixed exits (4% stop, 10-day time stop).

Hypotheses

Iteration 2 fixes the Layer-2 TypeError with the smallest possible change and no regression to earlier layers. Root cause: _rolling_wma was a @staticmethod, but the Layer-2 synthetic proxy rebinds class methods as instance methods, so self._rolling_wma(values, period) was called with an injected self ('takes 2 positional arguments but 3 were given') and every scenario crashed before producing a signal. Following the codebase's established convention (module-level helpers are Layer-2-proxy-safe), _rolling_wma is now a module-level function called directly from _hma_series; the HMA formula, the normalized-slope signal, and all entry/exit/sizing logic are byte-for-byte unchanged. Verified against the actual synthetic generators: all six scenarios now run without error and the HMA slope varies (470/468 unique values), correctly positive in uptrends and negative in downtrends. Imports remain clean (math, numpy), so Layer 1 stays green; only the proxy-incompatible method binding was removed.

Hypotheses

Fundamentally money-losing with no edge to optimize toward: profit_factor 0.899, Sharpe -0.63, total_return -88.5%, CAGR -31%, max_drawdown 94.9%, and a deeply negative avg_trade_return/expectancy (-124) across an adequate 714-trade / 687-day sample. This is not a thin-sample or below-fees-density problem — the bare HMA-slope-flip long-only mechanism has NEGATIVE expectancy because it whipsaws (33.8% win rate, 714 round-trips, 9.57% commission drag) on choppy DOT, buying every up-slope and getting stopped/flipped on every reversal with no trend/regime filter. Optimizing the single HMA period or fixed stop/time-stop cannot convert a -0.63 Sharpe / 0.90 PF whipsaw into a positive edge; it would only curve-fit to the few 2021/2023 trend bursts already swamped by the chop. The code is sound (correct long-only spot routing, OHLCV-only, trades match the hypothesis) — the HYPOTHESIS is the failure: a lag-reduced MA does not create a trend edge on a mean-reverting alt, and long-only-spot means every DOT downtrend is eaten with no short side to offset. Do not spend optimization compute here.

Implementation

Long-only DOT 4H Hull Moving Average slope trend follower (OHLCV-only) on BINANCE_SPOT (CASH, leverage 1.0). It computes HMA(20) via the nested weighted-MA construction, enters LONG when the normalized HMA slope is positive (trend rising), and exits when the slope rolls over (≤0), a 4% protective stop trips, or a 60-bar (~10-day) time stop elapses. Risk-based sizing (2% of equity to the 4% stop, capped at 1x equity notional). One meaningful parameter (hma_period); zero supplementary data.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['risk_pct', 'hma_period', 'min_notional', 'max_hold_bars', 'stop_loss_pct', 'slope_lookback'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: DotFourHourHullMaSlopeTrendLong._rolling_wma() takes 2 positional arguments but 3 were given (bar timestamp: 1735691340000) - steady_downtrend: TypeError: DotFourHourHullMaSlopeTrendLong._rolling_wma() takes 2 positional arguments but 3 were given (bar timestamp: 1735691340000) - flat_ranging: TypeError: DotFourHourHullMaSlopeTrendLong._rolling_wma() takes 2 positional arguments but 3 were given (bar timestamp: 1735691340000) - volatility_spike: TypeError: DotFourHourHullMaSlopeTrendLong._rolling_wma() takes 2 positional arguments but 3 were given (bar timestamp: 1735691340000) - zero_volume: TypeError: DotFourHourHullMaSlopeTrendLong._rolling_wma() takes 2 positional arguments but 3 were given (bar timestamp: 1735691340000) - price_gap: TypeError: DotFourHourHullMaSlopeTrendLong._rolling_wma() takes 2 positional arguments but 3 were given (bar timestamp: 1735691340000)

Backtest Review

Clean OHLCV-only implementation, no supplementary-data dependency (correctly heeds the 6-failure feedback)

Backtest Review

Functions correctly: 714 long entries / 0 shorts, trades match the long-only HMA-slope hypothesis, 0 dropped (size/notional), metrics_reliable=true

Backtest Review

Adequate sample (714 trades / 687 days) — the failure is genuine no-edge, not thin-sample noise

Backtest Review

Decisively money-losing: profit_factor 0.899, Sharpe -0.63, Sortino -1.71, total_return -88.5%, CAGR -31%

Backtest Review

avg_trade_return / expectancy -124 (deeply negative) — edge is below zero, not merely below fees

Backtest Review

max_drawdown 94.9% (CI 72-99.6%) with a 1905-day recovery duration — catastrophic risk

Backtest Review

Negative alpha (-0.22) and information_ratio (-0.55) vs buy-hold; negative in 4 of 7 years

Backtest Review

Bare slope-flip entry/exit whipsaws (33.8% win rate, 714 round-trips, commission 9.57% of gross) — no trend filter to suppress chop

Backtest Review

negative (expectancy -124)

Backtest Review

> 0.25% (spot)

Outcome Summary

DotFourHourHullMaSlopeTrendLong applied the lag-reduced Hull Moving Average as a one-parameter slope trend-follower on a fresh symbol (DOT), carefully heeding the session's feedback by using only OHLCV and routing long-only to spot. The implementation was clean and faithful to the hypothesis, but the mechanism failed decisively: with no trend or regime filter, the bare slope-flip whipsawed on choppy DOT, producing 714 round-trips at a 34% win rate, negative -$124/trade expectancy, an 88.5% loss, and a near-total 94.9% drawdown. The reviewer abandoned it pre-optimization, concluding the adequate sample proves a genuine negative edge rather than thin-sample noise — a lag-reduced MA cannot manufacture trend on a mean-reverting alt, and long-only-spot has no short side to offset DOT's downtrends. With the code sound and the hypothesis itself the failure (and already iteration 2 after only a Layer-2 fix), optimization compute was explicitly declined.

Outcome Summary

A faster, lag-reduced moving average does not by itself create a trend edge on a mean-reverting alt — without a trend/regime filter a bare slope-flip entry whipsaws to negative expectancy (PF 0.90, 34% win rate, 9.6% fee drag) and, long-only on spot, absorbs every downtrend with a near-total drawdown; the failure is the hypothesis, not the code, so optimization can't rescue it.

Outcome Summary

The analyst abandoned it at the backtest-review gate as fundamentally negative-expectancy with no edge to optimize toward: the bare HMA-slope-flip whipsaws on choppy DOT — buying every up-slope and getting stopped/flipped on reversals with no trend/regime filter — so a lag-reduced MA cannot create a trend edge on a mean-reverting alt, and long-only-spot eats every downtrend with no short side to offset.

Outcome Summary

A long-only, OHLCV-only trend-following strategy on DOT 4H spot (BINANCE_SPOT, leverage 1.0) using the Hull Moving Average — go long when the HMA slope is rising and exit when the slope rolls over, with a 4% stop and 10-day time stop — chosen as a maximally simple one-parameter mechanism on a new symbol, deliberately avoiding the 6 consecutive supplementary-data failures by using pure price.

Outcome Summary

It was decisively money-losing with catastrophic risk over an adequate 714-trade / 687-day sample: -88.5% total return, CAGR -31%, Sharpe -0.63, profit factor 0.90, 33.8% win rate, expectancy -$124/trade, 94.9% max drawdown (CI 72–99.6%), negative alpha -0.22, commission 9.57% of gross, negative in 4 of 7 years; execution was clean (714/714 submitted, metrics_reliable=true).
Strategy report

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