Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3822
Beiträge: 36904
Benutzer: 6.071
Aktive Benutzer: 494
Links: 80
Wir begrüßen unseren neuesten Benutzer: Roerich
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 5 Stunden
- Roerich
vor 5 Stunden
- John_Liver...
vor 6 Stunden
- harry1001
vor 22 Stunden
- supadog
vor einem Tag
- POCJonah7

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 55
Gesamt: 56
Team: 0
Team:  
Benutzer:  fxnoob
Freunde anzeigen

Empfehlungen

Werbung

Like Tree4Likes
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 11.11.15
Mitglied
 
Registriert seit: Jun 2013
Beiträge: 220
Ca$hDigger befindet sich auf einem aufstrebenden Ast
Standard 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
  #2 (permalink)  
Alt 11.11.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.873
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
Ca$hDigger likes this.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 11.11.15
Mitglied
 
Registriert seit: Mar 2012
Beiträge: 131
Trabo befindet sich auf einem aufstrebenden Ast
Standard

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 likes this.
  #4 (permalink)  
Alt 12.11.15
Mitglied
 
Registriert seit: Jun 2013
Beiträge: 220
Ca$hDigger befindet sich auf einem aufstrebenden Ast
Standard

@ 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 Machst du Codeinterne Backtests oder wie?
  #5 (permalink)  
Alt 12.11.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.873
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #6 (permalink)  
Alt 12.11.15
Mitglied
 
Registriert seit: Jun 2013
Beiträge: 220
Ca$hDigger befindet sich auf einem aufstrebenden Ast
Standard

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ß
  #7 (permalink)  
Alt 12.11.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.873
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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 likes this.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #8 (permalink)  
Alt 12.11.15
Mitglied
 
Registriert seit: Jun 2013
Beiträge: 220
Ca$hDigger befindet sich auf einem aufstrebenden Ast
Standard

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ß
  #9 (permalink)  
Alt 12.11.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.873
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
Ca$hDigger likes this.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #10 (permalink)  
Alt 12.11.15
Mitglied
 
Registriert seit: Mar 2012
Beiträge: 131
Trabo befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Ca$hDigger Beitrag anzeigen

@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 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
Angehängte Grafiken
Dateityp: gif trabo-csv_array.gif (72,7 KB, 8x aufgerufen)
Thema geschlossen

Lesezeichen

Stichworte
historie, history, mql4, orderhistorie, orderhistory, programmierung, programmierung metatrader


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------