Косяк класса или реализации мкл?

 

 Написал класс, для работы с зиг-загом. До универсальности ещё не дошёл, но.. В одном эксперте работает. Вот понадобилось использовать его в другом классе, и.. замечено, что метод:

//=========================================================================================================================================
// 1.3 Получаем значение цены на заданном индексе экстремума
double ZZOperations::GetZZExtremumPrice(int fi_Index) {
   return (ZZExtremumPrice[fi_Index]);
}

 возвращает всегда 0. Никаких привязок к канкретной сове нет. В чём может быть причина то?

Класс прикрепляю и вот дублирую код:

//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                                                                      ZZOperations.mqh |
//|                                                                                                                                   hoz |
//|                                                                                                                                       |
//+---------------------------------------------------------------------------------------------------------------------------------------+
#ifndef ZZOperations_H
#define ZZOperations_H

#property copyright "hoz"
#property link      ""
#property strict
// ================================================== Включения и импорт внешних модулей =================================================+
#import "stdlib.ex4"
   bool CompareDoubles(double number1,double number2);
#import     "ArraysManipulations.ex4"
   void ShiftIndexDatetime (datetime& fdta_Value[], bool fb_Conditions = false);
   void ShiftIndexDouble (double& fda_Value[], bool fb_Conditions = false);
#import

#include    <HOZ_Code\Classes\Maintenance\HandlingWithErrors.mqh>
#include    <HOZ_Code\Classes\Maintenance\Logging.mqh>

//+=======================================================================================================================================+
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//|                                                     КЛАСС ДЛЯ РАБОТЫ С ЗИГ-ЗАГАМИ                                                     |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+=======================================================================================================================================+
class ZZOperations
{
   private:
      bool      primary;                         // Флаг первичности сбора экстремумов Zig-Zag'а
      datetime  ZZExtremumTime[1000];            // Массив времени экстремумов Zig-Zag'а
      double    ZZExtremumPrice[1000];           // Массив цен экстремумов Zig-Zag'а
      double    ZZLimbSize[1000];                // Массив размеров колен Zig-Zag'а
   public:
      //---- Конструктор и деструктор
                ZZOperations (void);
               ~ZZOperations (void);

      void      MakeNoneEmptyArray (string fs_Symbol, int fi_TF);
      datetime  GetZZExtremumTime (int fi_Index);
      double    GetZZExtremumPrice (int fi_Index);
      double    GetZZLimbSize (double fd_FirstLimbNumber, double fd_SeondLimbNumber);
};

