MT4 se bloque, n'appelle pas start() à nouveau

 

Bonjour,

Je suis confronté à un vilain problème :

après quelques itérations, la fonction start() de mon indicateur ne revient pas après l'appel de return(), c'est-à-dire que MT4 reste dans une boucle, consommant le CPU, sans appeler start() à nouveau.

Je me demande si je n'ai pas détruit la pile d'appel de la fonction ?

Que me conseillez-vous de rechercher principalement pour trouver la cause ?

J'ai déjà débogué toute la semaine. Il s'agit de 72 pages de code.

Je n'utilise pas d'appels de DLL, seulement le plan MQL.

Merci.

 
Vous ne revenez pas du début. Vous devez corriger votre code. Récupérez dbgView et ajoutez des appels de journal au début et au retour de chaque fonction, puis recherchez votre boucle infinie.
 

J'enregistre déjà les informations de débogage.

Je ne vois pas de boucle indéfinie.

La dernière chose que je vois dans le fichier journal est lorsque j'appelle return() dans la dernière ligne de start().

A partir de là, start() n'est plus jamais déclenché.

Il doit s'agir de quelque chose d'autre.

 
Consignation où/comment ? Vous ne pouvez PAS utiliser Print/Alert car vous suspendez le thread de l'interface graphique, la sortie ne sera pas écrite.
 

Je sais, j'utilise ma propre fonction PrintDebug() avec FileWrite(), FileFlush.

 

Pensez-vous que ma façon d'imprimer les informations de débogage est suffisante ?

 
mt4forum:

J'enregistre déjà les informations de débogage.

Je ne vois pas de boucle indéfinie.

La dernière chose que je vois dans le fichier journal, c'est lorsque j'appelle return() dans la dernière ligne de start().

A partir de là, start() n'est plus jamais déclenché.

Il doit s'agir de quelque chose d'autre.


Est-ce que vous imprimez quelque chose dans le journal comme première ligne de start() ?
 

Oui, j'enregistre la première et la dernière ligne.

Puis-je être sûr que ma façon d'enregistrer ne manque aucune information ?

 
mt4forum:

Oui, j'enregistre la première et la dernière ligne.

Puis-je être sûr que ma façon d'enregistrer ne manque aucune information ?

Si vous n'en êtes pas sûr, utilisez simplement une fonction standard Print() et vérifiez le fichier journal, et pas seulement l'onglet expert . ... nous n'avons pas vu votre méthode de journalisation.

Utilisez-vous des indicateurs via des appels iCustom() ? Si c'est le cas, ils utilisent peut-être les cycles du CPU . . .
 

Voici ma fonction log :

void PrintDebug(int F, string DebugStr1, string DS2 = "", string DS3 = "", string DS4 = "", string DS5 = "", string DS6 = "", string DS7 = "", 
   string DS8 = "", string DS9 = "", string DS10 = "", string DS11 = "", string DS12 = "", string DS13 = "", string DS14 = "", string DS15 = "", 
   string DS16 = "", string DS17 = "", string DS18 = "", string DS19 = "", string DS20 = "")
{
   FileWrite(F, CommonIdentStr() + Blank + DebugStr1 + DS2 + DS3 + DS4 + DS5 + DS6 + DS7 + DS8 + DS9 + DS10 
               + DS11 + DS12 +DS13 + DS14 + DS15 + DS16 + DS17 + DS18 + DS19 + DS20);
   FileFlush(F);
}

Et voici ma fonction start :

int start()
  {     
   int TFInd;
   int k;  
   
   if (CheckDebug(DebugStart, 2))
      {
         DebugStr = "DebugStart: " + "begin: " + " InitialGapFound: " + BoolToString(InitialGapFound);
         PrintDebug(DebugFile, DebugStr);
      }
   
   if (InitialGapFound)        
      {                                             
         if (TimeLocal() >= LastInitialGapCloseCheck + HistoryDownloadCheckInterval)                                  // zzz
            {
               LastInitialGapCloseCheck = TimeLocal();
               
               if (InitialHistoryGapClosed())
                  {
                     if (CheckDebug(DebugStart, 2))
                        {
                           DebugStr =  "DebugStart: " + " InitialHistoryGapClosed ";
                           PrintDebug(DebugFile, DebugStr);
                        }
                  
                     ReInit = true;
                     InitialGapFound = false;

                     MyInit();
                  }        
            }

         if (CheckDebug(DebugStart, 2))
            {
               DebugStr = "DebugStart: " + " last return in InitialGapFound";
               PrintDebug(DebugFile, DebugStr);
            } 
            
         return(OK);
      
      }  // if InitialGapFound

   if (CheckDebug(DebugStart, 2))
      {
         DebugStr = "DebugStart (): last return: ";
         
         PrintDebug(DebugFile, DebugStr);
      } 
 
              
   return(0);
  }

J'enregistre le début de start et la fin.

La fonction CheckDebug() n'a pas d'influence, puisqu'elle renvoie toujours true.

Voici le fichier journal généré.

Vous pouvez voir que la dernière entrée est "DebugStart : last return in InitialGapFound", qui est la dernière instruction exécutée dans la fonction start().

L'entrée suivante dans le fichier journal devrait être "DebugStart : begin : ...", la première instruction de la fonction start().

Mais la fonction start() n'est jamais déclenchée à nouveau. Au lieu de cela, MT4 se bloque dans une boucle.

Je ne vois aucune boucle dans la logique de mon programme. Je n'utilise pas de DLLs, pas de iCustom, ....

2013.11.15 12:33:14 Test réduit 0 : USDJPY M15 Debug Init() begin :
2013.11.15 12:33:14 Test réduit 0 : USDJPY M15 DebugMyInit begin :
2013.11.15 12:33:14 Test réduit 0 : USDJPY M15 Debug Init() return :
2013.11.15 12:33:14 Test réduit 0 : USDJPY M15 DebugStart : begin : InitialGapFound : True
2013.11.15 12:33:14 Test reduced 0 : USDJPY M15 DebugStart : dernier retour dans InitialGapFound
2013.11.15 12:33:15 Test réduit 395052 : USDJPY M15 DebugStart : begin : InitialGapFound : True
2013.11.15 12:33:15 Test réduit 395052 : USDJPY M15 DebugStart : dernier retour dans InitialGapFound
2013.11.15 12:33:16 Test réduit 395052 : USDJPY M15 DebugStart : begin : InitialGapFound : True
2013.11.15 12:33:16 Test réduit 395052 : USDJPY M15 DebugStart : InitialHistoryGapClosed :
2013.11.15 12:33:16 Test réduit 395052 : USDJPY M15 DebugMyInit begin :
2013.11.15 12:33:16 Test réduit 395052 : USDJPY M15 DebugMyInit InitialMyInitCalls : 0 IndexCount : 1 nach CreateHistory()
2013.11.15 12:33:17 Test réduit 395052 : USDJPY M15 DebugMyInit InitialMyInitCalls : 0 IndexCount : 2 nach CreateHistory()
2013.11.15 12:33:18 Test réduit 395052 : USDJPY M15 DebugMyInit InitialMyInitCalls : 0 IndexCount : 3 nach CreateHistory()
2013.11.15 12:33:19 Test réduit 395052 : USDJPY M15 DebugMyInit InitialMyInitCalls : 0 IndexCount : 4 nach CreateHistory()
2013.11.15 12:33:20 Test réduit 395052 : USDJPY M15 DebugMyInit InitialMyInitCalls : 0 IndexCount : 5 nach CreateHistory()
2013.11.15 12:33:21 Test réduit 395052 : USDJPY M15 DebugMyInit InitialMyInitCalls : 0 IndexCount : 6 nach CreateHistory()
2013.11.15 12:33:22 Test réduit 395052 : USDJPY M15 DebugMyInit InitialMyInitCalls : 0 IndexCount : 7 nach CreateHistory()
2013.11.15 12:33:22 Test réduit 395052 : USDJPY M15 DebugMyInit retour InitialMyInitCalls : 0 IndexCount : 8
2013.11.15 12:33:22 Test reduced 395052 : USDJPY M15 DebugStart : dernier retour dans InitialGapFound

 
mt4forum:

Voici ma fonction log :

Et voici ma fonction start :

J'enregistre le début de start et la fin.

La fonction CheckDebug() n'a pas d'influence, puisqu'elle renvoie toujours true.

Voici le fichier journal généré.

Vous pouvez voir que la dernière entrée est "DebugStart : last return in InitialGapFound", qui est la dernière instruction exécutée dans la fonction start().

L'entrée suivante dans le fichier journal devrait être "DebugStart : begin : ...", la première instruction de la fonction start().

Mais la fonction start() n'est jamais déclenchée à nouveau. Au lieu de cela, MT4 se bloque dans une boucle.


Ce qui est acceptable dans...

      return(OK);


Supposons que votre débogage soit à l'origine du problème, ajoutez ce qui suit après les déclarations de variables dans start() run et faites un rapport montrant le journal et votre extrait de journal comme ci-dessus....

int start()
  {     
   int TFInd;
   int k;  
   
   Print("start():  started . . .");  // <-----  add this line here
   
   if (CheckDebug(DebugStart, 2))