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

101 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```csharp
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
```csharp
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
- Jurik Research: [DMX Description](http://www.jurikres.com/catalog/ms_dmx.htm)