Re: ZigZag - индикатор
Добавлено: 30 мар 2016, 15:26
Мне кажется вы не различаете разницы между локальным экстремумом (локальный максимум или локальный минимум) и пиком/впадиной.
Неофициальный форум клиентского терминала Альфа-Инвестиции (Альфа-Директ 4). Обсуждение терминала, обмен опытом, разработка скриптов индикаторов и стратегий.
https://alfadirect4.ru/
Pisces писал(а):Тогда надо сначала определится с понятием delta. Для меня delta - это минимальное расстояние между экстремумами, позволяющее формировать впадины и пики самой линии ZigZagа.
Pisces писал(а):Хорошо, пусть так.
Но тот пик, про который на картинке указано, что он не может быть расчитан формируется не по вудеф, а по неоднократно изложенному правилу:
когда цена, например, пересекает вверх уровень предыдущего максимума, формируется минимум, как наименьшее значение цены за период от последнего максимума до момента пересечения ценой его уровня. И наоборот, очередной максимум формируется в момент пересечения ценой вниз уровня последнего минимума.
А какой из экстремумов выше или ниже - это уже формализация идеи индикатора. Тут я не спец...
Вам идея индикатора понятна?
Код: Выделить всё
function Initialize()
{
IndicatorName = "ZigZag_N";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddSeries("ZZWL", DrawAs.Custom, Color.Blue, true, Axes.Parent); //отображение локального ZigZag
AddSeries("ZZG", DrawAs.Custom, Color.Blue, true, Axes.Parent); //отображение глобального ZigZag
AddSeries("Lh_Ll", DrawAs.Custom, Color.Magenta, true, Axes.Parent); //отображение последнего плеча
AddSeries("Peak", DrawAs.Custom, Color.Green); //текуший пик
AddSeries("Trough", DrawAs.Custom, Color.Orange); //текущая впадина
AddSeries("Peak1", DrawAs.Custom, Color.Gray); //предыдущий пик
AddSeries("Trough1", DrawAs.Custom, Color.Red); //предыдущая впадина
AddSeries("Marker", DrawAs.Custom, Color.Red);
AddParameter("Delta", 0.2); //параметр ZigZag задается в процентах
AddGlobalVariable("peakbar", Types.Int, 0);
AddGlobalVariable("troughbar", Types.Int, 0);
AddGlobalVariable("Direction", Types.Int, 0); //направление локального ZigZag
AddGlobalVariable("DirG", Types.Int, 0); //направление глобального ZigZag
AddGlobalVariable("hi", Types.Double, 0);
AddGlobalVariable("lo", Types.Double, 0);
AddGlobalVariable("hibar", Types.Int, 0);
AddGlobalVariable("lobar", Types.Int, 0);
AddGlobalVariable("exPkbar", Types.IntList); //процедура записи последних пиков
AddGlobalVariable("exTghbar", Types.IntList); //процедура записи последних впадин
AddGlobalVariable("hiG", Types.Double, 0);
AddGlobalVariable("loG", Types.Double, 0);
AddGlobalVariable("hibarG", Types.Int, 0);
AddGlobalVariable("lobarG", Types.Int, 0);
AddGlobalVariable("peakbarG", Types.Int, 0);
AddGlobalVariable("troughbarG", Types.Int, 0);
}
function Evaluate()
{
// Alfadirect4.ru Gerig
// ZigZag
// Новый минимум, если Close бара вырос от текущего Low на % и при этом
// последний Peak выше предыдущего Peak1
// Новый максимум, если Close бара снизился от текущего High на % и при этом
// последняя впадина Trough меньше предыдущей впадины Trough1
if (CurrentIndex < 2)
{
lo = Input.Low[0]; //Впервые присваиваемые значения для локального минимума
hi = Input.High[0]; //Впервые присваиваемые значения для локального максимума
loG = Input.Low[0]; //Впервые присваиваемые значения для глобального минимума
hiG = Input.High[0]; //Впервые присваиваемые значения для глобального максимума
}
else
{
double delta = 0.01*Delta;
//Задаем значения локальному минимуму lo и локальному максимуму hi
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; //нашли впадину локального ZigZag
hi = Input.High[0]; //локальный максимум
hibar = CurrentIndex; //номер бара локального максимума
troughbar = lobar; //номер бара впадины
exTghbar.Add(troughbar); //добавляем номер бара впадины в перечень
if ( exTghbar.Count > 2 ) //записываем номера баров последних впадин.
exTghbar.RemoveAt(0);
ZZWL[lobar-CurrentIndex] = lo;
Marker[lobar-CurrentIndex] = lo;
}
}
if(Direction <= 0)
{
if(Input.High[0] <(1 - delta)*hi)
{
Direction = 1; // нашли пик локального ZigZag
lo = Input.Low[0]; //локальный минимум
lobar = CurrentIndex; //мер бара локального минимума
peakbar = hibar; //номер бара пика
exPkbar.Add(peakbar); //добавляем номер пика в перечень
if (exPkbar.Count > 2 ) //записываем номера баров последних пиков.
exPkbar.RemoveAt(0);
ZZWL[hibar-CurrentIndex] = hi;
Marker[hibar-CurrentIndex] = hi;
}
}
Trough = Input.Low[troughbar-CurrentIndex]; //впадина
Peak = Input.High[peakbar-CurrentIndex]; //пик
if (exTghbar.Count > 1)
{
Trough1 = Input.Low[exTghbar[0]-CurrentIndex]; //предыдущая впадина локального ZigZag
}
if(exPkbar.Count > 1)
{
Peak1 = Input.High[exPkbar[0]-CurrentIndex]; //предыдущий пик локального ZigZag
//ShowMessage(peakbar-CurrentIndex); //Для отладки использовали
}
Marker.DrawCircle();
Peak.DrawDash();
Trough.DrawDash();
Peak1.DrawDash();
Trough1.DrawDash();
ZZWL.DrawLine(Color.Blue, Line.Dot, 2); //отрисовка локального ZigZag цвета Blue
//Задаем значения глобальному минимуму loG и глобального максимуму hiG
if(Input.High[0] > hiG)
{
hiG = Input.High[0];
hibarG = CurrentIndex;
}
if(Input.Low[0] < loG)
{
loG = Input.Low[0];
lobarG = CurrentIndex;
}
if(DirG >= 0)
{
if((Input.Low[0] > (1 + delta)*loG))
{
if ((Peak>Peak1)||((Peak<Peak1)&&(Input.Low[0]<Trough)))
{
DirG = -1; //нашли впадину глобального ZigZag
hiG = Input.High[0]; //глобального максимум
hibarG = CurrentIndex; //номер бара глобального максимума
troughbarG = lobarG; //номер бара впадины
ZZG[lobarG-CurrentIndex] = loG;
// Marker[lobarG-CurrentIndex] = loG;
}
}
}
if(DirG <= 0)
{
if(Input.High[0] <(1 - delta)*hiG)
{
if((Trough1>Trough)||((Trough1<Trough)&&(Input.High[0]>Peak)))
{
DirG = 1; // нашли пик глобального ZigZag
loG = Input.Low[0]; //глобального минимум
lobarG = CurrentIndex; //мер бара глобального минимума
peakbarG = hibar; //номер бара пика
ZZG[hibarG-CurrentIndex] = hiG;
// Marker[hibarG-CurrentIndex] = hiG;
}
}
}
ZZG.DrawLine(Color.Blue, Line.Solid, 3); //отрисовка глобального ZigZag цвета Blue
// Последнее плечо, где отображаются локальные экстремумы (не зафиксированно)
// отображается пунктирной линией цвета Magenta
if (CurrentIndex == MaxIndex)
{
if (troughbar > peakbar)
{
Lh_Ll[troughbar-CurrentIndex]=ZZWL[troughbar-CurrentIndex];
Lh_Ll[hibar-CurrentIndex] = hi;
}
if (troughbar < peakbar)
{
Lh_Ll[peakbar-CurrentIndex]=ZZWL[peakbar-CurrentIndex];
Lh_Ll[lobar-CurrentIndex] = lo;
}
}
Lh_Ll.DrawLine(Color.Magenta, Line.Dot, 2);
}
}