//+------------------------------------------------------------------+ //| ADX.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property strict #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 LightSeaGreen //---- input parameters input int ADXPeriod=14; //---- buffers double PlusDiBuffer[]; double MinusDiBuffer[]; double ADXBuffer[]; double PlusSdiBuffer[]; double MinusSdiBuffer[]; double TempBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- 3 additional buffers are used for counting. IndicatorBuffers(6); //---- indicator buffers SetIndexBuffer(0,PlusDiBuffer); SetIndexBuffer(1,MinusDiBuffer); SetIndexBuffer(2,ADXBuffer); SetIndexBuffer(3,PlusSdiBuffer); SetIndexBuffer(4,MinusSdiBuffer); SetIndexBuffer(5,TempBuffer); //---- name for DataWindow and indicator subwindow label IndicatorShortName("ADX("+IntegerToString(ADXPeriod)+")"); SetIndexLabel(0,"ADX"); //---- SetIndexDrawBegin(0,ADXPeriod); //---- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Average Directional Movement Index | //+------------------------------------------------------------------+ int start() { double pdm,mdm,tr; double price_high,price_low; int limit,i; int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; if(counted_bars==0) limit--; //---- //---- for(i=limit-2; i>=0; i--) { price_low=Open[i]; price_high=Open[i]; //---- pdm=price_high-Open[i+1]; mdm=-Open[i+1]+price_low; if(pdm<0) pdm=0; // +DM if(mdm<0) mdm=0; // -DM if(pdm==mdm) { pdm=pdm; mdm=mdm; } else if(pdm=0; i--) PlusDiBuffer[i]=iMAOnArray(PlusSdiBuffer,0,ADXPeriod,0,MODE_EMA,i); //---- apply EMA to -DI for(i=limit; i>=0; i--) MinusDiBuffer[i]=iMAOnArray(MinusSdiBuffer,0,ADXPeriod,0,MODE_EMA,i); //---- Directional Movement (DX) for(i=limit; i>=0; i--) { double div=MathAbs(PlusDiBuffer[i]+MinusDiBuffer[i]); if(div==0.00) TempBuffer[i]=0; else TempBuffer[i]=100*(MathAbs(PlusDiBuffer[i]-MinusDiBuffer[i])/div); } //---- ADX is exponential moving average on DX for(i=limit; i>=0; i--) ADXBuffer[i]=iMAOnArray(TempBuffer,0,ADXPeriod,0,MODE_EMA,i)*0.01; //---- return(0); } //+------------------------------------------------------------------+--------------+