I have this TEMA indicator which worked fine. I added a piece of code in order to limit the amount of bars to process but the indicator line gets messed up in the back in an abnormal way and when I limit the amount of bars to process to a small value like 500 the indicator doesn't display properly at all it just throws lines up and down.
This is the modified code which I use.
Can someone help me shed some light on this.
If I limit the bars for a simple moving average code I do not get these above mentioned problems.
I for one believe it has something to do with the IMAOnArray() part in the code. I also attached an image to display the problem.
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DarkBlue
#property indicator_width1 2
//---- input parameters
extern int EMA_period=14;
//code added to limit amount of bars.
extern int BarsBack=1500;
//---- buffers
double TemaBuffer[];
double Ema[];
double EmaOfEma[];
double EmaOfEmaOfEma[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(4);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,TemaBuffer);
SetIndexBuffer(1,Ema);
SetIndexBuffer(2,EmaOfEma);
SetIndexBuffer(3,EmaOfEmaOfEma);
SetIndexDrawBegin(0, Bars - BarsBack);
IndicatorShortName("TEMA("+EMA_period+")");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i,limit,limit2,limit3,counted_bars=IndicatorCounted();
//---++
//coded added to limit bars
if(Bars>BarsBack)
{
limit=BarsBack;
}
else
{
limit=Bars-counted_bars-1;
}
limit2=limit;
limit3=limit2;
for (i=limit;i>=0;i--) Ema[i]=iMA(NULL,0,EMA_period,0,MODE_EMA,PRICE_CLOSE,i);
for (i=limit2;i>=0;i--) EmaOfEma[i]=iMAOnArray(Ema,0,EMA_period,0,MODE_EMA,i);
for (i=limit3;i>=0;i--) EmaOfEmaOfEma[i]=iMAOnArray(EmaOfEma,0,EMA_period,0,MODE_EMA,i);
for (i=limit3;i>=0;i--) TemaBuffer[i]=3*Ema[i]-3*EmaOfEma[i]+EmaOfEmaOfEma[i];
//----
return(0);
}
//+------------------------------------------------------------------+