Wilder's DMI

Author: mladen
0 Views
0 Downloads
0 Favorites
Wilder's DMI
//+------------------------------------------------------------------+
//|                                                 Wilder's DMI.mq4 |
//|                                                  coded by mladen |
//|                                                                  |
//| Directional movement index was developed by Welles Wilder        |
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link      "mladenfx@gmail.com"

#property indicator_separate_window
#property  indicator_buffers 5
#property indicator_minimum  0
#property indicator_color1   Lime
#property indicator_color2   Tomato
#property indicator_color3   DimGray
#property indicator_color4   Orange
#property indicator_color5   DimGray
#property indicator_width3   2 
#property indicator_width4   2 
#property indicator_style1   STYLE_DOT
#property indicator_style2   STYLE_DOT
#property indicator_style5   STYLE_DOT

//
//
//
//
//

extern int  DMI.Length =    14;
extern bool ShowADX    =  true;
extern bool ShowADXR   = false;
extern int  Level      =    20;

//
//
//
//
//

double DIp[];
double DIm[];
double ADX[];
double ADXR[];
double ADXLevel[];
double averageDIp[];
double averageDIm[];
double averageTR[];


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//

int init()
{
   IndicatorBuffers(8);
   SetIndexBuffer(0,DIp);      SetIndexLabel(0,"DI+");
   SetIndexBuffer(1,DIm);      SetIndexLabel(1,"DI-");
   SetIndexBuffer(2,ADX);      SetIndexLabel(2,"ADX");
   SetIndexBuffer(3,ADXR);     SetIndexLabel(3,"ADXR");
   SetIndexBuffer(4,ADXLevel); SetIndexLabel(4,NULL);
   SetIndexBuffer(5,averageDIp);
   SetIndexBuffer(6,averageDIm);
   SetIndexBuffer(7,averageTR);
      for (int i=0;i<8;i++) SetIndexEmptyValue(i,0.00);

   //
   //
   //
   //
   //

   IndicatorShortName("Wilder\'s DMI ("+DMI.Length+")");
   return(0);
}

int deinit()
{
   return(0);
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int start()
{
   int counted_bars=IndicatorCounted();
   int i,limit;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
           limit=Bars-counted_bars;
           limit=MathMin(limit,Bars-2);

   //
   //
   //
   //
   //
   
   double sf = 1.0/DMI.Length;
      for (i=limit;i>=0;i--)
      {
         double currTR  = MathMax(High[i],Close[i+1])-MathMin(Low[i],Close[i+1]);
         double DeltaHi = High[i] - High[i+1];
	      double DeltaLo = Low[i+1] - Low[i];
         double plusDM  = 0.00;
         double minusDM = 0.00;
         
            if ((DeltaHi > DeltaLo) && (DeltaHi > 0)) plusDM  = DeltaHi;
            if ((DeltaLo > DeltaHi) && (DeltaLo > 0)) minusDM = DeltaLo;      
         
         //
         //
         //
         //
         //
         
            averageDIp[i] = averageDIp[i+1] + sf*(plusDM  - averageDIp[i+1]);
            averageDIm[i] = averageDIm[i+1] + sf*(minusDM - averageDIm[i+1]);
            averageTR[i]  = averageTR[i+1]  + sf*(currTR  - averageTR[i+1]);
            ADXLevel[i]   = Level;

         //
         //
         //
         //
         //
                  
            DIp[i] = 0.00;                   
            DIm[i] = 0.00;                   
            if (averageTR[i] > 0)
               {              
                  DIp[i] = 100.00 * averageDIp[i]/averageTR[i];
                  DIm[i] = 100.00 * averageDIm[i]/averageTR[i];
               }            

            if(ShowADX)
               {
                  double DX;
                  if((DIp[i] + DIm[i])>0) 
                       DX = 100*MathAbs(DIp[i] - DIm[i])/(DIp[i] + DIm[i]); 
                  else DX = 0.00;
                  ADX[i] = ADX[i+1] + sf*(DX - ADX[i+1]); 
                  if(ShowADXR)
                         ADXR[i] = 0.5*(ADX[i] + ADX[i+DMI.Length]);
               }
      }   
   return(0);      
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---