Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Индикаторы

Идеальный зигзаг - индикатор для MetaTrader 4

Просмотров:
14417
Рейтинг:
(19)
Опубликован:
2012.03.28 06:38
Обновлен:
2016.11.22 07:33
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу



Достоинства :

1. Самая тяжелая функция в расчетах -- iBarShift, которая полностью замещает ненужные циклы для поиска вершин.

2. Вся необходимая информация для каждого бара не только доступна в любой момент истории, но и также доступна советнику для любого момента истории.

3. Никаких висящих вершин.

4. Возможность эффективного поиска вершин без перебора значений индикатора.

5. Очень быстрая работа.

6. Корректная обработка вставки истории и переключения таймфреймов.

7. Незаменим для работы в советниках.


Недостатки :

1. Затраты памяти. Для корректной отрисовки зигзагу надо 2 буфера (1 мало, будут висяки), здесь используется 5. Полностью компенсируется (имхо) достоинством № 6. Ни один быстрый зигзаг по определению не может корректно обрабатывать вставку истории на двух буферах.

2. Рисование дополнительных линий. Нужно для того, чтобы они были видны советнику. Значения порядка таких величин, которые не должны быть видны ни при каком раскладе.


Принцип:

Новое колено начинает строиться при откате больше, чем заданный в настройках.

Он может задаваться в пунктах (XLab_ZZ) или в процентах (XLab_ZZP)


Взятие вершин:

extern int ChannelWidth = 100;

#property indicator_chart_window
#property indicator_buffers 1

#property indicator_color1 Red
#property indicator_width1 3

datetime LastTime;

int init()
{
   LastTime = 0;
   
   return(0);
}

bool GetValue(double dir, int bar, int prevBar, double& peak, int& peakBar, datetime& peakTime)
{
   if (dir < 0)
   {
      datetime t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar);
      int i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      double v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else if (dir > 0)
   {
      t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar);
      i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else 
   {
      return (false);
   }
   
   return (true);
}

int start()
{
   if (LastTime == Time[0]) return (0);
   LastTime = Time[0];
   
   double dir = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 4, 1);
   double rdir = -dir;

   if (dir == EMPTY_VALUE) return (0);
   
   double v1, v2, v3, v4, v5;
   int    i1, i2, i3, i4, i5;
   datetime t1, t2, t3, t4, t5;
   
   GetValue(dir, 1, 0, v1, i1, t1);
   GetValue(rdir, i1, 0, v2, i2, t2);
   GetValue(dir, i2, i1, v3, i3, t3);
   GetValue(rdir, i3, i2, v4, i4, t4);
   GetValue(dir, i4, i3, v5, i5, t5);

   SetPt("1", v1, t1);
   SetPt("2", v2, t2);
   SetPt("3", v3, t3);
   SetPt("4", v4, t4);
   SetPt("5", v5, t5);
   
   Print(v1, "   ", v2, "  ", v3, "  ", v4, " ", v5, " ", i1, "  ", i2, "  ", i3, " ", i4, " ", i5);

   return(0);
}

void SetPt(string name, double price, datetime time)
{
   ObjectCreate(name, OBJ_ARROW, 0, time, price);
   ObjectSet(name, OBJPROP_ARROWCODE, 108);
   ObjectSet(name, OBJPROP_PRICE1, price);
   ObjectSet(name, OBJPROP_TIME1, time);
}


Этот пример -- индикатор, который каждый бар (раз в бар) маркирует 5 последних вершин (включая текущую несформированную).

Внимание! Код может работать некорректно, если включен режим нулевого бара


Режим нулевого бара:

Включается в коде переменной DrawZeroBar. По умолчанию выключен.

Включать не рекомендуется. Если индикатор используется в советнике, категорически не рекомендуется.


Пользуйте :) . Просьба сообщать обо всех обнаруженных недостатках.

V4 MA MACD V4 MA MACD

Советник на основе нескольких МА и МАСD.

s-PSI@CalculateProfitFromTime s-PSI@CalculateProfitFromTime

Просматриваем работу результатов своей стратегии (на истории) по часам.

b-PSI@CalculateProfitFromTime b-PSI@CalculateProfitFromTime

Просматриваем работу результатов своей стратегии (на истории терминала и в тестере после тестирования) по часам.

Советник Urdala_Tester_Demo Советник Urdala_Tester_Demo

Советник Urdala_Tester - это универсальный тестер и исполнитель ваших математических стратегий.