MT4 hängt sich auf, ruft nicht mehr start() auf

 

Hallo!

ich stehe hier vor einem hässlichen Problem:

Die start() -Funktion meines Indikators kommt nach einigen Iterationen nach dem return()-Aufruf nicht mehr zurück, d.h. MT4 hängt in einer Schleife und frisst CPU, ohne start() erneut aufzurufen.

Ich frage mich, ob ich irgendwie den Funktionsaufrufstapel zerstört habe?

Was schlagen Sie vor, wonach ich hauptsächlich suchen sollte, um die Ursache zu finden?

Ich habe schon die ganze Woche mit dem Debugging verbracht. Es sind 72 Seiten Code.

Ich verwende keine DLL-Aufrufe, nur MQL.

Dankeschön.

 
Sie kehren nicht vom Start zurück. Sie müssen Ihren Code korrigieren. Holen Sie sich dbgView und fügen Sie Log-Aufrufe beim Start und bei der Rückkehr jeder Funktion hinzu, um Ihre Endlosschleife aufzuspüren.
 

Ich protokolliere bereits Debug-Informationen.

Ich kann keine unendliche Schleife sehen.

Das letzte, was ich in der Protokolldatei sehe, ist, wenn ich return() in der letzten Zeile von start() aufrufe.

Von da an wird start() nie wieder ausgelöst.

Es muss also etwas anderes sein.

 
Protokollierung wo/wie? Sie können Print/Alert NICHT verwenden, da Sie den GUI-Thread aufhängen und die Ausgabe nicht geschrieben wird.
 

Ich weiß, ich verwende meine eigene PrintDebug() Funktion mit FileWrite(), FileFlush.

 

Glauben Sie, dass meine Art, Debug-Informationen zu drucken, ausreichend ist?

 
mt4forum:

Ich protokolliere bereits Debug-Informationen.

Ich kann keine unendliche Schleife sehen.

Das letzte, was ich in der Protokolldatei sehe, ist, wenn ich return() in der letzten Zeile von start() aufrufe.

Von da an wird start() nie wieder ausgelöst.

Es muss also etwas anderes sein.


Geben Sie als erste Zeile von start() etwas in das Protokoll ein?
 

Ja, ich protokolliere die erste Zeile und die letzte Zeile.

Kann ich sicher sein, dass bei meiner Art der Protokollierung keine Protokollinformationen fehlen?

 
mt4forum:

Ja, ich protokolliere die erste Zeile und die letzte Zeile.

Kann ich sicher sein, dass bei meiner Art der Protokollierung keine Protokollinformationen fehlen?

Wenn Sie sich nicht sicher sind, verwenden Sie einfach ein standardmäßiges Print() und überprüfen Sie die Protokolldatei und nicht nur die Registerkarte "Experte". . wir haben Ihre Art der Protokollierung nicht gesehen.

Verwenden Sie Indikatoren über iCustom()-Aufrufe? Wenn ja, beanspruchen sie vielleicht CPU-Zyklen. . .
 

Hier ist meine Log-Funktion:

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

Und hier ist meine Startfunktion:

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

Ich protokolliere den Beginn von start und das Ende.

Die Funktion CheckDebug() hat keinen Einfluss, da sie immer true zurückgibt.

Im Folgenden sehen Sie die erzeugte Protokolldatei.

Sie können sehen, dass der letzte Eintrag "DebugStart: last return in InitialGapFound" lautet, was die letzte Anweisung ist, die in der Funktion start() ausgeführt wurde.

Der nächste Eintrag in der Protokolldatei sollte "DebugStart: begin: ...", die erste Anweisung der start()-Funktion.

Aber start() wird nie wieder ausgelöst. Stattdessen bleibt MT4 in einer Schleife hängen.

Ich kann keine Schleife in meiner Programmlogik erkennen. Ich verwende keine DLLs, kein iCustom, ...

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

 
mt4forum:

Hier ist meine Log-Funktion:

Und hier ist meine Startfunktion:

Ich protokolliere den Beginn von start und das Ende.

Die Funktion CheckDebug() hat keinen Einfluss, da sie immer true zurückgibt.

Im Folgenden sehen Sie die erzeugte Protokolldatei.

Sie können sehen, dass der letzte Eintrag "DebugStart: last return in InitialGapFound" lautet, was die letzte Anweisung ist, die in der Funktion start() ausgeführt wurde.

Der nächste Eintrag in der Protokolldatei sollte "DebugStart: begin: ...", die erste Anweisung der start()-Funktion.

Aber start() wird nie wieder ausgelöst. Stattdessen bleibt MT4 in einer Schleife hängen.


Was ist in Ordnung...

      return(OK);


Nehmen wir an, dass Ihr Debugging das Problem verursacht, fügen Sie bitte Folgendes nach den Variablendeklarationen in start() run ein und melden Sie sich zurück, indem Sie das Protokoll und Ihren Protokollauszug wie oben zeigen...

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