АДАПТИВНЫЕ СКОЛЬЗЯЩИЕ СРЕДНИЕ
AMA (Adaptive Moving Average) – АДАПТИВНАЯ СКОЛЬЗЯЩАЯ СРЕДНЯЯ КАУФМАНА
Адаптивная скользящая средняя – это экспоненциальная скользящая средняя с изменяемым периодом сглаживания. Данный индикатор часто встречается под именем KAMA. Формула АМА совпадает с формулой EMA
,
где SС – коэффициент сглаживания, который изменяется во времени и зависит от отношения реального изменения цены (Signal) и совокупного абсолютного изменения за выбранный период (Noise).
Коэффициент ER при монотонном движении равен единице (т.к. Signal = Noise) , а при нулевом изменении или очень малом – стремится к нулю. Для приведения коэффициента сглаживания к диапазону значений соответствующих двум EMA с некоторыми периодами добавляются следующие преобразования
где
Типовые параметры. Обычно используются следующие значение периода усреднения для дневного тайм-фрейма Pfast = 4, Pslow = 30, P = 10 .
Сигналы.
Трендовый вариант
Если цена пересекает вверх линию АМА, то покупать.
Если цена пересекает вниз линию АМА, то продавать.
Вариант дополнительного открытия позиции
Если Low < АМА и Close > Open, то покупать.
Если High > АМА и Close < Open, то продавать.
Автор: Перри Кауфман (Perry J. Kaufman).
Первоисточник: «Trading Systems and Methods»
Код Альфа-Директ
function Initialize()
{
IndicatorName = "AMA";
AddInput("Input", Inputs.Price);
PriceStudy = true;
AddSeries("AMA", DrawAs.Line, Color.Red);
AddParameter("PSlow", 30.0, 1);
AddParameter("PFast", 4.0);
AddParameter("Period", 10.0);
}
function Evaluate()
{
// AlfaDirect. 2014. OX
// Индикатора KAMA. Адаптивная скользящая средняя П.Кауфмана (Perry J. Kaufman).
if (CurrentIndex <= Period)
AMA = Input[0];
else
{
double Sig = Math.Abs(Input[0] - Input[-Period]);
double Noise = 0.0;
for (int j = 0; j < Period; j++)
Noise = Noise + Math.Abs( Input[-j] - Input[-j-1] );
double SSC = 0.0;
if (Noise > 0.0)
SSC = (Sig / Noise) * ( 2.0/(PFast + 1.0) - 2.0/(PSlow + 1.0) ) + 2.0/(PSlow + 1.0);
else
SSC = 0.0;
AMA = AMA[-1] + SSC*SSC*( Input[0] - AMA[-1] );
}
}
SAR (STOP and REVERSE) – СТОП и РЕВЕРС
ParabolicSAR (Parabolic Stop And Revers)– Параболическая система
Параболическая система (Parabolic SAR – Parabolic Stop and Reverse) – это индикатор, отражающий текущий уровень следящего стоп–приказа, который постоянно подтягивается к цене. Уровень следящего стоп–приказа рассчитывается по формуле:
SAR(t) = SAR(t-1) + AF*(EP-SAR(t-1)),
где SAR(t) – текущее значение стопа; SAR(t-1) – предыдущее значение стопа; EP – текущий экстремум в направлении позиции Параболика; AF – фактор ускорения. Фактор ускорения AF изначально равен параметру Step, далее увеличивается с каждым новым экстремумом AF = AF + Step, но не превышает заданного максимального значения MaxStep.
При срабатывании стопа (т.е. цена пробивает его уровень), индикатор меняет позицию и устанавливает начальный стоп на уровне последнего значения противоположного экстремума.
Параметры: Шаг (Step) – начальное значение AF и шаг его изменения при появлении нового экстремума в направлении текущей позиции. Макс. (MaxStep) – максимальное значение, которое может принимать фактора «ускорение» AF.
Настройка параметров
Типовыми параметрами Параболика являются: Шаг(Step) = 0,02, Макс(МахStep) = 0,2.
Если сравнить формулу индикатора Параболика с EMA, то видно, что коэффициент AF в Параболике соответствует коэффициенту 2/(N+1) в EMA, где N – период EMA. Тогда при типовых параметрах, период экспоненциального сглаживания экстремумов начинается со периода 99 и доходит до периода почти равного 10 при формировании нескольких новых экстремумов в направлении текущей позиции.
Исходя из этого можно оценить работоспособность индикатора с типовыми параметрами и предположить необходимые параметры индикатора на выбранном тайм-фрейме. Пример. Если есть бумага, на которой быстрый тренд контролируется индикатором EMA(50), то максимальное значение будет равно 0,04.
Сигналы
Сигналом для совершения операции является пересечение графика цены с линией SAR, что означает окончание предыдущего движения (разворот тренда, либо его временную стабилизацию на данном уровне). Индикатор является исключительно трендовым.
Индикатор является встроенным индикатором, поэтому создавать пользовательский индикатор не имеет смысла.
Автор: Welles Wilder
Источники: Welles Wilder. New Concepts in Technical Trading Systems. 1978.
Код Альфа-Директ (на базе исходников CodeBase/MQL4)
function Initialize()
{
IndicatorName = "ParabolicSAR";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddParameter("Step", 0.02); // начальный шаг
AddParameter("Maximum", 0.2); // максимальный шаг
AddGlobalVariable("dirlong", Types.Long, 1);
AddGlobalVariable("last_high", Types.Double, 0.0);
AddGlobalVariable("last_low", Types.Double, 0.0);
AddGlobalVariable("ep", Types.Double, 0.0);
AddGlobalVariable("start", Types.Double, 0.0);
AddSeries("ParabolicSAR", DrawAs.Line, Color.Blue);
}
function Evaluate()
{
// AlfaDirect. 2014. OX
// Индикатор ParabolicSAR. Автор: Уэллс Уайлдер (Welles Wilder).
// Реализация по MQL4. Совпадает с MetaStock.
var sar = 0.0;
var price = 0.0;
var price_low = 0.0;
var price_high = 0.0;
if (CurrentIndex < 3)
{
start = Step;
dirlong = 1;
ep = Input.High[0];
last_high = Input.High[0];
last_low = Input.Low[0];
ParabolicSAR = Input.Low[0];
}
else
{
price_low = Input.Low[0];
price_high = Input.High[0];
if (dirlong == 1 && price_low < ParabolicSAR[1])
{ // Если позиция лонг и стоп параболик
dirlong = 0;
start = Step;
ep = price_low;
last_low = price_low;
ParabolicSAR = last_high;
return;
}
if (dirlong < 1 && price_high > ParabolicSAR[1])
{ // Если позиция лонг и стоп параболик
dirlong = 1;
start = Step;
ep = price_high;
last_high = price_high;
ParabolicSAR = last_low;
return;
}
price = ParabolicSAR[1];
sar = price + start * (ep - price);
if (dirlong == 1)
{
if ((ep < price_high) && ((start + Step) <= Maximum))
start = start + Step;
price = Input.Low[1];
if (sar > price)
sar = price;
price = Input.Low[2];
if (sar > price)
sar = price;
if (sar > price_low)
{
start = Step;
dirlong = 0;
ep = price_low;
last_low = price_low;
ParabolicSAR = last_high;
return;
}
if (ep < price_high)
{
last_high = price_high;
ep = price_high;
}
}
else
{
if ((ep > price_low) && ((start + Step) <= Maximum))
start = start + Step;
price = Input.High[1];
if (sar < price)
sar = price;
price = Input.High[2];
if (sar < price)
sar = price;
if (sar < price_high)
{
start = Step;
dirlong = 1;
ep = price_high;
last_high = price_high;
ParabolicSAR = last_low;
return;
}
if (ep > price_low)
{
last_low = price_low;
ep = price_low;
}
}
ParabolicSAR = sar;
}
}
|