Обновлённый клиентский терминал MetaTrader 4 build 201 - страница 4

 
To nen При переключении периода графика возникают задержки на несколько секунд.
Дело в том, что в 54 версии по умолчанию включен поиск паттернов Gartley. А это прогон всей истории через 30 зигзагов - до первого нахождения паттерна. И при переключении таймфреймов также происходит поиск паттернов на новом таймфрейме. Почитайте описание. Попробуйте другие режимы. Там 10 разных зигзагов. На других режимах никаких тормозов нет.

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

Для меня проще сделать, чем долгое время толочь воду в ступе...
 
Побыстрому набросал код.
Выкладываю код зигзага. За основу взят код из поставки метатрейдера за 2005 год.
Устранение горбов в конце кода - взято из первого варианта зигзага Николая Косицына.
И добавил от себя:
1) устранил ошибку, заключающуюся в прорисовке переломов зигзага в воздухе;
2) устранил вывод хаотичных линий при прокрутке истории назад и добавлении новой истории;
3) оптимизировал расчет зигзага. Оптимизация заключается в том, что пересчет зигзага производится при:
а) появлении нового бара
б) при выходе цены выше хая или ниже лова нулевого бара
такую оптимизацию предложил micmed.

И еще хочу добавить просьбу к Rosh'у. Просьба читать что я пишу не по диагонали. Вы пишете, что не надо отсылать по ссылкам. Я выложил здесь (выше в сообщениях) текст, который находился по вышеуказанным ссылкам. В этом тексте и приведен поиск ошибки повисания переломов зигзага в воздухе.

Почему пишу, чтобы Вы читали не по диагонали? В соседней ветке при ответе Putnik'у Вы сами признались, что читаете по диагонали.

Картинки рисуемые зигзагом, код которого здесь привожу, выкладывать не буду. Это может сделать любой при желании. Сейчас немного погонял этот зигзаг на евродолларе на минутках с параметрами
Depth=3
Deviation=3
Backstep=2
Предпочитаю тестировать зигзаги в таком жестком режиме.
При небольшом тестировании сбоев не выявлено.

Не обижусь, если этот код будет включен в поставку с очередной версией Метатрейдере в качесте стандартного зигзага.
//+------------------------------------------------------------------+
//|                                        Custom ZigZag_1_nen       |
//+------------------------------------------------------------------+
#property link  "http://onix-trade.net/forum/index.php?s=&showtopic=4786&view=findpost&p=149768"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

int count;
double lBar_0,hBar_0;
datetime tiBar_0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   ArraySetAsSeries(ExtMapBuffer,true);
   ArraySetAsSeries(ExtMapBuffer2,true);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+


int start()
  {

   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   if (lBar_0<=Low[0] && hBar_0>=High[0] && tiBar_0==Time[0]) return(0);
   else
     {
      lBar_0=Low[0]; hBar_0=High[0]; tiBar_0=Time[0];
     }

 // обнуляем индикаторные буферы
   if (Bars-IndicatorCounted()>3) for (shift=Bars-1;shift>=0; shift--) {ExtMapBuffer[shift]=0; ExtMapBuffer2[shift]=0; tiBar_0=0;}[/}

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      if (Low[shift]==val) ExtMapBuffer[shift]=val; else ExtMapBuffer[shift]=0;
    
      //--- high
      val=High[iHighest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0; 
              } 
           }
        }
      if (High[shift]==val) ExtMapBuffer2[shift]=val; else ExtMapBuffer2[shift]=0;
     }

   // final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         res=ExtMapBuffer2[shift];
         if(res!=0.0) ExtMapBuffer[shift]=res;
        }
     }

// Удаление горбов
   double vel1, vel2, vel3, vel4;
   int bar1, bar2, bar3, bar4;
   int count;
   for(int bar=Bars-ExtDepth; bar>=0; bar--)
     {
      if (ExtMapBuffer[bar]!=0)
        {
         count++;
         vel4=vel3;bar4=bar3;
         vel3=vel2;bar3=bar2;
         vel2=vel1;bar2=bar1;
         vel1=ExtMapBuffer[bar];bar1=bar;
         if (count<3) continue; 
         if ((vel3<vel2)&&(vel2<vel1)) {ExtMapBuffer[bar2]=0;ExtMapBuffer2[bar2]=0;bar=bar3+1;}
         if ((vel3>vel2)&&(vel2>vel1)) {ExtMapBuffer[bar2]=0;ExtMapBuffer2[bar2]=0;bar=bar3+1;}
         if ((vel2==vel1)&&(vel1!=0 )) {ExtMapBuffer[bar1]=0;ExtMapBuffer2[bar2]=0;bar=bar3+1;}
        }
    } 

  }



 
To Rosh & всем:

Рош, рисование в воздухе вершин это ошибка зашитая в логику индикатора. кратко она описана вот здесь:

http://onix-trade.net/forum/index.php?s=4a364c50915a354779055cab57c36e2f&showtopic=4786
а суть проблемы вот:
"Есть подозрение что это не ошибка индикатора или реализации, а самой формулировки индикатора. Попытаюсь объяснить: представим, что вершина 5 из верхнего рисунка находится на расстоянии меньшем depth, тогда ее не надо рисовать. Но в процессе перехода к вершине 6 может нарисоваться некий локальный хай для которого вершина 5 на глубину depth есть максимальная вершина и отстоит от 3 на величину большую depth. потому и рисует в воздух. Вопрос в том, правильно ли так делать и так понимать работу ЗЗ?"

В посте идет ссылка на картинку на сайте плюс обсуждение самого алгоритма и проблем. ЗЗ от Косицина весьма неплох , может если его подрихтовать то и стоит его взять за основу?
Мне пришлось довольно глубоко влезть в проблему в процессе переноса ЗЗ от МТ4 на форекстестер от терранина (помните диспуты на пауке?).
 
