adxdon
Download scriptThis script is a specialized technical analysis tool designed to measure the strength and direction of market trends. It processes historical price data—specifically the highs, lows, and closing prices—to determine how aggressively the market is moving in either an upward or downward direction.
The logic operates through four primary stages:
1. Identifying Movement Extremes
The script begins by analyzing every price candle to calculate the "True Range." It looks at how far the price moved from its previous close, identifying the total volatility of each period. Simultaneously, it separates this movement into two categories:
- Positive Movement: Instances where the current high is greater than the previous high.
- Negative Movement: Instances where the current low is lower than the previous low.
2. Filtering Dominance
Not all price movements are considered significant. The logic includes a filter to ensure that only the dominant move is recorded. If both upward and downward movements occur in the same period, the script identifies which move was larger; it then discards the weaker movement and keeps only the stronger one for further calculation.
3. Calculating Directional Indicators (+DI and -DI)
The script then takes these "dominant" moves and smooths them out using an Exponential Moving Average (EMA). This smoothing helps remove market "noise" and reveals the underlying trend.
- +DI (Positive Directional Index): Represents the strength of the upward trend.
- -DI (Negative Directional Index): Represents the strength of the downward trend.
By dividing these smoothed movements by the total volatility (the True Range), the script creates a normalized percentage that tells you which direction currently has the most momentum.
4. Determining Trend Strength (ADX)
The final stage combines the +DI and -DI values to calculate the ADX (Average Directional Index).
- It measures the absolute difference between the upward and downward strength.
- It then calculates the average of this difference over a specific period.
The Result: The final output provides a clear visual representation of market dynamics:
- The +DI and -DI lines tell you which way the market is currently leaning (Up or Down).
- The ADX value tells you how powerful that trend is, regardless of its direction. A rising ADX indicates a strengthening trend, while a falling ADX suggests a weakening market or a transition into a sideways range.
//+------------------------------------------------------------------+
//| ADXdon.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 YellowGreen
#property indicator_color3 Wheat
#property indicator_level1 20
//---- input parameters
extern int ADXPeriod=14, DiPlusPeriod = 34, DiMinusPeriod=34;
//---- buffers
double ADXBuffer[];
double PlusDiBuffer[];
double MinusDiBuffer[];
double PlusSdiBuffer[];
double MinusSdiBuffer[];
double TRBuffer[];
double TempBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 3 additional buffers are used for counting.
IndicatorBuffers(7);
//---- indicator buffers
SetIndexBuffer(0,ADXBuffer);
SetIndexBuffer(1,PlusDiBuffer);
SetIndexBuffer(2,MinusDiBuffer);
SetIndexBuffer(3,PlusSdiBuffer);
SetIndexBuffer(4,MinusSdiBuffer);
SetIndexBuffer(5,TempBuffer);
SetIndexBuffer(6, TRBuffer );
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("ADX("+ADXPeriod+", DI-: "+DiMinusPeriod+", DI+: "+DiPlusPeriod+")");
SetIndexLabel(0,"ADX");
SetIndexLabel(1,"+DI");
SetIndexLabel(2,"-DI");
//----
SetIndexDrawBegin(0,ADXPeriod);
SetIndexDrawBegin(1,ADXPeriod);
SetIndexDrawBegin(2,ADXPeriod);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Average Directional Movement Index |
//+------------------------------------------------------------------+
int start()
{
double pdm,mdm,tr;
double price_high,price_low;
int starti,i,counted_bars=IndicatorCounted();
//----
//int limit=Bars-2;
int limit=Bars-counted_bars;
if(counted_bars>0) limit++;
i = limit;
starti = i;
//----
while(i>=0)
{
price_low=Low[i];
price_high=High[i];
//----
pdm = 0.0;
mdm = 0.0;
if ( price_high > High[i+1] )
pdm = price_high - High[i+1];
if ( price_low < Low[i+1] )
mdm = Low[i+1] - price_low;
if ( pdm < mdm )
pdm = 0.0;
else if ( mdm < pdm )
mdm = 0.0;
//---- absolute true range
double num1=MathAbs(price_high-price_low);
double num2=MathAbs(price_high-Close[i+1]);
double num3=MathAbs(price_low-Close[i+1]);
tr=MathMax(num1,num2);
tr=MathMax(tr,num3);
//---- counting plus/minus direction
PlusSdiBuffer[i]=pdm;
MinusSdiBuffer[i]=mdm;
TRBuffer[i] = tr;
//----
i--;
}
//---- apply EMA to +DI
for(i=0; i<limit; i++) {
//---- apply EMA to TR
TRBuffer[i]=iMAOnArray(TRBuffer,0,ADXPeriod,0,MODE_EMA,i);
PlusDiBuffer[i] = PlusDiBuffer[i+1];
MinusDiBuffer[i] = MinusDiBuffer[i+1];
if ( TRBuffer[i] != 0 ) {
PlusDiBuffer[i]=iMAOnArray(PlusSdiBuffer,Bars,DiPlusPeriod,0,MODE_EMA,i) / TRBuffer[i];
//---- apply EMA to -DI
MinusDiBuffer[i]=iMAOnArray(MinusSdiBuffer,Bars,DiMinusPeriod,0,MODE_EMA,i) / TRBuffer[i];
}
}
//---- Directional Movement (DX)
i=Bars-2;
//TempBuffer[i+1]=0;
i=starti;
while(i>=0)
{
double div=MathAbs(PlusDiBuffer[i]+MinusDiBuffer[i]);
if(div==0.00) TempBuffer[i]=TempBuffer[i+1];
else TempBuffer[i]=MathAbs(PlusDiBuffer[i]-MinusDiBuffer[i]) / div;
i--;
}
//---- ADX is exponential moving average on DX
for(i=0; i<limit; i++) {
ADXBuffer[i]=iMAOnArray(TempBuffer,0,ADXPeriod,0,MODE_EMA,i) * 100.0;
PlusDiBuffer[i] = PlusDiBuffer[i] * 100.0;
MinusDiBuffer[i] = MinusDiBuffer[i] * 100.0;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments