Пользовательские индикаторы > ZZe (ZigZag evge) - ЗизЗаг

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение evge » 22 ноя 2016, 15:10

ZZe (ZigZag evge) - одна из экспериментальных вариаций индикатора ZigZag.

Условие определения экстремумов

1. Строится на основе отклонения от экстремума на ATR(Period) * K, где

ATR - значение индикатора ATR с периодом Period,
K - коэффициент.

2. Или на основании фракталов, цена закрытия ниже (выше) максимума (минимума) заданное количество баров.

Сигналы Buy и Sell формируются в момент определения экстремумов, т.е. именно эти ряды можно использовать для стратегий в АД4, Buy > 0 - сигнал на покупку, Sell > 0 - сигнал на продажу.

Дополнительные особенности

  • Последняя предполагаемая линия перерисовывается.
  • Отображаются уровни последних экстремумов.

Параметры

Period - период ATR
K - коэффициент для ATR
Bars - количество баров для определения фрактала (справа)

Пример

ZZe-01.png
Индикатор ZZe
ZZe-01.png (36.67 КБ) 30925 просмотров

ZZe-02.png
Индикатор ZZe
ZZe-02.png (37.03 КБ) 30916 просмотров


Код: Выделить всё

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();
   }
}

}


Скачать исходный код (скрипт)

ZZe.zip
(1.4 КБ) 2179 скачиваний
никогда такого не было и вот опять

abelok
Сообщения: 23
Зарегистрирован: 20 ноя 2016, 07:43
Благодарил (а): 1 раз
Поблагодарили: 3 раза

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение abelok » 23 ноя 2016, 12:04

Я в MultiChart использую иногда такой индикатор (зигзаг по ATR). Но во флэте, в отличие от просто ZZ, он "дрожит и мечется".
Что не очень удобно.
В целом индикатор информативен. Ну, а перерисовка - это родовая травма :))

ЗЫ. Было-бы здорово включить в индюки какие-либо звуковые сигналы. У меня не получается для AD4. Звук всё время идёт.

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение evge » 01 дек 2016, 10:41

abelok писал(а):Ну, а перерисовка - это родовая травма :))


Тут перерисовка имеется ввиду дорисовка, т.к. первую точку мы знаем, вторая вычисляется т.е. линия будет до уже известного экстремума, но он в процессе может поменяться
никогда такого не было и вот опять

State
Сообщения: 35
Зарегистрирован: 08 окт 2018, 12:43
Поблагодарили: 1 раз

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение State » 29 окт 2018, 10:25

