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. Wer ADX(14) auf Tagesdaten verschiedener Märkte (Indizes, Gold, EUR/USD, Bitcoin) auswertet, sieht typischerweise drei Dinge:
- Die Schwelle ist asset-spezifisch. Der typische ADX-Wert unterscheidet sich deutlich zwischen Aktienindizes, FX und Krypto. Eine pauschale „25er-Linie“ ist Schrott.
- ADX lag-t. Bis ADX über 25 steigt, läuft der Trend oft schon seit 15–25 Bars. Wer dann erst einsteigt, kauft regelmäßig in die Trend-Erschöpfung.
- ADX-Spikes sind keine Trend-Bestätigung. Sie kommen oft nach Volatilitäts-Schocks, nicht nach Trend-Etablierung. Februar 2020 in SPX: ADX explodierte von 15 auf 60 — kein Trend, ein Crash. Beides sieht für ADX gleich aus.
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:
- +DI kreuzt −DI von unten → Long-Signal
- −DI kreuzt +DI von unten → Short-Signal
- Filter: ADX über 20 oder 25 (asset-abhängig)
Als isolierte Strategie auf Index-Tagesdaten liefert das Crossing typischerweise eine Trefferquote unter 50 % und einen Profit-Faktor kaum über 1. 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. Sinnvoll ist, zusätzlich zu verlangen, dass der Wert von ADX selbst steigt (also DX über seinem 14-Bar-Mittel) und der Schlusskurs auf der korrekten Seite einer 50- oder 100-Tage-Linie liegt. 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:
- Trendfolge-Strategien laufen nur, wenn ADX im oberen Quartil. Bei mir: ADX über dem rollenden 1-Jahres-80-%-Quantil.
- Mean-Reversion-Strategien laufen nur, wenn ADX im unteren Quartil. Also unter dem 20-%-Quantil.
- Im Mittelbereich: beide Strategien reduziert oder pausiert.
Das ist nicht spektakulär — aber es vermeidet, dass Trendfolge-Module in Range-Phasen verbluten und Mean-Reversion-Module in echten Trends gegen die Bewegung kämpfen. Wie viel ein solcher Filter bringt, muss man für jedes System selbst backtesten.
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.
- Wendepunkte erkennen. ADX dreht erst, nachdem die Trend-Beschleunigung schon längst weg ist. Für Top-/Bottom-Calls ist er nutzlos.
- Auf sehr kurzen Timeframes funktionieren. Auf 5-Minuten-Charts produziert ADX so viel Rauschen, dass praktisch jedes Signal wertlos ist. Daily und höher ist Pflicht.
- Volatilitätsschocks von Trends unterscheiden. ADX-Spike auf Crash-Tag sieht aus wie ADX-Spike auf Trend-Start. Ohne ATR-Normalisierung blendet der Filter regelmäßig falsch.
In der Praxis: ADX als Filter, nicht als Trigger.
In einem typischen Multi-Strategie-System mit Trendfolge, Mean-Reversion und Volatilitäts-Strategien ist ADX selten selbst Entry-Trigger, aber häufig Bestandteil des Regime-Filters, der entscheidet, ob eine Strategie im aktuellen Markt 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.
Stand: Mai 2026, überarbeitet Oktober 2026. Angaben zu Produkten, Preisen, Gesetzen und Fristen können sich seitdem geändert haben; maßgeblich sind die aktuellen Angaben der Anbieter und Behörden.
Sie wollen ADX sauber als Regime-Filter in Ihren Stack integrieren? Unverbindlich anfragen — wir kalibrieren ihn auf Ihre Instrumente. Mehr zu meinem Angebot: Trading-Systeme entwickeln lassen.