Что возвращают функции Lowest и Highest - страница 4

 
Попробую поэкспериментировать с кодом, приведенным composter на первой странице. Может что-то и получится.
 
nen:
Правильно, вычисляется. Находится номер ячейки. Из этой ячейки (таймсерии) берется значение максимума или минимума бара. Считается, что на этом баре был найден, допустим, максимум. Это значение потом помещается в индикаторный буфер с найденным номером. Максимум индикатора должен соответствовать максимуму на баре. И в моем коде также из массива (таймсерии) с этим же найденный номером берется максимум и сравнивается со значением val. Проверяется: правильно ли мы делаем, что помещаем в буфер с этим номером число val. Оно же должно быть равно максимуму бара. Сравнение чисел, взятых из одного и того же места, вполне корректно.

Мне кажется, сравнение ...==val , опасно тем, что от тика к тику может меняться именно номер ячейки. Особенно на мелких таймфреймах, где много близких совпадающих Low и High. Впрочем надо подумать, возможно мы имеем в виду разные моменты.
 
nen, не хотите ли потестировать этот зигзаг? Собственно, это просьба ко всем, кто имеет опыт применения зигзагов и знает, что он от зигзага хочет. Может из этого прототипа удастся что-то путное сделать?
//+------------------------------------------------------------------+
//|                                                      CZigZag.mq4 |
//|                                         Copyright © 2006, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Candid"
#property link      "likh@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
//extern int ExtBackstep=3;

int    shift;
double res;
int i;
int fBar;
double CurMax,CurMin;
int CurMaxPos,CurMinPos;
int CurMaxBar,CurMinBar;
double hPoint;
double mhPoint;
double EDev;
int MaxDist,MinDist;
bool FirstRun;
bool AfterMax,AfterMin;

//---- indicator buffers
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZag);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("CZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
//    EDev = ExtDeviation*Point;
    EDev = (ExtDeviation+0.5)*Point;
    AfterMax = true;
    AfterMin = true;
    fBar = Bars-1;
    CurMax = High[fBar];
    CurMaxBar = 1;
    CurMin = Low[fBar];
    CurMinBar = 1;
    MaxDist = 0;
    MinDist = 0;
    FirstRun = false;
  }