Доброго дня! Евгений, в первую очередь к Вам вопрос. Видел Ваши посты где пишете, что кидайте идеи, а код Вы напишите.
С кодом у меня както не получилось((( Компилируется, но не тестится. Я больше теоретик с обилием времени на тестирование.

Идея наверное не нова, но всетаки: по индикатору зигзаг е открывать позиции соответствующие сигналу (то есть при появлении сигнала покупка/продажа) а закрывать не при достижении профита/стопа или противоположного сигнала а при пересечении ценой линий HL и LL. Стопы тоже ставить по ним.

То есть при достижении лонг позиции линии LL (верхняя) - закрытие в плюс, при HL (закрытие в стоп минус). По шорту наоборот. Даже лучше если будет при достижении верхнего/нижнего максимума -1 пункт.

Можете написать код?

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение evge » 29 окт 2018, 12:43

State писал(а):Видел Ваши посты где пишете, что кидайте идеи, а код Вы напишите


Подтверждаю, интересные идеи переведу в код.

State писал(а):Идея наверное не нова, но всетаки: по индикатору зигзаг е открывать позиции соответствующие сигналу (то есть при появлении сигнала покупка/продажа) а закрывать не при достижении профита/стопа или противоположного сигнала а при пересечении ценой линий HL и LL. Стопы тоже ставить по ним.


Код будет несложный. Чуть позже напишу и выложу здесь.
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение evge » 29 окт 2018, 13:29

HH и HL вообще не используются в коде, лишние.

Рисуются уровни.

При появлении сигнала уровень в направлении сигнала сдвигается до цены сигнала.

Поэтому выставить на него тейк не получится.

Поэтому меняю немного код самого индикатора, который будет отображать значения HL и LL по всей истории где рассчитан индикатор.

ZZe-HL-LL.png
ZZe-HL-LL.png (38.41 КБ) 29438 просмотров


Код: Выделить всё

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.Line, Color.Green);
AddSeries("LL", DrawAs.Line, 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();

HL = L;
LL = H;

if (CurrentIndex == MaxIndex)
{
   Levels[0].Level = L;
   Levels[1].Level = H;
   if (D != 0)
   {
      LineLast[CurrentIndex - IL] = L;
      LineLast[CurrentIndex - IH] = H;
      LineLast.DrawLine();
   }
}

}



Код стратегии (пример):

Код: Выделить всё

/**
ZZeBRS
**/

function Initialize()
{
   StrategyName = "ZZeBRS";
   AddParameter("Period", 14, "", 1);
   AddParameter("K", 3, "", 1);
   AddParameter("Bars", 10, "", 1);
   AddParameter("TP", 3, "в TP раз больше чем стоп (или меньше если <1)", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 100;
   ShortLimit = -100;
   AddChartIndicator("MY.ZZe", new Dictionary <string, string>{{"Period", "Period"}, {"K", "K"}, {"Bars", "Bars"}});
}

function OnUpdate()
{

   var I = Input1;
   
   var Z = MY.ZZe(I, Period, K, Bars);
   
   if (Z["Buy"] > 0)
   {
      EnterLong();
      BreakingStop(Z["HL"][0], I.Close[0] + (I.Close[0] - Z["HL"][0]) * TP, SignalPriceType.Price);
   }

   if (Z["Sell"] > 0)
   {
      EnterShort();
      BreakingStop(Z["LL"][0], I.Close[0] - (Z["LL"][0] - I.Close[0]) * TP, SignalPriceType.Price);
   }
   

}


Здесь стоп известен, а тейк выставляется как разница между ценой (входа) и стопом умноженной на TP (параметр) от текущей цены (входа).
никогда такого не было и вот опять

State
Сообщения: 35
Зарегистрирован: 08 окт 2018, 12:43
Поблагодарили: 1 раз

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение State » 29 окт 2018, 15:00

Спасибо, буду экспериментировать)

Но с таким алгоритмом весь смысл меняется. Совсем не то. Идея была в этих уровнях.

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение evge » 29 окт 2018, 16:10

Уровня по направлению сигнала уже нет в момент сигнала.
Он устанавливается в "режим поиска".
Понаблюдайте в момент появления сигнала как ведет себя индикатор и эти уровни.
никогда такого не было и вот опять

State
Сообщения: 35
Зарегистрирован: 08 окт 2018, 12:43
Поблагодарили: 1 раз

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение State » 29 окт 2018, 16:25

Наблюдаю уже достаточно долгое время. Они выставляются на макс/мин цену из расчета нескольких ближайших свечей. При достижении/пробитии он передвигается в зависимости от макс/мин достигнутого пробитием. Данный вариант вполне приемлем и работоспособен.

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

Re: ZZe (ZigZag evge) - ЗизЗаг

Непрочитанное сообщение evge » 29 окт 2018, 17:33

Имею ввиду, что индикатор уже не имеет этой информации в момент появления сигнала уровень меняется.
Можно конечно заглянуть в прошлый бар в той модификации индикатора что я дал выше.

Но есть и ситуации когда take будет ниже чем цена открытия в long

посмотрите на скриншот, последний сигнал.

PS: Точнее take там очень мал по отношению к stop или отрицательный, нужно именно посмотреть на реальные сигналы и отношение этих линий к сигналам в момент их возникновения.
никогда такого не было и вот опять


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя