Metatrader 5 - Benötigt viel Speicher beim Durchlaufen eines Charts durch Symbole

 
Hallo,

Ich habe einen Expert Advisor, der so eingerichtet wurde, dass er die Symbole durchläuft, und der eine Menge Speicher verbraucht.

Ich habe bemerkt, dass dies beim Laden von Symbolen in die Market Watch und beim Entfernen von Symbolen aus der Market Watch langsam ansteigt. Es ist also nicht der Chart, der durch die vorhandenen Elemente in der Market Watch läuft, sondern eher, wenn neue Symbole geladen und entfernt werden.

Es ist so eingerichtet, dass es Folgendes tut:

  1. OnInit setzt den Timer alle 3 Sekunden in Gang
  2. OnTimer
    1. Ermitteln Sie das nächste Symbol in der Liste mit SymbolTotal() SymbolName()
    2. Setzt den Chart auf das nächste Symbol mittels SymbolSelect() um es in den Market Watch zu laden und ChartSetSymbolPeriod() um den aktuellen Chart auf das nächste Symbol zu setzen
    3. Verwendet SymbolSelect(), um alle unbenutzten Symbole im Market Watch zu entfernen.

Wenn ich so viel benutzerdefinierten Code wie möglich entferne und nur die oben genannten Schritte verwende, um ein Diagramm durch die verfügbaren Symbole durchlaufen zu lassen, stelle ich fest, dass die Speichernutzung auf meinem Rechner weiter zunimmt.

Die CPU bleibt konstant, aber der Speicher schießt in die Höhe.

Fragen:

  1. Warum passiert das?
  2. Gibt es irgendwelche Workarounds oder Vorschläge, die jemand hat, um zu verhindern, dass der Speicher in die Höhe schießt?
    (z.B. lieber einen neuen Chart mit ChartOpen() öffnen, anstatt den bestehenden Chart mit ChartSetSymbolPeriod() zu verwenden)
  3. Gibt es einen Ausweg?
    (d.h. ist dies einfach die Art und Weise, wie es funktioniert)
  4. Irgendwelche anderen Vorschläge?


Vielen Dank!

 
Vielleicht eine Endlosschleife? Schwer zu erraten ohne Code.
 

Ja, es ist eine Endlosschleife, aber das ist ja der Sinn.

Alle Symbole werden immer wieder durchlaufen.

Der folgende Code wird alle 3 Sekunden ausgelöst.

Hier ist der Codeausschnitt (zu Demozwecken ist alles in einer Methode zusammengefasst):

void OnTimer()
  {
      // Find next symbol
      long symbolsTotal = SymbolsTotal(false);
      long count = GlobalVariableGet("testmem");
      if(count >= symbolsTotal)
      {
         count = 0;         
      }                  
      string newSymbol = SymbolName(count, false);
      SymbolSelect(newSymbol, true);
      count++;
      GlobalVariableSet("testmem", count);
      
      // Change chart symbol
      ChartSetSymbolPeriod(0, newSymbol, Period());         
      
      // Remove other symbols from Market Watch
      CArrayString *symbols = new CArrayString();
      for(int i = 0; i < SymbolsTotal(true); i++)
      {
         string symbol = SymbolName(i, true); // Get name from local market watch
         symbols.Add(symbol);
      }           
            
      int total = symbols.Total();
      for(int i = 0; i < total; i++)
      {
         string symbolToRemove = symbols.At(i);
         
         // Is the symbol not the current chart or about to  
         // be added?
         if(newSymbol != symbolToRemove)
         {            
            // Remove from Market Watch
            SymbolSelect(symbolToRemove, false);   
         }         
      }
      
      delete symbols;
   
  }
 
wo werden Symbole initiiert?
 

Ich bin nicht sicher, was Sie mit "Symbolen" meinen, aber der obige Code befindet sich in einem neuen Expert Advisor, bei dem der ExecuteTimer() auf 3 Sekunden eingestellt ist.

Hier ist der Code (dies ist in einem EA):

int OnInit()
{
//--- Timer erstellen
EventSetTimer(3);

//---
return(INIT_SUCCEEDED);
}

 
Hallo,

Ich habe das vollständige Skript in der angehängten Datei "ForumQuestion1.mq5" hinzugefügt.

Schritte zur Wiederherstellung des Fehlers:

  1. Öffnen Sie das angehängte Skript in Metaeditor (es ist sicher) für Metatrader 5
  2. Öffnen Sie den Task-Manager in Windows
    1. Suchen Sie nach "Metatrader 5 Client Terminal" und notieren Sie sich die Menge des Speichers
  3. Führen Sie das Skript aus und beobachten Sie die Speicherspalte im Task Manager

Der Arbeitsspeicher steigt langsam an, während das Skript die Symbole durchläuft.

Dateien:
 
gr101:
Hallo,

Ich habe das vollständige Skript hinzugefügt, siehe angehängte Datei "ForumQuestion1.mq5".

Schritte zur Wiederherstellung des Fehlers:

  1. Öffnen Sie das angehängte Skript in Metaeditor (es ist sicher) für Metatrader 5
  2. Öffnen Sie den Task-Manager in Windows
    1. Suchen Sie nach "Metatrader 5 Client Terminal" und notieren Sie sich die Menge an Speicher
  3. Führen Sie das Skript aus und beobachten Sie die Speicherspalte im Task Manager

Der Arbeitsspeicher steigt langsam an, während das Skript die Symbole durchläuft.

Ich habe Ihren Code ausprobiert und habe kein Speicherproblem.

MT5 Build 1325.

 

Hallo Alain,

danke für deine Antwort.

Ich habe den gleichen Build. Die Speichererweiterung ist langsam. Es dauert ein paar Minuten. Im Grunde genommen nimmt er allmählich zu.

In der angehängten Datei "Memory increase.docx.png" sind einige Screenshots zu sehen, die zeigen, wie sich der Speicher mit der Zeit aufbaut.

Ich benutze den gleichen Build "MT5 Build 1325".

Informationen zur Maschine:

  • Windows 8.1 Unternehmen
  • 64bit Betriebssystem
  • 16Gb RAM
  • i7-Prozessor

Danke

Dateien:
 
gr101:

Hallo Alain,

danke für die Antwort.

Ich habe den gleichen Build. Der Speicherzuwachs ist langsam. Es dauert ein paar Minuten. Im Grunde genommen nimmt er allmählich zu.

In der angehängten Datei "Memory increase.docx.png" finden Sie einige Screenshots, die zeigen, wie sich der Speicher mit der Zeit aufbaut.

Ich benutze denselben Build "MT5 Build 1325".

Rechner-Informationen:

  • Windows 8.1 Unternehmen
  • 64bit Betriebssystem
  • 16Gb RAM
  • i7-Prozessor

Danke

Ich arbeite mit Windows 10, falls das einen Unterschied macht.

Ihr Skript läuft seit einigen Minuten vor meinem letzten Beitrag. Derzeit ist die Speichernutzung niedriger als zu Beginn (280 Mb gegenüber 300 Mb).

EDIT: Ich habe gerade noch einmal nachgesehen und es sind jetzt 189 Mb !!! immer noch abnehmend :D

EDIT2: Läuft auf dem Metaquotes Demo-Server.

 

Danke für das Feedback.

Ich denke, ich werde auf Windows 10 aktualisieren und sehen, ob das einen Unterschied macht.

 

Ich habe es auf Windows Server 12 R2 gesetzt und das treibt auch den Speicher in die Höhe.

Lassen Sie mich dies für eine Weile zu überwachen und geben Feedback zu diesem Thread.

Grund der Beschwerde: