Ja.
Als erstes brauchst Du eine Art limit, nennen wir sie order_limit. Diese kommt in den Kopf der Schleife, int i=order_limit statt i=0.
Wenn Du immer nur die letzten 50 durchgehen willst dann musst Du während Du OrderHistoryTotal abgefragt hast, testen ob die Zahl größer als fünfzig ist und falls ja, die Zahl minus fünfzig rechnen und dann als order_limit einsetzen.
Er fängt dann automatisch immer erst bei der Zahl order_limit an, außer wenn die OrderHistoryTotal kleiner als fünfzig ist, dann startet er bei 0.
Tobias Johannes Zimmer #:
Ja.
Hi. Erst mal danke für die Rückmeldung.Ja.
Als erstes brauchst Du eine Art limit, nennen wir sie order_limit. Diese kommt in den Kopf der Schleife, int i=order_limit statt i=0.
Wenn Du immer nur die letzten 50 durchgehen willst dann musst Du während Du OrderHistoryTotal abgefragt hast, testen ob die Zahl größer als fünfzig ist und falls ja, die Zahl minus fünfzig rechnen und dann als order_limit einsetzen.
Er fängt dann automatisch immer erst bei der Zahl order_limit an, außer wenn die OrderHistoryTotal kleiner als fünfzig ist, dann startet er bei 0.
Bis auf den ersten Absatz, "i=order_limit statt i=0" habe ich leider den Rest deiner Erklärung nicht verstanden.
Kannst du mir das nochmal erläutern was du damit meinst?
Im Kern geht es bei meiner Anfrage ja darum nicht ALLE History-Orders durchlaufen zu müssen (als Bsp wenn ich einen EA über meherere Jahre laufen lasse kommen einige Hunderte/Tausende Orders zusammen und dann wird er durch die History-Schleife sehr lahm)
Ja doch. Schau Dir Deine for Loop an. Wenn Du sagst int i=0, fängt sie immer bei 0 an.
Du möchtest aber, dass i auch bei späteren Indizes starten kann. Diese sind jedoch erst vorhanden, wenn bereits Einträge in OrderHistory stehen, also nicht ganz am Anfang. Deshalb ersetzt Du die 0 durch order_limit und sagst
int order_limit=0;
if(OrderHistoryTotal()>=50)
order_limit=OrderHistoryTotal()-50;
for(int i=order_limit; i<OrderHistoryTotal(); i++)
{Inhalt der Schleife}
Tobias Johannes Zimmer #:
Ja doch. Schau Dir Deine for Loop an. Wenn Du sagst int i=0, fängt sie immer bei 0 an.
Ja doch. Schau Dir Deine for Loop an. Wenn Du sagst int i=0, fängt sie immer bei 0 an.
Du möchtest aber, dass i auch bei späteren Indizes starten kann. Diese sind jedoch erst vorhanden, wenn bereits Einträge in OrderHistory stehen, also nicht ganz am Anfang. Deshalb ersetzt Du die 0 durch order_limit und sagst
int order_limit=0;
if(OrderHistoryTotal()>=50)
order_limit=OrderHistoryTotal()-50;
for(int i=order_limit; i<OrderHistoryTotal(); i++)
{Inhalt der Schleife}
So also die Lösung funktioniert, daher DANKE für den Tipp.
Ich hatte ja das Problem nur, wrnn mehrere EA's parallel auf dem gleichen Oaar gelaufen sind.
Wie gesagt, die o.g Lösung passt ABER ich hab halt immer, dass ich eine Anzahl von maximal zu betrachtenden Orders angeben muss.
Habe eine andere Lösung gefunden bzw genannt bekommen, in der ich ganz einfach mit dem break, else breal arbeiten kann. D.h. es werden auch nicht ALLE History Orders durchgegangen.
:-)
Aber wie gesagt danke! Wieder etwas gelernt und ein Stück schlauer
Gern geschehen.
https://www.mql5.com/de/docs/basis/operators/for
Naja die for hat drei Eingaben:
Die erste ist der Startpunkt.
Die zweite besteht aus allen möglichen Bedingungen für das weiterlaufen die mit logischem UND und ODER verknüpft werden können i<50 && !IsStopped && !XYZ.
Die dritte ist die Änderung des Schleifenindex.
Markus Wilhelm #:
So also die Lösung funktioniert, daher DANKE für den Tipp.
Ich hatte ja das Problem nur, wrnn mehrere EA's parallel auf dem gleichen Oaar gelaufen sind.
Wie gesagt, die o.g Lösung passt ABER ich hab halt immer, dass ich eine Anzahl von maximal zu betrachtenden Orders angeben muss.
Habe eine andere Lösung gefunden bzw genannt bekommen, in der ich ganz einfach mit dem break, else breal arbeiten kann. D.h. es werden auch nicht ALLE History Orders durchgegangen.
:-)
Aber wie gesagt danke! Wieder etwas gelernt und ein Stück schlauer
Kenne deine Strategie ja nicht, aber alternativ kannst Du ja auch abfragen ob es eine offene Position oder offene Order gibt. Das würde das ganze nochmals beschleunigen
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
ich versuche für meinen EA eine Funktion zu erstellen, mit der ich abfrage, ob eine Order geschlossen wurde (bool = newClose).
Üblicherweiße nutze ich dafür den klassischen loop mit OrderHistoryTotal() und einem Zeitstempel.
Leider wird gerade im Strategie-Tester der EA dann unglaublich langsam, je länger er läuft, da die Anzahl im OrderHistoryTotal() natürlich immer größer wird.
Daher die Frage, ob jemand einen alternativen loop-Ansatz hat um z.B.: nur die neuesten 50 geschlossenen Trades zu loop'en um die Schleife nicht gar zu groß werden zu lassen.
Einfach OrderHistoryTotal() durch zB 50 zu ersetzten und dann den loop mit i++ oder i-- laufen zu lassen, führt ja leider dazu, dass nach 50 History-Order keine weiteren mehr betrachtet werden... :-(
Freue mich auf Tipps und Tricks :-)