Поиск экстремумов индикатора ZigZag - страница 3

 
Yuriy Vins:
static int handle=0;                                    //Хэндл индикатора.
 
Эхх, уйду я наверное обратно в MQL4 , там для меня все как-то проще.. ))
 
Yuriy Vins:
Эхх, уйду я наверное обратно в MQL4 , там для меня все как-то проще.. ))

Готовы сменить бмв на жигули?

 
Vitaly Muzichenko:

Добавил я Static , смешно, но он теперь показывает совсем не те цены!

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                       Copyright 2018. Yuriy Vins |
//|                                            https://www.sayta.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018. Yuriy Vins"
#property link      "https://www.sayta.net"
#property version   "1.00"

double extr1, extr2, extr3, extr4, extr5, extr6, extr7;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  { 
    
    extr1 = GetExtremumZigZagPrice(NULL,0,1,12,5,3);
    extr2 = GetExtremumZigZagPrice(NULL,0,2,12,5,3);
    extr3 = GetExtremumZigZagPrice(NULL,0,3,12,5,3);
    extr4 = GetExtremumZigZagPrice(NULL,0,4,12,5,3);
    extr5 = GetExtremumZigZagPrice(NULL,0,5,12,5,3);
    extr6 = GetExtremumZigZagPrice(NULL,0,6,12,5,3);
    extr7 = GetExtremumZigZagPrice(NULL,0,7,12,5,3);
    
    Comment
    (
     "Extremum 1 = "+DoubleToString(extr1,_Digits),"\n",
     "Extremum 2 = "+DoubleToString(extr2,_Digits),"\n",
     "Extremum 3 = "+DoubleToString(extr3,_Digits),"\n",
     "Extremum 4 = "+DoubleToString(extr4,_Digits),"\n",
     "Extremum 5 = "+DoubleToString(extr5,_Digits),"\n",
     "Extremum 6 = "+DoubleToString(extr6,_Digits),"\n",
     "Extremum 7 = "+DoubleToString(extr7,_Digits),"\n"
    );
  }
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
//|  Возвращает экстремум ЗигЗага по его номеру.                                                                                                  |
//|  Параметры:                                                                                                                                   |
//|   symbol          - наименование инструмента    ("" - текущий символ)                                                                         |
//|   timeframe       - таймфрейм                   ( 0 - текущий ТФ)                                                                             |
//|   extremum_number - номер экстремума            ( 0 - текущий)                                                                                |
//|   depth           - ExtDepth                                                                                                                  |
//|   deviation       - ExtDeviation                                                                                                              |
//|   backstep        - ExtBackstep                                                                                                               |
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
double GetExtremumZigZagPrice(string symbol="", ENUM_TIMEFRAMES timeframe=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                //Цена экстремума выбранная из массива таймсерии.
  int    count;                                  //Счетчик цикла.
  int bars_quantity=500;                         //Количество баров на графике. 
  int extremum_count=0;                          //Счетчик экстремумов.
  static int handle=0;                           //Хэндл индикатора.
  static bool flag; 
  
  if(!flag)
   {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага, если он есть.
   ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
   
   if(handle != INVALID_HANDLE)
     flag=true;
   }
  
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)  //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(price[count]);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}

Ладно, я как разберусь в чем причина, то обязательно отпишусь!

 
Yuriy Vins:

Добавил я Static , смешно, но он теперь показывает совсем не те цены!

Ладно, я как разберусь в чем причина, то обязательно отпишусь!

Решение получилось следующее:

Я функцию ArraySetAsSeries(price,true); вынес за пределы условия if(!flag). И теперь функция цены показывает ВЕРНО!

Сдвиг

Код:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                       Copyright 2018. Yuriy Vins |
//|                                            https://www.sayta.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018. Yuriy Vins"
#property link      "https://www.sayta.net"
#property version   "1.00"

double extr1, extr2, extr3, extr4, extr5, extr6, extr7;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  { 
    
    extr1 = GetExtremumZigZagPrice(NULL,0,1,12,5,3);
    extr2 = GetExtremumZigZagPrice(NULL,0,2,12,5,3);
    extr3 = GetExtremumZigZagPrice(NULL,0,3,12,5,3);
    extr4 = GetExtremumZigZagPrice(NULL,0,4,12,5,3);
    extr5 = GetExtremumZigZagPrice(NULL,0,5,12,5,3);
    extr6 = GetExtremumZigZagPrice(NULL,0,6,12,5,3);
    extr7 = GetExtremumZigZagPrice(NULL,0,7,12,5,3);
    
    Comment
    (
     "Extremum 1 = "+DoubleToString(extr1,_Digits),"\n",
     "Extremum 2 = "+DoubleToString(extr2,_Digits),"\n",
     "Extremum 3 = "+DoubleToString(extr3,_Digits),"\n",
     "Extremum 4 = "+DoubleToString(extr4,_Digits),"\n",
     "Extremum 5 = "+DoubleToString(extr5,_Digits),"\n",
     "Extremum 6 = "+DoubleToString(extr6,_Digits),"\n",
     "Extremum 7 = "+DoubleToString(extr7,_Digits),"\n"
    );
  }
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
//|  Возвращает экстремум ЗигЗага по его номеру.                                                                                                  |
//|  Параметры:                                                                                                                                   |
//|   symbol          - наименование инструмента    ("" - текущий символ)                                                                         |
//|   timeframe       - таймфрейм                   ( 0 - текущий ТФ)                                                                             |
//|   extremum_number - номер экстремума            ( 0 - текущий)                                                                                |
//|   depth           - ExtDepth                                                                                                                  |
//|   deviation       - ExtDeviation                                                                                                              |
//|   backstep        - ExtBackstep                                                                                                               |
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
double GetExtremumZigZagPrice(string symbol="", ENUM_TIMEFRAMES timeframe=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                //Цена экстремума выбранная из массива таймсерии.
  int    count;                                  //Счетчик цикла.
  int bars_quantity=500;                         //Количество баров на графике. 
  int extremum_count=0;                          //Счетчик экстремумов.
  static int handle;                             //Хэндл индикатора.
  static bool flag; 
  
  if(!flag)
   {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага.
   //ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
   
   if(handle != INVALID_HANDLE)
     flag=true;
   }
   
  ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)  //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(price[count]);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}
 
Yuriy Vins:

Решение получилось следующее:

Я функцию ArraySetAsSeries(price,true); вынес за пределы условия if(!flag). И теперь функция цены показывает ВЕРНО!

Код:

А если так?

   if(handle != INVALID_HANDLE)
     flag=true;
     ArraySetAsSeries(price,true);
   }
 
Vitaly Muzichenko:

А если так?

Не-аа. И так я тоже пробовал. Тоже не те цены показывает. Вот посмотрите, например:  Extremum 1 совсем далеко не равен цене 1.19019

Не те цены

 
Vladimir Karputov:

Вы зачем животину мучаете? Зачем на каждом обращении в функцию GetExtremumZigZagBar создаёте ОДИН хендл индикатора? 

Существует жесткое правило: хендл создаётся ОДИН раз в OnInit. И это ещё не всё, но для начала хотя бы это устраните.

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

 

Короче, из всех вариантов пока лучшими оказались вот эти:

//+-----------------------------------------------------------------------------------------------------------------------------------------------+
//|  Возвращает экстремум ЗигЗага по его номеру.                                                                                                  |
//|  Параметры:                                                                                                                                   |
//|   symbol          - наименование инструмента    ("" - текущий символ)                                                                         |
//|   timeframe       - таймфрейм                   ( 0 - текущий ТФ)                                                                             |
//|   extremum_number - номер экстремума            ( 0 - текущий)                                                                                |
//|   depth           - ExtDepth                                                                                                                  |
//|   deviation       - ExtDeviation                                                                                                              |
//|   backstep        - ExtBackstep                                                                                                               |
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
double GetExtremumZigZagPrice(string symbol="", ENUM_TIMEFRAMES timeframe=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                                 //Цена экстремума выбранная из массива таймсерии.
  int    count;                                                   //Счетчик цикла.
  int bars_quantity=(int)ChartGetInteger(0,CHART_VISIBLE_BARS,0); //Количество баров на графике. 
  int extremum_count=0;                                           //Счетчик экстремумов.
  static int handle;                                              //Хэндл индикатора.
  static bool flag; 
  
  if(!flag)
   {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага.
   if(handle != INVALID_HANDLE)
     flag=true;
   }
   
  ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)   //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(price[count]);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
//|  Возвращает номер бара экстремума ЗигЗага по его номеру.                                                                                      |
//|  Параметры:                                                                                                                                   |
//|   symbol          - наименование инструмента    ("" - текущий символ)                                                                         |
//|   timeframe       - таймфрейм                   ( 0 - текущий ТФ)                                                                             |
//|   extremum_number - номер экстремума            ( 0 - текущий)                                                                                |
//|   depth           - ExtDepth                                                                                                                  |
//|   deviation       - ExtDeviation                                                                                                              |
//|   backstep        - ExtBackstep                                                                                                               |
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
int GetExtremumZigZagBar(string symbol="", ENUM_TIMEFRAMES timeframe=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                                 //Цена экстремума выбранная из массива таймсерии.
  int    count;                                                   //Счетчик цикла.
  int bars_quantity=(int)ChartGetInteger(0,CHART_VISIBLE_BARS,0); //Количество баров на графике. 
  int extremum_count=0;                                           //Счетчик экстремумов.
  static int handle;                                              //Хэндл индикатора.
  static bool flag; 
  
  if(!flag)
   {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага.
   if(handle != INVALID_HANDLE)
     flag=true;
   }
   
  ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)   //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(count);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}
 

Тесты:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                       Copyright 2018. Yuriy Vins |
//|                                            https://www.sayta.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018. Yuriy Vins"
#property link      "https://www.sayta.net"
#property version   "1.00"

double extr1, extr2, extr3, extr4, extr5, extr6, extr7;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  { 
    
    extr1 = GetExtremumZigZagPrice(NULL,0,1,12,5,3);
    extr2 = GetExtremumZigZagPrice(NULL,0,2,12,5,3);
    extr3 = GetExtremumZigZagPrice(NULL,0,3,12,5,3);
    extr4 = GetExtremumZigZagPrice(NULL,0,4,12,5,3);
    extr5 = GetExtremumZigZagPrice(NULL,0,5,12,5,3);
    extr6 = GetExtremumZigZagPrice(NULL,0,6,12,5,3);
    extr7 = GetExtremumZigZagPrice(NULL,0,7,12,5,3);
    
    Comment
    (
     "Extremum 1 = "+DoubleToString(extr1,_Digits),"\n",
     "Extremum 2 = "+DoubleToString(extr2,_Digits),"\n",
     "Extremum 3 = "+DoubleToString(extr3,_Digits),"\n",
     "Extremum 4 = "+DoubleToString(extr4,_Digits),"\n",
     "Extremum 5 = "+DoubleToString(extr5,_Digits),"\n",
     "Extremum 6 = "+DoubleToString(extr6,_Digits),"\n",
     "Extremum 7 = "+DoubleToString(extr7,_Digits),"\n",
     "\n",
     "Bars_Total_by_Chart = "+IntegerToString(ChartGetInteger(0,CHART_VISIBLE_BARS,0),0),"\n",
     "Bars_Total_by_History = "+IntegerToString(iBars(Symbol(),0),0),"\n"
    );
  }
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
//|  Возвращает экстремум ЗигЗага по его номеру.                                                                                                  |
//|  Параметры:                                                                                                                                   |
//|   symbol          - наименование инструмента    ("" - текущий символ)                                                                         |
//|   timeframe       - таймфрейм                   ( 0 - текущий ТФ)                                                                             |
//|   extremum_number - номер экстремума            ( 0 - текущий)                                                                                |
//|   depth           - ExtDepth                                                                                                                  |
//|   deviation       - ExtDeviation                                                                                                              |
//|   backstep        - ExtBackstep                                                                                                               |
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
double GetExtremumZigZagPrice(string symbol="", ENUM_TIMEFRAMES timeframe=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                                 //Цена экстремума выбранная из массива таймсерии.
  int    count;                                                   //Счетчик цикла.
  int bars_quantity=(int)ChartGetInteger(0,CHART_VISIBLE_BARS,0); //Количество баров на графике. 
  int extremum_count=0;                                           //Счетчик экстремумов.
  static int handle;                                              //Хэндл индикатора.
  static bool flag; 
  
  if(!flag)
   {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага.
   if(handle != INVALID_HANDLE)
     flag=true;
   }
   
  ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)   //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(price[count]);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}
