Как код преобразовать по классу. Есть три функции которые перевожу в класс.

 

Рассчитываю количество rates_total, Time... 

bool MAtime()
  {
   for(int i=1; i<2; i++)//10
     {
      int _Pmax=Pmax[i]*2,prev_calculated=0;
      double    ExtBuffer[],high[],low[];
     //-- Тайфрейм
      ENUM_TIMEFRAMES n_period=(ENUM_TIMEFRAMES)GetPeriodEnumerator((uchar)i);
      //--
      if(p_c[i]!=rates_total)
        {
         MqlRates raters[];
         ArrayFree(ExtBuffer);
         ArrayResize(ExtBuffer,_Pmax);
         ArrayFree(high);
         ArrayResize(high,_Pmax);
         ArrayFree(low);
         ArrayResize(low,_Pmax);
         int rez=CopyRates(Symbol(), n_period, 0, _Pmax, raters);//n_period
         if(rez==0)
           {
            Print("Error Не определен MqlRates");
            break;
           }
         //--- Расчет исторических данных времени
         ArrayFree(Time);
         ArrayResize(Time,_Pmax);
         int time=CopyTime(Symbol(), n_period,0,_Pmax,Time);
         if(time==0)
           {
            Print("Error Не определен time");
            break;
           }
         //--- Рассчитаем значения цены
         for(int j=0; j<_Pmax; j++)
           {
            ExtBuffer[j]=MathAbs((raters[j].high+raters[j].low)/2);
            high[j]=raters[j].high;
            low[j]=raters[j].low;
           }
         //---
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Расчет ТФ                                                        |
//+------------------------------------------------------------------+
int GetPeriodEnumerator(uchar n_period)
  {
   switch(n_period)
     {
      case 0:
         return(PERIOD_CURRENT);
      case 1:
         return(PERIOD_M1);
      case 2:
         return(PERIOD_M5);
      case 3:
         return(PERIOD_M15);
      case 4:
         return(PERIOD_M30);
      case 5:
         return(PERIOD_H1);
      case 6:
         return(PERIOD_H4);
      case 7:
         return(PERIOD_D1);
      case 8:
         return(PERIOD_W1);
      case 9:
         return(PERIOD_MN1);
      default:
         Print("Enumerator period");
         return(-1);
     }
  }

Думаю как должна выглядеть структура класса, для этих данных.

 

Как интересно сделать расчет prev_calculated или || и  rates_rotal более разумным для системы?????

//+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//+------------------------------------------------------------------+
#property copyright "2021"
#property version   "1.00"
#include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
  {
private:
   string            m_symbol;
   ENUM_TIMEFRAMES   m_timeframe;
   datetime          m_time;
   long              m_rt;
   int               m_pc;
   datetime          Time(void);
   int               PrevCalculated(void);
   long              RatesTotal(void);
   string            Symbol(void)         { return this.m_symbol;    }
public:
   ENUM_TIMEFRAMES   Timeframe(void)      { return this.m_timeframe; }
   datetime          GetTime(void)        { return this.m_time;      } //  Возвращает время последнего обращения
   long              GetRatesTotal(void)  { return this.m_rt;        }
   int               GetPrevCalculated(void) {return this.m_pc;       }
   bool              IsNewBar(void);                                   //  Основная функция класса
                     CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe);
                    ~CNewBar(void) {;}
  };
//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0)
  {
   this.m_symbol = symbol;
   this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe);
  }
//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {
   datetime array[1], ret;
   ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
   return(array[0]);
  }
//+------------------------------------------------------------------+
//| Возвращает количество баров в истории                            |
//+------------------------------------------------------------------+
long CNewBar::RatesTotal(void)
  {
//---- получим количество баров
   long rt=SeriesInfoInteger(this.m_symbol, this.m_timeframe,SERIES_BARS_COUNT);
//---- Проверка количества
   if(rt<1)
      Print("Error "+__FUNCTION__+" Не определенно кол-во баров ",this.m_symbol," ",this.m_timeframe);
//----
   return(rt);
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CNewBar::PrevCalculated(void)
  {
   int pc=(int)(this.RatesTotal()-this.m_rt);
   return(pc);
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm=this.Time();
   Print("this.m_time ",this.m_time," tm ",tm," this.m_pc ",this.m_pc," this.m_rt ",this.m_rt);
   if(tm==0)
      return false;
   if(tm!=this.m_time)
     {
      //--- определяем время
      this.m_time=tm;
      //--- определяем кол-во
      this.m_pc=this.PrevCalculated();
      this.m_rt=(int)this.RatesTotal();
      return true;
     }
   this.m_pc=(int)this.m_rt;
   return false;
  }
 

Во вроде работает


//+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//+------------------------------------------------------------------+
#property copyright "2021"
#property version   "1.00"
#include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
  {
private:
   string            m_symbol;
   ENUM_TIMEFRAMES   m_timeframe;
   datetime          m_time;
   int               m_rt;
   int               m_pc;
   datetime          Time(void);
   int               PrevCalculated(void);
   int               RatesTotal(void);
   string            Symbol(void)         { return this.m_symbol;    }
public:
   ENUM_TIMEFRAMES   Timeframe(void)      { return this.m_timeframe; }
   datetime          GetTime(void)        { return this.m_time;      } //  Возвращает время последнего обращения
   int               GetRatesTotal(void)  { return this.m_rt;        }
   int               GetPrevCalculated(void) {return this.m_pc;       }
   bool              IsNewBar(void);                                   //  Основная функция класса
                     CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe);
                    ~CNewBar(void) {;}
  };
