← Alle Insights

ADX & DMI: Trend-Stärke systematisch messen.

ADX misst nicht, wohin der Markt geht — er misst, wie entschieden er sich bewegt. Wer das versteht, hat einen der wenigen wirklich nützlichen Filter im Indikator-Zoo. Wer ADX als Long/Short-Trigger missbraucht, hat ihn nicht verstanden.

Was Wilder mit ADX und DMI eigentlich gebaut hat.

J. Welles Wilder veröffentlichte 1978 in „New Concepts in Technical Trading Systems" einen ganzen Stack — RSI, ATR, Parabolic SAR, und eben das Directional Movement System (DMS). Daraus stammen DMI (Directional Movement Index) und ADX (Average Directional Index).

Die Grundgrößen sind Plus-DM und Minus-DM, also der gerichtete Anteil der Bewegung zwischen zwei Bars:

+DM = max(High − High_prev, 0)   falls High − High_prev > Low_prev − Low, sonst 0
−DM = max(Low_prev − Low, 0)     falls Low_prev − Low > High − High_prev, sonst 0
TR  = max(High − Low, |High − Close_prev|, |Low − Close_prev|)

+DI = 100 * Wilder_MA(+DM, 14) / Wilder_MA(TR, 14)
−DI = 100 * Wilder_MA(−DM, 14) / Wilder_MA(TR, 14)
DX  = 100 * |+DI − −DI| / (+DI + −DI)
ADX = Wilder_MA(DX, 14)

Wichtig: ADX ist richtungslos. Ein ADX von 40 bedeutet starker Trend — ob nach oben oder nach unten, sagt allein der Vergleich von +DI und −DI. Wer ADX als Long-Signal interpretiert, weil „der Wert hoch ist", liegt strukturell falsch.

ADX über 25: Mythos und Realität.

Die Lehrbuch-Regel: ADX über 25 = Trend, unter 20 = Range. Klingt sauber, ist aber empirisch wackelig. Ich habe ADX(14) auf Daily-Daten von SPX, DAX, Gold, EUR/USD und Bitcoin von 2005 bis heute analysiert. Drei Befunde:

Brauchbar wird ADX erst, wenn Sie die Schwelle empirisch auf das jeweilige Instrument kalibrieren und ADX nur als Filter, nicht als Trigger verwenden.

+DI und −DI: das nutzbare Richtungs-Signal.

Während ADX nur die Stärke misst, geben +DI und −DI die Richtung. Klassisch:

Als isolierte Strategie auf SPX-Daily seit 2010: rund 47 % Trefferquote, Profit-Faktor knapp über 1.0, Sharpe um 0,2. Mit anderen Worten: nutzlos. Die +DI/−DI-Crosses sind zu häufig und zu unscharf. Sie produzieren in choppy Phasen Whipsaws im Wochentakt.

Was die Crosses retten kann, ist eine sehr restriktive Filterung. Bei mir muss zusätzlich der Wert von ADX selbst steigen (also DX über seinem 14-Bar-Mittel), und der Schlusskurs muss auf der korrekten Seite einer 50- oder 100-Tage-Linie liegen. Damit schrumpft die Trade-Anzahl drastisch, aber die Profit-Faktor-Werte landen in einer verwertbaren Größenordnung.

ADX als Regime-Filter — die ehrliche Verwendung.

Die saubere Anwendung von ADX ist nicht der direkte Trade, sondern die Aktivierung anderer Strategien. Konkret:

Das ist nicht spektakulär — aber es vermeidet, dass meine Trendfolge-Module in Range-Phasen verbluten und meine Mean-Reversion-Module in echten Trends gegen die Bewegung kämpfen. Allein dieser Filter verbessert den Sharpe meiner Multi-Strategie- Bücher um etwa 0,3.

ADX-Kombinationen, die ich nutze.

ADX + 200-Tage-Linie als Trend-Stack

Klassisch und robust: Long-Setups laufen nur, wenn Kurs über 200-Tage-Linie und ADX steigend. Short-Setups invers. Wenn ADX flach im niedrigen Bereich verharrt, gar nichts. Das ist eine 80/20-Pareto-Regel: keine spektakulären Trades, aber massive Drawdown-Reduktion.

ADX + ATR als Volatilitäts-bereinigter Trend-Score

