Erreurs, bugs, questions - page 2747

 
fxsaber:
time of [Bench1()] = 1483377
100000000
time of [Bench2()] = 1725035
100000000
time of [Bench1()] = 1523441
100000000
time of [Bench2()] = 1712777
100000000
time of [Bench1()] = 1416779
100000000
time of [Bench2()] = 1452093
100000000
time of [Bench1()] = 1399366
100000000
time of [Bench2()] = 1449939
 
Mihail Matkovskij:

Mon débogueur refuse de fonctionner dans l'un de mes projets. En outre, son comportement est difficile à prévoir. Parfois, il refuse tout simplement d'entrer dans les points d'arrêt. Il refuse également d'entrer dans certaines fonctions. Au début, je pensais que la raison était les mises à jour (peut-être que quelque chose s'est mal passé avec le débogage). Mais dans d'autres programmes plus simples, tout semble fonctionner. Je ne l'ai pas beaucoup consulté, cependant, car je travaille sur mon projet principal. Il est assez complexe et comprend 15 modules uniquement de ma propre conception (je n'ai pas compté le nombre de modules standard). Le module principal contient jusqu'à 2000 lignes. Je pensais que c'était peut-être une question de complexité du projet... De même, à certains endroits, j'utilise des macros pour les extraits de code répétitifs. J'utilise également des éléments standard de l'interface utilisateur, tels que CAppDialog, CCheckGroup, CComboBox, CButton etc. que j'ai réécrits pour la fonctionnalité de mon programme. Peut-être que le débogage ne fonctionne pas à cause d'eux... Par exemple, la méthode CCheckGroup::itemCheckState(const string item) que j'ai spécifiquement écrite ne débogue pas. La méthode trouve l'élément de la case à cocher et vérifie s'il est sélectionné (son état) :

Voici le type d'interface utilisateur que j'ai obtenu :

Certains des éléments de l'interface utilisateur sont temporairement classés. Et voici une branche où j'ai décrit comment j'ai remplacé les méthodes Show() et Hide() de l'élément CAppDialog: https://www.mql5.com/ru/forum/338301. Le compilateur s'est plaint à ce moment-là et une erreur critique s'est produite.

Au final, le projet se compile normalement, le compilateur ne génère aucune erreur. Mais le débogage échoue et ne montre pas l'exécution de certains fragments de code, fonctions, méthodes, etc.

D'après ce que je comprends, il peut y avoir plusieurs raisons à cela.

  1. Code compliqué du projet, utilisation de macros
  2. Complication du code par l'utilisation d'éléments d'interface utilisateur standard, tels que CAppDialog, CCheckGroup, CComboBox, CButton (pour lesquels j'ai également écrit de nouvelles méthodes et remplacé certaines méthodes existantes).
  3. Bug du débogueur lié à la nouvelle build (possible, peu probable).

Informations sur la construction et le système :

Qui a eu des problèmes similaires avec le débogueur et quelle pourrait en être la cause ?

https://www.mql5.com/ru/forum/1111/page2746#comment_16481481

Dans la méthode CCheckGroup::itemCheckState (dans laquelle le débogueur ne peut pas entrer) je mets quelque chose comme ceci :

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState(const string item) {
  int total = m_strings.Total();
  
  if(total != m_states.Total())
    return -1;
    
  int i = 0;
  for(; i < total; i++) {
    if(m_strings.At(i) == item) {
      Alert(__FUNCTION__ + " item: " + item  + " state: " + (string)m_states.At(i));
      return m_states.At(i);
    }
  }
  
  return -1;
}

Et j'ai obtenu le message suivant :

2020.05.21 13:20:44.229 CCheckGroup::itemCheckState item : 39 state : 32

Il s'avère que la méthode fonctionne bien, mais le débogueur ne la voit pas pour une raison quelconque. Si le débogueur ne travaille pas correctement, le travail sur le projet peut être retardé pendant une longue période. J'aimerais que les développeurs prêtent attention à ce bug, très probablement lié au débogueur.
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2020.05.21
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Mihail Matkovskij:

https://www.mql5.com/ru/forum/1111/page2746#comment_16481481

Il s'avère que la méthode fonctionne correctement, mais le débogueur ne la voit plus pour une raison quelconque.
Si le débogueur ne fonctionne pas correctement, le projet peut être retardé pendant une longue période. J'aimerais que les développeurs prêtent attention à ce bug très probablement lié au débogueur.

Il y a beaucoup de texte, je ne l'ai pas lu en entier.
Mais si quelque chose fonctionne dans la version debug et ne fonctionne pas dans la version release, ou vice versa, vérifiez si toutes les variables et tous les champs, en particulier dans la classe/structure, ont été initialisés.

 
Mihail Matkovskij:
si la méthode est inline, ce n'est pas le problème du débogueur, mais celui du compilateur en mode débogage.
 