To Rosh & всем:

Рош, рисование в воздухе вершин это ошибка зашитая в логику индикатора. кратко она описана вот здесь:

http://onix-trade.net/forum/index.php?s=4a364c50915a354779055cab57c36e2f&showtopic=4786
а суть проблемы вот:
"Есть подозрение что это не ошибка индикатора или реализации, а самой формулировки индикатора. Попытаюсь объяснить: представим, что вершина 5 из верхнего рисунка находится на расстоянии меньшем depth, тогда ее не надо рисовать. Но в процессе перехода к вершине 6 может нарисоваться некий локальный хай для которого вершина 5 на глубину depth есть максимальная вершина и отстоит от 3 на величину большую depth. потому и рисует в воздух. Вопрос в том, правильно ли так делать и так понимать работу ЗЗ?"

В посте идет ссылка на картинку на сайте плюс обсуждение самого алгоритма и проблем. ЗЗ от Косицина весьма неплох , может если его подрихтовать то и стоит его взять за основу?
Мне пришлось довольно глубоко влезть в проблему в процессе переноса ЗЗ от МТ4 на форекстестер от терранина (помните диспуты на пауке?).


Привет wellx. Я прекрасно знаю, что рисование вершин в воздухе заложено в самом алгоритме, именно поэтому я предложил дать свой алгоритм. В ходе этой ветки стало очевидным, что:
1) каждый понимает ZigZag так, как он считает правильным
2) большинству пользователей все равно, какой Zigzag использовать.
Сам я знаю кроме этого еще как минимум три алгоритма ZigZag'а , которые не имеют ничего общего с идущим в поставке с терминалом. При этом я не могу сказать, что какой-то из этих трех является единственно правильным. Поэтому не стоит превращать эту тему в войну тупоконечников с остроконечниками. Николай Косицын тоже нигде не заявлял о том, что его переработка ZigZag'а самое правильная - это говорит о том, что он досконально разобрался с этой проблемой и не навязывает свой подход другим.
Ведь если бы был общепризнанный алгоритм построения ZigZag'а , то не было бы и темы для обсуждения.
 

2) большинству пользователей все равно, какой Zigzag использовать.
Откуда такая информация? Про большинство.

Заметил, что многие после долгих поисков, с каким зигзагом работать, возвращаются к тому варианту, что был в поставке с метатрейдером до 2006 года. Разумеется многие хотели бы, чтобы тот зигзаг был избавлен от ошибок.
По поводу зигзага Николая Косицына. Второй вариант его зигзага использует два буфера для вывода индикатора на график.
Сейчас написано огромное количество индикаторов, которые используют в своей основе или как внешний зигзаг, имеющий один буфер, используемый для вывода индикатора на график.
Поэтому продвигать двухбуферный зигзаг надо осторожно. Он будет несовместим со многими индикаторами.
 

И еще хочу добавить просьбу к Rosh'у. Просьба читать что я пишу не по диагонали. Вы пишете, что не надо отсылать по ссылкам. Я выложил здесь (выше в сообщениях) текст, который находился по вышеуказанным ссылкам. В этом тексте и приведен поиск ошибки повисания переломов зигзага в воздухе.

Почему пишу, чтобы Вы читали не по диагонали? В соседней ветке при ответе Putnik'у Вы сами признались, что читаете по диагонали.

nen
Я читаю по диагонали только "водяные" сообщения. Я уже говорил, что предпочитаю конкретные действия, а не общие рассуждения. Повторяю, что ошибку "с повисанием переломов зигзаге в воздухе" я прекрасно знаю и не надо мне ее каждый раз показывать. Я просил алгоритм/код обхода этой ошибки. Если при этом еще будет обоснование алгоритма - было бы совсем хорошо. Брутальный подход с заменой номера индекса и/или привязки значения ZigZag'a к значению экстремуму - это не алгоритм, это латание дыр.
Жалко, что картинку с предлагаемым Zigzag'ом не выложили. Сделаю сам.
 

2) большинству пользователей все равно, какой Zigzag использовать.
Откуда такая информация? Про большинство.

Из открытых источников, то есть из количества участников обсуждения алгоритма Zigzag'а . Других критериев нет. Не путайте с пользователями инструментов на основе Zigzag'a, которые не задумывались даже об алгоритме этого индикатора.
 

Не путайте с пользователями инструментов на основе Zigzag'a, которые не задумывались даже об алгоритме этого индикатора.


Это лишь говорит о великой тяге к халяве и граалю :))
 

Сейчас написано огромное количество индикаторов, которые используют в своей основе или как внешний зигзаг, имеющий один буфер, используемый для вывода индикатора на график.
Поэтому продвигать двухбуферный зигзаг надо осторожно. Он будет несовместим со многими индикаторами.


Расшифруйте , пожалуйста, выделенную фразу.
По поводу стиля DRAW_ZIGZAG - именно поэтому и не стал делать, во-первых, опять же будет спорный алгоритм рассчета, и во-вторых - большинство сразу и не поймет как им пользоваться, а уж тупая замена в советниках или индикаторах будет грозить народными волнениями :)
 
nen,
Вырезать лишние переломы не проблема, достаточно минимально изменить только две строчки в коде. Я думаю, так и сделаем, тем более радикальных изменений от старого Zigzag'а не будет (кроме минутных тайм-фреймов). Вот как выглядит у меня измененный индикатор на текущий момент.



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

PS. Индикатор Zigzag пользовательский, поэтому каждый пользователь может сам менять его как хочет.
Причина обращения: