Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1566

 
Mikhail Tkachev:

Si vous avez une EA de trois lignes, alors bien sûr vous n'avez pas besoin de la POO).

Mais si je devais créer un gobelin avec un bras et trois jambes, puis avec une jambe et trois bras - alors, oui, c'est là que la POO m'aiderait vraiment. Bien que... Je ne sais pas non plus.

Quel est l'intérêt de l'avoir ici ?

Et le nombre de "lignes" que vous avez n'a aucune importance. ;)
 
Mikhail Tkachev:

Seulement int ou double ?
Et si la variable est un objet d'une classe?
Et si le nombre de ces objets est inconnu à l'avance [avant l'exécution de OnInit()] ?
Et si les paramètres des constructeurs à l'avance [avant OnInit()] sont inconnus ?

Vous avez donné un bon lien et un bon exemple sur la déclaration des classes.

Dans tous les cas, les globaux sont déclarés avant OnInit() ; les autres sont déclarés chaque fois qu'ils sont nécessaires.

 
MakarFX:

Dans tous les cas, Global est déclaré avant OnInit(), les autres sont déclarés chaque fois que nécessaire

C'est clair en théorie.
En pratique, après :

la déclaration de 'NB_M1' cache la variable globale -> par ligne dans OnInit()

voir la déclaration précédente de "NB_M1".

l'expert fonctionne comme si NB_M1 était global (et correctement initialisé), même s'il est caché par une déclaration locale et initialisé comme local dans OnInit().

Par idée, ça ne devrait pas fonctionner du tout.

 
Mikhail Tkachev:

En théorie, cela a du sens.
En pratique, après :

la déclaration de 'NB_M1' cache la variable globale -> par ligne dans OnInit()

voir la déclaration précédente de "NB_M1".

l'expert fonctionne comme si NB_M1 était global (et correctement initialisé), bien qu'il soit caché par la déclaration locale dans OnInit().

Par idée, ça ne devrait pas fonctionner du tout.

Qu'est-ce que NB_M1 ? Peut-être est-il déjà déclaré dans la bibliothèque ? Et sans aucun code, comme les sourds avec les aveugles)
 
Сергей Таболин:


Et le nombre de "cordes" que vous avez n'a pas d'importance. ;)

Lorsque vous avez une centaine de lignes de code, parce que vous voulez d'abord ajouter ceci, puis oublier à quoi cela sert, puis ajouter cela, alors naturellement ( ?) la pensée va surgir : "Comment l'organiser ?" Ou pas).

 
MakarFX:
Qu'est-ce que NB_M1 ? Peut-être est-il déjà déclaré dans la bibliothèque ? Et sans code du tout, c'est comme être sourd et aveugle).

NB_M1 est un objet de la classe CIsNewBar pour définir le début d'une nouvelle barre pour chaque caractère. Non, il n'est pas déclaré dans la bibliothèque.
Code dans le premier message :https://www.mql5.com/ru/forum/160683/page1547#comment_23712294

 
Mikhail Tkachev:

NB_M1 est un objet de la classe CIsNewBar pour définir le début d'une nouvelle barre pour chaque caractère. Non, il n'est pas déclaré dans la bibliothèque.
Le code dans le premier post :https://www.mql5.com/ru/forum/160683/page1547#comment_23712294

Ainsi, NB_M1 est déclaré à l'intérieur de la classe et on peut y accéder.

Pouvons-nous jeter un coup d'œil au code de cette classe ?

 
NB_M1 est un objet de cette classe. Comment le mettre à l'intérieur ?
//+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//|                               Copyright © 2011, Nikolay Kositsin |
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+ 
#property copyright "2011,   Nikolay Kositsin"
#property link      "farria@mail.redcom.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//|  Алгоритм определения момента появления нового бара              |
//| Для каждого таймфрейма каждого символа нужно создавать объект    |
//+------------------------------------------------------------------+  
#include <Object.mqh>

class CIsNewBar:public CObject // Сделан наследником класса для возможности работы с классом CArrayObj (из библиотеки)
// class CIsNewBar   // Первоначальная редакция
  {
   //----
public:

      //---- функция определения момента появления нового бара
   bool IsNewBar()
     {
      //---- получим время появления текущего бара
      datetime TNew=datetime(SeriesInfoInteger(m_Symbol,m_TimeFrame,SERIES_LASTBAR_DATE));

      if(TNew!=m_TOld && TNew) // проверка на появление нового бара
        {
         m_TOld=TNew;
         return(true); // появился новый бар!
        }
      //----
      return(false); // новых баров пока нет!
     };

   //---- конструктор класса    
                     CIsNewBar(const string &pSymbol, const ENUM_TIMEFRAMES pTimeFrame){
                        m_Symbol=pSymbol; m_TimeFrame=pTimeFrame;
                        m_TOld=-1;};

protected:
   datetime          m_TOld;        // Время хранится 
   ENUM_TIMEFRAMES   m_TimeFrame;   //    для каждого таймфрейма
   string            m_Symbol;      //    каждого символа

   //---- 
  };
//+------------------------------------------------------------------+
 
Mikhail Tkachev:
NB_M1 est un objet de cette classe. Comment le mettre à l'intérieur ?
A quoi sert cette variable NB_M1 ?
 
Mikhail Tkachev:
NB_M1 est un objet de cette classe. Comment le mettre à l'intérieur ?

Je pense que c'est comme ça que ça doit être.

bool NB_M1;
int OnInit()
{
}

void OnTick()
{
   NB_M1=new CIsNewBar(_Symbol,PERIOD_M1);  // Эта строка потом будет в цикле для разных символов
   if (NB_M1)  // (1) Если появился новый бар M1
        {....}
    ......
}