ADX hat eine unschöne Eigenschaft: in volatilen Phasen wird er groß, auch wenn der Markt nirgends hinläuft. Eine Range mit großen Bars produziert hohen TR, dadurch wachsen +DM und −DM gleichermaßen, der Quotient bleibt theoretisch stabil — in der Praxis verzerrt das Rauschen den DX-Wert.

Ich normalisiere daher ADX mit ATR: ADX-Score = ADX(14) − rolling_z(ATR(14), 100). Das zieht ADX-Werte nach unten, wenn die Volatilität gerade ungewöhnlich hoch ist. Auf FX-Paaren bringt das spürbar bessere Filter-Trefferquoten.

Konkrete Implementierung.

In Python (pandas, ohne externe TA-Library)

import numpy as np
import pandas as pd

def wilder_smooth(series, n):
    # Wilder smoothing = EMA mit alpha = 1/n
    return series.ewm(alpha=1/n, adjust=False).mean()

def adx_dmi(df, n=14):
    high, low, close = df['high'], df['low'], df['close']
    up_move   = high.diff()
    down_move = -low.diff()

    plus_dm  = np.where((up_move > down_move) & (up_move > 0), up_move, 0.0)
    minus_dm = np.where((down_move > up_move) & (down_move > 0), down_move, 0.0)

    tr1 = high - low
    tr2 = (high - close.shift()).abs()
    tr3 = (low  - close.shift()).abs()
    tr  = pd.concat([tr1, tr2, tr3], axis=1).max(axis=1)

    atr      = wilder_smooth(tr, n)
    plus_di  = 100 * wilder_smooth(pd.Series(plus_dm,  index=df.index), n) / atr
    minus_di = 100 * wilder_smooth(pd.Series(minus_dm, index=df.index), n) / atr
    dx       = 100 * (plus_di - minus_di).abs() / (plus_di + minus_di)
    adx      = wilder_smooth(dx, n)

    return pd.DataFrame({'+DI': plus_di, '-DI': minus_di, 'ADX': adx})

In MQL5

// Handle für ADX einrichten
int adxHandle = iADX(_Symbol, PERIOD_D1, 14);

double adxBuf[], plusDiBuf[], minusDiBuf[];
ArraySetAsSeries(adxBuf,     true);
ArraySetAsSeries(plusDiBuf,  true);
ArraySetAsSeries(minusDiBuf, true);

// MAIN = ADX, PLUSDI, MINUSDI
CopyBuffer(adxHandle, 0, 0, 3, adxBuf);
CopyBuffer(adxHandle, 1, 0, 3, plusDiBuf);
CopyBuffer(adxHandle, 2, 0, 3, minusDiBuf);

double sma100  = iMA(_Symbol, PERIOD_D1, 100, 0, MODE_SMA, PRICE_CLOSE);
double smaVal  = 0; CopyBuffer((int)sma100, 0, 1, 1, &smaVal);
double price   = iClose(_Symbol, PERIOD_D1, 1);

bool trendUp     = price > smaVal;
bool adxRising   = adxBuf[1] > adxBuf[2];
bool adxStrong   = adxBuf[1] > 22;
bool plusCross   = plusDiBuf[2] < minusDiBuf[2] && plusDiBuf[1] > minusDiBuf[1];

if (trendUp && adxRising && adxStrong && plusCross) {
    OpenLong();
}

Was ADX nicht kann.

Meine Praxis: ADX nur als Filter, nie als Trigger.

Bei uns laufen rund 18 systematische Strategien parallel — Trendfolge, Mean-Reversion, Volatilitäts-Arbitrage. In keiner dieser Strategien ist ADX selbst Entry-Trigger. Aber in etwa der Hälfte ist er Bestandteil des Regime-Filters, der entscheidet, ob die Strategie in diesem Markt aktuell laufen darf oder pausiert.

Das ist die ehrliche Antwort auf die Frage, was ADX bringt: er ist kein Werkzeug, mit dem man Geld verdient. Er ist ein Werkzeug, mit dem man Geld nicht verliert — indem man die richtigen Strategien zur richtigen Zeit aktiv hält.

Sie wollen ADX sauber als Regime-Filter in Ihren Stack integrieren? Erstgespräch buchen — wir kalibrieren ihn auf Ihre Instrumente.