Files
QuanTAlib/lib/momentum/dmx/Dmx.md
T

3.1 KiB
Raw Blame History

DMX - Jurik Directional Movement Index

DMX is Jurik's advanced replacement for Welles Wilder's DMI/ADX trend indicators. Traditional DMI consists of +DI, -DI (directional movement lines) and ADX (trend strength), but they suffer from noise and lag due to simplistic smoothing (Wilder's moving average). Jurik's DMX addresses this by using the ultra-low-lag Jurik Moving Average (JMA) in place of Wilder's smoothing.

The result: DMX+ and DMX- lines that are significantly smoother than classical +DI/-DI, and a combined DMX oscillator that crosses zero to signal trend direction changes with minimal lag. In fact, DMX is so smooth that a separate ADX line becomes unnecessary the DMX oscillator itself is both a direction and strength indicator (larger magnitude = stronger trend, sign = trend direction).

Core Concepts

  • JMA Smoothing: Uses Jurik Moving Average instead of Wilder's Smoothing for DM+, DM-, and TR.
  • Zero-Lag: JMA provides superior noise reduction with minimal lag compared to EMA/RMA.
  • Bipolar Oscillator: DMX is calculated as DI^+ - DI^-, resulting in a single oscillator ranging from -100 to +100.
  • Trend Detection:
    • Positive values indicate an uptrend.
    • Negative values indicate a downtrend.
    • Magnitude indicates trend strength.

Parameters

Parameter Type Default Description
Period int 14 The lookback period for JMA smoothing.

Formula

  1. Calculate Raw Directional Movement:

    
    UpMove = High_t - High_{t-1}
    
    
    DownMove = Low_{t-1} - Low_t
    
    
    DM^+_{raw} = \begin{cases} UpMove & \text{if } UpMove > DownMove \text{ and } UpMove > 0 \\ 0 & \text{otherwise} \end{cases}
    
    
    DM^-_{raw} = \begin{cases} DownMove & \text{if } DownMove > UpMove \text{ and } DownMove > 0 \\ 0 & \text{otherwise} \end{cases}
    
  2. Calculate True Range:

    
    TR_{raw} = \max(High_t - Low_t, |High_t - Close_{t-1}|, |Low_t - Close_{t-1}|)
    
  3. Smooth with JMA:

    
    DM^+_{smooth} = JMA(DM^+_{raw}, Period)
    
    
    DM^-_{smooth} = JMA(DM^-_{raw}, Period)
    
    
    ATR_{smooth} = JMA(TR_{raw}, Period)
    
  4. Calculate Directional Indicators:

    
    DI^+ = 100 \times \frac{DM^+_{smooth}}{ATR_{smooth}}
    
    
    DI^- = 100 \times \frac{DM^-_{smooth}}{ATR_{smooth}}
    
  5. Calculate DMX:

    
    DMX = DI^+ - DI^-
    

C# Implementation

Standard Usage

using QuanTAlib;

var dmx = new Dmx(14);
var bars = new TBarSeries(); 
// ... add bars ...

foreach(var bar in bars) {
    var result = dmx.Update(bar);
    Console.WriteLine($"DMX: {result.Value}");
}

Batch Processing

var dmx = new Dmx(14);
var resultSeries = dmx.Update(bars);

Interpretation

  • Crossover: DMX crossing above 0 signals a potential uptrend start. Crossing below 0 signals a potential downtrend start.
  • Strength: Higher absolute values indicate a stronger trend. Values near 0 indicate a ranging market.
  • Divergence: Divergence between price and DMX can signal potential reversals.

References