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)
-   -   Orderhistory anlegen? (http://www.expert-advisor.com/forum/showthread.php?t=4571)

Ca$hDigger 11.11.15 17:28

Orderhistory anlegen?
 
Hallo,

mal eine Frage zum auslesen der History. Ich möchte die Orderhistory in eine Reihe abspeichern indem nach dem schließen der Orders, diese in die Reihe gelegt werden. Zur Zeit lese ich nach jeder geschlossenen Order die letzte Order aus und lege sie in eine Reihe. Das einfache zur Zeit ist, dass maximal nur eine Order geöffnet ist somit reicht immer das auslesen von der letzten Order nach schließen der Order.

Ich suche jetzt nach eine Lösung/Logik die das Ganze mit mehreren Orders hinbekommt. Hier ist auch die Frage ob man für ein Ordercluster zB beim Pyramidenbau die selbe Magicnumber nimmt gibt es Vor oder Nachteile im Ordermanagement? Nehmen wir an es sind 10 Orders geöffnet und werden zur fast gleichen Zeit geschlossen, evt werden durch eine Verzögerung zu einem Tick 6 geschlossen und erst zum nächsten die restlichen 4 somit ist im Vorfeld nicht klar wieviele wirklich ausgelesen werde sollen.
Wie bekommt man eine immer aktuelle und korrekte History hin egal wieviele Orders zugleich geschlossen werden?

Grüße
C$D

traderdoc 11.11.15 17:57

Code:

void CheckHistoryOrders() {
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){
            //...
        }
      }
  } 
}

Die Reihenfolge des Schließens ist in der OrderHistorie festgelegt, d.h. die letzte geschlossene Order würde per o.g. Code zuerst ausgelesen werden.

traderdoc

Trabo 11.11.15 20:08

Ich habe hier ein anderen ansatz genommen, jede erteilte order wird bei mir in einem array geschrieben. So wie die letzten x ticks ins array gepackt wird.
Darüber wird alles verwaltet.
Auf die Orderhystory() greif ich nur bei evnetuelle änderungen auf.
Bsp. Neustart des System,TP oder SL gerissen.
Das gute ist das ich es hiermit schaffe ein tcikdatenbacktest mit über 500.000 trades in nur eine Minute und dieses auch zu 100% genau. ClusterBildung ist damit auch kein Problem.

Im real Betireb frisst es kaum Performance und ist extrem schnell und das bei einem komplzierten sourcecode...

Ca$hDigger 12.11.15 00:14

@ traderdoc
Die Herausforderung ist jetzt nur, dass die Einzel-Orderergbnisse (Pipwert: OrderClosePrice()-OrderOpenPrice()) nachdem mehrere Orders zur selben Zeit geschlossen wurden, korrekt in mein Array gelegt werden ([0] ist immer die letzte Order und die Reihe ist endlich zB 500 Felder).
Ich bin nicht sicher wie man das hinbekommt, vermute aber zB könnte man permanent die Anzahl der offenen Orders ermitteln und bei Änderung die Differenz zu vorher als Variable nutzen um die Anzahl der zu übertragenden Positionen zu bestimmen (für Schleife...)?. Oder man checkt einfach permanent direkt die History und ermittelt (wie auch immer das geht?) ob neue Orders in der History auftauchen und überträgt dann je nach Anzahl neuer geschlossener Orders genau dessen Pip-Ergebnisse ins Array...?

@Trabo
Ins Array soll es bei mir ja auch allerdings die Pipergebnisse der geschlossenen Orders schön der Reihe nach. ps: Was hat der tickdatenbacktest mit dem Ordermanagement zu tun? den Zusammenhang hab ich noch nicht ganz verstanden :o Machst du Codeinterne Backtests oder wie?

traderdoc 12.11.15 08:36

Was ich immer wieder bemerke ist, dass bei der Problemdarstellung keine eineindeutige Beschreibung gestellt wird. Daraus resultieren dann Lösungsansätze, die so nicht gewollt sind usw. usf.
Hier scheint mir das wieder der Fall zu sein und daher meine Bitte, um nochmalige glasklare Darlegung des Anliegens.

Was willst Du genau wann und wie erreichen?

traderdoc

Ca$hDigger 12.11.15 13:49

Ok ich versuchs nochmal präziser :)

Ein Array mit zB 500 Feldern soll die Pipergebnisse der geschlossenen Orders aufnehmen. Im Prinzip eine Orderhistory für die Pipergebnisse.

[0] entspricht der letzten Order, [1] die vorletzte und so weiter.
Wird eine Order geschlossen wird das Array aktualisiert also verrückt indem von hinten nach vorne die Werte den vorigen Wert übernehmen: [499]=[498],...,[1]=[0], [0]=letzteOrder.

