[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 29

 
hoz:

 Подскажите, как вытягивать значения из индикатора зиг-заг? Как вообще это реализуется? Т.е. если  я хочу подхватить определённый экстремум, а не только последний.

 

 Вот, например, я щяс это зиг-заг хочу прикрутить к своему эксперту:

 

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

В буфере ищется НЕПУСТОЕ (EMPTY_VALUE) значение по принципу:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
а доступ к буферу индикатора через iCustom().
 
TarasBY:

В буфере ищется НЕПУСТОЕ (EMPTY_VALUE) значение по принципу:

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

 а доступ к буферу индикатора через iCustom().


 Логично. Но таким образом будет поиск до тех пор, пока не наткнёмся на непустое значение. А если, мне, например, да и, на самом деле, нужен не последее непустое значение т.е. не последний экстремум, а другой.. Например, вот на скрине:

 

 

 
hoz:


 Логично. Но таким образом будет поиск до тех пор, пока не наткнёмся на непустое значение. А если, мне, например, да и, на самом деле, нужен не последее непустое значение т.е. не последний экстремум, а другой.. Например, вот на скрине:

В цикл ввести счётчик экстремумов и по номеру экстремума (непустого значения подряд) разрывать цикл.
 
TarasBY:
В цикл ввести счётчик экстремумов и по номеру экстремума (непустого значения подряд) разрывать цикл.

 Понял. Благодарю. Тут нужно теперь на практике это всё применять. Суть понял, но в уме стока фильтров что мозг закипает...
 
hoz:

 Понял. Благодарю. Тут нужно теперь на практике это всё применять. Суть понял, но в уме стока фильтров что мозг закипает...

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


вот так. функции отдаешь n (номер пика) она тебе вернет его значение. если тебе нужен номер бара пика то поменять тип функции на int и вместо return(ind); напиши return(i);

Также учти что если ты в коде своем используешь i особенно в переборах (как в учебнике) то в этой функции поменяй i на любую другую переменную например k.

и обязательно настрой iCustom внутри функции под свой индикатор.  

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


вот так. функции отдаешь n (номер пика) она тебе вернет его значение. если тебе нужен номер бара пика то поменять тип функции на int и вместо return(ind); напиши return(i);

Также учти что если ты в коде своем используешь i особенно в переборах (как в учебнике) то в этой функции поменяй i на любую другую переменную например k.

и обязательно настрой iCustom внутри функции под свой индикатор.  

 Николай, интересно, конечно, у вас написано условие. Смотрю, и думаю...

 

if(ind!=0) n--;

else

if(ind!=0) return(ind);

  Получается если буфер пользовательского индикатора вернул значение нуль, то n--, а если если буфер пользовательского индикатора вернул значение нуль, то ... возврашаем значение буфера индикатора.

 Но условия же одинаковы. И там и так если не нуль..

 
hoz:

 Николай, интересно, конечно, у вас написано условие. Смотрю, и думаю...

 

  Получается если буфер пользовательского индикатора вернул значение нуль, то n--, а если если буфер пользовательского индикатора вернул значение нуль, то ... возврашаем значение буфера индикатора.

 Но условия же одинаковы. И там и так если не нуль..

 

скобки фигурные куда то выпали пока пытался суда нормально код вставить:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

 

Если n>1 {

   если буфер не пустой то от n отнимем 1

   }наоборот{

   если буфер не пустой - вернем его значение

   } 

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


или вот так, что лаконичней. Помешан я на быстродействии и красоте кода, не обращайте внимания ) 
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


или вот так, что лаконичней. Помешан я на быстродействии и красоте кода, не обращайте внимания ) 


 В общем то, и так и так прекрасно всё. Просто я привык код писать немного иначе, мне так читается проще, а у вас по другому. У вас скобка первая каждая не переносится. Я у себя разложил в Эдиторе и всё стало на свои места в таком виде:

 

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


 В общем то, и так и так прекрасно всё. Просто я привык код писать немного иначе, мне так читается проще, а у вас по другому. У вас скобка первая каждая не переносится. Я у себя разложил в Эдиторе и всё стало на свои места в таком виде:


когда код перешагивает за over 1000 строк, начинаешь писать компактно )

также в MT4 страдает быстродействие, особенно когда проводишь тесты. Лаконичный вариант исполняется быстрее.  

Причина обращения: