Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1566

 
Mikhail Tkachev:

Si tienes un EA de tres líneas, entonces por supuesto no necesitas OOP).

Pero si tuviera que crear Goblin con un brazo y tres piernas, y luego con una pierna y tres brazos - entonces, sí, ahí es donde OOP realmente me ayudaría. Aunque... Yo tampoco lo sé.

¿Qué sentido tiene tenerlo aquí?

Y no importa en absoluto cuántas "líneas" tengas. ;)
 
Mikhail Tkachev:

¿Sólo int o doble?
¿Y si la variable es un objeto de una clase?
¿Y si se desconoce de antemano el número de tales objetos [antes de la ejecución de OnInit()]?
¿Y si los parámetros de los constructores por adelantado [antes de OnInit()] son desconocidos?

Has dado un buen enlace y ejemplo sobre la declaración de clases.

En cualquier caso, los globales se declaran antes de OnInit(); los otros se declaran cada vez que se necesitan

 
MakarFX:

En cualquier caso, Global se declara antes de OnInit(), los demás se declaran cada vez que sea necesario

Esto está claro en teoría.
En la práctica, después de :

la declaración de 'NB_M1' oculta la variable global -> por línea en OnInit()

véase la declaración anterior de "NB_M1

el experto funciona como si NB_M1 fuera global (y estuviera correctamente inicializado), aunque esté oculto por una declaración local e inicializado como local en OnInit().

Por idea, no debería funcionar en absoluto.

 
Mikhail Tkachev:

En teoría, esto tiene sentido.
En la práctica, después de :

la declaración de 'NB_M1' oculta la variable global -> por línea en OnInit()

véase la declaración anterior de "NB_M1

el experto funciona como si NB_M1 fuera global (y estuviera correctamente inicializado), aunque está oculto por la declaración local en OnInit().

Por idea, no debería funcionar en absoluto.

¿Qué es NB_M1? ¿Quizás ya está declarado en la biblioteca? Y sin ningún tipo de código, como los sordos con los ciegos)
 
Сергей Таболин:


Y no importa cuántos "hilos" tengas. ;)

Cuando tienes cien o dos líneas de código, porque quieres empezar con esto, luego te olvidas de para qué sirve esto, luego añades esto, entonces naturalmente (?) surgirá el pensamiento: "¿Cómo organizarlo?" O no).

 
MakarFX:
¿Qué es NB_M1? ¿Quizás ya está declarado en la biblioteca? Y sin código en absoluto, es como sordo y ciego)

NB_M1 es un objeto de la clase CIsNewBar para definir el inicio de una nueva barra para cada carácter. No, no está declarado en la biblioteca.
Código en el primer puesto :https://www.mql5.com/ru/forum/160683/page1547#comment_23712294

 
Mikhail Tkachev:

NB_M1 es un objeto de la clase CIsNewBar para definir el inicio de una nueva barra para cada carácter. No, no está declarado en la biblioteca.
El código en el primer puesto :https://www.mql5.com/ru/forum/160683/page1547#comment_23712294

Así, NB_M1 se declara dentro de la clase y se puede acceder a ella

¿Podemos echar un vistazo al código de esta clase?

 
NB_M1 es un objeto de esta clase. ¿Cómo se pone 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 es un objeto de esta clase. ¿Cómo se pone dentro?
¿para qué sirve esta variable NB_M1?
 
Mikhail Tkachev:
NB_M1 es un objeto de esta clase. ¿Cómo se pone dentro?

Creo que así debería ser

bool NB_M1;
int OnInit()
{
}

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