//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (AfterMax) {
//      res = Low[shift]-CurMin-hPoint;
      res = Low[shift]-CurMin;
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            AfterMax = false;
            AfterMin = true;
            CurMaxBar = CurMinBar+1;
            CurMaxPos = Bars-CurMaxBar;
            CurMax = High[CurMaxPos];
            for (i=CurMaxPos-1;i>=shift;i--) {
              if (High[i] > CurMax+hPoint) {
                CurMaxBar = Bars-i;
                CurMax = High[i];
              }
            }  //  for (i=CurMaxPos-1;i>=shift;i--)
            ZigZag[Bars-CurMaxBar] = CurMax;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMax) 
    if (AfterMin) {
//      res = CurMax-High[shift]-hPoint;
      res = CurMax-High[shift];
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            AfterMin = false;
            AfterMax = true;
            CurMinBar = CurMaxBar+1;
            CurMinPos = Bars-CurMinBar;
            CurMin = Low[CurMinPos];
            for (i=CurMinPos-1;i>=shift;i--) {
              if (Low[i] < CurMin-hPoint) {
                CurMinBar = Bars-i;
                CurMin = Low[i];
              }
            }  //  for (i=CurMinPos-1;i>=shift;i--)
            ZigZag[Bars-CurMinBar] = CurMin;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


Прошу учитывать, что хотя названия параметров сохранены, работают они по другому.


 
Вот тоже, посмотрите мой ЗигЗаг, может поможет докопаться до истины ....

//+------------------------------------------------------------------+
//|                                                        DT_ZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, klot."
#property link      "klot@mail.ru"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Red
//---- indicator parameters
extern int ExtDepth=12;
//---- indicator buffers
double zzL[];
double zzH[];
double zz[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
 //  IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexArrow(2,159);
   SetIndexArrow(1,159);
//---- indicator buffers mapping
   SetIndexBuffer(0,zz);
   SetIndexBuffer(1,zzH);
   SetIndexBuffer(2,zzL);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
     
//---- indicator short name
   IndicatorShortName("DT_ZZ("+ExtDepth+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    i,shift,pos,lasthighpos,lastlowpos,curhighpos,curlowpos;
   double curlow,curhigh,lasthigh,lastlow;
   double min, max;
   ArrayInitialize(zz,0.0);
   ArrayInitialize(zzL,0.0);
   ArrayInitialize(zzH,0.0);
   
   lasthighpos=Bars; lastlowpos=Bars;
   lastlow=Low[Bars];lasthigh=High[Bars];
  for(shift=Bars-ExtDepth; shift>=0; shift--)
    {
      curlowpos=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      curlow=Low[curlowpos];
      curhighpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      curhigh=High[curhighpos];
      //------------------------------------------------
      if( curlow>=lastlow ) { lastlow=curlow; }
      else
         { 
            //идем вниз
            if( lasthighpos>curlowpos  ) 
            { 
            zzL[curlowpos]=curlow;
              ///*
              min=100000; pos=lasthighpos;
               for(i=lasthighpos; i>=curlowpos; i--)
                  { 
                    if (zzL[i]==0.0) continue;
                    if (zzL[i]<min) { min=zzL[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=min;
               //*/
            } 
          lastlowpos=curlowpos;
          lastlow=curlow; 
         }
      //--- high
      if( curhigh<=lasthigh )  { lasthigh=curhigh;}
      else
         {  
            // идем вверх
            if( lastlowpos>curhighpos ) 
            {  
            zzH[curhighpos]=curhigh;
           ///*
               max=-100000; pos=lastlowpos;
               for(i=lastlowpos; i>=curhighpos; i--)
                  { 
                    if (zzH[i]==0.0) continue;
                    if (zzH[i]>max) { max=zzH[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=max;
           //*/     
            }  
         lasthighpos=curhighpos;
         lasthigh=curhigh;    
         }       
    //----------------------------------------------------------------------
    }
 return(0);
}
//+------------------------------------------------------------------+



 
nen, не хотите ли потестировать этот зигзаг? Собственно, это просьба ко всем, кто имеет опыт применения зигзагов и знает, что он от зигзага хочет. Может из этого прототипа удастся что-то путное сделать?
Прошу учитывать, что хотя названия параметров сохранены, работают они по другому.


Candid. Обязательно посмотрю. При первой установке сразу возникло следующее замечание.
Идут подряд несколько баров с одинаковыми максимумами. Ваш вариант зигзага рисует перелом (вершину) на последнем баре. То есть ближнем к нулевому. По хорошему надо бы сделать, чтобы перелом рисовался на первом баре - самом дальнем от нулевого. Первая появившаяся вершина значащая. Также и с мтнимумами. Могу привести несколько источников (из литературы), где требуется делать именно так.
 
klot , спасибо. По Идее Вашего DT-ZigZag сделал сейчас в своем индикаторе работу с данными старших таймфреймов. Но оставил только идею. А алгоритм сделал свой. Вчера сделал еще некоторые исправления в зигзаг. Сейчас выложил его для коллективного тестирования. Обязательно попробую и Ваш вариант. Вот здесь описание индикатора, из-за которого весь сыр-бор: http://onix-trade.net/forum/index.php?showtopic=373 Только надо учитывать, что в режиме DT-ZigZag используется зигзаг, идущий в комплекте с индикатором. И этот внешний зигзаг иногда дает сбои на первом луче. Новый вариант внешнего зигзага тестируется.
 
klot , спасибо. По Идее Вашего DT-ZigZag сделал сейчас в своем индикаторе работу с данными старших таймфреймов. Но оставил только идею. А алгоритм сделал свой. Вчера сделал еще некоторые исправления в зигзаг. Сейчас выложил его для коллективного тестирования. Обязательно попробую и Ваш вариант. Вот здесь описание индикатора, из-за которого весь сыр-бор: http://onix-trade.net/forum/index.php?showtopic=373 Только надо учитывать, что в режиме DT-ZigZag используется зигзаг, идущий в комплекте с индикатором. И этот внешний зигзаг иногда дает сбои на первом луче. Новый вариант внешнего зигзага тестируется.

Да, я заметил :) осталась только идея :) . Я сейчас повсемесно пользую тем своим ЗЗ-ом (код в посте выше) Он стабильнее работает с данными других ТФ.
 
nen:
При первой установке сразу возникло следующее замечание.
Идут подряд несколько баров с одинаковыми максимумами. Ваш вариант зигзага рисует перелом (вершину) на последнем баре.
Ага, значит я выбрал неправильную "опцию". Сейчас отредактирую код в посте с исходником. Признак изменений - закомментированные строчки неправильной "опции".
 
Candid, сейчас нормально.
Klot, интересный вариант.

Если Ваши варианты зигзагов покажут интересные результаты, можно их в своей разработке применять?
 
Если Ваши варианты зигзагов покажут интересные результаты, можно их в своей разработке применять?
Да, конечно. Если исход тестирования будет положительным, я даже попытаюсь добавить его в Code Base.
Причина обращения: