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, что означает окончание предыдущего движения (разворот тренда, либо его временную стабилизацию на данном уровне). Индикатор является исключительно трендовым.
Пример:
Исходный текст:
Код: Выделить всё
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;
}
}
Индикатор является встроенным индикатором, поэтому создавать пользовательский индикатор не имеет смысла.