ZigZag - индикатор
Добавлено: 26 фев 2016, 22:55
Индикатор ZigZag относится к ряду трендовых и изображается на графиках в виде отрезков, соединяющих локальные экстремумы цены, именуемые пиками (Peak) и впадинами (Trough). Благодаря этому удается рассматривать важные рыночные движения, не принимая во внимание шумы. Параметр в этом индикатора один - Delta. Этот параметр определяет расчет пиков и впадин. Другими словами пиком считается тот high свечи в окружении которого, как перед так и после ней, имеются другие high свечей меньшие на значение Delta (в процентах). Расчет для впадины обратный. Выбирается такой low свечи, в окружении которого есть low, большие на значение Delta (в процентах). Особенность этого индикатора в том, то он не "заглядывает в будущее" (отсутствует явление "peeking").
Код: Выделить всё
Текст индикатора:
function Initialize()
{
IndicatorName = "ZigZag";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddSeries("ZZWL", DrawAs.Line, Color.Blue);
AddSeries("Peak", DrawAs.Custom, Color.Green);
AddSeries("Trough", DrawAs.Custom, Color.Orange);
AddSeries("Marker", DrawAs.Custom, Color.Red);
AddParameter("Delta", 0.2);
AddGlobalVariable("peakbar", Types.Int, 0);
AddGlobalVariable("troughbar", Types.Int, 0);
AddGlobalVariable("Direction", Types.Int, 0);
AddGlobalVariable("hi", Types.Double, 0);
AddGlobalVariable("lo", Types.Double, 0);
AddGlobalVariable("hibar", Types.Int, 0);
AddGlobalVariable("lobar", Types.Int, 0);
}
function Evaluate()
{
// AlfaDirect 2015. OX
// ZZ (ZigZag)
// Новый минимум, если Close бара вырос от текущего Low на %
// Новый максимум, если Close бара снизился от текущего High на %
if (CurrentIndex < 2)
{
lo = Input.Low[0]; //First min candle for Low
hi = Input.High[0]; //First max candle for High
}
else
{
double delta = 0.01*Delta;
//Detected Local max and Local min
if(Input.High[0] > hi)
{
hi = Input.High[0];
hibar = CurrentIndex;
}
if(Input.Low[0] < lo)
{
lo = Input.Low[0];
lobar = CurrentIndex;
}
if(Direction >= 0)
{
if(Input.Low[0] > (1 + delta)*lo)
{
Direction = -1;
hi = Input.High[0];
hibar = CurrentIndex;
troughbar = lobar;
ZZWL[lobar-CurrentIndex] = lo;
Marker[lobar-CurrentIndex] = lo;
}
}
if(Direction <= 0)
{
if(Input.High[0] < (1 - delta)*hi)
{
Direction = 1;
lo = Input.Low[0];
lobar = CurrentIndex;
peakbar = hibar;
ZZWL[hibar-CurrentIndex] = hi;
Marker[hibar-CurrentIndex] = hi;
}
}
Peak=Input.High[peakbar-CurrentIndex];
Trough=Input.Low[troughbar-CurrentIndex];
Marker.DrawCircle();
Peak.DrawDash();
Trough.DrawDash();
// Последнее плечо (не зафиксированно)
if (CurrentIndex == MaxIndex)
{
if (troughbar > peakbar)
{
ZZWL[hibar-CurrentIndex] = hi;
}
if (troughbar < peakbar)
{
ZZWL[lobar-CurrentIndex] = lo;
}
}
}
}