//+------------------------------------------------------------------+ //| ADX.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //добавил стрелки Martingeil 2011год. февраль. #property indicator_separate_window #property indicator_buffers 5 #property indicator_color1 Blue #property indicator_color2 YellowGreen #property indicator_color3 Wheat #property indicator_color4 Blue #property indicator_color5 Red #property indicator_width1 2 #property indicator_width2 0 #property indicator_width3 0 #property indicator_width4 0 #property indicator_width5 0 #property indicator_level1 20 //---- input parameters extern int ADXPeriod=14; //---- buffers double ADXBuffer[]; double PlusDiBuffer[]; double MinusDiBuffer[]; double PlusSdiBuffer[]; double MinusSdiBuffer[]; double TempBuffer[]; double BufferUp[1000],BufferDn[1000]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 3 additional buffers are used for counting. IndicatorBuffers(8); //---- indicator buffers SetIndexBuffer(0,ADXBuffer); SetIndexBuffer(1,PlusDiBuffer); SetIndexBuffer(2,MinusDiBuffer); SetIndexBuffer(3,BufferUp);//стрелка синяя верх SetIndexBuffer(4,BufferDn);//стрелка красная вниз SetIndexBuffer(5,PlusSdiBuffer); SetIndexBuffer(6,MinusSdiBuffer); SetIndexBuffer(7,TempBuffer); //---- name for DataWindow and indicator subwindow label SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,233); SetIndexStyle(4,DRAW_ARROW); SetIndexArrow(4,234); IndicatorShortName("ADX("+ADXPeriod+")"); 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 y0[],y1[],y2[]; int down,up; double pdm,mdm,tr; double price_high,price_low; int i; //---- int xsize=ArraySize(BufferUp); ArrayResize(y0,xsize); ArrayResize(y1,xsize); ArrayResize(y2,xsize); int counted_bars = IndicatorCounted(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; int limit = Bars - counted_bars; if(counted_bars==0) limit-=1+2; i=limit; //---- while(i>=0) { price_low=Low[i]; price_high=High[i]; //---- pdm=price_high-High[i+1]; mdm=Low[i+1]-price_low; if(pdm<0) pdm=0; // +DM if(mdm<0) mdm=0; // -DM if(pdm==mdm) { pdm=0; mdm=0; } else if(pdm=0) { double div=MathAbs(PlusDiBuffer[i]+MinusDiBuffer[i]); if(div==0.00) TempBuffer[i]=0; else TempBuffer[i]=100*(MathAbs(PlusDiBuffer[i]-MinusDiBuffer[i])/div); i--; } //---- ADX is exponential moving average on DX for(i=0; i=0; i--) { y0[i] =ADXBuffer[i]; y1[i+1]=ADXBuffer[i+1]; y2[i+2]=ADXBuffer[i+2]; if(y0[i]-y1[i+1]<0 && y1[i+1]-y2[i+2]>0){down=1;} else {down=0;} if(y0[i]-y1[i+1]>0 && y1[i+1]-y2[i+2]<0){up=1;} else {up=0;} if(down==1){BufferDn[i+1]=y0[i+1]+10;}//стрелка вниз if(up ==1){BufferUp[i+1]=y0[i+1]-10;}//стрелка верх } //---- return(0); } //+------------------------------------------------------------------+