На замену предлагается оптимизированная версия, которая работает в Period раз быстрее. Скорость достигается за счет хорошо известного рекуррентного счета СКО вместо непрерывного лобового суммирования разностей квадратов при движении окна расчета, как в коде АД.
Код: Выделить всё
function Initialize()
{
IndicatorName = "BBfast";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddParameter("Period", 50, 1.2);
AddParameter("D", 2.0);
AddGlobalVariable("SUM", Types.Double, 0.0);
AddGlobalVariable("QUM", Types.Double, 0.0);
AddSeries("SMA", DrawAs.Line, Color.Gray);
AddSeries("Upper", DrawAs.Line, Color.Gray);
AddSeries("Lower", DrawAs.Line, Color.Gray);
}
function Evaluate()
{
double v=Input[0], sum=SUM, qum=QUM;
sum+=v; qum+=v*v;
int period=(int)Period;
if(CurrentIndex<period) period=CurrentIndex+1;
else
{
v=Input[-period];
sum-=v; qum-=v*v;
}
SUM=sum; QUM=qum;
v=sum/period;
SMA=v;
sum=D*Math.Sqrt((period*v*v-2.0*v*sum+qum)/period);
Upper=v+sum;
Lower=v-sum;
}