ALMA Moving Average

Опубликовано в AmiBroker

Еще одна необычная скользящая средняя.

Arnaud Legoux Moving Average - индикатор на основе распределения Гаусса для отклонения скользящего среднего в сторону наиболее актуальных цен. Это позволяет использовать большие периоды, чтобы отфильтровывать "шум", при этом индикатор своевременно реагирует на изменение рыночной тенденции.

Вот аннотация автора  к индикатору в переводе на русский: 

Мы с друзьями/коллегами создали этот новый индикатор в результате попыток создать новый вид скользящей средней. Мы  немного устали от неизменного за последние 10 лет набора MA.

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

Нулевой этап цифровой фильтрации снижает уровень шума в сигнале. Обычная фильтрация снижает уровень шума в сигнале, но добавляют задержку.

ALMA может дать отличные результаты, если вы потратите время, чтобы правильно настроить параметры.

Арно Л. 

Подобрать оптимальные параметры можно используя следующую формулу Amibroker:

 

_SECTION_BEGIN("Arnaud Legoux Moving Average");
function ALMA(priceField, windowSize, sigma, Offset)
{    m = floor(Offset * (windowSize - 1));
      s = windowSize / sigma;

      w = 0;
      wSum = 0;

      for(i = 1; i < windowSize; i++)
      {       w[i] = exp(-((i-m)*(i-m))/(s*s));               // 2 should be there?
               wSum += w[i];
      }

      for(i = 1; i < windowSize; i++)
           w[i] /= wSum;

      outalma = Null;

      for(j = 0; j < BarCount; j++)
      {     alSum = 0;
             if(j < windowSize)
                   outalma[j] = Null;
             else
             {        for(i = 1; i < windowSize; i++)
                             alSum += priceField[j - (windowSize - 1 - i)] * w[i];
                       outalma[j] = alSum;
             }
      }

      return outalma;
}

p = ParamField("Price Field");
windowSize = Param("Window Size", 9, 5, 201, 2);
sigma = Param("Sigma", 6, 1, 20);
Offset = Param("Offset", 0.85, 0.05, 1.0, 0.05);

Plot(ALMA(p, windowSize, sigma, Offset), "ALMA", ParamColor("Color",colorBlue), ParamStyle("Style"));
_SECTION_END();

_SECTION_BEGIN("Price1");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

 

Более подробно: Неформальное описание скользящей ALMA

Реализация индикатора для терминала QUIK здесь.

Cм. также

От себя  - эксперименты с этой скользящей дают интересные результаты. Думаю (на досуге) попробовать построить какой-нибудь алгоритм с её использованием.

 


Дополнение. В версии 5.4 появилась новая функция FIR(). Применение ее даёт значительно более простую формулу для ALMA:

// AFL code by E.M.Pottasch, 2011

ws=Param("Window Size",21,5,201,2);
sigma=Param("Sigma",6,1,20,1);
Offset=Param("Offset",1,0,1.0,0.05);
bi=BarIndex();

 

m=floor(Offset*(ws-1));s=ws/sigma;
window=IIf(bi<ws,(Cum(1)-1)-m,0);
window=IIf(bi<ws,exp(-(window^2)/(2*s^2)),0);
rr=FIR(C,window,ws);

 

SetChartOptions(0, chartShowDates);
Plot(C,"\nLast",colorLightGrey,styleCandle);
Plot(rr,"\nALMA",colorBlue,1);

 

Комментарии   

# FreeMan 31.03.2012 22:14
Михаил, реально ли запрограммирова ть эту скользящую в квке?
# admin 01.04.2012 00:54
Нет ничего невозможного :lol:
# AmiGator 12.07.2018 15:58
А как добавить несколько одинаковых индикаторов? Они как бы добавляются, а в разделе Parameters настройка общая. Для кастомных недоступно это?
# admin 13.07.2018 01:24
Посмотрите повнимательнее. У каждого индикатора свои настройки, которые вы можете изменять

Недостаточно прав для комментирования