Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Array vs FileWrite/Read (http://www.expert-advisor.com/forum/showthread.php?t=7035)

Mr_Snow 02.07.21 02:08

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

Indikator-Trading 02.07.21 08:22

Ist es denn nötig die offenen Trades jede Sekunde abzufragen? Wann ein Trade geöffnet wird, hängt ja von deinem System ab. Schließt du einen Trade per OrderClose, ist das ja auch eine Entscheidung, welche du im Code verankert hast. Wird ein Trade über SL oder TP geschlossen, kannst du dieses über die OnTradeTransaction() Funktion abfragen und deine Arrays anpassen. So aktualisierst du deine Datei nur in dem Fall, wenn eine Tradeaktion durchgeführt wird. Gruß Timo

RetepM 02.07.21 19:10

Hi, ich habe mir vor Jahren aus einem amerikanischen Board ein Dashboard runtergeladen (hieß Dashboard? Ultimate?) oder so ähnlich.
Mittlerweile laufen darin im Sekundentakt ca 50 verschiedene Durchläufe über die bei mir meistens 28 Währungspaare-Arrays. Das macht überhaupt kein Problem für die Performance von MT4.

Wenn es Arrays geben sollte, deren Inhalt du z.B. nach einem Crash nicht wieder herstellen kannst, dann würde ich dir empfehlen, diese alle 15-60 Minuten oder so ähnlich in eine Datei zu sichern.
Grüße

Mr_Snow 02.07.21 23:53

Zitat:

Zitat von Indikator-Trading (Beitrag 45522)
Ist es denn nötig die offenen Trades jede Sekunde abzufragen? Wann ein Trade geöffnet wird[...]?

Ja, denn die zu überwachenden Trades werden per Hand eingestellt und wieder geschlossen, der EA überwacht und analysiert.

RetepM 03.07.21 13:21

Zitat:

Zitat von Mr_Snow (Beitrag 45526)
Ja, denn die zu überwachenden Trades werden per Hand eingestellt und wieder geschlossen, der EA überwacht und analysiert.

Hi, so richtig verstehe ich dein Problem nicht. Warum schreibst du nicht alle offenen Orders in ein Array. Wenn du das jede Sekunde tust, erfasst du zeitnah sowohl die geöffneten als auch die geschlossenen Orders, und hast du immer ein aktuelles Array für deine Analysen. Dabei spielt es keine Rolle, ob die Daten automatisch oder manuell eingeben werden.
Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum