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

 
Klimenko_a_e:

En el código real, la función devuelve un objeto.

Creo que el constructor de copias debería crear una copia temporal en este caso.

El código funciona correctamente en MQL5 build 1545.

En la nueva versión, el constructor de copias no puede redimensionar ni siquiera un array unidimensional: Error 4007.

Creo que no es correcto.

Me resulta difícil hacer una declaración definitiva en este caso. Hay muy buenos expertos para su pregunta, así que le recomiendo que dirija esta pregunta ahttps://www.mql5.com/ru/forum/1111.

Con mis ediciones el código funciona como debería. Sin ella, no lo hace. Pero si su código debe funcionar o no es mejor a la rama en el enlace anterior.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e:

En el código real, la función devuelve un objeto.

El constructor de copias, en mi opinión, debería crear una copia temporal en este caso.

El código funciona correctamente en MQL5 build 1545.

En la nueva versión, el constructor de copias no puede redimensionar ni siquiera un array unidimensional: Error 4007.

En mi opinión, esto no es correcto.


El error se ha solucionado en la build 1580, gracias, todo funciona como debería).
 
fxsaber:

Me resulta difícil decir algo definitivo en este caso. Hay muy buenos expertos en tu pregunta, así que te recomiendo que la plantees en la ramahttps://www.mql5.com/ru/forum/1111.

Con mis ediciones el código funciona como debería. Sin ella, no lo hace. Pero si su código debe funcionar o no es mejor que se dirija a la rama en el enlace anterior.


Gracias por el enlace.
 

Tal vez alguien pueda darme una pista.

No puedo averiguar cómo interrumpir la ejecución del EA después de cambiar manualmente la configuración de entrada.

1) Ejecute el código del EA así en el gráfico:

#property version   "1.00"

input int Setting_ = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Print ("OnInit:",Setting_);
   
   return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Print ("OnDeinit(",reason,"):",Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

2) Abra la ventana de ajustes y cambie el parámetro "Setting_" a 1.

3) Y aplicar los cambios.

Por lo tanto, para empezar a aplicar los cambios, OnInit debe ser ejecutado, pero OnInit no se ejecutará hasta que los cálculos en OnTick (o cualquier otro) se detengan.

Por lo que sé, sólo hay una comprobación paradetener el programa a través de _StopFlag - bandera para detener mql5-programa, pero es sólo para la salida completa. Pero no sé cómo entender que los ajustes de entrada han cambiado para detener los cálculos.

¿Quizás alguien se ha enfrentado a una situación así? ¿Quizás haya algún hack secreto?

 
Marat Sultanov:

Tal vez alguien pueda darme una pista.

No puedo averiguar cómo interrumpir la ejecución del EA después de cambiar manualmente la configuración de entrada.

1) Ejecute el código del EA así en el gráfico:

2) Abra la ventana de ajustes y cambie el parámetro "Setting_" a 1.

3) Y aplicar los cambios.

Por lo tanto, para empezar a aplicar los cambios, OnInit debe ser ejecutado, pero OnInit no se ejecutará hasta que los cálculos en OnTick (o cualquier otro) se detengan.

Por lo que sé, sólo hay una comprobación paradetener el programa a través de _StopFlag - bandera para detener mql5-programa, pero es sólo para la salida completa. Pero no sé cómo entender que los ajustes de entrada han cambiado para detener los cálculos.

¿Quizás alguien se ha enfrentado a una situación así? ¿Quizás haya algún hack secreto?

Comprobar el código de desinicialización en OnInit()

Razones para la desinicialización

Códigos de razón de desinicialización del Asesor Experto devueltos por UninitializeReason(). Pueden tener cualquiera de los siguientes valores:

Constante .

Valor

Descripción

PROGRAMA_DE_RAZONES

0

Expert ha detenido su trabajo llamando a ExpertRemove()

REASON_REMOVE

1

Programa eliminado de la carta

REASON_RECOMPILE

2

Programa recompilado

CAMBIO_DE_CARTA_DE_RAZÓN

3

El símbolo del gráfico o el periodo se ha modificado

REASON_CHARTCLOSE

4

El gráfico está cerrado

PARÁMETROS_DE_RAZÓN

5

Los parámetros de entrada fueron modificados por el usuario

REASON_ACCOUNT

6

Se ha activado otra cuenta o se ha vuelto a conectar al servidor comercial porque se ha modificado la configuración de la cuenta

PLANTILLA_DE_RAZÓN

7

Se aplicó otro modelo de gráfico

REASON_INITFAILED

8

Señal de que el manejador OnInit() ha devuelto un valor distinto de cero

REASON_CLOSE

9

La terminal estaba cerrada

 
Artyom Trishkin:

Comprobar el código de desinicialización en OnInit()

...

Um... No me has entendido :)

Necesitas saber dentro de la función (por ejemplo enOnTick), que el usuario ha cambiado los parámetros de entrada, es decir, saber que es el momento de terminar y dejar que el programa pase a OnDeinit.

 
Marat Sultanov:

Um... No me has entendido :)

Es necesario saber dentro de la función (por ejemplo, enOnTick) que el usuario ha cambiado los parámetros de entrada, es decir, saber que es el momento de llamarlo un día y dejar que el programa salga a OnDeinit.

Tan pronto como un usuario llama a la ventana de ajustes del EA (F7) y presiona el botón OK allí, OnDeinit() es llamado inmediatamente y este, a su vez, escribe el valor de REASON_PARAMETERS en el código de desinicialización. Luego se llama a OnInit(), donde utilizandoUninitializeReason() sepuede comprobar el código de desinicialización y, si su valor es igual a REASON_PARAMETERS, decidir qué hacer a continuación.
 
Artyom Trishkin:
Tan pronto como un usuario llama a la ventana de ajustes de EA (F7) y hace clic en el botón OK allí, OnDeinit() es llamado inmediatamente, y esto, a su vez, escribe el valor de REASON_PARAMETERS en el código de desinicialización. Luego se llama a OnInit(), donde utilizando UninitializeReason() sepuede comprobar el código de desinicialización y, si su valor es igual a REASON_PARAMETERS, decidir qué hacer a continuación.

Muy bien.

Por favor:

1) Primero ejecuta mi código, que di en mi primer post. No lo puse allí por la belleza... Se puede ejecutar en cualquier gráfico.

2) Llame a la ventana de configuración del EA.

3) Cambie el parámetro y pulse OK.

Si miras con atención mi código, el resultado no te sorprenderá: no se llamará a OnDeinit().

 

No sólo eso, he añadido una impresión en el deinit, tanto el motivo como el parámetro, para que te asegures de que el experto NO llega al deinit.

Tenga en cuenta la pieza más importante del código:

void OnTick()
{
   while (!_StopFlag)
   {
      Sleep(1000);
   }
}

Es una clara emulación de un cálculo largo que no se interrumpe por un cambio en los parámetros de entrada. Y necesito interrumpirlo y la pregunta es ¿cómo? :)

Sólo quiero asegurarme de que no me falta nada en MQL5 y realmente no hay nada más en el lenguaje que_StopFlag, que por desgracia no resuelve esta situación.

A grandes rasgos, necesito captar el momento en que los parámetros de entrada cambian durante un cálculo pesado.

 
Marat Sultanov:

No sólo eso, he añadido una impresión en el deinit, tanto el motivo como el parámetro, para que te asegures de que el experto NO llega al deinit.

Tenga en cuenta la pieza más importante del código:

Es una clara emulación de un cálculo largo que no se interrumpe por un cambio en los parámetros de entrada. Y necesito interrumpirlo y la pregunta es ¿cómo? :)

Sólo quiero asegurarme de que no me falta nada en MQL5 y realmente no hay nada más en el lenguaje que_StopFlag, que por desgracia no resuelve esta situación.

A grandes rasgos, necesito captar el momento en que los parámetros de entrada cambian durante un cálculo pesado.

A grandes rasgos - vuelve a leer atentamente lo que te escribí y elimina el bucle infinito de tu código.

¿Está seguro de que llevar el Asesor Experto a un bucle infinito es la solución correcta?

Razón de la queja: