loop OrderHistoryTotal() --> Überladen

 
Hallo,
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.


bool              newClose       = false;
static datetime   lastCloseTime  = 0;     
      
      for(int i=0; i<=OrdersHistoryTotal()-1; i++)
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
            if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
               if(OrderCloseTime()>lastCloseTime)
               {
                  newClose = true;
                  lastCloseTime = OrderCloseTime();
               };





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 :-)

 
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. 

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.
Hi. Erst mal danke für die Rückmeldung.
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. 

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.

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.

https://www.mql5.com/de/docs/basis/operators/for
 
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