Características del lenguaje mql5, sutilezas y técnicas - página 204

 
Andrey Khatimlianskii:

Nadie ha garantizado que otros manejadores de eventos se interrumpan (o no se ejecuten).

Después de la alerta, ocurren tanto el deinit como el init, ¿verdad?

Sí, hay un reinicio completo en marcha. Lo que se abalanza sobre el temporizador (aunque sea el segundo) es una característica, no un error.

 
fxsaber:

Este asesor avisa cuando se cambia de cuenta. Parece que no debería hacerlo, según la norma

Sin embargo, esto sucede debido al temporizador.

Esta peculiaridad puede ser utilizada para resolver un problema sencillo en su formulación, pero complejo en su aplicación.

// Если произошла смена счета, советник выгружается.

const bool Init = EventSetMillisecondTimer(1);

void OnTimer()
{
  static const long Account = AccountInfoInteger(ACCOUNT_LOGIN);
  
  if (Account != AccountInfoInteger(ACCOUNT_LOGIN))
    ExpertRemove();
}
 
fxsaber:

Esta característica puede utilizarse para resolver una solución sencilla en su formulación pero compleja en su aplicación.

¿Por qué no podemos comprobar el cambio de cuenta en la entrada de cada función On?

¿Por qué un temporizador de milisegundos? De todos modos, no interrumpirá la ejecución del programa si se produce un reinicio de sesión durante el tiempo de ejecución.

 
Andrey Khatimlianskii:

¿Por qué no se puede comprobar el cambio de cuenta en la entrada de cada función On?

¿Por qué un temporizador de milisegundos? De todos modos, no interrumpirá la ejecución del programa si se produce un reinicio de sesión mientras se está ejecutando.

Pruébalo. Hay un largo debate sobre este tema en el enlace anterior.

 
fxsaber:

Sí, hay un reinicio completo en marcha. Es sólo el temporizador (incluso un segundo temporizador) el que se dispara - una característica, no un error.

Después del comando ExpertRemove() la bandera de parada simplemente se levanta y el EA continúa trabajando hasta el siguiente tick. En un nuevo tick, el EA se descargará cuando se levante la bandera de parada. Significa que hasta que llegue un nuevo tic, todas las funciones On siguen funcionando en el modo normal.

En consecuencia, si no podemos obtener el estado de esta bandera mediante programación (no he buscado específicamente esta característica), entonces necesitamos tener una bandera personalizada globalmente. Establecemos nuestra propia bandera antes del comando ExpertRemove() y la comprobamos en cada función On. Si la bandera está activada, nos vamos. Entonces el temporizador no ejecutará el código que esté escrito en él.

¿O tal vez me he equivocado y la pregunta es diferente?

 
Artyom Trishkin:

Después del comando ExpertRemove(), la bandera de parada simplemente se establece y el EA continúa trabajando hasta el siguiente tick. Si la bandera de parada se levanta en un nuevo tick, el EA se descarga. Significa que hasta que llegue un nuevo tic, todas las funciones On siguen funcionando en el modo normal.

En consecuencia, si no podemos obtener el estado de esta bandera mediante programación (no he buscado específicamente esta característica), entonces necesitamos tener una bandera personalizada globalmente. Establecemos nuestra propia bandera antes del comando ExpertRemove() y la comprobamos en cada función On. Si la bandera está activada, nos vamos. Entonces el temporizador no ejecutará el código que esté escrito en él.

¿O tal vez lo he entendido mal y la pregunta es diferente?

No sé qué problema está describiendo.

 
Artyom Trishkin:

Después del comando ExpertRemove(), la bandera de parada simplemente se establece y el EA continúa trabajando hasta el siguiente tick. Si la bandera de parada se levanta en un nuevo tick, el EA se descarga. Significa que hasta que llegue un nuevo tic, todas las funciones On siguen funcionando en el modo normal.

En consecuencia, si no podemos obtener el estado de esta bandera mediante programación (no he buscado específicamente esta característica), entonces necesitamos tener una bandera personalizada globalmente. Establecemos nuestra propia bandera antes del comando ExpertRemove() y la comprobamos en cada función On. Si la bandera está activada, nos vamos. Entonces el temporizador no ejecutará el código que esté escrito en él.

¿O tal vez lo he entendido mal y la pregunta es diferente?

No en una nueva garrapata, sino en la siguiente vuelta;

Poner ExpertRemove() en OnInit() y comprobarlo en la depuración paso a paso.

 
Alexey Viktorov:

No en una nueva garrapata, sino en la siguiente vuelta;

Poner ExpertRemove() en OnInit() y comprobarlo paso a paso en debug.

Sí, mi error. Cualquier evento siguiente no se ejecutará. Hace mucho tiempo que no busco en la ayuda funciones que no necesito :)

 
fxsaber:

No sé qué problema está describiendo.

El significado de la respuesta no está claro. No importa.

 
Artyom Trishkin:

El significado de la respuesta no está claro.

ExpertRemove no ha sido invocado.

Razón de la queja: