Demarker indicator - DI (DeM)

Demarker Code



//+------------------------------------------------------------------+
//| DeMarker.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 1
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_level1 0.3
#property indicator_level2 0.7
//---- input parameters
extern int DeMarkerPeriod=14; //---- buffers
double DeMarkerBuffer[]; double ExtMaxBuffer[]; double ExtMinBuffer[]; //+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
  {
   string short_name; //---- 2 additional buffers are used for counting.
   IndicatorBuffers(3); SetIndexBuffer(0,DeMarkerBuffer); SetIndexBuffer(1,ExtMaxBuffer); SetIndexBuffer(2,ExtMinBuffer); //---- indicator line
   SetIndexStyle(0,DRAW_LINE); //---- name for DataWindow and indicator subwindow label
   short_name="DeM("+DeMarkerPeriod+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); //---- first values aren't drawn
   SetIndexDrawBegin(0,DeMarkerPeriod); //----
   return(0); }
//+------------------------------------------------------------------+
//| DeMarker |
//+------------------------------------------------------------------+
int start()
  {
   double dNum; int    i,nCountedBars; //---- insufficient data
   if(Bars<=DeMarkerPeriod) return(0); //---- bars count that does not changed after last indicator launch.
   nCountedBars=IndicatorCounted(); //----
   ExtMaxBuffer[Bars-1]=0.0; ExtMinBuffer[Bars-1]=0.0; if(nCountedBars>2) i=Bars-nCountedBars-1; else               i=Bars-2; while(i>=0)
     {
      dNum=High[i]-High[i+1]; if(dNum<0.0) dNum=0.0; ExtMaxBuffer[i]=dNum; dNum=Low[i+1]-Low[i]; if(dNum<0.0) dNum=0.0; ExtMinBuffer[i]=dNum; i--; }  
//---- initial zero
   if(nCountedBars<1)
      for(i=1; i<=DeMarkerPeriod; i++)
         DeMarkerBuffer[Bars-i]=0.0; //----
   i=Bars-DeMarkerPeriod-1; if(nCountedBars>=DeMarkerPeriod) i=Bars-nCountedBars-1; while(i>=0)
     {
      dNum=iMAOnArray(ExtMaxBuffer,0,DeMarkerPeriod,0,MODE_SMA,i)+ iMAOnArray(ExtMinBuffer,0,DeMarkerPeriod,0,MODE_SMA,i); if(dNum!=0.0)
         DeMarkerBuffer[i]=iMAOnArray(ExtMaxBuffer,0,DeMarkerPeriod,0,MODE_SMA,i)/dNum; else
         DeMarkerBuffer[i]=0.0; i--; }
   return(0); }
//+------------------------------------------------------------------+