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:

traderdoc 12.11.15 20:53

Aber irgendwie müssen diese Daten ja auch in die Excel-Tabelle geschrieben werden und wenn sie verarbeitet werden sollen, müssen sie wieder ausgelesen werden und wenn sich was verändert, müssen die Daten wieder aktualisiert werden - Tick für Tick.

Welches Programm führt denn diese ganzen Operationen aus?
Weiterhin steht die Frage, ob man auch tatsächlich all die Daten benötigt oder ob da ne Menge Feldleichen rumliegen.

Desweiteren operierst Du mit offenen Trades, er mit geschlossenen.

traderdoc

Trabo 12.11.15 21:19

Die Export funktion wird nur erinmal gebraucht, das ist am ende vom Backtest.
Im real Betrieb wird die CSV erst dann geschrieben wenn sich was an der orderstruktur geändert hat. (BSP. tp oder Sl getriggert)
Nach einem neustart wird synchronisiert.
Das Array ist variabel aufgebaut damit nicht zusätzliche performance verbraucht wird.

Das einzige was Tick bei Tick läuft, ist
vergleich Mt4.OPenOrder() zu MyArray.OpenOrder() ist ungleich dann Synchro
MyArray.Bit() = bit
MyArray.Ask() = Ask

das wars, den rest wird intern verwaltet. (selbst die berechnete strategie mit einstiegskurs kommt da rein, sodass es sich bei jedem Tick genau einkaufen kann)

(Wie ich operriere nur mit offenen order ? wer sagt das ? )
Ich operiere mit OffnenOrder wie mit geschlossenen order.
Geschlossene Order für z.b. Moneymamagement. ist die Strategieequity größer als gleitender durchschnitt von 20, dann geh %risk rein ansonsten geh mit 0,01lot rein.
Oder halt für andere zwecke...

Feldleichen sind mir bis jetzt nicht bewusst, das ist halt das was ich so brauche...

Verwalten tut das Mt4 :)

traderdoc 12.11.15 22:06

Nun ja, wie Du selbst geschrieben hast, verwalten muß alles MT4. Nur warum soll man alles in eine csv auslagern, um es für Berechnungen wieder laden zu müssen?

Aber ok, es führen bekanntlich mehrere Wege nach Rom.

traderdoc

Trabo 12.11.15 22:45

Zitat:

Zitat von traderdoc (Beitrag 31667)
Nun ja, wie Du selbst geschrieben hast, verwalten muß alles MT4. Nur warum soll man alles in eine csv auslagern, um es für Berechnungen wieder laden zu müssen?

Aber ok, es führen bekanntlich mehrere Wege nach Rom.

traderdoc

Wer sagt was von immer wieder laden ?
Du schreibst asl erstes man muss es bei jeden Tick machen, das ist schonmal nicht so.;)

Einmal laden:
Daten aufzeichen, und alle Berrechnung werden intern geführt.

Ganz einfach zeig mir bitte ein backtest was über 100.000 offene trades verwalten kann und die am besten noch mit einem trailing. :)

P.s. Genau ich nimm aber den schnellsten weg, der andere dauert mir zu lange ;)

traderdoc 12.11.15 23:32

Wie willst Du denn trailen, wenn Du nicht mit jedem Tick den neuen Kurs verarbeitest? Jede einzelne Order kann nur bearbeitet werden, indem sie einzeln und nacheinander die entsprechenden Prozeduren durchlaufen.
Wie oft nun auch immer und was auch immer geladen werden muß, jede Order muß verwaltet werden.
Nun kommt es auf das Handelssystem an, wie SL und TP, Ordergröße bzgl. Teilverkäufe etc. verwaltet werden. Wenn des HS nur darauf hinläuft, eine Order zu setzen, den SL und TP an die Order binden und darauf warten, dass die eine oder andere Linie getriggert wird und die Order per Broker automatisch geschlossen wird, dann läßt man es halt einfach laufen. Nur dazu braucht man genauso wenig eine csv-Datei zu beschreiben, außer man will sofort alle Orders auf einen Blick haben. Nur wozu?
Und nochmal, jede Order, die aufwändiger verwaltet werden muß, weil die Stops als hidden gesetzt worden, weil tickgenaue Überwachung stattfinden muß, weil Teilschließungen oder Zukäufe oder tickgenaues Trailing gewollt ist, muß Tick für Tick alle notwendigen Prozeduren durchlaufen werden.
Da beißt die Maus keinen Faden ab.

traderdoc


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