//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0)
  {
   this.m_symbol = symbol;
   this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe);
  }
//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {
   datetime array[1], ret;
   ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
   return(array[0]);
  }
//+------------------------------------------------------------------+
//| Возвращает количество баров в истории                            |
//+------------------------------------------------------------------+
int CNewBar::RatesTotal(void)
  {
//---- получим количество баров
   long rt=SeriesInfoInteger(this.m_symbol, this.m_timeframe,SERIES_BARS_COUNT);
//---- Проверка количества
   if(rt<1)
      Print("Error "+__FUNCTION__+" Не определенно кол-во баров ",this.m_symbol," ",this.m_timeframe);
//----
   return((int)rt);
  };
//+------------------------------------------------------------------+
//| Кол-во отработанных                                              |
//+------------------------------------------------------------------+
int CNewBar::PrevCalculated(void)
  {
  int _rt=this.RatesTotal();
  int rt=_rt-(_rt-this.m_rt);
   return(rt < 0 ? 0 : rt);
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm=this.Time();
   int      rt=this.RatesTotal();
   if(tm==0)
      return false;
   if(tm!=this.m_time)
     {
      //--- определяем время
      this.m_time=tm;
      //--- определяем кол-во
      this.m_pc=this.PrevCalculated();
      this.m_rt=rt;
      return true;
     }
     this.m_pc=rt<0 ? 0 : rt;
   return false;
  }
Еще надо расчет цены сделать
 

Подскажите пожалуйста как объявить массив в классе, для того чтобы его вытащить в советнике? 

m_pr_hl2[b]=MathAbs((iHigh(this.m_symbol,this.m_timeframe,b) + iLow(this.m_symbol,this.m_timeframe,b))/2);
class CNewBar : public CObject
  {
private:
   string            m_symbol;
   ENUM_TIMEFRAMES   m_timeframe;
   datetime          m_time;
   double            m_pr_hl2[];
   datetime          Time(void);
   string            Symbol(void)         { return this.m_symbol;    }
public:
   ENUM_TIMEFRAMES   Timeframe(void)      { return this.m_timeframe; }
   datetime          GetTime(void)        { return this.m_time;      } //  Возвращает время последнего обращения
   int               PriceHL2(void);      
   bool              IsNewBar(void);                                   //  Основная функция класса
                     CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe);
                    ~CNewBar(void) {;}
  };
//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0)
  {
   this.m_symbol = symbol;
   this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe);
   m_rt=this.RatesTotal();
   m_pc=0;
   PriceHL2();
  }
//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |SERIES_LASTBAR_DATE
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {
   datetime array[1], ret;
   ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
   return(array[0]);
  }

//+------------------------------------------------------------------+
//| Расчет цены                                                      |
//+------------------------------------------------------------------+
int CNewBar::PriceHL2(void)
  {
   int res=ArrayResize(this.m_pr_hl2,this.m_rt);
   for(int b=this.m_pc; b<this.m_rt; b++)
      m_pr_hl2[b]=MathAbs((iHigh(this.m_symbol,this.m_timeframe,b) + iLow(this.m_symbol,this.m_timeframe,b))/2);
   return(res);
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm=this.Time();
   if(tm==0)
      return false;
   if(tm!=this.m_time)
     {
      //--- определяем время
      this.m_time=tm;
      this.PriceHL2();
      return true;
     }
   return false;
  }
 
Mikhail Toptunov #:

Подскажите пожалуйста как объявить массив в классе, для того чтобы его вытащить в советнике? 

Два варианта:

  1. Очень плохой. Сделать массив публичным.
  2. Плохой. Добавить в класс публичный метод (типа GetArray), при помощи которого и передавать массив вне класса.
 
Ihor Herasko #:

Два варианта:

  1. Очень плохой. Сделать массив публичным.
  2. Плохой. Добавить в класс публичный метод (типа GetArray), при помощи которого и передавать массив вне класса.

Сможете описать хороший вариант...

Как лучше рассчитать  цену по каждому бару и по каждому ТФ, в классе или вне класса?

 
Mikhail Toptunov #:

Сможете описать хороший вариант...

Как лучше рассчитать  цену по каждому бару и по каждому ТФ, в классе или вне класса?

 Я бы не делал такой класс. Все подобные расчеты сводятся всего лишь к одной функции - функции определения индекса бара, с которого требуется производить перерасчет данных индикатора. Если функция возвращает значение более 0, то это и есть новый бар (т. е. надобность в IsNewbar() пропадает). Таким образом, достаточно вставить функцию определения индекса первого бара в соответствующий класс. А там уже нужно смотреть, как удобнее: объявить переменную PrevCalculated как член класса или передавать ссылку на нее в функцию.