The main loop ends at 1.
for(int i=limit; i>=0; i--)
Ernst Van Der Merwe:
The main loop ends at 1.
for(int i=limit; i>=0; i--)
Hi Ernst,
I have tried changing to what you suggested but arrows stay displayed in the same place... any other suggestions?
Thanks
for(int i=limit; i>0; i--)
if (direction[i]== 1) CrossUp[i-1] = Low[i-1] - iATR(NULL,0,10,i-1);
Try something like that.
Keith Watford:
When I do this arrows no longer appear at all on chart...
for(int i=limit; i>0; i--)
if (direction[i]== 1) CrossUp[i-1] = Low[i-1] - iATR(NULL,0,10,i-1);
Try something like that. {
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--)
{
j=i+1;
macd[j] = iMA(NULL,0,Fast_EMA,0,MODE_EMA,price,j)-iMA(NULL,0,Slow_EMA,0,MODE_EMA,price,j);
direction[j] = (j<rates_total-1) ? (macd[j]>macd[j+1]) ? 1 : (macd[j]<macd[j+1]) ? -1 : 0 : 0;
CrossUp[i] = EMPTY_VALUE;
CrossDown[i] = EMPTY_VALUE;
if(j<rates_total-1 && direction[j]!=direction[j+1])
{
if(direction[j]== 1) CrossUp[i] = low[j] - iATR(NULL,0,10,j);
if(direction[j]==-1) CrossDown[i] = high[j] + iATR(NULL,0,10,j);
}
}
return(rates_total);
}
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--)
{
j=i+1;
macd[j] = iMA(NULL,0,Fast_EMA,0,MODE_EMA,price,j)-iMA(NULL,0,Slow_EMA,0,MODE_EMA,price,j);
direction[j] = (j<rates_total-1) ? (macd[j]>macd[j+1]) ? 1 : (macd[j]<macd[j+1]) ? -1 : 0 : 0;
CrossUp[i] = EMPTY_VALUE;
CrossDown[i] = EMPTY_VALUE;
if(j<rates_total-1 && direction[j]!=direction[j+1])
{
if(direction[j]== 1) CrossUp[i] = low[j] - iATR(NULL,0,10,j);
if(direction[j]==-1) CrossDown[i] = high[j] + iATR(NULL,0,10,j);
}
}
return(rates_total);
}
Ernst Van Der Merwe:
Wow Ernst thank you so much! that works great!!
{
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--)
{
j=i+1;
macd[j] = iMA(NULL,0,Fast_EMA,0,MODE_EMA,price,j)-iMA(NULL,0,Slow_EMA,0,MODE_EMA,price,j);
direction[j] = (j<rates_total-1) ? (macd[j]>macd[j+1]) ? 1 : (macd[j]<macd[j+1]) ? -1 : 0 : 0;
CrossUp[i] = EMPTY_VALUE;
CrossDown[i] = EMPTY_VALUE;
if(j<rates_total-1 && direction[j]!=direction[j+1])
{
if(direction[j]== 1) CrossUp[i] = low[j] - iATR(NULL,0,10,j);
if(direction[j]==-1) CrossDown[i] = high[j] + iATR(NULL,0,10,j);
}
}
return(rates_total);
}
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--)
{
j=i+1;
macd[j] = iMA(NULL,0,Fast_EMA,0,MODE_EMA,price,j)-iMA(NULL,0,Slow_EMA,0,MODE_EMA,price,j);
direction[j] = (j<rates_total-1) ? (macd[j]>macd[j+1]) ? 1 : (macd[j]<macd[j+1]) ? -1 : 0 : 0;
CrossUp[i] = EMPTY_VALUE;
CrossDown[i] = EMPTY_VALUE;
if(j<rates_total-1 && direction[j]!=direction[j+1])
{
if(direction[j]== 1) CrossUp[i] = low[j] - iATR(NULL,0,10,j);
if(direction[j]==-1) CrossDown[i] = high[j] + iATR(NULL,0,10,j);
}
}
return(rates_total);
}
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--) | The rt-2 is wrong. You have lookbacks -2, Slow_EMA, Fast_EMA and 10 (ATR.) See How to do your lookbacks correctly. |
whroeder1:
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--) | The rt-2 is wrong. You have lookbacks -2, Slow_EMA, Fast_EMA and 10 (ATR.) See How to do your lookbacks correctly. |
EMAs aren't bar dependent, so the lower rates_total-n is, the longer it would take to get the correct value. In this case, use a rates total check instead.
if(rates_total<100 || prev_calculated<0)
return(0);
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--)
return(0);
int j,limit = prev_calculated<1 ? rates_total-2 : rates_total-prev_calculated;
for(int i=limit; i>=0; i--)
![MQL5 - Language of trade strategies built-in the MetaTrader 5 client terminal](https://c.mql5.com/i/registerlandings/logo-2.png)
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
Below indicator displays up/ down arrows when MACD histogram changes direction. I am trying to get it to change the arrow to display on the current bar (0) as opposed to bar 1. i.e. when MACD changes direction and candle closes I would like arrow to be displayed on the following candle as opposed to that one. I have tried changing last two if statements 'i' but have had no luck... I feel like the solution should be an easy one but am unable to find an answer.
Any help or advice much appreciated.
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrLawnGreen
#property indicator_color2 clrRed
#property strict
//------------------------------------------------------------------
extern int Fast_EMA = 12; // Fast ema period
extern int Slow_EMA = 26; // Slow ema period
extern ENUM_APPLIED_PRICE price = PRICE_CLOSE; // Price
double CrossUp[],CrossDown[],direction[],macd[];
int OnInit()
{
IndicatorBuffers(4);
SetIndexBuffer(0, CrossUp); SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0, 225);
SetIndexBuffer(1, CrossDown); SetIndexStyle(1, DRAW_ARROW); SetIndexArrow(1, 226);
SetIndexBuffer(2, direction);
SetIndexBuffer(3, macd);
return(0);
}
int OnCalculate (const int rates_total,
const int prev_calculated,
const datetime& btime[],
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[] )
{
int counted_bars = prev_calculated;
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
int limit=MathMin(rates_total-counted_bars,rates_total-1);
for(int i=limit; i>-0; i--)
{
macd[i] = iMA(NULL,0,Fast_EMA,0,MODE_EMA,price,i)-iMA(NULL,0,Slow_EMA,0,MODE_EMA,price,i);
direction[i] = (i<Bars-1) ? (macd[i]>macd[i+1]) ? 1 : (macd[i]<macd[i+1]) ? -1 : 0 : 0;
CrossUp[i] = EMPTY_VALUE;
CrossDown[i] = EMPTY_VALUE;
if (i<Bars-1 && direction[i]!=direction[i+1])
{
if (direction[i]== 1) CrossUp[i] = Low[i] - iATR(NULL,0,10,i);
if (direction[i]==-1) CrossDown[i] = High[i] + iATR(NULL,0,10,i);
}
}
return(rates_total);
}
I have tried changing