Условие определения экстремумов
1. Строится на основе отклонения от экстремума на ATR(Period) * K, где
ATR - значение индикатора ATR с периодом Period,
K - коэффициент.
2. Или на основании фракталов, цена закрытия ниже (выше) максимума (минимума) заданное количество баров.
Сигналы Buy и Sell формируются в момент определения экстремумов, т.е. именно эти ряды можно использовать для стратегий в АД4, Buy > 0 - сигнал на покупку, Sell > 0 - сигнал на продажу.
Дополнительные особенности
- Последняя предполагаемая линия перерисовывается.
- Отображаются уровни последних экстремумов.
Параметры
Period - период ATR
K - коэффициент для ATR
Bars - количество баров для определения фрактала (справа)
Пример
Код: Выделить всё
function Initialize()
{
//ZZe - ZigZag evge
IndicatorName = "ZZe";
PriceStudy = true;
AddInput("I", Inputs.Candle);
// Сигнал на "покупку" в момент определения локального миниумма
AddSeries("Buy", DrawAs.Custom, Color.Green);
// Сигнал на "продажу" в момент определения локального максимума
AddSeries("Sell", DrawAs.Custom, Color.Red);
// Зиззаг
AddSeries("Line", DrawAs.Line, Color.Blue);
AddSeries("LineLast", DrawAs.Line, Color.Gray);
// Уровни последних определенных экстремумов
AddLevel(0, Color.Green, LineStyles.Dot, 2, "Buy");
AddLevel(0, Color.Red, LineStyles.Dot, 2, "Sell");
AddSeries("HL", DrawAs.Custom, Color.Green);
AddSeries("LL", DrawAs.Custom, Color.Red);
// ATR
AddParameter("Period", 14);
// ATR*K
AddParameter("K", 3);
// Fractals
AddParameter("Bars", 10);
// [H]igh - последний локальный максимум
AddGlobalVariable("H", Types.Double, 0.0);
// [L]ow - последний локальный минимум
AddGlobalVariable("L", Types.Double, 999999999);
// [D]irection - направление последнего сигнала
AddGlobalVariable("D", Types.Int, 0);
// [I]ndex [H]igh - индекс бара последнего [H]igh
AddGlobalVariable("IH", Types.Int, 0);
// [I]ndex [L]ow - индекс бара последнего [L]ow
AddGlobalVariable("IL", Types.Int, 0);
}
function Evaluate()
{
// evge 22.11.2016 http://alfadirect4.ru
var A = ATR(I, Period);
var CH = I.High;
var CL = I.Low;
var CC = I.Close;
if (CH[0] > CH[1] && CH[0] > H) { H = CH[0]; IH = CurrentIndex; }
if (CL[0] < CL[1] && CL[0] < L) { L = CL[0]; IL = CurrentIndex; }
if (CC[0] < H && (H - CC[0] >= A[0] * K || CurrentIndex - IH >= Bars) && D >= 0)
{
Sell = CH[0];
Sell.DrawCircle();
D = -1;
L = CL[0];
IL = CurrentIndex;
Line[CurrentIndex - IH] = H;
}
else
if (CC[0] > L && (CC[0] - L >= A[0] * K || CurrentIndex - IL >= Bars) && D <= 0)
{
Buy = CL[0];
Buy.DrawCircle();
D = 1;
H = CH[0];
IH = CurrentIndex;
Line[CurrentIndex - IL] = L;
}
Line.DrawLine();
if (CurrentIndex == MaxIndex)
{
Levels[0].Level = L; HL = L;
Levels[1].Level = H; LL = H;
if (D != 0)
{
LineLast[CurrentIndex - IL] = L;
LineLast[CurrentIndex - IH] = H;
LineLast.DrawLine();
}
}
}
Скачать исходный код (скрипт)