Пользовательские индикаторы > Быстрые ленты Боллинджера

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
BugsDigger
Сообщения: 535
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 92 раза

Быстрые ленты Боллинджера

Непрочитанное сообщение BugsDigger » 06 ноя 2021, 11:21

Изучая внутренности встроенного индикатора BB, увидел, что счет там далеко не оптимален по скорости. В этом можно легко убедиться, бросив на график данный индикатор с достаточно большим периодом: начинаются сильные тормоза при листании графика; в оптимизации вообще завал.

На замену предлагается оптимизированная версия, которая работает в 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;
}

Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей