Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 02.07.21
Mr_Snow Mr_Snow ist offline
Neues Mitglied
 
Registriert seit: Apr 2017
Beiträge: 26
Mr_Snow befindet sich auf einem aufstrebenden Ast
Standard Array vs FileWrite/Read

Hi,

die Verwaltung von Daten über ein Array ist in MQL4 ja echt eine Mamutaufgabe und bläst unwarscheinlich den Quelltext mit verschachtelten For-Schleifen auf.
Daher nun meine Frage:

Da ich den EA ohnehin ausfallsicher machen muss, werde ich das Array am Ende eines Durchlaufs in eine Datei ablegen. Was wäre bei einer EventTimer(1) Funktion performanter/sinnvoller?
  1. intern mit Arrays und X Schachtel-For-Schleifen zu arbeiten und am Ende alles in EINE Datei zu schreiben?
  2. für jedes ArrayElement eine separate Datei ablegen und diese immer auslesen?

Szenario:

Der EA überwacht den gesamten Markt und prüft auf offene Positionen. Symbole, die offene Positionen haben, werden in einem Array gespeichert.

Er vergleicht nun einmal pro sekunde den Markt mit dem Array. Findet er ein Symbol mit offenen Orders, das noch nicht im Array ist, fügt er es hinzu. Das klappt soweit ohne Probleme. Auch das "Löschen", weil ich das Array vorher immer auf Größe Null setzte.
Die Krux beginnt, weil pro gefundenem Symbol ein Statuswert gespeichert werden muss, der unabhängig von der Öffnung im Markt ist. Das Löschen dieses Symbols aus dem Array hängt nun von diesem Statuswert ab.
Also kann ich das Array nicht jedes mal vorher auf Null bringen, sondern muss alles kompliziert mit verschachtelten For-Schleifen prüfen, neue temporäre Arrays erzeugen, die zu löschende Werte enthalten, usw.
Am Ende entsteht ein imenser Spagetti-Code, nur um ein paar ArrayElemente aus einem Array zu löschen. Und nicht mal der klappt von der Logik her, denn wenn ich da ein Element lösche, stimmt der Index für alle nachfolgenen Werte nicht mehr:

Code:
int durchläufe = ArrayRange(Symbole[], 0);

//Nimm jedes Elemtent aus Symbole[]
for(int i, i < durchläufe; i++)
{
   //Wenn zu löschendes Element gefunden:
   if(das hier löschen == true)
   {
     LöschtElementAusArray(Symbole[], i);  //löscht aus Symbole[] den Index i
   }
}
Macht es da von der Performance her Sinn, das ganze über Dateien zu lösen?

Jedes aktive Symbol bekommt genau eine Datei: EURUSD_12345.txt mit genau zwei Zeilen:
1."EURUSD"
2. Wichtiger Statuswert

Jetzt kann ich pro Sekunde den Ordner auslesen und prüfen:
  • for-schleife 1: Markt prüfen, wenn Symbol noch nicht als Datei, dann Datei erzeugen.
  • for-schliefe 2: Dateien prüfen, ob Symbol im Markt vorhanden, wenn nicht und der Statuswert erlaubt das entfernen, dann löschen.

Die FileWrite/Delete würde er nur auslösen, wenn sich etwas ändert. FileRead für alle Dateien würde 1x pro Sekunden kommen.



Sorry für die Textwand, aber ich bin mir ziemlich sicher, das auch viele andere vor dem Array Problem stehen und hier gegebenfall fündig werden.

Ich bedanke mich schon einmal vorab
und wünsche einen guten Tag