Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 204

 
Andrey Khatimlianskii:

Nessuno ha garantito che altri gestori di eventi vengano interrotti (o non vengano eseguiti).

Dopo l'allarme, sia deinit che init avvengono, giusto?

Sì, c'è un reboot completo in corso. È solo il timer (anche un secondo) che viene preso di mira - una caratteristica, non un bug.

 
fxsaber:

Questo consulente avverte quando si passa da un conto all'altro. Sembrerebbe che non dovrebbe farlo, secondo la regola

Tuttavia, questo accade a causa del timer.

Questa peculiarità può essere utilizzata per risolvere un problema semplice nella formulazione, ma complesso nella realizzazione.

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

const bool Init = EventSetMillisecondTimer(1);

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

Questa caratteristica può essere usata per risolvere un problema semplice nella formulazione ma complesso nell'implementazione.

Perché non possiamo semplicemente controllare il cambiamento dell'account all'ingresso di ogni funzione On?

Perché un timer di millisecondi? Non interromperà comunque l'esecuzione del programma se si verifica un re-login durante il runtime.

 
Andrey Khatimlianskii:

Perché non puoi semplicemente controllare il cambio di account all'ingresso di ogni funzione On?

Perché un timer di millisecondi? Non interromperà comunque l'esecuzione del programma se un re-login avviene mentre è in esecuzione.

Provate. C'è una lunga discussione su questo argomento al link qui sopra.

 
fxsaber:

Sì, c'è un reboot completo in corso. È solo il timer (anche un secondo timer) che si alza - una caratteristica, non un bug.

Dopo il comando ExpertRemove() il flag di stop viene semplicemente alzato e l'EA continua a lavorare fino al prossimo tick. Su un nuovo tick, l'EA sarà scaricato quando il flag di stop sarà alzato. Significa che finché non arriva un nuovo tick, tutte le funzioni On continuano a lavorare in modo normale.

Di conseguenza, se non possiamo ottenere lo stato di questa bandiera programmaticamente (non ho cercato specificamente questa caratteristica), allora dobbiamo avere una bandiera globalmente personalizzata. Impostiamo il nostro flag prima del comando ExpertRemove() e lo controlliamo in ogni funzione On. Se la bandiera è impostata, si parte. Allora il timer non eseguirà il codice che è scritto in esso.

O forse ho sbagliato e la domanda è diversa?

 
Artyom Trishkin:

Dopo il comando ExpertRemove(), il flag di stop è semplicemente impostato e l'EA continua a lavorare fino al prossimo tick. Su un nuovo tick, se il flag di stop è impostato, l'EA sarà scaricato. Significa che finché non arriva un nuovo tick, tutte le funzioni On continuano a lavorare in modo normale.

Di conseguenza, se non possiamo ottenere lo stato di questa bandiera programmaticamente (non ho cercato specificamente questa caratteristica), allora dobbiamo avere una bandiera globalmente personalizzata. Impostiamo il nostro flag prima del comando ExpertRemove() e lo controlliamo in ogni funzione On. Se la bandiera è impostata, si parte. Allora il timer non eseguirà il codice che è scritto in esso.

O forse ho sbagliato tutto e la domanda è diversa?

Non so quale problema stai descrivendo.

 
Artyom Trishkin:

Dopo il comando ExpertRemove(), il flag di stop è semplicemente impostato e l'EA continua a lavorare fino al prossimo tick. Se il flag di stop viene alzato su un nuovo tick, l'EA viene scaricato. Significa che finché non arriva un nuovo tick, tutte le funzioni On continuano a lavorare in modo normale.

Di conseguenza, se non possiamo ottenere lo stato di questa bandiera programmaticamente (non ho cercato specificamente questa caratteristica), allora dobbiamo avere una bandiera globalmente personalizzata. Impostiamo il nostro flag prima del comando ExpertRemove() e lo controlliamo in ogni funzione On. Se la bandiera è impostata, si parte. Allora il timer non eseguirà il codice che è scritto in esso.

O forse ho sbagliato tutto e la domanda è diversa?

Non su una nuova zecca, ma sul prossimo ritorno;

Mettete ExpertRemove() in OnInit() e controllatelo nel debug passo dopo passo.

 
Alexey Viktorov:

Non su una nuova zecca, ma sul prossimo ritorno;

Mettete ExpertRemove() in OnInit() e controllatelo passo dopo passo nel debug.

Sì, errore mio. Qualsiasi evento successivo non sarà eseguito. È da molto tempo che non cerco nell'aiuto funzioni di cui non ho bisogno :)

 
fxsaber:

Non so quale problema state descrivendo.

Il significato della risposta non è chiaro. Non importa.

 
Artyom Trishkin:

Il significato della risposta non è chiaro.

ExpertRemove non è stato invocato.