Características da linguagem mql5, subtilezas e técnicas - página 204

 
Andrey Khatimlianskii:

Ninguém garantiu que os outros manipuladores de eventos serão interrompidos (ou não correrão).

Após o alerta, tanto o deinit como o init acontecem, certo?

Sim, há um reinício completo em curso. É apenas o temporizador (mesmo um segundo) que é colocado - uma característica, não um bug.

 
fxsaber:

Este conselheiro alerta quando se muda de conta. Parece que não o deveria fazer, de acordo com a regra

No entanto, isto acontece por causa do temporizador.

Esta característica pode ser utilizada para resolver um problema simples de formulação, mas complexo na implementação.

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

const bool Init = EventSetMillisecondTimer(1);

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

Esta característica pode ser utilizada para resolver um problema simples de formulação mas complexo de implementação.

Porque não podemos simplesmente verificar a mudança de conta à entrada de cada On-function?

Porquê um temporizador de milissegundos? Não interromperá de qualquer forma a execução do programa se ocorrer um re-login durante o tempo de execução.

 
Andrey Khatimlianskii:

Porque não pode simplesmente verificar a mudança de conta à entrada de cada On-function?

Porquê um temporizador de milissegundos? Não interromperá a execução do programa de qualquer forma se um novo registo acontecer enquanto estiver a decorrer.

Experimente-o. Há uma longa discussão sobre este tópico no link acima.

 
fxsaber:

Sim, há um reinício completo em curso. É apenas o temporizador (mesmo um segundo temporizador) que é esbarrado - uma característica, não um bug.

Após o comando ExpertRemove() a bandeira de paragem é simplesmente levantada e a EA continua a funcionar até ao próximo tick. Num novo tick, a EA será descarregada quando a bandeira de paragem for hasteada. Isto significa que até que um novo tick chegue, todas as funções On-funções continuam a funcionar no modo normal.

Consequentemente, se não conseguirmos obter o estado desta bandeira programática (não procurei especificamente esta funcionalidade), então precisamos de ter uma bandeira personalizada a nível mundial. Pomos a nossa própria bandeira antes do comando ExpertRemove() e verificamo-la em cada On-function. Se a bandeira estiver hasteada, partimos. Então, o temporizador não executará o código que nele está escrito.

Ou talvez eu me tenha enganado e a questão seja diferente?

 
Artyom Trishkin:

Após o comando ExpertRemove(), a bandeira de paragem é simplesmente colocada e a EA continua a funcionar até ao próximo tick. Num novo tick, se a bandeira de paragem for colocada, a EA será descarregada. Isto significa que até que um novo tick chegue, todas as funções On-funções continuam a funcionar no modo normal.

Consequentemente, se não conseguirmos obter o estado desta bandeira programática (não procurei especificamente esta funcionalidade), então precisamos de ter uma bandeira personalizada a nível mundial. Pomos a nossa própria bandeira antes do comando ExpertRemove() e verificamo-la em cada On-function. Se a bandeira estiver hasteada, partimos. Então, o temporizador não executará o código que nele está escrito.

Ou talvez tenha percebido tudo mal e a questão seja diferente?

Não sei que problema está a descrever.

 
Artyom Trishkin:

Após o comando ExpertRemove(), a bandeira de paragem é simplesmente colocada e a EA continua a funcionar até ao próximo tick. Se a bandeira de paragem for hasteada num novo tick, a EA é descarregada. Isto significa que até que um novo tick chegue, todas as funções On-funções continuam a funcionar no modo normal.

Consequentemente, se não conseguirmos obter o estado desta bandeira programática (não procurei especificamente esta funcionalidade), então precisamos de ter uma bandeira personalizada a nível mundial. Pomos a nossa própria bandeira antes do comando ExpertRemove() e verificamo-la em cada On-function. Se a bandeira estiver hasteada, partiremos. Então, o temporizador não executará o código que nele está escrito.

Ou talvez tenha percebido tudo mal e a questão seja diferente?

Não num novo tique, mas no próximo regresso;

Colocar ExpertRemove() no OnInit() e verificá-lo passo a passo no debug.

 
Alexey Viktorov:

Não num novo tique, mas no próximo regresso;

Colocar ExpertRemove() no OnInit() e verificá-lo passo a passo na depuração.

Sim, erro meu. Qualquer evento seguinte não será executado. Há muito tempo que não procuro ajuda para funções de que não preciso :)

 
fxsaber:

Não sei que problema está a descrever.

O significado da resposta não é claro. Não importa.

 
Artyom Trishkin:

O significado da resposta não é claro.

ExpertRemove não foi invocado.