//=========================================================================================================================================
// Конструктор класса. ====================================================================================================================
ZZOperations::ZZOperations (void) {
   primary = true;
}
//=========================================================================================================================================
// Деструктор класса. =====================================================================================================================
ZZOperations::~ZZOperations (void) {
}
//=========================================================================================================================================
// 1.1 Отбираем и заносим в массив " непустые значения " из индикаторного буфера Зиг-Зага и передаём полученный массив по ссылке через
//     параметры функции.
void ZZOperations::MakeNoneEmptyArray (string fs_Symbol,              // Символ инструмента
                                       int    fi_TF)                  // Таймфрейм графика инструмента
{
   double   value;              // Значение, возвращаемое Зиг-Загом
   int      NEIndex = 0;        // Индекс "непустого" значения
   
   if (!primary)                                                      // Проверим на наличие "непустого" значения 0-ой бар
   {
      value = iCustom (fs_Symbol, fi_TF, "NeoZigZag_Close", 0, 0);    // Определяем значение Зиг-Зага на 0-м индексе
      
      if (ZZExtremumPrice[0] == value) return;                        // Если значение последнего "непустого" значения равно текущему...
                                                                      //.. значению Зиг-Зага, выходим
      if (value == 2147483647.0) return;
      if (value == 0.0) return;                                       // Если значение Зиг-Зага на днном баре "пустое", пропускаем его
      {
         if (ZZExtremumPrice[0] < ZZExtremumPrice[1])                 // Если последнее колено Зиг-Зага направлено вниз, то..
         {
            if (ZZExtremumPrice[0] == value) return;                   // Если значение цены на 0-индексе, равно значению полученному в этот раз, выходим
            
            if (value < ZZExtremumPrice[0])                           // Если значение полученного экстремума ниже значения на 0-индексе..
              ZZExtremumPrice[0] = value;                             //.. присвоим новое значение 0-му индексу
            else if (value > ZZExtremumPrice[0])                      // Иначе, если цены полученного экстремума, выше значения на 0-м индексе..
            {
               ShiftIndexDouble (ZZExtremumPrice);                    // Dысвобождаем 0-ячейки в массивах цен..
               ShiftIndexDatetime (ZZExtremumTime);                   //.. и времени полученных экстремумов, и,

               ZZExtremumPrice[0] = value;                            //.. Записываем в них..
               ZZExtremumTime[0] = iTime (fs_Symbol, fi_TF, 0);       //.. соответствующие значенмя
            }
         }
         else if (ZZExtremumPrice[0] > ZZExtremumPrice[1])            // Если последнее колено Зиг-Зага направлено вверх, то..
         {
            if (ZZExtremumPrice[0] == value) return;                  // Если значение цены на 0-индексе, равно значению полученному в этот раз, выходим

            if (value > ZZExtremumPrice[0])                           // Если значение полученного экстремума выше значения на 0-индексе..
              ZZExtremumPrice[0] = value;                             //.. присвоим новое значение 0-му индексу
            else if (value < ZZExtremumPrice[0])                      // Иначе, если цены полученного экстремума, ниже значения на 0-м индексе..
            {
               ShiftIndexDouble (ZZExtremumPrice);                    // Dысвобождаем 0-ячейки в массивах цен..
               ShiftIndexDatetime (ZZExtremumTime);                   //.. и времени полученных экстремумов, и,

               ZZExtremumPrice[0] = value;                            //.. Записываем в них..
               ZZExtremumTime[0] = iTime (fs_Symbol, fi_TF, 0);       //.. соответствующие значенмя
            }
         }
      }
   }
   else                                                                // Первичная проверка истории на наличие требуемого кол-ва "непустых" значений
   {
      for (int index = 0; ; index++)
      {
         value = iCustom (fs_Symbol, fi_TF, "NeoZigZag_Close", 0, index);  // Определяем значение Зиг-Зага на соответствующем индексе

         if (value == 2147483647.0) continue;
         if (value == 0.0) continue;                                       // Если значение Зиг-Зага на днном баре "пустое", пропускаем его
         {
            ZZExtremumPrice[NEIndex] = value;                              //  Заносим цену и время отобранных "непустых" значений Зиг-Зага...
            ZZExtremumTime[NEIndex] = iTime (fs_Symbol, fi_TF, index);     //  ..в массивы цен и времени последовательных экстремумов
            
            NEIndex++;                                                     // Увеличиваем счётчик "непустого" значения на 1.
         }
         
         if (NEIndex == 15) return;                                        // Если отобрано 15 "непустых" значений Зиг-зага, выходим из цикла
      }
      primary = false;
   }
}
//=========================================================================================================================================
// 1.2 Получаем размер колена Zig-Zag'а по индексу.
double ZZOperations::GetZZLimbSize (double fd_FirstZZExtremumPrice, double fd_SecondZZExtremumPrice)
{
   return (fd_FirstZZExtremumPrice - fd_SecondZZExtremumPrice);
}
//=========================================================================================================================================
// 1.3 Получаем значение цены на заданном индексе экстремума
double ZZOperations::GetZZExtremumPrice(int fi_Index) {
   return (ZZExtremumPrice[fi_Index]);
}
//=========================================================================================================================================
// 1.4 Получаем значение времени на заданном индексе экстремума
datetime ZZOperations::GetZZExtremumTime (int fi_Index) {
   return (ZZExtremumTime[fi_Index]);
}

#endif
Файлы:
 

А индикатор NeoZigZag_Close корректные значения возвращает?


Вот что для начала рекомендую я:

  1. Вывести в лог, значения при заполнении массива ZZExtremumPrice
    Print("Set ZZExtremumPrice[",NEIndex,"]: ",value);
  2. Вывести значение ZZExtremumPrice при запросе
    Print("Get ZZExtremumPrice[",fi_Index,"]: ",ZZExtremumPrice[fi_Index]);
 
mql5:
А индикатор NeoZigZag_Close ноли возвращает?
Вообще то не должен. Но у меня было пару случаев, когда возврат был вроде как 0. Говорю так потому, что я не с проста в коде сделал проверку на 0. А вообще код индикатора прилагаю. Написал известным опытным программистом Scriptong'ом.
Файлы:
 
Честно говоря, вот здесь может быть зацикливание

      for (int index = 0; ; index++)
      {
         value = iCustom (fs_Symbol, fi_TF, "NeoZigZag_Close", 0, index);  // Определяем значение Зиг-Зага на соответствующем индексе

         if (value == 2147483647.0) continue;
         if (value == 0.0) continue;                                       // Если значение Зиг-Зага на днном баре "пустое", пропускаем его
         {
            ZZExtremumPrice[NEIndex] = value;                              //  Заносим цену и время отобранных "непустых" значений Зиг-Зага...
            ZZExtremumTime[NEIndex] = iTime (fs_Symbol, fi_TF, index);     //  ..в массивы цен и времени последовательных экстремумов
            
            NEIndex++;                                                     // Увеличиваем счётчик "непустого" значения на 1.
         }
         
         if (NEIndex == 15) return;                                        // Если отобрано 15 "непустых" значений Зиг-зага, выходим из цикла
      }

Если в Зизаге не будет 15ти вершин, то Вы выйдете за пределы баров индикатора и всегда будете из iCustom получать 0.0
Причина обращения: