Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43266
Benutzer: 7.220
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: JosephTK
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 12 Stunden
- JosephTK
vor 2 Tagen
- Hopfen&Mal...
vor 3 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 434
Gesamt: 435
Team: 0
Team:  
Benutzer:  murkel
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 02.07.21
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
  #2 (permalink)  
Alt 02.07.21
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
  #3 (permalink)  
Alt 02.07.21
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 240
RetepM befindet sich auf einem aufstrebenden Ast
Standard

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
  #4 (permalink)  
Alt 02.07.21
Neues Mitglied
 
Registriert seit: Apr 2017
Beiträge: 26
Mr_Snow befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
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.
  #5 (permalink)  
Alt 03.07.21
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 240
RetepM befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Mr_Snow Beitrag anzeigen
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
Thema geschlossen

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------