6.1 KiB
Average Directional Index (ADX) Pro
1. Summary (Introduction)
The Average Directional Index (ADX), developed by J. Welles Wilder, is a widely used technical indicator designed to measure the strength of a trend, regardless of its direction. It does not indicate whether the trend is bullish or bearish, but only quantifies its momentum.
The ADX system consists of three lines:
- ADX Line: The main line that indicates trend strength.
- +DI (Positive Directional Indicator): A line that measures the strength of the upward price movement.
- -DI (Negative Directional Indicator): A line that measures the strength of the downward price movement.
Our ADX_Pro implementation is a unified, professional version that allows the calculation to be based on either standard or Heikin Ashi candles.
2. Mathematical Foundations and Calculation Logic
The ADX calculation is a complex, multi-stage process that relies heavily on Wilder's smoothing technique (a specific type of Smoothed or Running Moving Average - SMMA/RMA).
Required Components
- ADX Period (N): The lookback period for all calculations (e.g., 14).
- Directional Movement (+DM, -DM): Measures the portion of the current bar's range that is outside the previous bar's range.
- True Range (TR): The standard measure of a single bar's volatility.
Calculation Steps (Algorithm)
-
Calculate Directional Movement and True Range: For each period, calculate:
\text{Up Move} = \text{High}_i - \text{High}_{i-1}\text{Down Move} = \text{Low}_{i-1} - \text{Low}_i- If
\text{Up Move} > \text{Down Move}and\text{Up Move} > 0, then\text{+DM} = \text{Up Move}, else\text{+DM} = 0. - If
\text{Down Move} > \text{Up Move}and\text{Down Move} > 0, then\text{-DM} = \text{Down Move}, else\text{-DM} = 0. \text{True Range (TR)} = \text{Max}[(\text{High}_i - \text{Low}_i), \text{Abs}(\text{High}_i - \text{Close}_{i-1}), \text{Abs}(\text{Low}_i - \text{Close}_{i-1})]
-
Smooth +DM, -DM, and TR: Apply Wilder's smoothing method over the period
N.- Initialization: The first value is the sum of the first
Nperiods.\text{Smoothed +DM}_{N} = \sum_{i=1}^{N} \text{+DM}_i - Recursive Calculation:
\text{Smoothed +DM}_i = \text{Smoothed +DM}_{i-1} - \frac{\text{Smoothed +DM}_{i-1}}{N} + \text{+DM}_i - (The same logic applies to -DM and TR)
- Initialization: The first value is the sum of the first
-
Calculate Directional Indicators (+DI, -DI):
\text{+DI}_i = 100 \times \frac{\text{Smoothed +DM}_i}{\text{Smoothed TR}_i}\text{-DI}_i = 100 \times \frac{\text{Smoothed -DM}_i}{\text{Smoothed TR}_i} -
Calculate the Directional Index (DX):
\text{DX}_i = 100 \times \frac{\text{Abs}(\text{+DI}_i - \text{-DI}_i)}{\text{+DI}_i + \text{-DI}_i} -
Calculate the Final ADX: The ADX is a Wilder-smoothed moving average of the DX.
- Initialization: The first ADX value is a simple average of the first
NDX values. - Recursive Calculation:
\text{ADX}_i = \frac{(\text{ADX}_{i-1} \times (N-1)) + \text{DX}_i}{N}
- Initialization: The first ADX value is a simple average of the first
3. MQL5 Implementation Details
Our MQL5 implementation follows a modern, object-oriented design pattern to ensure stability, reusability, and maintainability. The logic is separated into a main indicator file, a dedicated calculator engine, and a shared core engine.
-
Shared Core Engine (
DMI_Engine.mqh): The fundamental calculation of Directional Movement (+DI, -DI) is outsourced to a shared engine. This ensures that both the ADX and the DMI Stochastic indicators use the exact same, validated mathematical core, eliminating code duplication and potential inconsistencies. -
Modular Calculator Engine (
ADX_Calculator.mqh): The ADX-specific logic (calculating the DX and smoothing it to get the ADX) is encapsulated here. This calculator orchestrates theDMI_Engineto get the raw data and then performs the final steps. -
Object-Oriented Design (Composition & Inheritance):
- The
CADXCalculatoruses Composition to include theCDMIEngine. - The Heikin Ashi support is implemented via a Factory Pattern in the
CADXCalculator_HAsubclass, which instantiates a specializedCDMIEngine_HA. This keeps the main logic clean and agnostic of the data source.
- The
-
Optimized Incremental Calculation: Unlike basic implementations that recalculate the entire history on every tick, this indicator employs an intelligent incremental algorithm.
- It utilizes the
prev_calculatedstate to determine the exact starting point for updates. - The internal buffers persist their state between ticks, allowing the recursive Wilder's Smoothing algorithm to continue seamlessly from the last known value.
- This results in O(1) complexity per tick, ensuring instant updates and zero lag.
- It utilizes the
4. Parameters (ADX_Pro.mq5)
- ADX Period (
InpPeriodADX): The lookback period used for all internal calculations. Wilder's original recommendation and the most common value is14. - Candle Source (
InpCandleSource): Allows the user to select the candle type for the initial calculation of directional movement.CANDLE_STANDARD: Uses the standard chart's OHLC data.CANDLE_HEIKIN_ASHI: Uses smoothed Heikin Ashi data.
5. Usage and Interpretation
- Trend Strength: The primary signal is the ADX line itself.
- ADX < 25: Weak or non-existent trend (ranging market). Trend-following strategies should be avoided.
- ADX > 25: Strong trend. The higher the ADX, the stronger the trend.
- Rising ADX: The trend is gaining strength.
- Falling ADX: The trend is losing strength.
- Trend Direction (+DI and -DI Crossover):
- When the +DI line (green) crosses above the -DI line (red), it suggests the start of a bullish trend.
- When the -DI line (red) crosses above the +DI line (green), it suggests the start of a bearish trend.
- Trade Confirmation: A common strategy is to wait for a +DI/-DI crossover and then confirm that the ADX line is above 25 (or rising) before entering a trade. This helps to filter out signals that occur in weak or non-trending markets.