TheXpert:
input int Range = 0;

double Res = 0;

#define  GETCURRENTTICK GetCurrentTick1(Tick)
//#define GETCURRENTTICK GetCurrentTick2(Tick, !i)
//#define GETCURRENTTICK GetCurrentTick3(Tick)

void OnTick()
{
  MqlTick Tick;
    
  for (int i = 0; i < 100; i++)
    if (GETCURRENTTICK)
      Res += Tick.bid;
}

double OnTester()
{
  return(Res);
}

bool GetCurrentTick1( MqlTick &Tick )
{
  return(SymbolInfoTick(_Symbol, Tick));
}

bool GetCurrentTick2( MqlTick &Tick, const bool NewTick = false )
{
  static MqlTick CurrentTick;
  
  if (NewTick)
    SymbolInfoTick(_Symbol, CurrentTick);
  
  Tick = CurrentTick;
  
  return(true);
}

bool GetCurrentTick3( MqlTick &Tick )
{
  static MqlTick _Tick; // Аналог Bid в MT4
  
  _Tick.bid += _Point;  // Хоть какой-то расход вычислительный ресурсов.
  
  Tick = _Tick;
  
  return(true);
}
#define  GETCURRENTTICK GetCurrentTick1(Tick)
#define  GETCURRENTTICK GetCurrentTick2(Tick, !i)
#define  GETCURRENTTICK GetCurrentTick3(Tick)
2020.05.21 14:19:52.450 Core 1  pass 0 returned result 693275970.165784 in 0:00:08.925
2020.05.21 14:19:59.980 Core 1  pass 1 returned result 693275970.165784 in 0:00:07.529
2020.05.21 14:20:07.370 Core 1  pass 2 returned result 693275970.165784 in 0:00:07.390
2020.05.21 14:20:14.694 Core 1  pass 3 returned result 693275970.165784 in 0:00:07.323
2020.05.21 14:20:21.688 Core 1  pass 4 returned result 693275970.165784 in 0:00:06.994
2020.05.21 14:20:29.114 Core 1  pass 5 returned result 693275970.165784 in 0:00:07.425
2020.05.21 14:20:36.133 Core 1  pass 6 returned result 693275970.165784 in 0:00:07.019
2020.05.21 14:20:43.557 Core 1  pass 7 returned result 693275970.165784 in 0:00:07.424
2020.05.21 14:20:49.580 Core 1  pass 8 returned result 693275970.165784 in 0:00:06.022
2020.05.21 14:20:57.273 Core 1  pass 9 returned result 693275970.165784 in 0:00:07.693
2020.05.21 14:21:03.993 Core 1  pass 10 returned result 693275970.165784 in 0:00:06.719
2020.05.21 14:21:03.993 Tester  optimization finished, total passes 11
2020.05.21 14:21:04.003 Statistics      optimization done in 1 minutes 22 seconds
2020.05.21 14:21:04.003 Statistics      shortest pass 0:00:06.022, longest pass 0:00:08.925, average pass 0:00:07.314
2020.05.21 14:21:04.003 Statistics      local 11 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)
2020.05.21 14:21:49.346 Core 1  pass 0 returned result 693275970.165784 in 0:00:03.050
2020.05.21 14:21:51.108 Core 1  pass 1 returned result 693275970.165784 in 0:00:01.761
2020.05.21 14:21:52.903 Core 1  pass 2 returned result 693275970.165784 in 0:00:01.795
2020.05.21 14:21:54.731 Core 1  pass 3 returned result 693275970.165784 in 0:00:01.827
2020.05.21 14:21:56.536 Core 1  pass 4 returned result 693275970.165784 in 0:00:01.803
2020.05.21 14:21:58.341 Core 1  pass 5 returned result 693275970.165784 in 0:00:01.805
2020.05.21 14:22:00.135 Core 1  pass 6 returned result 693275970.165784 in 0:00:01.793
2020.05.21 14:22:01.912 Core 1  pass 7 returned result 693275970.165784 in 0:00:01.777
2020.05.21 14:22:03.663 Core 1  pass 8 returned result 693275970.165784 in 0:00:01.750
2020.05.21 14:22:05.458 Core 1  pass 9 returned result 693275970.165784 in 0:00:01.794
2020.05.21 14:22:07.274 Core 1  pass 10 returned result 693275970.165784 in 0:00:01.815
2020.05.21 14:22:07.274 Tester  optimization finished, total passes 11
2020.05.21 14:22:07.284 Statistics      optimization done in 0 minutes 21 seconds
2020.05.21 14:22:07.284 Statistics      shortest pass 0:00:01.750, longest pass 0:00:03.050, average pass 0:00:01.906
2020.05.21 14:22:07.284 Statistics      local 11 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)
2020.05.21 14:23:00.873 Core 1  pass 0 returned result 661757660284.981689 in 0:00:02.859
2020.05.21 14:23:02.704 Core 1  pass 1 returned result 661757660284.981689 in 0:00:01.830
2020.05.21 14:23:04.488 Core 1  pass 2 returned result 661757660284.981689 in 0:00:01.783
2020.05.21 14:23:06.227 Core 1  pass 3 returned result 661757660284.981689 in 0:00:01.737
2020.05.21 14:23:07.778 Core 1  pass 4 returned result 661757660284.981689 in 0:00:01.550
2020.05.21 14:23:09.517 Core 1  pass 5 returned result 661757660284.981689 in 0:00:01.738
2020.05.21 14:23:11.288 Core 1  pass 6 returned result 661757660284.981689 in 0:00:01.771
2020.05.21 14:23:12.997 Core 1  pass 7 returned result 661757660284.981689 in 0:00:01.708
2020.05.21 14:23:14.815 Core 1  pass 8 returned result 661757660284.981689 in 0:00:01.817
2020.05.21 14:23:16.621 Core 1  pass 9 returned result 661757660284.981689 in 0:00:01.805
2020.05.21 14:23:18.313 Core 1  pass 10 returned result 661757660284.981689 in 0:00:01.691
2020.05.21 14:23:18.313 Tester  optimization finished, total passes 11
2020.05.21 14:23:18.323 Statistics      optimization done in 0 minutes 21 seconds
2020.05.21 14:23:18.323 Statistics      shortest pass 0:00:01.550, longest pass 0:00:02.859, average pass 0:00:01.844
2020.05.21 14:23:18.323 Statistics      local 11 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)

Au sujet de la gratuité des fonctions de SymbolInfo.

 
TheXpert:
si la méthode est inline, alors ce n'est pas le problème du débogueur, mais celui du compilateur pour le mode débogage.

Exactement, le projet s'est avéré déborder de macros, les miennes et celles des modules standards. C'est peut-être pour cela que le débogueur ne parvient pas toujours à faire correspondre les commandes du fichier de débogage *.ex5 avec les lignes du fichier source *.mq5 et des autres modules...

 
fxsaber:
Les fonctions de SymbolInfo sont gratuites.

il s'agit donc du coût de la fonction elle-même, et non du coût du passage de la chaîne par valeur, et non par référence !

Votre version avec le cache est une sacrée solution, si l'exécution de cette fonction prend un pourcentage significatif du temps d'exécution de l'EA (ce que je ne crois pas vraiment).

 
Mihail Matkovskij:

Exactement, le projet s'est avéré déborder de macros, les miennes et celles des modules standards. C'est peut-être pour cela que le débogueur ne parvient pas toujours à faire correspondre les commandes du fichier de débogage *.ex5 avec les lignes du fichier source *.mq5 et des autres modules...

si votre structure de fichiers est si complexe que le débogueur ne peut pas associer un point d'arrêt, alors c'est le problème du débogueur.
 
TheXpert:

est le coût de la fonction elle-même, et non le coût du passage de la chaîne par valeur, et non par référence !

C'est ce que j'essayais de dire au départ.

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

Erreurs, bugs, questions

fxsaber, 2020.05.20 13:24

C'est mieux d'avoir

const MqlTick _Tick; // Текущий _Symbol-тик.

Dans l'optimiseur, ces fonctions sont appelées des dizaines de milliards de fois.


De plus, votre variante avec le cache est une sacrée solution, si l'exécution de cette fonction prend un pourcentage significatif du temps d'exécution d'une EA (ce que je ne crois pas vraiment).

À un certain stade, non seulement la partie relative du temps pris devient importante, mais aussi la partie absolue.

 
Sergey Dzyublik:

C'est beaucoup de texte, je n'ai pas tout lu.
Mais si quelque chose fonctionne dans la version debug et ne fonctionne pas dans la version release, ou vice versa, alors vérifiez si toutes les variables et tous les champs, en particulier dans la classe/structure, ont été initialisés.

Les données qui devaient être initialisées, je les ai initialisées. Et si des données aléatoires s'y trouvent, cela provoquera une erreur dans le programme lui-même (par exemple, Array out of range ou Invalid pointer). Au moins, cela n'affectera pas le fonctionnement du débogueur. Et cela aide à trouver de tels bugs.