Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1374

 
Alexey Viktorov #:

Alguien te enseñó mal. La variable _LastError almacenará el valor hasta que se produzca el siguiente error.


Pues mira, al principio del código principal se produce el siguiente error

ERR_INVALID_DATETIME

4010

Fecha y/o valor de la hora incorrectos


Y entonces el código crea un objeto y _LastError se reescribe como

ERR_OBJECT_NOT_FOUND

4202

Objeto gráfico no encontrado


Si la comprobación de _LastError está al final del código, como suelo hacer, obtendré 4202 y lo ignoraré. Es decir, el error 4010 pasará desapercibido. ¿En qué me equivoco?

Alexey Viktorov #:


Es un requisito del mercado que no se reciban errores de ejecución desde el servidor del corredor.

Gracias, no lo sabía, pensaba que todos los errores estaban prohibidos.

 
leon_17 #:

Pues mira, al principio del código principal, por ejemplo, se produce el siguiente error:

ERR_INVALID_DATETIME

4010

Fecha y/o valor de la hora incorrectos


Y entonces el código crea un objeto y _LastError se reescribe como

ERR_OBJECT_NOT_FOUND

4202

Objeto gráfico no encontrado


Si la comprobación de _LastError está al final del código, como suelo hacer, obtendré 4202 y lo ignoraré. Es decir, el error 4010 pasará desapercibido. ¿En qué me estoy equivocando?

Gracias, no lo sabía, pensaba que todos los errores estaban prohibidos.

Exactamente. No te equivocas...

 

Hola, alguien puede darme una pista.

Estoy escribiendo los valores de tiempo de cada barra específicamente en un array. Hay un límite de 3000 barras en el gráfico.

La tarea:

- Para desplazar la matriz de valores en cada nueva barra.

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

No puedo ajustarlo para que funcione correctamente.

¿Estoy desplazando correctamente el array en una nueva barra si (this.m_rt-this.m_pc)=1?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

Hola, alguien puede darme una pista.

Estoy escribiendo los valores de tiempo de cada barra específicamente en un array. Hay un límite de 3000 barras en el gráfico.

La tarea:

- Para desplazar la matriz de valores en cada nueva barra.

No puedo ajustarlo para que funcione correctamente.

¿Estoy en lo cierto al desplazar la matriz en una nueva barra si (this.m_rt-this.m_pc)=1?

Es decir, el tamaño del array debe ser exactamente 3000 y en la formación de una nueva barra se debe sobrescribir primero el índice cero ......... y al final escribir el nuevo valor?

Si lo he entendido bien, ¿qué sentido tiene el bucle? Sólo hay que copiar el propio array en el índice nulo empezando por el primero, y luego escribir el nuevo valor en el último índice.

 
Alexey Viktorov #:

Si no se encuentra ningún objeto, este es el error de búsqueda de objetos...

ERR_OBJECT_NOT_FOUND

4202

Objeto gráfico no encontrado


No es necesario alertarlo...

Hice un par de pruebas... Esto es lo que tengo en mente. En MQL5, no es necesario utilizar ObjectFind() cuando se crean objetos.
El objeto puede ser creado sin ninguna comprobación previa de su existencia (simplemente usando ObjectCreate). Incluso dentro del OnTick tal código no causará ningún error _LastError.

No sé cómo se implementa en las profundidades del código del sistema MQL5, tal vez hay alguna comprobación ya cargado allí que el objeto se creará sólo si aún no está presente. Pero resulta que al menos cuando se crea un objeto dentro de MQL5, ObjectFind( ) no es necesario. Y todas sus propiedades se actualizan invariablemente en cada tick.

Esto no puede decirse de MQL4. La creación de un objeto sobre uno existente provocará un error 4200 ("El objeto ya existe"). Significa que el uso deObjectFind() es obligatorio para su creación.Esto me deja una posibilidad sencilla de cerrar sus propiedades de las actualizaciones constantes sin generar errores _LastError.

Por favor, confirme mis conclusiones.

 
Alexey Viktorov #:

Es decir, el tamaño de la matriz debe ser exactamente 3000 y cuando se forme una nueva barra, el índice cero debe sobrescribirse primero ......... y el nuevo valor debe añadirse al final?

Si he entendido bien, ¿por qué necesito un bucle? Simplemente, el propio array debe copiarse en el índice nulo empezando por el primero, y luego el nuevo valor debe añadirse al último índice.

Bueno, sí, está claro, pero si hay una pausa, por ejemplo, un retraso, aparecieron dos compases, los escribo.

Muchas gracias, lo entiendo, lo intentaré a través de CopyTime.

 
leon_17 #:

Hice un par de pruebas... Esto es lo que ocurre. En MQL5, no es necesario utilizar ObjectFind() cuando se crean objetos.
El objeto puede ser creado sin ninguna comprobación previa de su existencia (simplemente usando ObjectCreate). Incluso dentro del código OnTick este código no causará ningún error _LastError.

No sé cómo se implementa en las profundidades del código del sistema MQL5, tal vez hay alguna comprobación ya cargado allí que el objeto se creará sólo si aún no está presente. Pero resulta que al menos cuando se crea un objeto dentro de MQL5, ObjectFind( ) no es necesario. Y todas sus propiedades se actualizan invariablemente en cada tick.

Esto no puede decirse de MQL4. La creación de un objeto sobre uno existente provocará un error 4200 ("El objeto ya existe"). Significa que el uso deObjectFind() es obligatorio para su creación.Esto me deja una posibilidad sencilla de cerrar sus propiedades de las actualizaciones constantes sin generar errores _LastError.

Por favor, confirme mis conclusiones.

No se trata de errores en absoluto. La cuestión es que cuando se crea un objeto, se le asignan ciertas propiedades y por qué perder tiempo y recursos de la máquina en redefinir propiedades sin hacer cambios. Es mucho más barato comprobar si el objeto existe y luego asignar nuevas propiedades sólo a las que necesitan ser cambiadas. Por ejemplo, una etiqueta de texto o Lable, a menudo sólo el texto en estos objetos debe ser cambiado. Todas las demás propiedades se mantienen como están...
 
Mikhail Toptunov #:

Pues sí, parece claro, pero si hay una interrupción, por ejemplo, retraso, aparecieron dos compases, los apunto.

Gracias, lo entiendo, lo intentaré a través de CopyTime.

Bueno, si lo haces a través de CopyTime, no hay ningún problema. Sólo hay que copiar desde las 3000 barras actuales y ya está.

 

¿Cómo puedo establecer el nivel del trailing stop regular en el código del programa cuando se coloca una orden pendiente o se abre una posición desde el mercado?

Está claro cómo se hace esto manualmente. Los programas para trailing stops no estándar no son interesantes.

Gracias de antemano.

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

¿Por qué no funciona ese diseño? Dónde está el error... (el registro está vacío)


Y el yen, también vacío.

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      }