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

Опубликовано в 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)":
             e1 = array - Ref(array,-1);
e2 = Sum(e1 > 0, period);
e3 = Sum(e1 < 0, period);
result = AMA(array, 2*abs((e2 - e3) / (e2 + e3)) / (period+1));
              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

 

 

См. также