MT4 si blocca, non chiama più start()

 

Ciao,

mi trovo di fronte a un brutto problema:

dopo alcune iterazioni la funzione start() del mio indicatore non torna indietro dopo la chiamata return(), cioè MT4 si blocca in un loop, consumando la CPU, senza chiamare di nuovo start().

Mi chiedo se in qualche modo ho distrutto lo stack delle chiamate di funzione?

Cosa mi suggerisci di cercare principalmente per trovare la causa?

Ho già fatto il debug per tutta la settimana. Sono 72 pagine di codice.

Non sto usando nessuna chiamata DLL, solo MQL piano.

Grazie.

 
Non state tornando dall'inizio. Dovete correggere il vostro codice. Prendi dbgView e aggiungi le chiamate Log all'inizio e al ritorno di ogni funzione e rintraccia il tuo ciclo infinito.
 

Sto già registrando informazioni di debug.

Non riesco a vedere un ciclo indefinito.

L'ultima cosa che vedo nel file di log è quando chiamo return() nell'ultima riga di start().

Da lì start() non viene mai più attivato.

Deve essere qualcos'altro.

 
Registrare dove/come? Non puoi usare Print/Alert perché stai sospendendo il thread della GUI, l'output non verrà scritto.
 

Lo so, sto usando la mia funzione PrintDebug() con FileWrite(), FileFlush.

 

Pensi che il mio modo di stampare le informazioni di debug sia sufficiente?

 
mt4forum:

Sto già registrando informazioni di debug.

Non riesco a vedere un ciclo indefinito.

L'ultima cosa che vedo nel file di log è quando chiamo return() nell'ultima riga di start().

Da lì start() non viene mai più attivato.

Deve essere qualcos'altro.


Stampate qualcosa nel log come prima linea di start() ?
 

Sì, sto registrando la prima e l'ultima riga.

Posso essere sicuro che il mio modo di loggare non perda nessuna informazione di log?

 
mt4forum:

Sì, sto registrando la prima e l'ultima riga.

Posso essere sicuro che il mio modo di loggare non perda nessuna informazione di log?

Se non sei sicuro, usa una Print() standard e controlla il file di log, non solo la scheda dell'esperto. . non abbiamo visto il tuo modo di registrare.

Usi qualche indicatore tramite le chiamate iCustom()? Se lo fai, forse stanno prendendo i cicli della CPU. . .
 

Ecco la mia funzione di 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);
}

Ed ecco la mia funzione di inizio:

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);
  }

Sto registrando l'inizio dell'inizio e la fine.

La funzione CheckDebug() non ha alcuna influenza, poiché ritorna sempre true.

Quello che segue è il file di log generato.

Potete vedere che l'ultima voce è "DebugStart: last return in InitialGapFound", che è l'ultima istruzione eseguita nella funzione start().

La prossima voce nel file di log dovrebbe essere "DebugStart: begin: ...", la prima istruzione della funzione start().

Ma la funzione start() non viene mai attivata di nuovo. Invece MT4 si blocca in un loop.

Non riesco a vedere alcun ciclo nella logica del mio programma. Non sto usando DLL, nessun iCustom, ...

2013.11.15 12:33:14 Test ridotto 0: USDJPY M15 Debug Init() begin:
2013.11.15 12:33:14 Test ridotto 0: USDJPY M15 DebugMyInit begin:
2013.11.15 12:33:14 Test ridotto 0: USDJPY M15 Debug Init() ritorno:
2013.11.15 12:33:14 Test ridotto 0: USDJPY M15 DebugStart: begin: InitialGapFound: True
2013.11.15 12:33:14 Test ridotto 0: USDJPY M15 DebugStart: ultimo ritorno in InitialGapFound
2013.11.15 12:33:15 Test ridotto 395052: USDJPY M15 DebugStart: begin: InitialGapFound: True
2013.11.15 12:33:15 Test ridotto 395052: USDJPY M15 DebugStart: ultimo ritorno in InitialGapFound
2013.11.15 12:33:16 Test ridotto 395052: USDJPY M15 DebugStart: begin: InitialGapFound: True
2013.11.15 12:33:16 Test ridotto 395052: USDJPY M15 DebugStart: InitialHistoryGapClosed
2013.11.15 12:33:16 Test ridotto 395052: USDJPY M15 DebugMyInit begin:
2013.11.15 12:33:16 Test ridotto 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 1 nach CreateHistory()
2013.11.15 12:33:17 Test ridotto 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 2 nach CreateHistory()
2013.11.15 12:33:18 Test ridotto 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 3 nach CreateHistory()
2013.11.15 12:33:19 Test ridotto 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 4 nach CreateHistory()
2013.11.15 12:33:20 Test ridotto 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 5 nach CreateHistory()
2013.11.15 12:33:21 Test ridotto 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 6 nach CreateHistory()
2013.11.15 12:33:22 Test ridotto 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 7 nach CreateHistory()
2013.11.15 12:33:22 Test ridotto 395052: USDJPY M15 DebugMyInit ritorno InitialMyInitCalls: 0 IndexCount: 8
2013.11.15 12:33:22 Test ridotto 395052: USDJPY M15 DebugStart: ultimo ritorno in InitialGapFound

 
mt4forum:

Ecco la mia funzione di log:

Ed ecco la mia funzione di inizio:

Sto registrando l'inizio dell'inizio e la fine.

La funzione CheckDebug() non ha alcuna influenza, poiché ritorna sempre true.

Quello che segue è il file di log generato.

Potete vedere che l'ultima voce è "DebugStart: last return in InitialGapFound", che è l'ultima istruzione eseguita nella funzione start().

La prossima voce nel file di log dovrebbe essere "DebugStart: begin: ...", la prima istruzione della funzione start().

Ma la funzione start() non viene mai attivata di nuovo. Invece MT4 si blocca in un ciclo.


Cosa va bene in . . .

      return(OK);


Supponiamo che il tuo debug stia causando il problema, per favore aggiungi il seguente dopo le dichiarazioni delle variabili in start() run e riporta indietro mostrando il log e il tuo estratto di log come sopra . . .

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