//+------------------------------------------------------------------+
//|                                                        Test2.mq5 |
//|                                       Copyright 2018. Yuriy Vins |
//|                                            https://www.sayta.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

int bar_number1,bar_number2,bar_number3,bar_number4,bar_number5,bar_number6,bar_number7;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    
    bar_number1 = GetExtremumZigZagBar(NULL,0,1,12,5,3);
    bar_number2 = GetExtremumZigZagBar(NULL,0,2,12,5,3);
    bar_number3 = GetExtremumZigZagBar(NULL,0,3,12,5,3);
    bar_number4 = GetExtremumZigZagBar(NULL,0,4,12,5,3);
    bar_number5 = GetExtremumZigZagBar(NULL,0,5,12,5,3);
    bar_number6 = GetExtremumZigZagBar(NULL,0,6,12,5,3);
    bar_number7 = GetExtremumZigZagBar(NULL,0,7,12,5,3);
    
    Comment
    (
     "Bar_Number 1 = "+IntegerToString(bar_number1,0),"\n",
     "Bar_Number 2 = "+IntegerToString(bar_number2,0),"\n",
     "Bar_Number 3 = "+IntegerToString(bar_number3,0),"\n",
     "Bar_Number 4 = "+IntegerToString(bar_number4,0),"\n",
     "Bar_Number 5 = "+IntegerToString(bar_number5,0),"\n",
     "Bar_Number 6 = "+IntegerToString(bar_number6,0),"\n",
     "Bar_Number 7 = "+IntegerToString(bar_number7,0),"\n",
     "\n",
     "Bars_Total_by_Chart = "+IntegerToString(ChartGetInteger(0,CHART_VISIBLE_BARS,0),0),"\n",
     "Bars_Total_by_History = "+IntegerToString(iBars(Symbol(),0),0),"\n"
    );
  }
  
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
//|  Возвращает номер бара экстремума ЗигЗага по его номеру.                                                                                      |
//|  Параметры:                                                                                                                                   |
//|   symbol          - наименование инструмента    ("" - текущий символ)                                                                         |
//|   timeframe       - таймфрейм                   ( 0 - текущий ТФ)                                                                             |
//|   extremum_number - номер экстремума            ( 0 - текущий)                                                                                |
//|   depth           - ExtDepth                                                                                                                  |
//|   deviation       - ExtDeviation                                                                                                              |
//|   backstep        - ExtBackstep                                                                                                               |
//+-----------------------------------------------------------------------------------------------------------------------------------------------+
int GetExtremumZigZagBar(string symbol="", ENUM_TIMEFRAMES timeframe=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                                 //Цена экстремума выбранная из массива таймсерии.
  int    count;                                                   //Счетчик цикла.
  int bars_quantity=(int)ChartGetInteger(0,CHART_VISIBLE_BARS,0); //Количество баров на графике. 
  int extremum_count=0;                                           //Счетчик экстремумов.
  static int handle;                                              //Хэндл индикатора.
  static bool flag; 
  
  if(!flag)
   {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага.
   if(handle != INVALID_HANDLE)
     flag=true;
   }
   
  ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)   //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(count);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}

Все идеально работает. Пользуйтесь на здоровье!