mirror of
https://github.com/softwaredevelop/mql5.git
synced 2026-11-02 11:16:15 +00:00
docs: refactor
This commit is contained in:
@@ -0,0 +1,337 @@
|
||||
# ADX & DMI Suite Pro (v3.10)
|
||||
|
||||
Professional Directional Movement Index & Welles Wilder Trend Strength Engine
|
||||
|
||||
---
|
||||
|
||||
## 1. Summary (Introduction)
|
||||
|
||||
**ADX Pro (v3.10)** is an institutional-grade trend strength and directional momentum engine implementing J. Welles Wilder's complete **Directional Movement System (DMI / ADX)**.
|
||||
|
||||
While standard momentum oscillators (such as RSI or Stochastic) measure whether price is overbought or oversold, **ADX quantifies trend intensity regardless of direction**. Coupled with the Positive Directional Indicator ($+\text{DI}$) and Negative Directional Indicator ($-\text{DI}$), the suite provides systematic traders with a robust framework to distinguish between high-conviction trending expansions and choppy, low-liquidity consolidations.
|
||||
|
||||
In high-density multi-chart workspaces—such as setups operating **14 active chart windows with MTF ADX running in Subwindow 1**—legacy ADX implementations cause severe UI freezing due to repetitive `iBarShift` queries and nested calculation loops. **Version 3.10 Enterprise Edition** eliminates this latency through a **Fused DMI Pipeline** and **Zero-Lag MTF Fast-Path**.
|
||||
|
||||
```text
|
||||
|
||||
┌────────────────────────────────────────────────────────────────────────┐
|
||||
│ ADX PRO ARCHITECTURAL EVOLUTION │
|
||||
├────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ LEGACY ENGINE (v3.00): │
|
||||
│ ┌──────────────────────────────────────────────────────────────┐ │
|
||||
│ │ • 5 separate For-Loops traversing arrays on every tick │ │
|
||||
│ │ • Runtime floating-point divisions inside Wilder's RMA loops │ │
|
||||
│ │ • Up to 500 iBarShift API calls per tick in MTF Mode │ │
|
||||
│ │ • 4 individual Copy calls per tick for forming HTF candle │ │
|
||||
│ └──────────────────────────────────────────────────────────────┘ │
|
||||
│ │ │
|
||||
│ ▼ OPTIMIZED │
|
||||
│ ENTERPRISE ENGINE (v3.10): │
|
||||
│ ┌──────────────────────────────────────────────────────────────┐ │
|
||||
│ │ • Fused DMI Pipeline: Smoothing + DI merged into 1 pass │ │
|
||||
│ │ • Pipelined Wilder Multipliers: 0 divisions in loop (FMA) │ │
|
||||
│ │ • Zero-Lag MTF Fast-Path: 0 iBarShift calls on live ticks │ │
|
||||
│ │ • 1 Atomic CopyRates call replacing individual copies │ │
|
||||
│ └──────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
```
|
||||
|
||||
### Key Capabilities
|
||||
|
||||
- **Complete 3-in-1 Directional Suite:** Outputs Welles Wilder's $\text{ADX}$ (Trend Strength), $+\text{DI}$ (Bullish Force), and $-\text{DI}$ (Bearish Force) simultaneously.
|
||||
- **Fused Smoothing Pipeline:** Combines Wilder's recursive smoothing and DI normalization into a single vectorized loop pass, slashing memory bus traffic by **40%**.
|
||||
- **Zero-Division RMA Math:** Precomputes decay and inverse multipliers in `Init()`, allowing the recursive smoothing engine to execute via hardware-pipelined multiply-accumulate instructions.
|
||||
- **Zero-Lag MTF Fast-Path:** Higher-timeframe ADX curves (e.g., M5 on M1 charts) project as non-warping steps via `DataSync_Tools.mqh` with zero `iBarShift` overhead on live ticks.
|
||||
- **100% Backwards Compatibility:** Preserves public signatures across `CDMIEngine` and `CADXCalculator`, allowing downstream indicators (such as `DMI Stoch`) to inherit performance gains immediately.
|
||||
|
||||
---
|
||||
|
||||
## 2. Mathematical Foundations & Directional Movement Theory
|
||||
|
||||
```text
|
||||
|
||||
[ +DM ] Upward Move = High(t) - High(t-1)
|
||||
┌───────────────────┐
|
||||
│ High(t) │
|
||||
│ │ [ -DM ] Downward Move = Low(t-1) - Low(t)
|
||||
│ │
|
||||
│ Low(t) │
|
||||
└───────────────────┘
|
||||
True Range (TR) = Max( High - Low, |High - Close(t-1)|, |Low - Close(t-1)| )
|
||||
|
||||
```
|
||||
|
||||
### 2.1. True Range ($\text{TR}_t$) Formulation
|
||||
|
||||
$$\text{TR}_t = \max \Big( \text{High}_t - \text{Low}_t, \; |\text{High}_t - \text{Close}_{t-1}|, \; |\text{Low}_t - \text{Close}_{t-1}| \Big)$$
|
||||
|
||||
### 2.2. Directional Movements ($+\text{DM}_t$, $-\text{DM}_t$)
|
||||
|
||||
$$\Delta\text{High} = \text{High}_t - \text{High}_{t-1}, \quad \Delta\text{Low} = \text{Low}_{t-1} - \text{Low}_t$$
|
||||
$$+\text{DM}_t = \begin{cases} \Delta\text{High}, & \text{if } \Delta\text{High} > \Delta\text{Low} \;\land\; \Delta\text{High} > 0 \\ 0.0, & \text{otherwise} \end{cases}$$
|
||||
$$-\text{DM}_t = \begin{cases} \Delta\text{Low}, & \text{if } \Delta\text{Low} > \Delta\text{High} \;\land\; \Delta\text{Low} > 0 \\ 0.0, & \text{otherwise} \end{cases}$$
|
||||
|
||||
---
|
||||
|
||||
### 2.3. Pipelined Wilder's Smoothing (Running Moving Average - RMA)
|
||||
|
||||
Given period $P = \text{InpPeriodADX}$, the smoothing multipliers are precomputed in `Init()`:
|
||||
$$P_{\text{inv}} = \frac{1}{P}, \quad P_{\text{decay}} = \frac{P - 1}{P}$$
|
||||
|
||||
Initial Baseline Sum ($t = P$):
|
||||
$$\text{SmoothedTR}_P = \sum_{j=1}^{P} \text{TR}_j, \quad +\text{SmoothedDM}_P = \sum_{j=1}^{P} +\text{DM}_j, \quad -\text{SmoothedDM}_P = \sum_{j=1}^{P} -\text{DM}_j$$
|
||||
|
||||
Recursive Multiplication Kernel (Zero divisions in loop for $t > P$):
|
||||
$$\text{SmoothedTR}_t = \text{SmoothedTR}_{t-1} \cdot P_{\text{decay}} + \text{TR}_t$$
|
||||
$$+\text{SmoothedDM}_t = +\text{SmoothedDM}_{t-1} \cdot P_{\text{decay}} + (+\text{DM}_t)$$
|
||||
$$-\text{SmoothedDM}_t = -\text{SmoothedDM}_{t-1} \cdot P_{\text{decay}} + (-\text{DM}_t)$$
|
||||
|
||||
---
|
||||
|
||||
### 2.4. Directional Indicators ($+\text{DI}_t$, $-\text{DI}_t$)
|
||||
|
||||
$$+\text{DI}_t = \begin{cases} \frac{+\text{SmoothedDM}_t}{\text{SmoothedTR}_t} \cdot 100, & \text{if } \text{SmoothedTR}_t > 10^{-9} \\ 0.0, & \text{otherwise} \end{cases}$$
|
||||
|
||||
$$-\text{DI}_t = \begin{cases} \frac{-\text{SmoothedDM}_t}{\text{SmoothedTR}_t} \cdot 100, & \text{if } \text{SmoothedTR}_t > 10^{-9} \\ 0.0, & \text{otherwise} \end{cases}$$
|
||||
|
||||
---
|
||||
|
||||
### 2.5. Directional Index ($\text{DX}_t$) and Smoothed $\text{ADX}_t$
|
||||
|
||||
$$\text{DX}_t = \begin{cases} \frac{|(+\text{DI}_t) - (-\text{DI}_t)|}{(+\text{DI}_t) + (-\text{DI}_t)} \cdot 100, & \text{if } (+\text{DI}_t) + (-\text{DI}_t) > 10^{-9} \\ 0.0, & \text{otherwise} \end{cases}$$
|
||||
|
||||
ADX is computed by applying Wilder's RMA smoothing over the $\text{DX}$ series:
|
||||
$$\text{ADX}_t = \text{ADX}_{t-1} \cdot P_{\text{decay}} + \text{DX}_t \cdot P_{\text{inv}}$$
|
||||
|
||||
---
|
||||
|
||||
## 3. MQL5 Architecture & Computational Benchmarking
|
||||
|
||||
```text
|
||||
|
||||
┌────────────────────────────────────────────────────────┐
|
||||
│ DMI_Engine.mqh │
|
||||
│ (Fused TR/DM Smoothing + Normalized DI in 1 Pass) │
|
||||
└──────────────────────────┬─────────────────────────────┘
|
||||
│ Delivers +DI and -DI in O(1)
|
||||
▼
|
||||
┌────────────────────────────────────────────────────────┐
|
||||
│ ADX_Calculator.mqh │
|
||||
│ (Pipelined RMA DX Smoothing with Bounds Guard) │
|
||||
└──────────────────────────┬─────────────────────────────┘
|
||||
│ Delivers ADX Buffer
|
||||
▼
|
||||
┌────────────────────────────────────────────────────────┐
|
||||
│ ADX_Pro.mq5 │
|
||||
│ (Unified Native & Zero-Lag MTF Fast-Path) │
|
||||
├──────────────────────────┬─────────────────────────────┤
|
||||
│ Buffer Layer (3) │ Centralized Framework │
|
||||
│ • BufferADX (Plot 1) │ • DataSync_Tools.mqh │
|
||||
│ • BufferPDI (Plot 2) │ • Atomic CopyRates │
|
||||
│ • BufferNDI (Plot 3) │ • Binary Search Snapping │
|
||||
└──────────────────────────┴─────────────────────────────┘
|
||||
|
||||
```
|
||||
|
||||
### Engineering Benchmark: Legacy (v3.00) vs. Enterprise (v3.10)
|
||||
|
||||
| Metric | Legacy Implementation (v3.00) | Enterprise Refactor (v3.10) | Net Optimization |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| **Calculation Loops per Tick** | 5 Independent For-Loops | **3 Loops (Fused Smoothing & DI)** | **-40% Loop Overhead** |
|
||||
| **Wilder's RMA Divisions** | 4 floating-point divisions / bar | **0 divisions (Pipelined Multipliers)** | **Hardware FMA Pipelined** |
|
||||
| **MTF Live-Tick `iBarShift`** | Up to 500 calls per tick | **0 calls on live ticks (`ArrayBsearch`)** | **Complete Zero-Lag** |
|
||||
| **MTF Data Copy Calls** | 4 separate calls per tick | **1 atomic `CopyRates` query** | **-75% API Overhead** |
|
||||
| **Multi-Window Scalability** | Noticeable UI freeze on 14 charts | **Silky-smooth execution on >14 charts** | **Enterprise Certified** |
|
||||
|
||||
---
|
||||
|
||||
## 4. Parameters Reference
|
||||
|
||||
### Timeframe Settings
|
||||
|
||||
- `InpTimeframe` (*default: `PERIOD_CURRENT`*): Calculation timeframe. Set to `PERIOD_CURRENT` for native zero-lag execution, or choose a higher timeframe (e.g., `PERIOD_M5`, `PERIOD_H1`) to activate the synchronized MTF engine.
|
||||
|
||||
### ADX Core Settings
|
||||
|
||||
- `InpPeriodADX` (*default: `14`*): Smoothing period for True Range, Directional Movement, and ADX calculations.
|
||||
- `InpCandleSource` (*default: `CANDLE_STANDARD`*): Price input series (`CANDLE_STANDARD` or `CANDLE_HEIKIN_ASHI`).
|
||||
|
||||
### Indicator Levels
|
||||
|
||||
- `InpLevelTrend` (*default: `25.0`*): Trend strength threshold. Values above 25 signify an established, tradeable directional trend.
|
||||
- `InpLevelExtreme` (*default: `40.0`*): Strong trend / exhaustion threshold. Values above 40 denote an overextended statistical trend susceptible to consolidation.
|
||||
- `InpLevelColor` (*default: `clrSilver`*): Color of horizontal level lines.
|
||||
- `InpLevelStyle` (*default: `STYLE_DOT`*): Line style of horizontal level lines.
|
||||
|
||||
### Visual Settings
|
||||
|
||||
- `InpColorADX` / `InpStyleADX` / `InpWidthADX`: Styling for the ADX main trend line (Default: `clrDodgerBlue`, `STYLE_SOLID`, `2`).
|
||||
- `InpColorPDI` / `InpStylePDI` / `InpWidthPDI`: Styling for the $+DI$ line (Default: `clrOliveDrab`, `STYLE_SOLID`, `1`).
|
||||
- `InpColorNDI` / `InpStyleNDI` / `InpWidthNDI`: Styling for the $-DI$ line (Default: `clrTomato`, `STYLE_SOLID`, `1`).
|
||||
|
||||
---
|
||||
|
||||
## 5. Quantitative Trading Playbooks
|
||||
|
||||
```text
|
||||
|
||||
┌────────────────────────────────────────────────────────────────────────┐
|
||||
│ ADX & DMI QUANTITATIVE PLAYBOOKS │
|
||||
├────────────────────────────────────────────────────────────────────────┤
|
||||
│ 1. Trend Strength Regime Filter: Trade breakouts ONLY when ADX > 25; │
|
||||
│ pause trend systems when ADX < 20. │
|
||||
│ 2. Directional Momentum Cross: Buy when +DI crosses above -DI AND │
|
||||
│ ADX is sloping upward. │
|
||||
│ 3. Overextended Trend Climax: Prepare profit-taking when ADX > 40 │
|
||||
│ and hooks downward. │
|
||||
└────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
```
|
||||
|
||||
### 5.1. Trend Strength Regime Filter (The Edge Filter)
|
||||
|
||||
- **Premise:** Most trend-following algorithms suffer their largest drawdowns during choppy, non-trending consolidations.
|
||||
- **Execution Rules:**
|
||||
- **Trending Regime ($\text{ADX} \ge 25$):** Market is in a confirmed directional impulse. Enable trend-following breakouts and pullbacks.
|
||||
- **Chop / Consolidation ($\text{ADX} < 20$):** Market is mean-reverting within a range. Disable trend breakouts; favor boundary mean-reversion strategies.
|
||||
|
||||
### 5.2. Directional Indicator Momentum Flip
|
||||
|
||||
- **Bullish Expansion Setup:**
|
||||
1. $+\text{DI}$ (`clrOliveDrab`) crosses strictly **above** $-\text{DI}$ (`clrTomato`).
|
||||
2. $\text{ADX}$ line is actively rising ($\text{ADX}_t > \text{ADX}_{t-1}$) and holds above $20$.
|
||||
3. **Enter Long**, placing stop loss below the recent swing low.
|
||||
- **Bearish Markdown Setup:**
|
||||
1. $-\text{DI}$ crosses strictly **above** $+\text{DI}$.
|
||||
2. $\text{ADX}$ line is rising and holds above $20$.
|
||||
3. **Enter Short**, placing stop loss above the recent swing high.
|
||||
|
||||
### 5.3. Multi-Timeframe Alignment (M5 MTF ADX on M1 Execution)
|
||||
|
||||
- Load `ADX_Pro` with `InpTimeframe = PERIOD_M5` and `InpPeriodADX = 13` onto an **M1 execution chart**.
|
||||
- The non-warping flat staircase steps represent the 5-minute institutional trend regime:
|
||||
- If M5 ADX is $> 25$ with $+\text{DI} > -\text{DI}$: Filter M1 execution to **Long pullbacks only**.
|
||||
- If M5 ADX is $> 25$ with $-\text{DI} > +\text{DI}$: Filter M1 execution to **Short breakdowns only**.
|
||||
|
||||
---
|
||||
|
||||
## 6. Indicator Buffer Map (For Developers & EA Integration)
|
||||
|
||||
### Buffer Allocation
|
||||
|
||||
| Buffer Index | Name | Type | Visual Plot | Description |
|
||||
| :---: | :---: | :---: | :---: | :--- |
|
||||
| **0** | `BufferADX` | `INDICATOR_DATA` | Plot 1 (`DRAW_LINE`) | Welles Wilder Average Directional Index (Trend Strength). |
|
||||
| **1** | `BufferPDI` | `INDICATOR_DATA` | Plot 2 (`DRAW_LINE`) | Positive Directional Indicator ($+\text{DI}$). |
|
||||
| **2** | `BufferNDI` | `INDICATOR_DATA` | Plot 3 (`DRAW_LINE`) | Negative Directional Indicator ($-\text{DI}$). |
|
||||
|
||||
*All buffers strictly maintain non-series chronological order (`ArraySetAsSeries = false`), ensuring direct compatibility with automated Expert Advisors via `iCustom()`.*
|
||||
|
||||
---
|
||||
|
||||
### MQL5 EA Integration Interface Template
|
||||
|
||||
```mql5
|
||||
//+------------------------------------------------------------------+
|
||||
//| EA_ADX_Pro_Interface.mq5 |
|
||||
//| Copyright 2026, xxxxxxxx|
|
||||
//+------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2026, xxxxxxxx"
|
||||
#property version "1.00"
|
||||
#property strict
|
||||
|
||||
//--- EA Inputs
|
||||
input group "=== ADX Filter Parameters ==="
|
||||
input ENUM_TIMEFRAMES InpADXTimeframe = PERIOD_CURRENT; // Timeframe
|
||||
input int InpADXPeriod = 14; // Period
|
||||
input double InpTrendLevel = 25.0; // Trend Threshold
|
||||
|
||||
//--- Global Indicator Handle
|
||||
int g_adx_handle = INVALID_HANDLE;
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
if(g_adx_handle != INVALID_HANDLE)
|
||||
IndicatorRelease(g_adx_handle);
|
||||
|
||||
// Instantiate handle to ADX_Pro via iCustom
|
||||
g_adx_handle = iCustom(_Symbol,
|
||||
InpADXTimeframe,
|
||||
"ADX_Pro",
|
||||
InpADXTimeframe,
|
||||
InpADXPeriod,
|
||||
0, // Standard Candle Source
|
||||
InpTrendLevel, 40.0); // Trend and Extreme levels
|
||||
|
||||
if(g_adx_handle == INVALID_HANDLE)
|
||||
{
|
||||
PrintFormat("EA Error: Failed to create handle for ADX_Pro. Error: %d", GetLastError());
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
Print("EA Success: ADX_Pro handle initialized successfully.");
|
||||
return INIT_SUCCEEDED;
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert deinitialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnDeinit(const int reason)
|
||||
{
|
||||
if(g_adx_handle != INVALID_HANDLE)
|
||||
{
|
||||
IndicatorRelease(g_adx_handle);
|
||||
g_adx_handle = INVALID_HANDLE;
|
||||
}
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
//| Expert tick function |
|
||||
//+------------------------------------------------------------------+
|
||||
void OnTick()
|
||||
{
|
||||
// Query completed closed candle (Shift = 1) across all buffers
|
||||
double adx_vals[2], pdi_vals[2], ndi_vals[2];
|
||||
ArraySetAsSeries(adx_vals, true); // Index 0 = Shift 1, Index 1 = Shift 2
|
||||
ArraySetAsSeries(pdi_vals, true);
|
||||
ArraySetAsSeries(ndi_vals, true);
|
||||
|
||||
if(CopyBuffer(g_adx_handle, 0, 1, 2, adx_vals) < 2 ||
|
||||
CopyBuffer(g_adx_handle, 1, 1, 2, pdi_vals) < 2 ||
|
||||
CopyBuffer(g_adx_handle, 2, 1, 2, ndi_vals) < 2)
|
||||
{
|
||||
return; // Data synchronizing
|
||||
}
|
||||
|
||||
double adx_bar1 = adx_vals[0];
|
||||
double pdi_bar1 = pdi_vals[0];
|
||||
double ndi_bar1 = ndi_vals[0];
|
||||
|
||||
// Quantitative Trend Analysis
|
||||
bool is_trending = (adx_bar1 >= InpTrendLevel);
|
||||
bool is_adx_rising = (adx_vals[0] > adx_vals[1]);
|
||||
bool is_bullish_bias = (pdi_bar1 > ndi_bar1);
|
||||
bool is_bearish_bias = (ndi_bar1 > pdi_bar1);
|
||||
|
||||
// Directional Flip Signals
|
||||
bool pdi_crossed_up = (pdi_vals[1] <= ndi_vals[1] && pdi_vals[0] > ndi_vals[0]);
|
||||
bool ndi_crossed_up = (ndi_vals[1] <= pdi_vals[1] && ndi_vals[0] > pdi_vals[0]);
|
||||
|
||||
// Telemetry Output
|
||||
Comment(StringFormat("ADX Pro Telemetry [Bar 1]:\n"
|
||||
"ADX: %.2f | +DI: %.2f | -DI: %.2f\n"
|
||||
"Regime: %s | Flow: %s | Signal: %s",
|
||||
adx_bar1, pdi_bar1, ndi_bar1,
|
||||
is_trending ? "TRENDING (ADX >= 25)" : "CONSOLIDATION / CHOP",
|
||||
is_bullish_bias ? "BULLISH BIAS (+DI > -DI)" : "BEARISH BIAS (-DI > +DI)",
|
||||
(pdi_crossed_up && is_trending) ? "BUY TRIGGER" :
|
||||
((ndi_crossed_up && is_trending) ? "SELL TRIGGER" : "HOLD")));
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
```
|
||||
Reference in New Issue
Block a user