Archives de la version MT. - page 2

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

L'hypothèse intelligente est que le transfert doit être effectué immédiatement, sans exécuter le reste du code. N'est-ce pas ?

Mais en fait, TesterStop() n'arrête pas le test du tout !

Si l'exécution du code doit être interrompue, il suffit d'écrire return pour qu'il n'y ait plus d'exécution. TesterStop(), ainsi que ExpertRemove()

Le conseiller expert ne s'arrête pas immédiatement lorsque ExpertRemove() est appelé, seul un drapeau est levé pour arrêter le travail du conseiller expert. C'est-à-dire que le conseiller expert ne traitera pas les événements suivants, il appellera OnDeinit() et le déchargera du graphique.

Et le deuxième défaut observé est que

tester_stop = false;

il n'est pas du tout en place.

 
Alexey Viktorov:

Il est censé être intelligent, si vous avez besoin d'arrêter l'exécution du code, il suffit d'écrire return et il n'y aura plus d'exécution. TesterStop() ainsi que ExpertRemove()

Et la deuxième erreur que nous avons remarquée est que

n'est pas du tout en place.

L'événement suivant est OnTick() ?

Où se trouve la sortie OnTick() ?

Pourquoi n'est-il pas à sa place ? Il était prévu que si TesterStop() était déclenché, l'exécution n'atteindrait pas cette ligne.

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

L'événement suivant est OnTick() ?

D'où vient la sortie de OnTick() ?

Pourquoi cela n'est-il pas en place ? Il était prévu que si TesterStop() était déclenché, l'exécution n'atteindrait pas cette ligne.

C'est au développeur qu'il revient de décider où sortir et quoi continuer.

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;

L'indicateur tester_stop dans ce code sera mis à faux, que TesterStop() soit exécuté ou non.

 
Alexey Viktorov:

C'est au développeur de décider où aller et ce qu'il faut continuer.

Dans ce code, l'indicateur tester_stop prendra la valeur false, que TesterStop() soit exécuté ou non.

Je l'ai déjà))))

La question est de savoir ce qu'il faut faire. Comment arrêter le test ? Pour être précis. Les développeurs ne jurent presque que par l'utilisation deINIT_PARAMETERS_INCORRECT dans OnInit() et cela fait exploser la génétique.

J'ai trouvé une solution et je n'ai eu aucun problème jusqu'à récemment. Et maintenant... Oh, cher ))))

Et encore, où puis-je sortir de OnTick() ?

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

Je l'ai déjà eu)))

La question est de savoir ce qu'il faut faire. Comment arrêter le test ? Pour être précis. Les développeurs ne jurent presque que par l'utilisation deINIT_PARAMETERS_INCORRECT dans OnInit() et cela fait exploser la génétique.

J'ai trouvé une issue, mais il n'y a pas eu de problèmes dernièrement. Et maintenant... Oh, cher ))))

Eh bien, si vous comprenez quel est le problème ?

         TesterStop();
      tester_stop = false;
      return;

Tout le code, après l'exécution de TesterStop, ne sera pas exécuté. C'est-à-dire qu'il cessera de fonctionner immédiatement. En allant plus loin, nous pouvons ajuster le drapeau tester_stop...

Autre question : quel est ce numéro ? Est-ce que moins de neuf est une tentative d'obtenir une douleur supplémentaire ? C'est là que ça devient vraiment moche...

 
Alexey Viktorov:

Eh bien, si vous comprenez quel est le problème à gauche ?

Tout le code, après l'exécution de TesterStop, ne sera pas exécuté. En d'autres termes, il cessera immédiatement de fonctionner. A partir de là, nous pouvons réguler en utilisant le drapeau tester_stop...

Autre question : quel est ce numéro ? Est-ce que moins de neuf est une tentative d'obtenir une douleur supplémentaire ? C'est là que ça devient vraiment moche...

Moins beaucoup de neuf est pour déterminer que la sortie était exactement par TesterStop(). Je ne l'utilise que comme substitut deINIT_PARAMETERS_INCORRECT. C'est pourquoi je n'ai pas besoin de tout le reste après. Mais ce qui se passe maintenant, c'est que tout le code est exécuté et le programmeur obtient l'erreur de division par zéro. Bien sûr, si un tableau a une taille de 1, la valeur du second moins la valeur du premier sera toujours zéro ! Et je ne m'étais pas assuré contre ce bug, ou, oh, excusez-moi, ce malentendu.

J'ai essayé d'insérer le retour... Seulement un peu faux )))) :

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
         return;
      }

Je me suis retrouvé avec :

DM      0       15:32:01.518    Core 1  2016.10.01 00:00:00   153128312914612747
PE      0       15:32:01.518    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
IF      0       15:32:01.518    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
RS      3       15:32:01.518    Core 1  TesterStop() called on 0% of testing interval
GK      0       15:32:01.518    Core 1  final balance 10000.00 USD
JM      0       15:32:01.518    Core 1  OnTester result -99999999999.99001

Juste génial ))))

Le plus grand MERCI !!!

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

Moins beaucoup de neuf est pour déterminer que la sortie était exactement par TesterStop(). Je ne l'utilise que comme substitut deINIT_PARAMETERS_INCORRECT. C'est pourquoi je n'ai pas besoin de tout le reste après. Mais ce qui se passe maintenant, c'est que tout le code est exécuté et le programmeur obtient l'erreur de division par zéro. Bien sûr, si un tableau a une taille de 1, la valeur du second moins la valeur du premier sera toujours zéro ! Et je ne m'étais pas assuré contre ce bug, ou, oh, excusez-moi, ce malentendu.

J'ai essayé d'insérer le retour... Seulement un peu faux )))) :

Je me suis retrouvé avec :

Juste génial ))))

UN GRAND MERCI !!!

Sergei Tabolin:

Merci, j'ai déjà compris. Mais cela ne résout pas le problème. Il peut être résolu soit par la constanteMQL_TESTER_STOP, soit en changeant la valeur de retour de void à bool.

Une solution inattendue a été suggérée parAlexey Viktorov: si return est utilisé après TesterStop(), tout semble être correct. Comment et pourquoi cela se produit, je ne peux personnellement pas le comprendre. Néanmoins...

Par conséquent, il faut soit ajouter ce point à la documentation, soit changervoid en bool.

P.S. J'ai rencontré ce problème dans la version 2085. Il n'y avait pas de problème avant cela. Est-ce que ça me dit quelque chose ? )))

Sergey, il n'y a rien d'inattendu à cela. Au contraire, elle est logique et cohérente. Il y a différents cas. Parfois, vous devez terminer le traitement de l'événement avant que le conseiller expert ne soit terminé, et parfois, comme dans votre cas, vous devez le terminer tout de suite. 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. Et tu l'as laissé de côté dans mon exemple pour une raison quelconque.

 
Alexey Viktorov:

Sergey, il n'y a rien d'inattendu là-dedans. Au contraire, tout est logique et cohérent. Il y a différents cas. Parfois, vous devez finir de traiter l'événement avant que le conseiller expert ne soit terminé, et parfois, comme dans votre cas, vous devez le terminer immédiatement. 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. Et tu l'as laissé de côté dans mon exemple pour une raison quelconque.

Alexey, merci beaucoup pour votre aide.

Je comprends le problème auquel sont confrontés les développeurs et c'est pourquoi je propose une telle solution. Afin d'être en mesure de réagir correctement à la situation.

Quant aux variables statiques et à votre exemple, que j'ai "jeté"... Désolé, mais je ne comprends pas bien ce dont il s'agit. Expliquez-moi, si vous le voulez bien.

Et demandez un peu d'indulgence et de patience. J'ai une très mauvaise situation de vie qui peut me rendre très irritable (j'en suis conscient mais je ne peux rien y faire) et peu attentif.

Je ne comprends pas du tout. J'ai la tête qui tourne...

Voici un exemple :

Mon code montre que si la dernière valeur du tableau moins la première valeur du tableau est antérieure à zéro, le résultat doit être -9999999999999.88.

Mais pendant l'optimisation, j'obtiens ce résultat :

2019.06.16 16:27:09.847 Core 1  final balance 9587.10 USD
2019.06.16 16:27:09.847 Core 1  OnTester result -99999999999.88

9587 - 10000 n'est en aucun cas égal à zéro et le résultat est -999999999999999.88. Comment ? !?!? Je commence déjà à avoir un empêchement...

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

Alexey, merci beaucoup pour votre aide.

Je comprends le problème auquel sont confrontés les développeurs et c'est pourquoi je propose une telle solution. Être capable de réagir correctement à la situation.

Quant aux variables statiques et à votre exemple, que j'ai "jeté"... Désolé, mais je ne comprends pas bien de quoi on parle. Expliquez-moi, si vous le voulez bien.

Et demandez un peu d'indulgence et de patience. J'ai une très mauvaise situation de vie qui peut me rendre très irritable (j'en suis conscient mais je ne peux rien y faire) et peu attentif.

Je ne comprends pas du tout. J'ai la tête qui tourne...

Voici un exemple :

Mon code montre que si la dernière valeur du tableau moins la première valeur du tableau est antérieure à zéro, le résultat doit être -9999999999999.88.

Mais pendant l'optimisation, j'obtiens ce résultat :

9587 - 10000 n'est en aucun cas égal à zéro et le résultat est -999999999999999.88. Comment ? !?!? J'ai un empêchement...

Je ne sais pas si c'est bien ou mal, mais je n'entre jamais dans le code entier, c'est pourquoi je parlais d'une variable statique. Et à en juger par le fait que l'indicateur tester_stop est utilisé dans différentes parties du programme, cet indicateur doit être déclaré au niveau des variables globales.

D'où la preuve que vous avez déraisonnablement "jeté" le changement de la valeur du drapeau dans mon exemple.

C'est l'utilisation de

   if(tester_stop) return(-99999999999.99);

Et apparemment, soit ce drapeau ne change pas du tout, soit il ne change pas parce que le changement n'est pas fourni là où il devrait l'être.

 
Alexey Viktorov:
Il est parfois nécessaire de mettre fin au traitement des événements avant que le conseiller ne se termine.

Tout programmeur dispose de l'opérateur return dans son arsenal, mais il n'y a rien dans la terminaison forcée.


Dans ce contexte, ne pouvons-nous pas faire un contrôle ?

if(IsStopped())
if(!IsStopped())