Germany | Finland | Saint Petersburg | Drive

Все скользящие средние в одном флаконе

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

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

// Расчет скользящей средней взависимости от её типа
function MovingAverage( array, periods, type )
{
      switch (type)
      { case "MA":
              result = MA(array,periods);
              break;
         case "EMA":
              result = EMA(array,periods);
              break;
         case "DEMA":
              result = DEMA(array,periods);
              break;
         case "TEMA":
              result = TEMA(array,periods);
              break;
         case "HMA":
              result = HMA(array,periods);
              break;
         case "AMA":
              result = AMA(array,periods);
              break;
         case "WMA":
              result = WMA(array,periods);
              break;
         case "Wilders":
              result = Wilders(array,periods);
              break;
         case "Kaufman":
              fast = 2/(2+1); 
              slow = 2/(30+1 ); 
              result = AMA(array, (abs(array-Ref(array,-Periods))/Sum(abs(array-Ref(array,-1)),Periods)*(fast-slow)+slow)^2);
              break;
        case "TSF":
              result = TSF(array,periods);
              break;
        case "Linear Regression":
              result = LinearReg( array, Periods );
              break;
        case "T3":
              a = 0.7 ; 
              e1=EMA (array,Periods); 
              e2=EMA (e1,Periods); 
              e3=EMA (e2,Periods); 
              e4=EMA (e3,Periods); 
              e5=EMA (e4,Periods); 
              e6=EMA (e5,Periods); 
              result = -a^3 * e6 + (3 * a^2 +3 * a^3) * e5 + (-6 * a^2 - 3 * a - 3 * a^3) * e4 + (1 + 3 * a + a^3 + 3 * a^2 ) * e3; 
              break;
        case "ViDYA(CMO)":
              Up = Sum(IIf(array > Ref(array, -1), (array - Ref(array ,-1)), 0 ), periods); 
              Dw = Sum(IIf(array < Ref(array, -1), (Ref(array, -1) - array), 0 ), periods); 
              result = AMA(array, 2/(periods+1) *abs ((Up - Dw)/(Up + Dw)));
              break;
        case "ViDYA(StDev)":
              result = AMA(array, 2/(periods+1) * StDev(array, periods)/StDev(array, 2*Periods));
              break;
       case "TRIMA":               if ( (periods % 2) > 0)
                   e1 = e2 =(periods+1)/2;
              else
                   e1 = (e2=periods/2) + 1;
              result = MA(MA(array,e1),e2);            break;
       case "SWMA":
              /* Sine Weighted Moving Average */
              PI = 4 * atan(1);
              k = PI / (periods + 1);
             // denominator
             den = 0;
             for (i = 1; i <= periods; i++)
                     den += sin(i * k);
              for (i = 0; i < periods - 1; i++)
                     result[i] = Null;
             for (i = periods - 1; i < BarCount; i++)
             {
                    nom = 0;
                    for (j = 1; j <= periods; j++)
                              nom += sin(j * k) * array[i - periods + j];
                    result[i] = nom / den;
             }
             break;
       case "JMA":
             s1=0;
             for( i = 0; i < periods; i++ )
                   s1=s1+((periods-(2*i)-1)/2)*Ref(array,-i);
             result = MA(array,periods)+(((periods/2)+1)*S1)/((periods+1)*periods);
             break;
      case "OTF":
             SC = 2/(Periods+1);
             MPr =(H+L)/2;
             Val1[0] = SC * MPr[0];
             Val2 = SC *(H-L) / 2;
             for (i = 1 ; i < BarCount ; i++)
             { Val1[i] = SC * (MPr[i]-MPr[i-1]) +(1-SC) * Val1[i-1];
               Val2[i] += (1-SC) * Val2[i-1];
             }

             Lamb = IIf(Val2,abs(Val1/Val2),0);
             Alpha =(-Lamb^2 + Lamb * sqrt(Lamb^2+16))/8;
            result = C * Alpha;
            for (i = 1 ; i < BarCount ; i++)
                 result[i] += (1-Alpha[i])*result[i-1];
            break;
      }
      return result;
}
// Получения типа скользящей средней
function get_type_of_ma(Param_Name)
{        return ParamList(Param_Name,"MA|EMA|AMA|DEMA|TEMA|WMA|Wilders|Kaufman|Linear Regression|TSF|T3|ViDYA(CMO)|ViDYA(StDev)|TRIMA|DispMA|HMA|ALMA|SWMA|JMA|OTF",1);}

