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)
-   -   loop OrderHistoryTotal() --> Überladen (http://www.expert-advisor.com/forum/showthread.php?t=7272)

MarkusWilhelm89 16.11.22 11:39

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.

Code:

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... :-(

Für Tipps und Anregungen bin ich euch sehr dankbar :)

traderdoc 16.11.22 15:30

Ich würde die Schleife rückwärts laufen lassen, d.h. die letzte geschlossene Order wird zuerst abgefragt.

Code:

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

Diese Schleife wird sofort abbrechen, wenn eine geschlossene Order gefunden wird, deren Close-Time größer ist als die der Variablen lastCloseTime. Auch wird sie abgebrochen, wenn keine Order später als lastCloseTime gefunden wurde, um nicht unnütz alle historischen Orders abzufragen.

traderdoc

MarkusWilhelm89 16.11.22 18:29

Danke für den Tipp.
Leider funktioniert es im StrategyTestern nicht.
Er verfällt in eine Schleife aus der erst nicht mehr raus kommt... also er läuft quasi gar nicht erst los da ich in der onTick erst mal nach newClose suche :-(

traderdoc 16.11.22 18:45

Das verstehe ich nicht.
In der unten geschriebenen Schleife kann er sich nicht verfangen.

Dann wäre es hilfreich, wenn Du den Code der OnTick-Funktion mal postest.

traderdoc

MarkusWilhelm89 16.11.22 19:05

Wie dumm von mir.
Hab gerade festgestellt dass ich einen Tippfehler drin hazte.
Statt i >= 0 hatte ich 1 >=0

Sorry... mit der Korrektur läuft er durch.
Ich lass ihn mal über Nacht laufen und melde mich demnächst ob es die Lösung war. Daaanke schonmal


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:56 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