Учёба. Классы. Нужна помощь. - страница 30

 
Alexey Viktorov #:

Никаких особых ухищрений не надо.

Переменная 

m_time

будет проинициализирована значением времени нового бара для для, скажем M15 EurUsd, а на следующем шаге я её переинициализирую значением M30 GbpUsd. В таком случае о каком запоминании может идти речь? Или я что-тот не понимаю?

 
Vitaly Murlenko #:

Переменная 

будет проинициализирована значением времени нового бара для для, скажем M15 EurUsd, а на следующем шаге я её переинициализирую значением M30 GbpUsd. В таком случае о каком запоминании может идти речь? Или я что-тот не понимаю?

Нет. В советнике создаёте или указатель на объект или переменную типа объект и это время разное в разных объектах.

Это переменная

CNewBar newBar(_Symbol, timeFrames);

Это указатель. Символ берётся из массива который получили из списка.

    CNewBar *nb=new CNewBar(arrSymbols[i],timeFrame);


Самый простой способ для двух символов

CNewBar newBar_1("EURUSD", PERIOD_M15);
CNewBar newBar_2("GBPUSD", PERIOD_M30);
 
Alexey Viktorov #:

А если советник установлен на EURUSD а мне надо получить новый бар на GBPUSD тогда как? Писать новый класс?

первый входной пераметр же по символу

когда я его использовал, там передавался номер в Перечислениях

add

и никаких множителей объектов для мультисимволов

 
Alexey Viktorov #:

Нет. В советнике создаёте или указатель на объект или переменную типа объект и это время разное в разных объектах.

Это переменная

Это указатель. Символ берётся из массива который получили из списка.


Самый простой способ для двух символов

Я что-то упустил. Можно полный код класса и советника?

 

Ради шутки

я вот смотрю, и в этой ветке ни разу не отписались реальные известные тут на форуме, смотрят как на зоопарк)

если того же сабера считать профи, нет он не профи.

 

class СNewBar - способ породить класс на ровном месте..ничуть и ничем не лучше функции. Ни по скорости, ни по читаемости, ни по компактности. Зато целый класс и потуга в ОО

и использоваться будет так-же как функция - всё в том же дерьмовом процедурном стиле и горе лесенок if. 

 
Maxim Kuznetsov #:
всё в том же дерьмовом процедурном стиле и горе лесенок if. 

не процедурка тоже плохо выглядит, 3 строки на вызов каждой функции, минимум

можно конечно так писать, но это Ради создания большой библиотеки

 
Vitaly Murlenko #:

Я что-то упустил. Можно полный код класса и советника?

Давно уже выложено и обсуждено…

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2021.08.04 21:44

Когда-то Артём писал мне этот класс. Я в подробностях объяснить как работает не могу. Но Артём увидев вспомнит и сможет объяснить. В общем вот сам класс

#include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
  {
private:
  string            m_symbol;
  ENUM_TIMEFRAMES   m_timeframe;
  datetime          m_time;
  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 Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
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]);
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm = this.Time();
   if(tm == 0)
      return false;
   if(tm != this.m_time)
     {
      this.m_time = tm;
      return true;
     }
   return false;
  }

И вот цикл создания указателей в OnInit()

   for(int i = 0; i < ArraySize(Rates); i++)
     {
       CNewBar* nb = new CNewBar(Rates[i].m_Symbols, timefram);
       if(nb != NULL)
         {
          list_new_bar.Add(nb);
          Print(nb.IsNewBar(), " ***** ", Rates[i].m_Symbols, " ***** ", nb.Time());
         }
     }

и в OnTimer()

void OnTimer()
{
 int total = list_new_bar.Total();
 for(int i = 0; i < ArraySize(Rates); i++)
  {
   CNewBar* nb = list_new_bar.At(i);
   if(nb == NULL)
    continue;
   bool new_bar = nb.IsNewBar();
   if(new_bar)
    {// и дальше………

ArraySize(Rates) это размер массива структур в котором перечислены символы с которыми надо работать.

 

вот пример ООП)))))))))))))

в три строки можно было уложить

Артем прости меня

 
Maxim Kuznetsov #:

class СNewBar - способ породить класс на ровном месте..ничуть и ничем не лучше функции. Ни по скорости, ни по читаемости, ни по компактности. Зато целый класс и потуга в ОО

и использоваться будет так-же как функция - всё в том же дерьмовом процедурном стиле и горе лесенок if. 

Всё это правильно ровно до того момента пока не начали писать мультивалютный советник. По настоящему мультивалютный…

Потом под каждый символ надо писать свою функцию, а когда количество символов и какие символы в этом советнике будут работать неизвестно на стадии написания кода, вот тогда и приходит понимание, что лучше иметь такой класс и двумя строками всё решать не задумываясь, чем заниматься ан…ом.