И собственно, расчет любой скользящей средней в теле формулы

M_A = MovingAverage( ParamField("MA Field",-1), ParamOptimize( "MA period", 30, 6, 150, 1),get_type_of_ma("MA type"));

Какие-то типы средних пропустил? Буду рад добавить.

 


Стандартные порядки скользящих средних 

Период графика Порядки средних
Недельный 8, 13, 21
Дневной 8, 13, 21, 55, 89
4 часа 8, 34, 55, 89, 144
Часовой 8, 34, 55, 89, 144
15 минут 34, 55, 144

 

 

См. также 

Комментарии   
# Al9 01.06.2012 22:53
Доброго времени, Михаил. Это старый клиент/ученик (Ами ты мне открыл) ) - Александр (Мурманск). Не нашел Adaptive Moving Average в описании. А этот тип достаточно интересен (В QUIK уже встроили)
Ответить | Ответить с цитатой | Цитировать
# admin 02.06.2012 09:58
Александр, не вопрос, подрисовал. Эта средняя в Амиброкере встроенная, только второй параметр у неё имеет другой смысл, чем у остальных.

P.S. Приятно видеть старых друзей:)
Ответить | Ответить с цитатой | Цитировать
# AlexLan 20.06.2012 22:51
Доброго времени, Михаил.
Огромное спасибо за пример. Для мне как начинающему программисту в АМИ, пример оказался очень полезен.
В нем к сожалению АМА не работает (работает не правильно).
Большое спасибо.
С уважением, Александр. :-)
Ответить | Ответить с цитатой | Цитировать
# admin 21.06.2012 10:10
Alex, а что с AMA неправильно? Кроме того, что смысл второго параметра иной, чем у остальных, конечно.
Ответить | Ответить с цитатой | Цитировать
# AlexLan 21.06.2012 10:38
Михаил, добрый день.
У меня вывелась пила, в квике получается другой вид.
Это наверно из -за того, что в helpe в примере используется еще один параметр. Если поставить стандартные значения для расчета 2 и 30 то получается копия Kaufman.
Спасибо Вам за проделанную работу.
Подскажите пожалуйста. Ваш плагин Ами-Квик работает?
Ответить | Ответить с цитатой | Цитировать
# admin 21.06.2012 10:47
Алекс, в какие-то разные хелпы мы смотрим, видимо. Вот что я вижу в хелпе ами 5.4:

SYNTAX ama( ARRAY, SMOOTHINGFACTOR )
RETURNS ARRAY
FUNCTION calculates adaptive moving average - simliar to EMA() but smoothing factor could be time-variant (array).
EXAMPLE The example of volatility-weig hted adaptive moving average formula: graph0 = ema( close, 15 );
fast = 2/(2+1);
slow = 2/(30+1);
dir=abs(close-ref(close,-10));
vol=sum(abs(close-ref(close,-1)),10);
ER=dir/vol;
sc =( ER*(fast-slow)+ slow)^2; graph0 = ama( close, sc );


Счто касается адаптера амишарп - конечно работает. Пишу на нем сейчас очередной заказ
Ответить | Ответить с цитатой | Цитировать
# AlexLan 21.06.2012 11:03
Да эти формулы)))
Еще раз попробую запустить.
Спасибо, за ответ.
Ответить | Ответить с цитатой | Цитировать
# admin 21.06.2012 19:55
Всегда рад помочь, Alex.
Ответить | Ответить с цитатой | Цитировать
# AlexLan 30.06.2012 12:35
Михаил, огромное Вам спасибо за советы. :-)
Приятно поговорить с умным человеком. ))
Ответить | Ответить с цитатой | Цитировать
# admin 10.07.2012 12:23
И Вам удачи. Вот такой, например:

Ответить | Ответить с цитатой | Цитировать
# jma 28.09.2013 21:19
А почему у jma в формуле только период используется ?
там же в общем случае сглаживание должно еще задаваться?
Ответить | Ответить с цитатой | Цитировать
# admin 28.09.2013 22:02
Вы про фазу?

В этой Afl собраны средние с одним параметром - период. соответственно и у Jurik второй параметр опущен.

Если необходимо использовать полный вариант - лучше взять juriklib.dll и подключить ее к ами.
Ответить | Ответить с цитатой | Цитировать
# PASHAsoft 14.11.2013 11:25
PASHAsoft,

дорисуете? Добавлю, какие вопросы...
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий