// normalize a value to the -1..+1 range
var Normalize(var* Data,int Period)
{
Period = Max(2,Period);
var vMin = MinVal(Data,Period);
var vMax = MaxVal(Data,Period);
if(vMax>vMin)
return 2.*(*Data-vMin)/(vMax-vMin) - 1.;
else return 0.;
}
// Fisher Transform
var Fisher(var* Data)
{
var v = Clamp(Data[0],-0.998,0.998);
return 0.5*log((1.+v)/(1.-v));
}
// Normalized Fisher transform
var FisherN(var* Data,int Period)
{
var *Value = series(*Data,2), *FN = series(*Data,2);
Value[0] = 0.33*Normalize(Data,Period) + 0.67*Value[1];
return FN[0] = Fisher(Value) + 0.5*FN[1];
}