Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1566

 
Mikhail Tkachev:

Se avete un EA di tre righe, allora ovviamente non avete bisogno di OOP).

Ma se dovessi creare Goblin con un braccio e tre gambe, e poi con una gamba e tre braccia - allora, sì, è lì che l'OOP mi aiuterebbe davvero. Anche se... Non lo so nemmeno io.

Che senso ha averlo qui?

E non importa affatto quante "linee" avete. ;)
 
Mikhail Tkachev:

Solo int o double?
E se la variabile è un oggetto di una classe?
E se il numero di tali oggetti è sconosciuto in anticipo [prima dell'esecuzione di OnInit()]?
E se i parametri dei costruttori sono sconosciuti in anticipo [prima di OnInit()]?

Hai dato un buon link e un esempio sulla dichiarazione delle classi.

In ogni caso, quelli globali sono dichiarati prima di OnInit(); gli altri sono dichiarati ogni volta che sono necessari

 
MakarFX:

In ogni caso, i Global sono dichiarati prima di OnInit(), gli altri sono dichiarati ogni volta che sono necessari

Questo è chiaro in teoria.
In pratica, dopo :

la dichiarazione di 'NB_M1' nasconde la variabile globale -> per linea in OnInit()

vedere la precedente dichiarazione di 'NB_M1'.

l'esperto funziona come se NB_M1 fosse globale (e correttamente inizializzato), anche se è nascosto da una dichiarazione locale e inizializzato come locale in OnInit().

Per idea, non dovrebbe funzionare affatto.

 
Mikhail Tkachev:

In teoria, questo ha senso.
In pratica, dopo :

la dichiarazione di 'NB_M1' nasconde la variabile globale -> per linea in OnInit()

vedere la precedente dichiarazione di 'NB_M1'.

l'esperto funziona come se NB_M1 fosse globale (e correttamente inizializzato), sebbene sia nascosto dalla dichiarazione locale in OnInit().

Per idea, non dovrebbe funzionare affatto.

Cos'è NB_M1? Forse è già dichiarato nella libreria? E senza alcun codice, come i sordi con i ciechi)
 
Сергей Таболин:


E non importa quante "corde" hai. ;)

Quando avete un centinaio di righe di codice, perché volete aggiungere prima questo, poi dimenticare a cosa serve questo, poi aggiungere questo, allora naturalmente (?) sorgerà il pensiero: "Come organizzarlo?" Oppure no).

 
MakarFX:
Cos'è NB_M1? Forse è già dichiarato nella libreria? E senza codice, è come sordo e cieco)

NB_M1 è un oggetto di classe CIsNewBar per definire l'inizio di una nuova barra per ogni carattere. No, non è dichiarato nella libreria.
Codice nel primo post: https://www.mql5.com/ru/forum/160683/page1547#comment_23712294

 
Mikhail Tkachev:

NB_M1 è un oggetto di classe CIsNewBar per definire l'inizio di una nuova barra per ogni carattere. No, non è dichiarato nella libreria.
Il codice nel primo post: https://www.mql5.com/ru/forum/160683/page1547#comment_23712294

Quindi, NB_M1 è dichiarato all'interno della classe e vi si può accedere

Possiamo dare un'occhiata al codice di questa classe?

 
NB_M1 è un oggetto di questa classe. Come metterlo dentro?
//+------------------------------------------------------------------+
//|                                                     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 è un oggetto di questa classe. Come metterlo dentro?
a cosa serve questa variabile NB_M1?
 
Mikhail Tkachev:
NB_M1 è un oggetto di questa classe. Come metterlo dentro?

Penso che questo sia il modo in cui dovrebbe essere

bool NB_M1;
int OnInit()
{
}

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