Wilder's ADX
Download scriptThis script is designed as a technical analysis tool that helps traders understand the strength and direction of market trends. It processes price data to identify whether a market is moving upward, downward, or sideways, and provides several visual layers to help make that distinction clearer.
Core Logic and Functionality
The logic operates by analyzing the relationship between high, low, and closing prices over a specific period (defined by the "Smooth" setting). It breaks down the market movement into three primary components:
1. Directional Movement (+DI and -DI) The tool first looks at how much the price moves up versus how far it moves down.
- It identifies upward movements by looking at whether today's high is higher than yesterday's high.
- It identifies downward movements by checking if today's low is lower than yesterday's low.
- These values are then normalized against the total range of price movement. This results in two separate lines: one representing bullish (upward) momentum and the other representing bearish (downward) momentum.
2. Trend Strength (DMI and ADX) Once the tool knows the direction, it calculates how "strong" that move actually is.
- DX / DMI: This represents the difference between the upward and downward momentum. If one direction is significantly stronger than the other, this value increases.
- ADX (Average Directional Index): This provides a smoothed version of the trend strength. It tells the trader if a trend—regardless of whether it is up or down—is gaining power or losing steam. A rising ADX generally suggests a trending market, while a falling ADX may suggest a consolidating or "choppy" market.
3. Trend Rate (ADXR) To provide a more responsive view of the trend's momentum, the script calculates an "Average Directional Index Rate." This is essentially a faster way to see if the strength of the trend is currently accelerating or decelerating compared to previous periods.
Visual Presentation
The script outputs these calculations into five distinct visual elements:
- +DI: Visualizes upward pressure.
- -DI: Visualizes downward pressure.
- DX: Shows the raw difference between directions.
- ADX: Shows the smoothed strength of the current trend.
- ADXR: Provides a secondary, faster look at the trend's rate of change.
Summary for the User
In practical terms, this script allows a user to see not just where the price is going, but how hard it is pushing in that direction. By observing the interaction between the upward/downward lines and the strength indicators (ADX), traders can better identify when a trend is healthy and when it might be reaching an exhaustion point.
//+------------------------------------------------------------------+
//| DMI.mq4 |
//| Copyright © 2006, Fernando Gomes. |
//| http://www.ciavox.com/~fgomes |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Fernando Gomes."
#property link "http://www.ciavox.com/~fgomes"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_color4 DeepSkyBlue
#property indicator_color5 Blue
#property indicator_minimum 0
#property indicator_level1 20
#property indicator_level2 25
#property indicator_maximum 60
//---- indicator parameters
extern int Smooth = 13;
extern bool Hide_DI_Plus = False;
extern bool Hide_DI_Minus = False;
extern bool Hide_DX = False;
extern bool Hide_ADX = False;
extern bool Hide_ADXR = False;
//---- indicator buffers
double b_di_p[]; // buffer +DI
double b_di_m[]; // buffer -DI
double b_dmi[]; // buffer DMI
double b_adx[]; // buffer Average Directional indeX
double b_adxr[]; // buffer Average Directional indeX Rate
//---- non-indicator buffers
//---- NOTICE that these arrays must be included in ArraySetAsSeries()
double dm_p_avg[];
double dm_m_avg[];
double tr_avg[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {
//---- indicator buffers mapping
IndicatorBuffers(8);
if ( !SetIndexBuffer(0,b_di_p)
&& !SetIndexBuffer(1,b_di_m)
&& !SetIndexBuffer(2,b_dmi)
&& !SetIndexBuffer(3,b_adx)
&& !SetIndexBuffer(4,b_adxr)
&& !SetIndexBuffer(5,dm_p_avg)
&& !SetIndexBuffer(6,dm_m_avg)
&& !SetIndexBuffer(7,tr_avg)
) { Print("cannot set indicator buffers!"); return(-1); }
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("DMI("+Smooth+")");
SetIndexLabel(0,"+DI");
SetIndexLabel(1,"-DI");
SetIndexLabel(2,"DX");
SetIndexLabel(3,"ADX");
SetIndexLabel(4,"ADXR");
//----
SetIndexStyle(0, DRAW_LINE+Hide_DI_Plus*DRAW_NONE, STYLE_SOLID, 1,
indicator_color1);
SetIndexStyle(1, DRAW_LINE+Hide_DI_Minus*DRAW_NONE, STYLE_SOLID, 1,
indicator_color2);
SetIndexStyle(2, DRAW_LINE+Hide_DX*DRAW_NONE, STYLE_SOLID, 1,
indicator_color3);
SetIndexStyle(3, DRAW_LINE+Hide_ADX*DRAW_NONE, STYLE_SOLID, 1,
indicator_color4);
SetIndexStyle(4, DRAW_LINE+Hide_ADXR*DRAW_NONE, STYLE_SOLID, 1,
indicator_color5);
//----
SetIndexDrawBegin(0,Smooth);
SetIndexDrawBegin(1,Smooth);
SetIndexDrawBegin(2,Smooth);
SetIndexDrawBegin(3,2*Smooth);
SetIndexDrawBegin(4,3*Smooth);
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int counted_bars=IndicatorCounted();
if (counted_bars<0) return(-1);
if (Bars < 2) return(-1);
if (Smooth < 2) return(-1);
int limit=Bars-1-counted_bars;
double smooth = 1.0 / (Smooth * 1.0);
int firstDMI = Bars-1-Smooth;
int firstADX = Bars-1-(2*Smooth);
int firstADXR = Bars-1-(3*Smooth);
for (int i=limit; i>=0; i--) {
double high;
double low;
double dm_p;
double dm_m;
if (i<firstDMI) {
high = High[i] - High[i+1];
low = Low[i+1] - Low[i];
dm_p = 0.0;
dm_m = 0.0;
if ((high > low) && (high > 0.0))
dm_p = high;
else if ((low > high) && (low > 0.0))
dm_m = low;
// calculate averages (cumulative formula)
dm_p_avg[i] = dm_p_avg[i+1] - ( smooth * dm_p_avg[i+1] ) + dm_p;
dm_m_avg[i] = dm_m_avg[i+1] - ( smooth * dm_m_avg[i+1] ) + dm_m;
tr_avg[i] = tr_avg[i+1] - ( smooth * tr_avg[i+1] ) +
calcTR(i);
} else if (i==firstDMI) {
double sum_dm_p = 0.0;
double sum_dm_m = 0.0;
double sum_tr = 0.0;
for (int j=i; j<i+Smooth; j++) {
high = High[j] - High[j+1];
low = Low[j+1] - Low[j];
dm_p = 0.0 ;
dm_m = 0.0 ;
if ((high > low) && (high > 0.0))
dm_p = high;
else if ((low > high) && (low > 0.0))
dm_m = low;
sum_dm_p = sum_dm_p + dm_p;
sum_dm_m = sum_dm_m + dm_m;
sum_tr = sum_tr + calcTR(j);
}
// define current values
dm_p_avg[i] = sum_dm_p * smooth;
dm_m_avg[i] = sum_dm_m * smooth;
tr_avg[i] = sum_tr * smooth;
} else {
tr_avg[i] = 0.0;
}
// Calculate +DI and -DI
if (tr_avg[i] > 0.0) {
b_di_p[i] = 100.0 * dm_p_avg[i] / tr_avg[i];
b_di_m[i] = 100.0 * dm_m_avg[i] / tr_avg[i];
} else {
b_di_p[i] = 0.0;
b_di_m[i] = 0.0;
}
// calcule DMI
double sum = b_di_p[i] + b_di_m[i];
double diff = MathAbs( b_di_p[i] - b_di_m[i] );
if (sum > 0.0) {
b_dmi[i] = 100.0 * diff / sum;
} else {
b_dmi[i] = 0.0 ;
}
// Calculate ADX
if (i<firstADX) {
b_adx[i] = smooth*(b_adx[i+1]*(Smooth-1) + b_dmi[i]);
} else if (i==firstADX) {
double sum_dmi = 0.0;
for (int k=i+Smooth+1; k>i; k--) {
sum_dmi = sum_dmi + b_dmi[k];
}
b_adx[i] = smooth * sum_dmi;
} else {
b_adx[i] = 0.0;
}
// Calculate ADXR
if (i<=firstADXR) {
b_adxr[i] = (b_adx[i] + b_adx[i+Smooth]) / 2;
} else {
b_adxr[i] = 0.0;
}
} // for
return(0);
}
double calcTR(int bar) {
double a = High[bar] - Low[bar]; // A = Today's High -Today's Low
double b = MathAbs(Close[bar+1] - High[bar]); // B = Yesterday's Close - Today's High
double c = MathAbs(Close[bar+1] - Low[bar]); // C = Yesterday's Close - Today's Low
return(MathMax(MathMax(a,b),c));
}
//+------------------------------------------------------------------+
Comments