iATR produces different Values to ATR Indicator

 

Help please...

I'm trying to add an ADX signal to a MA crossover signal but iADX is producing different values to that of the ADX Indicator. Can someone let me know where I'm going wrong - I think it has something to do with not enough bars for calculating iADX.


//+------------------------------------------------------------------+
//| EMA-Crossover_Signal.mq4 |
//| Copyright © 2005, Jason Robinson (jnrtrading) |
//| http://www.jnrtading.co.uk |
//+------------------------------------------------------------------+

/*
+------------------------------------------------------------------+
| Allows you to enter two ema periods and it will then show you at |
| Which point they crossed over. It is more usful on the shorter |
| periods that get obscured by the bars / candlesticks and when |
| the zoom level is out. Also allows you then to remove the emas |
| from the chart. (emas are initially set at 5 and 6) |
+------------------------------------------------------------------+
*/
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)"
#property link "http://www.jnrtrading.co.uk"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red

double CrossUp[];
double CrossDown[];
extern int FasterMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA = 13;
extern int SlowerMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA = 25;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0, DRAW_ARROW, EMPTY);
SetIndexArrow(0, 233);
SetIndexBuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW, EMPTY);
SetIndexArrow(1, 234);
SetIndexBuffer(1, CrossDown);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int limit, i, counter;
double fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter, ADXprevious, ADXnow, ADXafter;
double Range, AvgRange, ATR;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

for(i = 0; i <= limit; i++) {

counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;

fasterMAnow = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i);
fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i+1);
fasterMAafter = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE, i-1);

slowerMAnow = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i);
slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i+1);
slowerMAafter = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE, i-1);

ADXnow = iADX(NULL, 0, 14, 0, 0, i);
ADXprevious = iADX(NULL, 0, 14, 0, 0, i+1);
ADXafter = iADX(NULL, 0, 14, 0, 0, i-1);


if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter) && (ADXafter > 24)) {
CrossUp[i] = Low[i] - Range*0.5;
//string var1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
Alert(ADXafter);
}
else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter) && (ADXafter > 24)) {
CrossDown[i] = High[i] + Range*0.5;
Alert(ADXafter);
}

}
return(0);
}

 
Please use this to post code . . . it makes it easier to read.

 
When i = 0 this is looking into the future . . . ADXafter = iADX(NULL, 0, 14, 0, 0, i-1);
 
RaptorUK:
When i = 0 this is looking into the future . . . ADXafter = iADX(NULL, 0, 14, 0, 0, i-1);

Apologies, I am very new to this. Even when I use ADXnow = iADX(NULL, 0, 14, 0, 0, i); I get differnent readings to that of the Indicator.
 
waynered:

Apologies, I am very new to this. Even when I use ADXnow = iADX(NULL, 0, 14, 0, 0, i); I get differnent readings to that of the Indicator.
No need to apologies to me :-) perhaps you could give some more info, screen grabs showing the figures that don't match, screen grabs showing the settings you are using with the Indicator, etc.
 
RaptorUK:
No need to apologies to me :-) perhaps you could give some more info, screen grabs showing the figures that don't match, screen grabs showing the settings you are using with the Indicator, etc.

The figures appearing in my Alert box are not matching the values of the ADX indicator in the Indicator window.


 
waynered:

The figures appearing in my Alert box are not matching the values of the ADX indicator in the Indicator window.





 
waynered:

Apologies, I am very new to this. Even when I use ADXnow = iADX(NULL, 0, 14, 0, 0, i); I get differnent readings to that of the Indicator.

No you don't . . . you are making incorrect assumptions. Add the bar number to your alert messages . . .

Alert("ADXnow: ", ADXnow, " barNo.: ", i);
Alert("ADXprevious: ", ADXprevious, " barNo.: ", i);
 
RaptorUK:

No you don't . . . you are making incorrect assumptions. Add the bar number to your alert messages . . .


Thanks RaptorUK. You're right...it does work.


Still getting used to looping and Bar referencing.


Now I just need to figure out how to turn it into an EA and exit strategy.


Thanks again.

Reason: