Skip to content

View translation

UniAroonOscillatorBullishTrendConfirmationLong4H

Hypotheses

UNI 4H Aroon Oscillator Bullish Trend Confirmation Long

Hypotheses

A long-only single-instrument TREND-CONFIRMATION strategy on UNIUSDT perpetual futures (Binance USD-M) using the Aroon Oscillator on 4-hour bars. CRITICAL DESIGN CHOICES driven by 6+ consecutive supplementary-data failures plus mean-reversion/contrarian-short failures: (a) ZERO supplementary data dependency — pure 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 — UNI (Uniswap) is not in the current portfolio of ADA/AVAX/BNB/BTC/DOT/ETH/LINK/LTC/SOL and it represents a distinct DeFi sector (DEX governance token), uncorrelated to the L1/L2/payments/oracle/meme alts already represented. (e) NEW mechanism — Aroon Oscillator 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 moving-average-based system (Hull/EMA/SMA crosses). Aroon (Tushar Chande 1995) measures TIME-SINCE-EXTREME rather than price-vs-MA: Aroon Up = 100 × (period − bars_since_highest_high) / period. When the most recent high is very recent AND the most recent low is far away, the trend is strongly up. This is a fundamentally different signal source. (f) MAXIMALLY SIMPLE — single meaningful parameter (Aroon period = 14, canonical Chande default).

Hypotheses

Iteration 4 fixes the Layer-2 failure: the two extreme-index helpers were @staticmethod, but Layer-2's _StrategyProxy rebinds class methods as instance methods, stripping the staticmethod descriptor so `self._idx_last_max(highs_w)` passed 2 positional args to a 1-arg function (TypeError across all six synthetic scenarios). The minimal, regression-free fix moves `_idx_last_max`/`_idx_last_min` to module-level functions and calls them without `self.` — binding is impossible, so the TypeError cannot recur. All signal math, sizing, imports, and class structure are otherwise byte-identical to previous_code, preserving the already-passing Layer 1 static checks and the continuous non-frozen Aroon signal.

Hypotheses

Fundamentally negative edge, not an optimization candidate. Over 431 trades / 5.5 years the base has Sharpe -0.497, profit_factor 0.883 (<1, net-of-fee losing), total_return -28.4%, negative alpha (-0.06), and loses in 5 of 7 years across multiple regimes. The implementation is correct and faithful to the hypothesis (431 long-only trades, pure OHLCV, non-frozen signal), so this is not a code bug to iterate on — the premise (Aroon oscillator confirming a tradable bullish trend on UNI 4H) simply has no edge. With a single meaningful parameter and a PF-0.88 losing base, optimization has no robust region to find; a 2-hour best-of-N sweep would only curve-fit noise onto a negative-expectancy mechanism. FAILURE PATTERN: single-asset Aroon long-only trend-confirmation on an alt perp yields a genuinely negative base edge (mirrors the abandoned ADA 4H Aroon sibling) — the time-since-extreme trend family is not producing edge on single alts and should not be re-attempted per-symbol.

Implementation

Long-only trend-confirmation on UNIUSDT Binance USD-M perpetual, 4H bars. Uses Tushar Chande's Aroon Oscillator (Aroon Up minus Aroon Down over a 14-bar window) as a continuous [-100,+100] signal that measures time-since-extreme. Enters long when the oscillator is strongly positive (>= entry_osc), exits when the trend weakens (<= exit_osc) or on stop-loss / take-profit / time stop. Pure OHLCV, zero supplementary-data dependency, equity-relative sizing, leverage 1.0.

