Caractéristiques du langage mql5, subtilités et techniques - page 204

 
Andrey Khatimlianskii:

Personne n'a garanti que les autres gestionnaires d'événements seront interrompus (ou ne seront pas exécutés).

Après l'alerte, deinit et init se produisent, non ?

Oui, il y a un redémarrage complet en cours. C'est juste la minuterie (même une deuxième) qui est mise en avant - une fonctionnalité, pas un bug.

 
fxsaber:

Ce conseiller émet des alertes lorsqu'il passe d'un compte à l'autre. Il semblerait qu'elle ne devrait pas le faire, selon la règle

Cependant, cela se produit à cause de la minuterie.

Cette particularité peut être utilisée pour résoudre un problème simple dans sa formulation, mais complexe dans sa mise en œuvre.

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

const bool Init = EventSetMillisecondTimer(1);

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

Cette fonctionnalité peut être utilisée pour résoudre un problème simple dans sa formulation mais complexe dans sa mise en œuvre.

Pourquoi ne pouvons-nous pas simplement vérifier la modification du compte à l'entrée de chaque fonction On ?

Pourquoi une minuterie en millisecondes ? L'exécution du programme ne sera de toute façon pas interrompue si une reconnexion se produit pendant l'exécution.

 
Andrey Khatimlianskii:

Pourquoi ne pas simplement vérifier la modification du compte à l'entrée de chaque fonction On ?

Pourquoi une minuterie en millisecondes ? Il n'interrompra pas l'exécution du programme de toute façon si une reconnexion se produit pendant qu'il est en cours d'exécution.

Essayez-le. Il y a une longue discussion sur ce sujet au lien ci-dessus.

 
fxsaber:

Oui, il y a un redémarrage complet en cours. C'est juste la minuterie (même une deuxième minuterie) qui est augmentée - une fonctionnalité, pas un bug.

Après la commande ExpertRemove(), le drapeau d'arrêt est simplement levé et l'EA continue de fonctionner jusqu'au prochain tick. Lors d'un nouveau tick, l'EA sera déchargé lorsque le drapeau stop sera levé. Cela signifie que jusqu'à l'arrivée d'un nouveau tic, toutes les fonctions On continuent de fonctionner en mode normal.

Par conséquent, si nous ne pouvons pas obtenir l'état de ce drapeau de manière programmatique (je n'ai pas spécifiquement cherché cette fonctionnalité), alors nous devons avoir un drapeau personnalisé de manière globale. Nous définissons notre propre drapeau avant la commande ExpertRemove() et le vérifions dans chaque fonction On. Si le drapeau est activé, nous partons. Alors le timer n'exécutera pas le code qui y est écrit.

Ou peut-être que je me suis trompé et que la question est différente ?

 
Artyom Trishkin:

Après la commande ExpertRemove(), le drapeau d'arrêt est simplement activé et l'EA continue de fonctionner jusqu'au prochain tick. Lors d'un nouveau tick, si le drapeau stop est activé, l'EA sera déchargé. Cela signifie que jusqu'à l'arrivée d'un nouveau tic, toutes les fonctions On continuent de fonctionner en mode normal.

Par conséquent, si nous ne pouvons pas obtenir l'état de ce drapeau de manière programmatique (je n'ai pas spécifiquement cherché cette fonctionnalité), alors nous devons avoir un drapeau personnalisé de manière globale. Nous définissons notre propre drapeau avant la commande ExpertRemove() et le vérifions dans chaque fonction On. Si le drapeau est activé, nous partons. Alors le timer n'exécutera pas le code qui y est écrit.

Ou peut-être ai-je tout faux et la question est-elle différente ?

Je ne sais pas quel problème vous décrivez.

 
Artyom Trishkin:

Après la commande ExpertRemove(), le drapeau d'arrêt est simplement activé et l'EA continue de fonctionner jusqu'au prochain tick. Si le drapeau stop est levé sur un nouveau tick, l'EA est déchargé. Cela signifie que jusqu'à l'arrivée d'un nouveau tic, toutes les fonctions On continuent de fonctionner en mode normal.

Par conséquent, si nous ne pouvons pas obtenir l'état de ce drapeau de manière programmatique (je n'ai pas spécifiquement cherché cette fonctionnalité), alors nous devons avoir un drapeau personnalisé de manière globale. Nous définissons notre propre drapeau avant la commande ExpertRemove() et le vérifions dans chaque fonction On. Si le drapeau est activé, nous partons. Alors le timer n'exécutera pas le code qui y est écrit.

Ou peut-être ai-je tout faux et la question est-elle différente ?

Pas sur un nouveau tic, mais sur le prochain retour ;

Mettez ExpertRemove() dans OnInit() et vérifiez-le dans le débogage étape par étape.

 
Alexey Viktorov:

Pas sur un nouveau tic, mais sur le prochain retour ;

Mettez ExpertRemove() dans OnInit() et vérifiez-le pas à pas dans le débogage.

Oui, je me suis trompé. L'événement suivant ne sera pas exécuté. Cela fait longtemps que je n'ai pas cherché dans l'aide des fonctions dont je n'ai pas besoin :)

 
fxsaber:

Je ne sais pas quel problème vous décrivez.

Le sens de la réponse n'est pas clair. Ça n'a pas d'importance.

 
Artyom Trishkin:

Le sens de la réponse n'est pas clair.

ExpertRemove n'a pas été invoqué.

Raison: