How to access ADX_WildersDMI_v1m ?

 

Hello,

I'm looking for a code example how to access the custom indicator ADX_WildersDMI_v1m in e EA.

I'm looking for the correct sequence of parameter using the iCustom command.

Any tips are welcome.

Thanks.

//+------------------------------------------------------------------+
//|                                                WildersDMI_v1.mq4 |
//|                           Copyright © 2007, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                       E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"
//----
#property indicator_separate_window
#property indicator_buffers   4
#property indicator_color1    LightBlue
#property indicator_width1    2
#property indicator_color2    Lime
#property indicator_width2    1
#property indicator_style2    2
#property indicator_color3    Tomato
#property indicator_width3    1
#property indicator_style3    2
#property indicator_color4    Orange
#property indicator_width4    2
#property indicator_level1    20
//---- input parameters
extern int       MA_Length  =1; // Period of additional smoothing 
extern int       DMI_Length  =14; // Period of DMI
extern int       ADX_Length  =14; // Period of ADX
extern int       ADXR_Length =14; // Period of ADXR
extern int       UseADX     =1; // Use ADX: 0-off,1-on
extern int       UseADXR    =1; // Use ADXR: 0-off,1-on
//---- buffers
double ADX[];
double PDI[];
double MDI[];
double ADXR[];
double sPDI[];
double sMDI[];
double STR[];
double DX[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(8);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ADX);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,PDI);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,MDI);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,ADXR);
   SetIndexBuffer(4,sPDI);
   SetIndexBuffer(5,sMDI);
   SetIndexBuffer(6,STR);
   SetIndexBuffer(7,DX);
//---- name for DataWindow and indicator subwindow label
   string short_name="WildersDMI("+MA_Length+","+DMI_Length+","+ADX_Length+","+ADXR_Length+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"ADX");
   SetIndexLabel(1,"+DI");
   SetIndexLabel(2,"-DI");
   SetIndexLabel(3,"ADXR");
//----
   SetIndexDrawBegin(0,DMI_Length+MA_Length);
   SetIndexDrawBegin(1,DMI_Length+MA_Length);
   SetIndexDrawBegin(2,DMI_Length+MA_Length);
   SetIndexDrawBegin(3,DMI_Length+MA_Length);
   SetIndexShift(3,2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int      shift, limit, counted_bars=IndicatorCounted();
   double alfa1=1.0/DMI_Length;
   double alfa2=1.0/ADX_Length;
//---- 
   if (counted_bars < 0) return(-1);
   if(counted_bars<1)
      for(shift=1;shift<=MA_Length+DMI_Length;shift++)
        {
         PDI[Bars-shift]=0.0;MDI[Bars-shift]=0.0;ADX[Bars-shift]=0.0;
         sPDI[Bars-shift]=0.0;sMDI[Bars-shift]=0.0;DX[Bars-shift]=0.0;
         STR[Bars-shift]=0.0;ADXR[Bars-shift]=0.0;
        }
   shift=Bars-MA_Length-DMI_Length-1;
   if(counted_bars>=DMI_Length+MA_Length) shift=Bars-counted_bars-1;
   while(shift>=0)
     {
      double AvgHigh =iMA(NULL,0,MA_Length,0,1,PRICE_HIGH,shift);
      double AvgHigh1=iMA(NULL,0,MA_Length,0,1,PRICE_HIGH,shift+1);
      double AvgLow  =iMA(NULL,0,MA_Length,0,1,PRICE_LOW,shift);
      double AvgLow1 =iMA(NULL,0,MA_Length,0,1,PRICE_LOW,shift+1);
      double AvgClose1= iMA(NULL,0,MA_Length,0,1,PRICE_CLOSE,shift+1);
//----
      double Bulls=0.5*(MathAbs(AvgHigh-AvgHigh1)+(AvgHigh-AvgHigh1));
      double Bears=0.5*(MathAbs(AvgLow1-AvgLow)+(AvgLow1-AvgLow));
      if (Bulls > Bears) Bears=0;
      else
         if (Bulls < Bears) Bulls=0;
         else
            if (Bulls==Bears) {Bulls=0;Bears=0;}
//----            
      sPDI[shift]=sPDI[shift+1] + alfa1 * (Bulls - sPDI[shift+1]);
      sMDI[shift]=sMDI[shift+1] + alfa1 * (Bears - sMDI[shift+1]);
//----      
      double   TR=MathMax(AvgHigh-AvgLow,AvgHigh-AvgClose1);
      STR[shift] =STR[shift+1] + alfa1 * (TR - STR[shift+1]);
      if(STR[shift]>0 )
        {
         PDI[shift]=100*sPDI[shift]/STR[shift];
         MDI[shift]=100*sMDI[shift]/STR[shift];
        }
      if(UseADX > 0)
        {
         if((PDI[shift] + MDI[shift])>0)
            DX[shift]=100*MathAbs(PDI[shift] - MDI[shift])/(PDI[shift] + MDI[shift]);
         else DX[shift]=0;
//----
         ADX[shift]=ADX[shift+1] + alfa2 *(DX[shift] - ADX[shift+1]);
         if(UseADXR >0) ADXR[shift]=0.5*(ADX[shift] + ADX[shift+ADXR_Length]);
        }
      shift--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------
 

If you leave out the parameters you get the defaults as code above, as in this example to get the four lines or values for the current bar and the last closed bar

double dBuffer0_0 = iCustom(NULL, 0, "WildersDMI_v1", 0, 0); 
double dBuffer1_0 = iCustom(NULL, 0, "WildersDMI_v1", 1, 0); 
double dBuffer2_0 = iCustom(NULL, 0, "WildersDMI_v1", 2, 0); 
double dBuffer3_0 = iCustom(NULL, 0, "WildersDMI_v1", 3, 0);

double dBuffer0_1 = iCustom(NULL, 0, "WildersDMI_v1", 0, 1); 
double dBuffer1_1 = iCustom(NULL, 0, "WildersDMI_v1", 1, 1); 
double dBuffer2_1 = iCustom(NULL, 0, "WildersDMI_v1", 2, 1); 
double dBuffer3_1 = iCustom(NULL, 0, "WildersDMI_v1", 3, 1);


if you want to supply variable parameters, it would be like this - they're in same order as in indi

extern int iMA_Length  = 2; 
extern int iDMI_Length = 14; 
extern int iADX_Length = 12;
extern int iADXR_Length = 13;
extern int iUseADX  = 0;
extern int iUseADXR  = 1;

int init()
 {

 }

start()
 {
  double dBuffer0_0 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 0, 0); 
  double dBuffer1_0 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 1, 0); 
  double dBuffer2_0 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 2, 0); 
  double dBuffer3_0 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 3, 0);

  double dBuffer0_1 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 0, 1); 
  double dBuffer1_1 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 1, 1); 
  double dBuffer2_1 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 2, 1); 
  double dBuffer3_1 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length,iDMI_Length,iADX_Length,iADXR_Length,iUseADX,iUseADXR, 3, 1);


  // Other code here
  // -----------------------------------------------------

  // -----------------------------------------------------

 return (0)
 }

