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

 
Tengo todo tipo de tonterías como parámetros de indicadores, etc. como parámetros en mi clase. En general, cosas que serán estáticas e iguales. Entonces, ¿por qué debo pasar estos valores cada vez que creo un objeto?
 
STARIJ:

¿es esto más corto? bool barup=... WindowRedraw(); seguirá ejecutándose - tomado de if

también puede ser más corto ... ver mi archivo

Gracias. ¿Cómo puedo establecer correctamente el intervalo en el que se dibujan los niveles de Fibo? Si son (hora) las 9.00, debería dibujar niveles de 8.00 a 8.59 en М1.
 
Juer:

El enunciado de la pregunta está claro, ¿no? La cuestión es inicializar lo mismo.

¿Cómo vas a inicializar algo que aún no existe? Una vez creado el objeto, empieza a existir, y es entonces cuando se puede inicializar.

Te lo dije de inmediato: haz de un objeto un constructor paramétrico, y pásale los parámetros necesarios, que se utilizarán para inicializar el objeto recién creado.

Se pueden pasar parámetros a través de una estructura, que se rellena con los datos necesarios (constantes para todos los objetos de este tipo) en OnInit() del programa. Luego, en OnTick(), por ejemplo, o en cualquier otro manejador estándar, creas tus objetos, pero al crearlo escribes lo siguiente:
CMyObject = new CMyObject(a_here_structure_with_set_parameters);

O, si los datos del objeto no cambian de un programa a otro y siempre tienen los mismos valores, entonces inicialízalos explícitamente con los parámetros necesarios en el constructor a través de la lista de inicialización, como dijo Igor más arriba:

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

Cualquier pregunta de los novatos en MQL4, ayuda y discusión sobre algoritmos y códigos

Ihor Herasko, 2018.03.28 17:31

Esto se hace en la lista de inicialización, que se encuentra en el constructor de la clase:

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

¿Cómo vas a inicializar algo que aún no existe? Una vez creado el objeto, empieza a existir, y es entonces cuando se puede inicializar.

Te lo dije de inmediato: haz de un objeto un constructor paramétrico, y pásale los parámetros necesarios, que se utilizarán para inicializar el objeto recién creado.

Puede pasar los parámetros a través de una estructura, que llenará con los datos necesarios (constantes para todos estos objetos) en OnInit() del programa. Luego, en OnTick(), por ejemplo, o en cualquier otro manejador estándar, creas tus objetos, pero en la creación escribes lo siguiente:
CMyObject = new CMyObject(a_here_structure_with_set_parameters);

Sí, ya veo. Gracias. Bueno de alguna manera solo pensé que había alguna solución para que cuando se cree un objeto tenga algunos parámetros preestablecidos de inmediato sin tener que pasarlos al constructor o lo que sea. A través de alguna clase de padres o algo así.

 
Juer:
En mi clase tengo todo tipo de cosas como parámetros de indicadores, etc. como parámetros. En general, cosas que serán estáticas e iguales. Entonces, ¿por qué debo pasar estos valores cada vez que creo un objeto?

Así que no lo pases. Inicializar en la lista de inicialización, como he mostrado. En el momento de crear una instancia de la clase, se llamará automáticamente al constructor de la misma, que inicializará todos los miembros de la clase, especificados en la lista de inicialización. Pon la función Print en el método CCandle y verás como se llama al constructor sin ninguna referencia a él.

 
Juer:

Sí, ya veo. Gracias. Bueno, de alguna manera sólo pensé que había alguna solución para que cuando se creara un objeto, tuviera algunos parámetros preestablecidos de inmediato sin tener que pasarlos al constructor o lo que sea. A través de alguna clase de padres o algo así.

Otra vez. Puede hacerlo sin transferir los datos al constructor.

 
Ihor Herasko:

Así que no lo pases. Inicializar en la lista de inicialización, como he mostrado. En el momento de crear una instancia de la clase, se llamará automáticamente al constructor de la misma, que inicializará todos los miembros de la clase, especificados en la lista de inicialización. Pon la función Print en el método CCandle y verás como se llama al constructor sin ninguna referencia a él.

No lo entiendo, ¿qué diferencia hay entre pasarlos por el constructor o por la función de inicialización?

 
Ihor Herasko:

Así que no lo pases. Inicializar en la lista de inicialización, como he mostrado. En el momento de crear una instancia de la clase, se llamará automáticamente al constructor de la misma, que inicializará todos los miembros de la clase, especificados en la lista de inicialización. Poner la función Print en el método CCandle y ver cómo se llama al constructor sin ninguna referencia a él.

¿Con qué se inicializarán? ¿Con qué valores? No entiendo.

Supongamos que tengo valores iniciales en los parámetros de entrada del Asesor Experto. Por lo tanto, necesito pasarlos a cada objeto de la clase. Pero no para pasarlos a cada objeto recién creado.

 

¿Cómo es que en este ciclo mi orden limitada se elimina sólo si después de colocar una orden limitada en la siguiente barra no se ha colocado otra orden limitada, es decir, una orden limitada se elimina sólo si se coloca y luego se siguen dos barras sin órdenes limitadas?

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

¿Con qué se inicializarán? ¿Con qué valores? No está claro

Los que se escriben en la lista de inicialización.

Supongamos que he inicializado los valores en los parámetros de entrada del Asesor Experto. Por lo tanto, necesito pasarlos a cada objeto de esta clase. Pero no para pasarlos a cada objeto recién creado.

Aquí está:

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

Si lo ejecutamos, obtenemos:

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed
Razón de la queja: