Archives de la version MT. - page 3

 
Сергей Таболин:

Je pense que TesterStop() etExpertRemove() devraient retourner true s'ils ne peuvent pas passer immédiatement le contrôle à OnTester(). Cela permettra de réagir en quelque sorte, par exemple, comme ceci :

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

Dans ce cas, nous pouvons obtenir exactement le résultat qui est logiquement attendu, au lieu de tourner autour du pot et de prévoir toutes les erreurs qui peuvent théoriquement se produire à la suite de l'arrêt du test.

Et c'est l'option que vous vouliez voir.

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);
 
Roman:

Dans ce contexte, ne pouvons-nous pas faire la vérification ?

Et comment prévenir/annuler l'arrêt forcé s'il est déjà en cours d'exécution ? Vos exemples sont un peu différents.
 
Alexey Viktorov:
Et comment prévenir/annuler l'arrêt forcé s'il est déjà en cours d'exécution ? Vos exemples sont un peu différents.

Ne déclenchez pas de licenciement forcé. Il n'y a donc pas lieu de l'annuler.

Probablement, forcer l'achèvement qui est déjà en cours, l'annuler n'a pas de sens en raison de possibles pépins logiciels.
Pour cette raison, il est probable que cette possibilité n'existe pas. Je ne peux pas le dire avec certitude.
Cela signifie que nous devons organiser logiquement notre code de manière à ne pas avoir besoin de revenir au code en cours d'exécution après avoir forcé la fin.
Si on abandonne, on abandonne explicitement.

 
Roman:

Il est peu probable qu'il soit utile d'annuler une résiliation forcée déjà déclenchée en raison d'éventuels problèmes de logiciel.
Par conséquent, cette option n'existe probablement pas. Je ne peux pas l'affirmer.
Cela signifie que nous devrions organiser logiquement notre code de manière à ne pas avoir à revenir au code en cours d'exécution après avoir forcé la fin.
Si on abandonne, on abandonne explicitement.

J'ai l'impression que vous n'avez pas tout lu dans ce sujet. Quelque chose ne coïncide pas tout à fait avec votre opinion sur le problème en question.

ps ; Bien que non. Dans votre premier message de ce fil, vous avez semblé citer mes mots exacts, mais pas complètement. Peut-être qu'à cause de cela, l'idée même du problème s'est déplacée.
 
Quelles que soient les questions, les réponses sont les mêmes. Parlez à vous-mêmes, alors. Vous essayez d'entrer dans le problème et les gens n'aiment toujours pas ça. Bonne chance pour trouver le problème.
 
Alexey Viktorov:

Et c'est la version que vous vouliez voir.

C'est vrai.

Mais n'est-ce pas

if(недопустимый параметр)          tester_stop = TesterStop();

plus simple et plus clair que...

if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }

?

Mais maintenant, j'ai fait exactement ce que vous m'avez conseillé.

 
Roman:
De telles questions et de telles réponses. Vous pouvez en discuter entre vous. Vous essayez d'entrer dans un problème et les gens n'aiment toujours pas ça. Bonne chance pour trouver le problème.

Vous ne devriez pas être offensé. Il fallait lire toute la phrase pour la comprendre.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Archives de la version MT.

Alexey Viktorov, 2019.06.16 15:25

Sergey, il n'y a rien d'inattendu. Au contraire, tout est logique et cohérent. Il y a différents cas. Parfois, vous devez terminer le traitement de l'événement avant que le conseiller expert ne termine son travail, parfois, comme dans votre cas, vous devez le terminer en urgence. Les développeurs sont confrontés à la question suivante : quelle est la bonne chose à faire, s'arrêter immédiatement, provoquant le mécontentement de ceux qui doivent finir de traiter l'événement, ou s'arrêter après la fin du traitement de l'événement. Tout programmeur dispose d'un opérateur de retour dans son arsenal, alors qu'il n'y a rien en cas de terminaison forcée.

Et pourquoi avez-vous besoin de changer le type void sur le bool, parce qu'encore une fois, dans l'arsenal du programmeur il y a des variables statiques qui peuvent être changées avant ou après TesterStop (), et en principe, tout sera comme vous voulez. Mais vous l'avez omis dans mon exemple pour une raison quelconque.

et vous avez seulement pris la deuxième partie hors contexte sans prêter attention à la première partie.
 
Сергей Таболин:

C'est vrai.

Mais n'est-ce pas

plus simple et plus clair que...

?

Mais maintenant, j'ai fait exactement ce que vous m'avez conseillé.

C'est peut-être plus simple et plus clair, mais exiger des développeurs quelque chose qui peut facilement être écrit soi-même est une erreur. Pour une raison quelconque, je ne crois pas que des ajouts au langage soient écrits sur le C++ et demandés. Et les remarques, j'en suis sûr, sont suffisantes pour beaucoup.

 
Alexey Viktorov:

C'est peut-être plus simple et plus clair, mais c'est une erreur d'exiger des développeurs quelque chose qui peut facilement être écrit par eux-mêmes. Pour une raison quelconque, je ne crois pas que des ajouts au langage soient écrits sur le C++ et demandés. Et les remarques, j'en suis sûr, sont suffisantes pour beaucoup.

Voici une vérification de votre option. Il s'est retrouvé avec un message comme celui-ci :

2019.06.16 18:49:25.464 Core 1  TesterStop() called on 0% of testing interval

C'est une impasse...

 
Alexey Viktorov:

Vous ne devriez pas être offensé. Il fallait avoir la phrase entière pour la comprendre.

et vous avez seulement pris la deuxième partie hors contexte sans prêter attention à la première partie.

En vous donnant un exemple avec IsStopped(), j'essayais de répondre à la première partie.
Parfois, il est nécessaire de terminer le traitement de l'événement avant de réaliser une EE, parfois c'est urgent comme dans votre cas.
Lisez la description de cette fonction IsStopped() dans la documentation, cela vous donnera peut-être des idées.
Mais il vous semble que ça vient d'une autre direction. Si c'est le cas, je m'excuse pour une éventuelle supposition.
Mais comme on dit dans les suggestions possibles, et résout le problème.
La solution définitive ne le dira à personne, car personne ne connaît toute la logique de son code, et ne s'y plongera probablement pas.