Good Luck

-BB-

 
BarrowBoy:

If you leave out the parameters you get the defaults as code above, as in this example to get the four lines or values for the current bar and the last closed bar


if you want to supply variable parameters, it would be like this - they're in same order as in indi

Good Luck

-BB-




Thanks for your help. I'm not an expert in indicater code. I'll have a good look at your code.

Have a nice weekend.

 

The above is fine (I didn't know you could call iCustom without the parameters) except for the missing "=" e.i. double var = iCustom(...)

From

//---- buffers
double ADX[];
double PDI[];
double MDI[];
double ADXR[];
double sPDI[];
double sMDI[];
double STR[];
double DX[];
I'd add
#define WDMI_ADX    0
#define WDMI_PDI    1
#define WDMI_MDI    2
#define WDMI_ADXR   3
#define WDMI_sPDI   4
#define WDMI_sMDI   5
#define WDMI_STR    6
#define WDMI_DX     7

double dBuffer0_0 = iCustom(NULL, 0, "WildersDMI_v1", iMA_Length, iDMI_Length,
                           iADX_Length, iADXR_Length, iUseADX, iUseADXR, 
                           WDMI_ADX, 0); 
  
 

> except for the missing "="

Oooops - late night typing strikes again >_<

Edited now thanks :)

-BB-

 
BarrowBoy:

> except for the missing "="

Oooops - late night typing strikes again >_<

Edited now thanks :)

-BB-

An other question related to the code of ADX_WildersDMI, I try to locate the field definition of the 4 filelds (ADX, +DI, -DI, ADXR) displayed in the separate indicater window directly after the "short name" description. I'd like to add some text to them. But currently I can't see how they are defined in the code, nor how they are displayed.

The fields are not part of the short name description.

Any idea?

Thaniks.

 

> The fields are not part of the short name description.

Thats right, they are output values, so they appear at the right of the shortname but are not part of it - you just have to know they are in 'buffer order (i.e. 0-3)

You could add them dynamically to the shortname but they would still appear as the separate set of figures as well

-BB-

 
BarrowBoy:

> The fields are not part of the short name description.

Thats right, they are output values, so they appear at the right of the shortname but are not part of it - you just have to know they are in 'buffer order (i.e. 0-3)

You could add them dynamically to the shortname but they would still appear as the separate set of figures as well

-BB-


Tanks for confirmation, BB. I'll play arround with it.
Reason: