Speicherprobleme im MQL5

szymon100m
644
szymon100m  

Hallo,

ich habe eine Frage, die ich so noch nirgends beantwortet gefunden habe.

Gibt es Alternativen für IndicatorRelease() im Strategietester? Gemäss Doku funktioniert die Methode im Strategietester nicht.

Mein Problem: ich habe einen EA, welcher mit mehreren Indikatoren arbeitet. Beim Strategietest können in Summe auch >20 Indikatoren geladen sein - bei 24 aktiven Agenten. Mein Rechner verträgt das gut.

Nun sind manche Indikatoren "leichter" z.B. iMACD füllt den Speicher auf 700MB pro Agenten und dann steigt der Speicherbedarf nicht mehr an. Andere z.B. iRSI steigern den Speicherbedarf ohne ein absehbares Ende. Der Speicherbedarf steigt also von Test zu Test stetig an, bis zum Absturz des PCs.

Ein Workaround, den ich gefunden habe ist die Deaktivierung aller lokalen Agenten. Wenn ich das kurz mache, wird der Speicherbereich aller Agenten zurückgesetzt und der Test geht weiter.

Kennt Jemand eine Möglichkeit der "Agentendeaktivierung und Aktivierung" per MQL5 Code? Kann man eine Arbeitsspeicherbefreiung erzwingen, ohne den Strategietester zu unterbrechen?

Kann man alte Indikatoren "schneller" aus dem Arbeitsspeicher schmeissen?

Ich freue mich auf Eure Ideen. Liebe Grüsse

Simon

Wie teste ich einen Handelsroboter vor dem Kauf
Wie teste ich einen Handelsroboter vor dem Kauf
  • www.mql5.com
Der Kauf eines Handelsroboters hat bestimmte Vorzüge gegenüber ähnlichen Möglichkeiten - ein automatisiertes System kann direkt im MetaTrader5-Terminal getestet werden. Vor dem Kauf kann und soll ein Expert Advisor sorgfältig in allen ungünstigen Modi im eingebauten Strategietester ausgeführt werden, um das System komplett zu verstehen.
amando
3389
amando  
szymon100m:

Hallo,

ich habe eine Frage, die ich so noch nirgends beantwortet gefunden habe.

Gibt es Alternativen für IndicatorRelease() im Strategietester? Gemäss Doku funktioniert die Methode im Strategietester nicht.

Mein Problem: ich habe einen EA, welcher mit mehreren Indikatoren arbeitet. Beim Strategietest können in Summe auch >20 Indikatoren geladen sein - bei 24 aktiven Agenten. Mein Rechner verträgt das gut.

Nun sind manche Indikatoren "leichter" z.B. iMACD füllt den Speicher auf 700MB pro Agenten und dann steigt der Speicherbedarf nicht mehr an. Andere z.B. iRSI steigern den Speicherbedarf ohne ein absehbares Ende. Der Speicherbedarf steigt also von Test zu Test stetig an, bis zum Absturz des PCs.

Ein Workaround, den ich gefunden habe ist die Deaktivierung aller lokalen Agenten. Wenn ich das kurz mache, wird der Speicherbereich aller Agenten zurückgesetzt und der Test geht weiter.

Kennt Jemand eine Möglichkeit der "Agentendeaktivierung und Aktivierung" per MQL5 Code? Kann man eine Arbeitsspeicherbefreiung erzwingen, ohne den Strategietester zu unterbrechen?

Kann man alte Indikatoren "schneller" aus dem Arbeitsspeicher schmeissen?

Ich freue mich auf Eure Ideen. Liebe Grüsse

Simon

also wenn du Probleme mit den Speicher hast, bei ein paar Standardindikatoren, dann bring deinen Code in Ordnung

Carl Schreiber
Moderator
11460
Carl Schreiber  

Ich denke auch, es liegt an Deinem Code!

Vielleicht könnte das Problem durch die Verwendung von OnDeinit() gelöst werde?

szymon100m
644
szymon100m  

Ich nutze natürlich OnDeinit(), jede verwendete Klasse hat auch einen implementierten Destructor, welcher alles löscht. Das Problem ist die Zerstörung der Indikatoren, das geht gemäss Doku nicht. Gibt es einen memory analyzer in MQL5? Wenn ich die Verwendung der Indikatoren deaktiviere und den EA laufen lasse, gibt es keine Speicherprobleme. Der Code von iRSI und iMACD sieht in der Doku identisch aus aus der Sicht der Grössenbeschränkungen.

Hier ein Beispieldestructor der Indikatorklasse.

IndicatorClass::~IndicatorClass()

  {

   int result = 0;

   if(IndicatorRelease(handleSchaff))

     {

      result += 1;

     }

}


amando
3389
amando  
szymon100m:

Ich nutze natürlich OnDeinit(), jede verwendete Klasse hat auch einen implementierten Destructor, welcher alles löscht. Das Problem ist die Zerstörung der Indikatoren, das geht gemäss Doku nicht. Gibt es einen memory analyzer in MQL5? Wenn ich die Verwendung der Indikatoren deaktiviere und den EA laufen lasse, gibt es keine Speicherprobleme. Der Code von iRSI und iMACD sieht in der Doku identisch aus aus der Sicht der Grössenbeschränkungen.

Hier ein Beispieldestructor der Indikatorklasse.

IndicatorClass::~IndicatorClass()

  {

   int result = 0;

   if(IndicatorRelease(handleSchaff))

     {

      result += 1;

     }

}


zeig lieber mal deinen code, das würde mehr sinn machen, die Klasse ist ja bekannt, die funktioniert

szymon100m
644
szymon100m  

Ich habe eine Kleinigkeit herausgefunden, beim test mit 1 Minute OHLC, ist der Speicherverbrauch ohne Indikatoren bei 70 MB, bei Test mit real ticks bei 750MB für ein halbes Jahr.

Somit ergibt sich für mich das folgende Learning. Der Algo ist funktionsfähig und leicht betreibbar beim Testen mit ungenauen Daten. Bei genauen Daten braucht es mehr RAM. Ich habe die Anzahl der aktiven Agenten von 24 auf 12 reduziert und werde berichten für wie lange mein Arbeitsspeicher reicht.

Christian
3542
Christian  
szymon100m:

Hallo,


Mein Problem: ich habe einen EA, welcher mit mehreren Indikatoren arbeitet. Beim Strategietest können in Summe auch >20 Indikatoren geladen sein - bei 24 aktiven Agenten. Mein Rechner verträgt das gut.


Wo ist das denn ein Problem ? 12 Kerner und nur 4 GB Ram , eher nicht, oder?

Ein Agent möchte bis zu 2 GB haben laut MQ Specs

Ps: mit 12 Agenten wird er kaum langsamer (Selbst getestet)

szymon100m
644
szymon100m  

Das hört sich gut an, hast Du mit realen Ticks getestet? Ich habe für ein 1-Minütiges Intervall einen Real Tick Test für 6 Monate in Parallel 24 Mal mit je 4 Indikatoren bei 64 GB RAM getestet. Das ergab einen RAM-Overflow. Bei grossen Tests, werden die Strategietester ein Bisschen grösser als 2GB.


Christian
3542
Christian  

Sicher doch, aber teste ruhig selber weiter. Da ist der Lerneffekt  am größten.

Ohne deinen Code gehts hier im Schneckentempo voran.

szymon100m
644
szymon100m  

Danke für den Tipp mit OnDeinit(). Das Problem war, dass ein Abbruch im Ereignis OnInit() durch ExpertRemove() kein OnDeinit() Ergeignis im EA mehr zur Folge hat. Dadurch wurden die Destruktoren der beteiligten Objekte nicht aufgerufen. Ist das ein Bug im MQL5 oder so designed?

Die Lösung sieht also im OnInit() mit dem markierten Quellcode wie folgt aus:

   if(!IsStopped())

     {

      //   init(inputVariables, parameters);

      mStop.checkDoubleIndicators(inputVariables);

      mAlgorithm = new AlgorithmClass(mParameters,1,99999,_Symbol,true);

     }

   else

     {

      OnDeinit(0);

     }

Christian
3542
Christian  
szymon100m:

nicht aufgerufen. Ist das ein Bug im MQL5 oder so designed?


ExpertRemove()

Ja ist so gewollt da ExpertRemove() ein direkter Programmabbruch ist.

Der Aufruf von ExpertRemove() im Strategietester aus der Funktion OnInit() bricht den Test des aktuellen Parametersatzes ab. Ein solches Ende gilt als Initialisierungsfehler.
https://www.mql5.com/de/docs/common/expertremove
Dokumentation zu MQL5: Allgemeine Funktionen / ExpertRemove
Dokumentation zu MQL5: Allgemeine Funktionen / ExpertRemove
  • www.mql5.com
ExpertRemove - Allgemeine Funktionen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5