Auf diese Weise ist die Reihe immer aktuell sofern nur eine Order geschlossen wird. Werden aber mehrere Orders gemeinsam geschlossen funktioniert dies nicht mehr da das Array ja dann über mehrere Werte aktualisiert werden müsste. Die Frage ist einfach wie das gehen könnte? Die weiterführende Frage ist eigentlich woher weiß der EA wieviele Orders er in das Array aktualisieren muss wenn dies immer unterschiedlich stattfindet also zB mal eine Order dann 7 dann 9 usw?

Gruß

traderdoc 12.11.15 14:45

Jo, damit kann man was anfangen.
Nun denn, das Charakteristikum einer geschlossenen Order ist die Variable OrderCloseTime(). Da die Orders sequentiell geschlossen werden, muß jede Order einen TimeStamp bekommen.
D.h. das Programm speichert die OrderCloseTime() der letzten geschlossenen Order. Mit jedem Tick wird geprüft, ob es eine neue geschlossene Order gibt (oder mehrere), die zeitlich jünger sind, als die gespeicherte Letzte.
Dies Anzahl wird gespeichert.
Nun wird mittels ArrayCopy() das Array x in ein Array y kopiert. Z.B. Deine 500 - der Anzahl neuer geschlossener Orders (z.B. 5), d.h. Es werden die letzten 495 Orders des Arrays x mit dem Index 0 bis 494 in das Array y mit dem Index 5 bis 499 kopiert und die neuen 5 Orders in das Array y mit dem Index 0 bis 4. Zum Schluß wird ggf. das gesamte Array y wieder mittels ArrayCopy() in das Array x kopiert. Fertig!

Ich sitze leider z.Z. nicht am PC, daher die erläuternde Trockenübung.

traderdoc

Ca$hDigger 12.11.15 17:11

Danke, mir ging es auch in erster Linie um das Konzeptionelle. Das die Orders sequentiell geschlossen werden wusst ich noch nicht (hab bisher immer nur mit einer Order gearbeitet).
Also das heißt, wenn jede Order zu 100% ein anderes OrderCloseTime() hat, dann ist das Problem der Identifizierung in der Reihe gelöst, so wie von dir beschrieben, prima :)

Jetzt noch eine andere Frage zum sequentiell, nehmen wir an es sind 7 Orders offen und sollen geschlossen werden hat jemand einen Beispielcode? Sollten dafür dann die selbe Magic haben oder?

Gruß

traderdoc 12.11.15 18:04

So, ich schiebe den Code mal nach:

Code:

//bei den globalen Variablen deklarieren
datetime LastCloseTime;

void CheckHistoryOrders() {
  datetime lct = 0;
  int i, count = 0;
  for (i = OrdersHistoryTotal() - 1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
            if (i == OrdersHistoryTotal() - 1) {
              if (OrderCloseTime() ==  LastCloseTime) break;
              lct = OrderCloseTime();
            }
            if (OrderCloseTime() > LastCloseTime) count++;
        }
      }
  }
  if (lct > LastCloseTime) LastCloseTime = lct;     

  if (count > 0) {
      int cnt = 0;
      ArrayCopy(Array_B, Array_A, count, count, ArraySize(Array_A)-count);
      for (i = OrdersHistoryTotal() - 1; i >= 0; i--) {
        if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
              //hier in das Array_B schreiben
              //Array_B[cnt] = .....
              cnt++;
              if (cnt == count) break;
            }
        }
      }
      ArrayCopy(Array_A, Array_B, 0, 0, WHOLE_ARRAY);
  } 
}

Nicht getestet!

traderdoc

Trabo 12.11.15 20:37

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Ca$hDigger (Beitrag 31654)

@Trabo
Ins Array soll es bei mir ja auch allerdings die Pipergebnisse der geschlossenen Orders schön der Reihe nach. ps: Was hat der tickdatenbacktest mit dem Ordermanagement zu tun? den Zusammenhang hab ich noch nicht ganz verstanden :o Machst du Codeinterne Backtests oder wie?

Bei mir steht so ziemlich alles im array, vom schlupf, aufgenommenen spread bis hin zum tatsächlichen ausführungs spread sowie die strategie welche gerade die position verfolgt. Das gute ist das du dann auch mit tralinings arbeiten kannst und dabei spielt es keine rolle wieviel offenen order vorhanden sind.

Wenn du hier hier immer auf Mt4 zugreifst wird alles ganz langsam tick zu tick...

Nunja wenn du auf tickbasis backtestest und der quellcode nicht schnell durchrennt wartest du ewig, eine optimierung ist dann eher langsam und man wartet nur.
Ich häng mal mein bild vom array ab, das ist ein teil ausschnitt :rolleyes:


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