// Zero-lag Moving Average
var rError;
var rEMA;
var ZMA(var* Data,int Period)
{
var *vEMA = series(*Data,2);
var *vZMA = series(*Data,2);
var a = smoothF(Period);
vEMA[0] = a*Data[0]+(1.-a)*vEMA[1];
rEMA = vEMA[0];
rError = 1000000;
var Gain,GainLimit=5,BestGain=0;
for(Gain=-GainLimit; Gain < GainLimit; Gain += 0.1)
{
vZMA[0] = a*(vEMA[0] + Gain*(Data[0]-vZMA[1])) + (1-a)*vZMA[1];
var Error = Data[0] - vZMA[0];
if(abs(Error) < rError) {
rError = abs(Error);
BestGain = Gain;
}
}
return vZMA[0] = a*(vEMA[0] + BestGain*(Data[0]-vZMA[1])) + (1-a)*vZMA[1];
}