Verification Results

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['tp_pct', 'exit_osc', 'risk_pct', 'stop_pct', 'entry_osc', 'aroon_period', 'min_notional', 'notional_pct', 'max_hold_bars'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: UniAroonOscillatorBullishTrendConfirmationLong4H._idx_last_max() takes 1 positional argument but 2 were given (bar timestamp: 1735691340000) - steady_downtrend: TypeError: UniAroonOscillatorBullishTrendConfirmationLong4H._idx_last_max() takes 1 positional argument but 2 were given (bar timestamp: 1735691340000) - flat_ranging: TypeError: UniAroonOscillatorBullishTrendConfirmationLong4H._idx_last_max() takes 1 positional argument but 2 were given (bar timestamp: 1735691340000) - volatility_spike: TypeError: UniAroonOscillatorBullishTrendConfirmationLong4H._idx_last_max() takes 1 positional argument but 2 were given (bar timestamp: 1735691340000) - zero_volume: TypeError: UniAroonOscillatorBullishTrendConfirmationLong4H._idx_last_max() takes 1 positional argument but 2 were given (bar timestamp: 1735691340000) - price_gap: TypeError: UniAroonOscillatorBullishTrendConfirmationLong4H._idx_last_max() takes 1 positional argument but 2 were given (bar timestamp: 1735691340000)

Backtest Review

Implementation is clean and matches the hypothesis: 431 long-only trades, 0 shorts, pure OHLCV with zero supplementary-data dependency, continuous bar-varying Aroon signal (no frozen-signal risk).

Backtest Review

Large trade sample (431) over 5.5 years — results are statistically meaningful, not small-sample noise.

Backtest Review

Entry pipeline is healthy: 431 signaled, 431 submitted, 0 dropped on size/cash/min-notional.

Backtest Review

Negative edge over the full period: Sharpe -0.497, profit_factor 0.883 (<1, losing after fees), total_return -28.4%, CAGR -10.1%.

Backtest Review

Negative alpha (-0.06) and negative Sortino (-0.87) — the strategy adds no risk-adjusted value versus its benchmark exposure.

Backtest Review

Loses in 5 of 7 calendar years across distinct regimes (2021 -10%, 2022 -26%, 2023 -12%, 2026 -21%) — not a single bad regime, a structural no-edge.

Backtest Review

50.4% max drawdown with a 1,936-day (5+ year) underwater duration; win rate only 35%, max 13 consecutive losses.

Backtest Review

Only one meaningful parameter (Aroon period) plus entry/exit thresholds — no rich robust region for optimization to exploit from a losing base.

Analysis

The submitted strategy_code does NOT implement this hypothesis — the wrong file was attached. The hypothesis is 'UNI 4H Aroon Oscillator Bullish Trend Confirmation Long' (long-only, single-instrument, OHLCV-only, UNIUSDT-PERP on 4H bars, Aroon Oscillator signal). But the code is class EthBtcRatioZScoreMeanReversionPairs — a market-neutral, two-instrument, long/short ETH/BTC ratio z-score mean-reversion pairs trade on BTCUSDT+ETHUSDT DAILY bars. The backtest config confirms it ran that: instrument_id=BTCUSDT.BINANCE, extra_instruments=[ETHUSDT.BINANCE], 1-DAY bars, balanced 53 long / 53 short legs — there is no UNI, no 4H, no Aroon, and no long-only logic in what was tested. ACTION: resubmit the actual UNI 4H Aroon Oscillator long-only strategy code (single instrument UNIUSDT.BINANCE-4-HOUR, no extra instruments, Aroon Up/Down oscillator entry, long-only) and re-run the backtest before any optimization. Separately, do NOT just resubmit the ETH/BTC ratio-MR code instead: that family has been repeatedly shown to have no edge (a sibling was abandoned with a wholly-negative Sharpe CI), and this run of it also loses (PF 0.95, Sharpe -0.22, total -11.8%). The hypothesis itself has not been tested — fix the file mismatch first.

Outcome Summary

UniAroonOscillatorBullishTrendConfirmationLong4H was engineered around a long list of prior failures — pure OHLCV to dodge supplementary-data kills, a new DeFi-sector symbol (UNI), and a structurally distinct indicator (Chande's Aroon Oscillator) measuring time-since-extreme rather than price-versus-MA. The implementation was clean and faithful to the hypothesis, producing 431 long-only trades over 5.5 years, but the edge was fundamentally negative: Sharpe -0.497, profit factor 0.883, total return -28.4%, losing in 5 of 7 years with a 50% max drawdown. The backtest-review gate abandoned it before optimization, judging the premise — Aroon confirming a tradable bullish trend on UNI 4H — simply edgeless, with a single meaningful parameter and a PF-0.88 base offering nothing for a best-of-N sweep to find but noise. It was flagged as a failure pattern for the time-since-extreme trend family on single alts, echoing the abandoned ADA 4H Aroon sibling.

Outcome Summary

The Aroon (time-since-extreme) long-only trend-confirmation family produces genuinely negative base edges on single alt perps — mirroring the abandoned ADA 4H Aroon sibling — so it should not be re-attempted symbol-by-symbol; a correct, faithful implementation of a no-edge mechanism cannot be optimized into profitability.

Outcome Summary

The backtest-review gate abandoned it before optimization: it failed on alpha, Sharpe, max drawdown, total return and profit factor, and with a faithful implementation (431 long-only trades, pure OHLCV, non-frozen signal) the problem was the premise, not a bug — the Aroon time-since-extreme trend-confirmation had no tradable edge on UNI, so with one meaningful parameter and a losing base there was no robust region for optimization to exploit.

Outcome Summary

A long-only, single-instrument trend-confirmation strategy on UNIUSDT.BINANCE USD-M perp (4H bars, pure OHLCV) using Tushar Chande's Aroon Oscillator — entering long when the oscillator signaled a strong, fresh uptrend (recent high, distant low) and exiting on trend weakening or stop/take-profit/time stops — deliberately chosen as a new symbol, a new indicator family, and zero supplementary-data dependency after repeated supplementary and mean-reversion failures.

Outcome Summary

Over 431 long-only trades across ~5.5 years it had a fundamentally negative edge: total return -28.4%, CAGR -10.1%, Sharpe -0.497, profit factor 0.883 (losing after fees), negative alpha (-0.06) and Sortino (-0.87), a 35% win rate, 50.4% max drawdown, and losses in 5 of 7 calendar years across distinct regimes.

Iteration History

EthBtcRatioZScoreMeanReversionPairs

Iteration History

Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['exit_zscore', 'min_notional', 'max_hold_days', 'stop_loss_pct', 'per_leg_notional', 'profit_target_pct', 'ratio_lookback_days', 'ratio_zscore_threshold'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: Frozen signal: all 409 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - steady_downtrend: Frozen signal: all 409 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - flat_ranging: Frozen signal: all 409 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - volatility_spike: Frozen signal: all 409 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - zero_volume: Frozen signal: all 409 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - price_gap: Frozen signal: all 409 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.
Strategy report

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