Erreurs, bugs, questions - page 38

 

Un problème est apparu, je ne sais pas où le mettre.

Voici la section du code qui m'intéresse :

      Print("itogo do=",itogo);
      if(itogo>1000)
        {
         Print("itogo>1000 =",itogo);
         itogo=500;
         Print("vsego_if=",itogo);
        }
      Print("itogo posle=",itogo);
      Print("+-----------------------------------------------------------+");

Il est dit que nous devons d'abord désimprimer la valeur de la variable itogo avec le texte "itogo do",

si itogo est supérieur à 1000, il est imprimé avec le texte "itogo>1000".

itogo se voit attribuer 500

Imprimer le itogo avec le texte "vsego_if=" puis quitter la zone protégée

imprimer le itogo avec le texte "itogo posle="

tracer une ligne.

Pourquoi je rentre dans les détails ?

il doit être clair que s'il n'y avait pas de condition, il y aura deux lignes entre eux ; s'il y avait une condition, il y aura quatre lignes.

Nous devons réaliser que lorsque la condition est déclenchée, la valeur de la variable va changer.

La première chose à faire est de désimprimer la variable itogo do, voici la désimpression qui montre deux imprimantes, donc aucune condition déclenchée mais la valeur de la variable a changé.

Comment cela peut-il être ? ?????????


Voici une capture d'écran du code pour montrer que rien entre les lignes, au-delà des limites du champ, n'est caché.

Le code se bloque, se compile sans problème mais refuse de fonctionner comme prévu.

La variable est déclarée globalement int, le code lui-même est gros mais les impressions ne se trouvent nulle part ailleurs dans le code.

Et la chose la plus intéressante avec le débogueur fonctionne bien, mais lorsque vous exécutez en mode normal, voici de tels brassages

et ce n'est pas le robot imprimeur par la logique du programme je vois que quelque chose ne va pas.

 

Je n'ai pas encore pu le reproduire sur d'autres exemples, mais ceci semble être la solution.

Auparavant, il y avait DebugBreak(); et le code était exécuté par le débogueur. Plus tard, DebugBreak() a été supprimé et tout a été recompilé.

mais apparemment ME se souvient que le débogueur a été utilisé et refuse de fonctionner correctement sans débogueur après la compilation.

Si je lance le débogueur, même au démarrage normal, le script fonctionne bien.

 
Urain:

Je n'ai pas encore pu le reproduire sur d'autres exemples, mais ceci semble être la solution.

Auparavant, il y avait DebugBreak() ; et le code était exécuté par le débogueur. Plus tard, DebugBreak() a été supprimé et tout a été recompilé.

mais apparemment, ME se souvient que le débogueur a été utilisé et refuse de fonctionner correctement sans le parcourir après la compilation.

Si vous l'exécutez à travers le débogueur, le script fonctionne bien même en fonctionnement normal.


Et ils appellent ça une libération ?

Le participant potentiel du Championnat 2010 a écrit un conseiller expert et l'a débogué, mais les éléments du débogueur restent dans le code. Cependant, le conseiller expert fonctionne bien. Cependant, elle ne fonctionne qu'avec des "astuces", mais le participant n'en sait rien - comment pourrait-il connaître une fonctionnalité aussi peu documentée ?

Ce participant a donc envoyé le code source de son EA à MetaQuotes pour qu'il participe au championnat 2010. Ils l'ont simplement compilé et, bien sûr, le code s'est avéré propre sans aucun "truc de débogage".

Le championnat 2010 est lancé, mais le MetaQuotes Expert Advisor ne fonctionne pas de la même manière que sur son ordinateur. Un participant est perplexe et a toutes sortes de pensées...

 
Urain:

Un problème est apparu, je ne sais même pas où le mettre.

