Все скользящие средние в одном флаконе
Часто в алгоритмах, написанных в Амиброкере, приходится экспериментировать не только с периодами скользящих средних, но и с их типами. Порылся в сети, собрал все, что попалось под руку и решил сохранить на память универсальный код для Амиброкера.
// Расчет скользящей средней взависимости от её типа
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 |
См. также
- Фрактальная адаптивная скользящая средняя FRAMA
- Скользящая средняя ALMA
- Неформальное описание скользящей ALMA
- Скользящие средние - основы (видео)
- Displaced Moving Average
- Optimum Moving Average
- Индикатор SMAD
