I have a working strategy in Zorro and I need to code it in MQL4 in order to run it in a context that doesn't permit the use of DLLs. But I am having trouble implementing BBands properly.
Some plotting for testing purposes.
// compare Bollinger bands separation to StdDev, Moment, and Variance functions
int bbperiod = 10;
BBands(Price,bbperiod,2,2,MAType_SMA);
var bbdist = rRealUpperBand + rRealLowerBand;
var std = StdDev(Price, bbperiod);
plot("STD", 4.*std - bbdist, NEW, RED);
var mom = sqrt(Moment2(Price, bbperiod, 2));
plot("Moment", 4.*mom - bbdist, NEW, RED);
var vari = sqrt(Variance(Price, bbperiod));
plot("Var", 4.*vari - bbdist, NEW, RED);
printf("\nStd %f mom %f var %f", 4.*std-bbdist, 4.*mom-bbdist, 4.*vari-bbdist);
For periods >= 4, StdDev and Variance give the same results, for period = 3 there are three different results.
I may have found a bug in the implementation of Moment in indicators.c ... here is an extract
// rMean contains the mean over Period values
var variance=0.;
int i;
for(i=0; i<Period; i++) {
var f = Data[i]-rMean;
variance += f*f;
}
variance /= (Period-1);
This code takes the sum of
Period values and divides that sum by
(Period-1). Shouldn't the sum be divided by
Period?
I tried a second test with a corrected version of the Moment function. For periods >= 4, StdDev and Variance give the same results, for period = 3 Variance gives the same result as Moment.
In any case, StdDev always gives the closest result. I have tried reading the ta-lib sources but I can't see the difference between Moment and StdDev. Any help would be appreciated.