Как вложить класс в класс? ПОМГИТЕ ПЛИЗЗЗ МАСТЕРА, ГУРУ, ПРОФИ

 

Учусь работать с классами. Объединяю расчеты. 

Задача вложить (2) в (1) или  (2) в (3), то есть объединить (1),(2),(3).

1) Это класс расчета нового бара + данных для расчета основного класса

//+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//+------------------------------------------------------------------+
#include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
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;      } //  Возвращает время последнего обращения
   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 Возвращает время нулевого бара                      |SERIES_LASTBAR_DATE
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {...
   return(array[0]);
  }
//+------------------------------------------------------------------+
//| Возвращает количество баров в истории                            |
//+------------------------------------------------------------------+
int CNewBar::RatesTotal(void)
  {...
   return((int)rt);
  };
//+------------------------------------------------------------------+
//| Кол-во отработанных                                              |
//+------------------------------------------------------------------+
int CNewBar::PrevCalculated(void)
  {...
   return(rt < 0 ? 0 : rt);
  }
//+------------------------------------------------------------------+
//| Расчет цены                                                      |
//+------------------------------------------------------------------+
int CNewBar::PriceHL2(void)
  {...
   return(res);
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm=this.Time();
   if(tm==0)
      return false;
   if(tm!=this.m_time)
     {
      Print("Кол-во Баров ",this.m_rt);
      return true;
     }
   return false;
  }
//+------------------------------------------------------------------+


2) Это класс основного расчета

//+------------------------------------------------------------------+
//|                                                    SMA Greed.mqh |
//|                                            Copyright 2015, Urain |
//|                            https://login.mql5.com/ru/users/Urain |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Urain"
#property link      "https://login.mql5.com/ru/users/Urain"
//+------------------------------------------------------------------+
//| #include <SMA Greed.mqh>                                         |
//+------------------------------------------------------------------+
#include <IncMAOnArray.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CSMA_Greed
  {
   CMAOnArray        chsma;
   struct SDoubleArray { double       m[];};
   int               m_max_period;
   int               rt,prv;
   double            temp;
public:
   SDoubleArray      d[];
                     CSMA_Greed(void){};
                    ~CSMA_Greed(void){};
   void              Init(int MaxMAperiod);
   void              Solve(const int aRatesTotal,const int aPrevCalc,const double  &aData[]);
  };
//+------------------------------------------------------------------+
void  CSMA_Greed::Init(int MaxMAperiod)
  {
...
  };
//+------------------------------------------------------------------+
void  CSMA_Greed::Solve(const int aRatesTotal,const int aPrevCalc,const double  &aData[])
  {
...
  };
//+------------------------------------------------------------------+


3) Это эксперт.

//+------------------------------------------------------------------+
//|                                             IsNewBar_Example.mq5 |
//+------------------------------------------------------------------+
#property copyright "2021Октябрь"
#property version   "1.00"
#include <IsNewBar.mqh>
//---
CArrayObj         list_new_bar;
//---
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=1; i<10; i++)
     {
      ENUM_TIMEFRAMES n_period=(ENUM_TIMEFRAMES)GetPeriodEnumerator((uchar)i);
      CNewBar *nb = new CNewBar(Symbol(), n_period);
      if(nb==NULL)
         continue;
      if(!list_new_bar.Add(nb))
        {
         delete nb;
         continue;
        }
     }
//--- create timer
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTimer()
  {
   int total = list_new_bar.Total();
   for(int i = 0; i < total; i++)
     {
      CNewBar* nb = list_new_bar.At(i);
      if(nb == NULL)
         continue;
      if(nb.IsNewBar())
        {
...
        }
     }
  }
//+------------------------------------------------------------------+
//| Расчет ТФ                                                        |
//+------------------------------------------------------------------+
int GetPeriodEnumerator(uchar n_period)
  {
...
  }
//+------------------------------------------------------------------+


Задача вложить (2) в (1) или  (2) в (3), то есть объединить (1),(2),(3).

Я в принципе написал решение, но оно наверняка нарушает прелесть реализации. 

Добавил в (1) Это класс расчета нового бара + данных для расчета основного класса

#include <SMA Greed.mqh>
CSMA_Greed smM1,smM5,smM15,smM30,smH1,smH4,smD1,smW1,smMN;
//+------------------------------------------------------------------+
//| Расчитываем МА конкретно ТФ                                      |
//+------------------------------------------------------------------+
int CNewBar::sm(void)
  {
   switch(this.m_timeframe)
     {
      case PERIOD_M1:
         smM1.Solve(this.m_rt,this.m_pc,this.m_pr_hl2); // Расчитываем базу
         break;
      case PERIOD_M5:
         smM5.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      case PERIOD_M15:
         smM15.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      case PERIOD_M30:
         smM30.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      case PERIOD_H1:
         smH1.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      case PERIOD_H4:
         smH4.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      case PERIOD_D1:
         smD1.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      case PERIOD_W1:
         smW1.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      case PERIOD_MN1:
         smMN.Solve(this.m_rt,this.m_pc,this.m_pr_hl2);
         break;
      default:
         Print("Error sm()");
     }
     return(0);
  }

//+------------------------------------------------------------------+
//| Расчитываем МА конкретно ТФ                                      |
//+------------------------------------------------------------------+
int CNewBar::smInit(void)
  {
  int i=this.m_timeframe;
   switch(i)
     {
      case PERIOD_M1:
         smM1.Init(m_pmax); // Расчитываем базу
         break;
      case PERIOD_M5:
         smM5.Init(m_pmax);
         break;
      case PERIOD_M15:
         smM15.Init(m_pmax);
         break;
      case PERIOD_M30:
         smM30.Init(m_pmax);
         break;
      case PERIOD_H1:
         smH1.Init(m_pmax);
         break;
      case PERIOD_H4:
         smH4.Init(m_pmax);
         break;
      case PERIOD_D1:
         smD1.Init(m_pmax);
         break;
      case PERIOD_W1:
         smW1.Init(m_pmax);
         break;
      case PERIOD_MN1:
         smMN.Init(m_pmax);
         break;
      default:
         Print("Error sm()");
     }
     return(0);
  }
//+------------------------------------------------------------------+

В общем начал создавать отдельные типо объекты или классы, не знаю точно как называется

smM1,smM5,smM15,smM30,smH1,smH4,smD1,smW1,smMN;

Но это очень объемно, а в в эксперте есть метод 

(3)

list_new_bar.Add(nb)

Наверно надо как то через него отработать, но не могу интегрировать. 

 

Как объявить класс для того чтобы класс d[].m[]; стал публичным

class CSMA_Greed : public CObject
  {
   CMAOnArray        chsma;
   struct SDoubleArray { double       m[];};
   string            m_symbol;
   ENUM_TIMEFRAMES   m_timeframe;
   int               m_max_period;
   int               rt,prv;
   double            temp;
   string            Symbol(void)         { return this.m_symbol;    }
public:
   SDoubleArray      d[];
                     CSMA_Greed(const string symbol,const ENUM_TIMEFRAMES timeframe,const int max_period);
                    ~CSMA_Greed(void){};
   void              Init(int MaxMAperiod);
   void              Solve(const int aRatesTotal,const int aPrevCalc,const double  &aData[]);
  };

Получается массив есть , а вытащить не могу

cg.d[1199].m[3720]
 
Mikhail Toptunov #:

Как объявить класс для того чтобы класс d[].m[]; стал публичным

Получается массив есть , а вытащить не могу

cg.d[1199].m[3720]
Не путайте божий дар с яичницей. Массив доступен, это отладчик чудит 
 
Sergey Gridnev #:
Не путайте божий дар с яичницей. Массив доступен, это отладчик чудит 

И правда!!! Аллилуйя!!!))) Слава Богу))))