J'ai fait ce code à titre d'exemple (j'ai mis vos valeurs) :

void Check(int itogo)
  {
   Print("itogo do=",itogo);
   if(itogo>1000)
     {
      Print("itogo>1000 =",itogo);
      itogo=500;
      Print("vsego_if=",itogo);
     }
   Print("itogo posle=",itogo);
   Print("+-----------------------------------------------------------+");  
  }
void OnStart()
  {
   Check(158);
   Check(179);
   Check(202);
   Check(222);
   Check(243);
   Check(261);
   Check(288);
   Check(301);
  }

Cela a bien fonctionné :

2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=301
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=301
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=288
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=288
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=261
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=261
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=243
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=243
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=222
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=222
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=202
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=202
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=179
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=179
2010.07.08 07:00:22     size (EURUSD,D1)        +-----------------------------------------------------------+
2010.07.08 07:00:22     size (EURUSD,D1)        itogo posle=158
2010.07.08 07:00:22     size (EURUSD,D1)        itogo do=158

Comme vous pouvez le constater, il n'y a pas d'erreur ou d'incohérence dans les valeurs des variables.

Peut-être avez-vous oublié de recompiler le code après de nombreuses réécritures et utilisé une ancienne version.

Ce que vous devez faire :

  • Copiez votre code depuis le début, redémarrez le terminal (pour plus d'assurance) et vérifiez
  • Si l'erreur persiste, envoyez-nous le code complet via servicedesk (ou même dans le forum) - nous le vérifierons sûrement.
 
simpleton:

Arrêtez d'être hystérique.

Si cette erreur est confirmée, elle sera corrigée immédiatement. Le développement de logiciels ne peut se faire sans erreurs.

 
Renat:

Arrêtez d'être hystérique.

Si cette erreur est confirmée, elle sera corrigée immédiatement. Le développement de logiciels ne peut se faire sans erreurs.

Renat, je suggère d'ouvrir le sujet "Critique de MQL5" ou quelque chose de similaire. Et tous les messages de ce type provenant d'autres fils de discussion devraient être supprimés comme hors sujet.

Ainsi, les critiques auront la possibilité d'exprimer leur point de vue, et les fils seront bien tenus.

 

Je voudrais connaître le sort de la requête#18261 pourun appel d'indicateur depuis un EA (la valeur ne correspond pas à l'indicateur).

Ce serait bien s'ils répondaient d'une manière ou d'une autre...

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
ddd06:

Je voudrais connaître le sort de la requête #18261 pour un appel d'indicateur depuis un EA (la valeur ne correspond pas à l'indicateur).

Ce serait bien s'ils répondaient d'une manière ou d'une autre...

Votre demande a été traitée. Il a été conseillé.

Pourquoi il n'a pas été mis à jour dans votre profil - nous allons le découvrir.

 
Renat:

J'ai fait ce code à titre d'exemple (mettez vos valeurs) :

Cela a bien fonctionné :

Comme vous pouvez le constater, il n'y a pas d'erreur ou d'incohérence dans les valeurs des variables.

Il est possible qu'après de nombreuses réécritures, vous ayez oublié de recompiler le code et utilisé une ancienne version.

Ce qu'il faut faire :

  • Recopiez votre code à partir de zéro, redémarrez le terminal (pour être sûr) et vérifiez
  • Si vous avez toujours l'erreur, envoyez-nous le code complet via servicedesk (ou même dans le forum) - nous allons certainement vérifier.

Et avant de poster ici, j'ai fait la même chose, et le résultat était comme vous l'avez, mais ici, sur la feuille où l'erreur s'est initialement produite tout et s'écrase.

Je répète la raison dans le débogueur, si sur cette feuille de calcul particulière a fait la recompilation et n'a pas exécuté par le débogage fonctionne incorrectement, après une exécution dans le débogage tout est normal. Je ne sais pas pourquoi le débogueur s'est accroché à cette feuille de calcul particulière, les copies de code sur d'autres feuilles de calcul fonctionnent bien, mais pas celle-ci.

C'est pourquoi j'ai écrit ci-dessus que je ne peux pas reproduire l'erreur jusqu'à présent (ou plutôt, elle se reproduit mais seulement dans le projet localisé).

Il existe peut-être une fonction du débogueur ou de ME qui permet de se souvenir de l'historique des modifications, il y avait peut-être une erreur critique avant l'incident à laquelle je n'ai pas prêté attention.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
Urain:

J'ai fait la même chose avant de le poster ici, et le résultat est le même que le vôtre, mais sur la feuille où l'erreur s'est produite à l'origine, tout se plante.

Je répète la raison dans le débogueur, si j'ai recompilé sur la feuille spécifique et ne l'a pas exécuté par le débogueur fonctionne incorrectement, après le débogage tout est normal. Je ne sais pas pourquoi le débogueur s'est accroché à cette feuille de calcul particulière, les copies de code sur d'autres feuilles de calcul fonctionnent bien, mais pas celle-ci.

C'est pourquoi j'ai écrit ci-dessus que je ne peux pas reproduire l'erreur jusqu'à présent (ou plutôt, elle se reproduit mais seulement dans le projet localisé).

Peut-être existe-t-il une fonction du débogueur ou de ME permettant de se souvenir de l'historique des modifications, peut-être y avait-il une erreur critique avant l'incident, à laquelle je n'ai pas prêté attention.

Vous souvenez-vous de l'emplacement de DebugBreak() ?

Je n'ai pas réussi à le reproduire jusqu'à présent.

Raison: