MQL4 - OrderSelect Fehler ???

Markus Wilhelm
186

Hallo,
ich habe ein Problem mit meiner OrderSelect Funktion und hoffe mir kann jemand helfen.

Grundprinzip:
Mein EA eröffnet MarketOrder's + PendingOrder's (Grid-System)
Ich möchte mit meiner Funktion den Eröffnungspreis der neuesten "Market"-Order selektieren. D.h. sobald eine PendingOrder zur MarketOrder wird, will ich den OrderOpenPrice() abrufen.

Problem:
Wenn der EA die Order mit der TicketNr #1 ausführt, erkennt er das korrekt.
Wenn der EA danach die (Pending)Order mit der TicketNr #2 eröffnet, erkennt er das korrekt.
Wenn der EA danach die (Pending)Order mit der TicketNr #4 eröffnet, erkennt er das korrekt
Wenn der EA danach die (Pending)Order mit der TicketNr #3 eröffnet, erkennt es es nicht.


Ich nutze wie immer die klassische for-Schleife um alles durchzugehen.
Nur im oben beschriebenen Beispiel, erkennt er die neueste Ausführung nicht (liegt es daran dass die TicketNr < also die vorherige ist?)

Hat jemand eine Idee oder Tipp wie ich das korrigieren kann?

Über Tipps/Ideen/Lösungen würde ich mich sehr freuen.


double Newest_Open_Price=0;      for(int i=0;i<OrdersTotal();i++)  if(OrderSelect(i,SELECT_BY_POS)  &&OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber && (OrderType()==OP_BUY||OrderType()==OP_SELL))   Newest_Open_Price= NormalizeDouble(OrderOpenPrice(),Digits);
Carl Schreiber
Moderator
12310
Carl Schreiber  
OnTradeTransaktio() ist die Funktion, die Du suchst.
Dokumentation zu MQL5: Ereignisbehandlung / OnTradeTransaction
Dokumentation zu MQL5: Ereignisbehandlung / OnTradeTransaction
  • www.mql5.com
OnTradeTransaction - Ereignisbehandlung - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
Markus Wilhelm
186
Markus Wilhelm  
Carl Schreiber:
OnTradeTransaktio() ist die Funktion, die Du suchst.

Hi,

danke für den Hinweis.

Die Funktion ist mir neu :-)

Ist das auch für MQL4 oder nur für MQL5?

Wenn ich mir den Bsp Code betrachte und in mein MQL4 rein kopiere, bringt er mir einige Fehlermeldungen

Carl Schreiber
Moderator
12310
Carl Schreiber  
Markus Wilhelm:

Hi,

danke für den Hinweis.

Die Funktion ist mir neu :-)

Ist das auch für MQL4 oder nur für MQL5?

Wenn ich mir den Bsp Code betrachte und in mein MQL4 rein kopiere, bringt er mir einige Fehlermeldungen

Ja, das ist wohl so, für MT4 nicht verfügbar - (MT5 ist halt in einigen Dingen besser).

Dann bliebe nur immer wieder alles abfragen, da auch OrdersTotal() nicht zwichen Pending und realen Positionen unterscheidet.

Merk Dir bei der Eröffnung die Ticketnummer und dann, kannst Du mit OrderSelet() direkt diese Order auswählen und nach dem Staus abfragen: OrderType().

OrdersTotal - Trade Functions - MQL4 Reference
OrdersTotal - Trade Functions - MQL4 Reference
  • docs.mql4.com
OrdersTotal - Trade Functions - MQL4 Reference
Markus Wilhelm
186
Markus Wilhelm  
Carl Schreiber:

Ja, das ist wohl so, für MT4 nicht verfügbar - (MT5 ist halt in einigen Dingen besser).

Dann bliebe nur immer wieder alles abfragen, da auch OrdersTotal() nicht zwichen Pending und realen Positionen unterscheidet.

Merk Dir bei der Eröffnung die Ticketnummer und dann, kannst Du mit OrderSelet() direkt diese Order auswählen und nach dem Staus abfragen: OrderType().



Puh, da steh ich bisschen auf dem Schlauch, wie das in der Umsetzung aussehen sollte... :-/

Meinst du damit, beim Platzieren einer (Pending)-Order die TicketNr und den OrderType() jeweils in einem Array abspeichern und das dann später durch gehen?

Carl Schreiber
Moderator
12310
Carl Schreiber  
Markus Wilhelm:



Puh, da steh ich bisschen auf dem Schlauch, wie das in der Umsetzung aussehen sollte... :-/

Meinst du damit, beim Platzieren einer (Pending)-Order die TicketNr und den OrderType() jeweils in einem Array abspeichern und das dann später durch gehen?

Na, dann trag doch einfach mal OrderSelect() oben rechts in das Suchfeld ein lies, was dort gefunden wird - es wird schon etwas passendes dabei sein.
Markus Wilhelm
186
Markus Wilhelm  
Carl Schreiber:
Na, dann trag doch einfach mal OrderSelect() oben rechts in das Suchfeld ein lies, was dort gefunden wird - es wird schon etwas passendes dabei sein.



Da habe ich leider nichts gefunden was mir weiter hilft, deshalb habe ich gehofft das mir jemand hier im Forum helfen kann.

Mir geht es ja auch darum, die verschiedenen Funktionen selbst kennen zu lernen, daher die Frage.... mich interssiert einfach die Programmierung


Was ich gesehen habe ist ein Beitrag, in dem beschrieben wird wie man TicketNr + TicketTyp in einem Multi-Array speichert und bei jedem neuen Tick dann wieder alle Orders durchgeht und in einem Multi-Array speichert.

Danach vergleicht man beide Multi-Arrays miteinandner... Leider ist das noch weit über meinem Kentnissstand der Programmierung :-(

Carl Schreiber
Moderator
12310
Carl Schreiber  
Entschuldige, aber da kann man Dir nicht helfen. Mit einer kurzen Suche habe ich einen ganzen Artikel gefunden über Ereignisse in MT4 - mehr kann Dir niemand sagen. Ein bisschen muss man schon selber machen.
Michael Martens
274
Michael Martens  

Also die neuste Order zu finden stellt kein Problem dar. Da braucht man auch kein Multi Array für.

Eine wie Du sie nennst "Market" Order (=laufende Trades) hat ja immer den OrderTyp OP_BUY oder OP_SELL - alle Pending Orders haben OP_BUY/SELL als LIMIT oder STOP. In Kombination mit OrderOpenTime() findet man dann schnell die neuste.

Geht dann so in dem Stil:

datetime SavedOrderTime = 0;

int OrderSavedTicket;

for  (Deine Schleife von oben)....

if (OrderOpenTime()>SavedOrderTime) {

OrderSavedTicket = OrderTicket();

SavedOrderTime=OrderOpenTime(); }

(Schleife wieder zu).


Falls Du mehr Hilfe brauchst, gerne per Skype.

Markus Wilhelm
186
Markus Wilhelm  
Michael Martens:

Also die neuste Order zu finden stellt kein Problem dar. Da braucht man auch kein Multi Array für.

Eine wie Du sie nennst "Market" Order (=laufende Trades) hat ja immer den OrderTyp OP_BUY oder OP_SELL - alle Pending Orders haben OP_BUY/SELL als LIMIT oder STOP. In Kombination mit OrderOpenTime() findet man dann schnell die neuste.

Geht dann so in dem Stil:

datetime SavedOrderTime = 0;

int OrderSavedTicket;

for  (Deine Schleife von oben)....

if (OrderOpenTime()>SavedOrderTime) {

OrderSavedTicket = OrderTicket();

SavedOrderTime=OrderOpenTime(); }

(Schleife wieder zu).


Falls Du mehr Hilfe brauchst, gerne per Skype.



Hi, danke. Funktioniert leider nicht.

Gerne können wir uns per Skype mal austauschen :-)

Wie kann ich dich über Skype erreichen?

Michael Martens
274
Michael Martens  
Markus Wilhelm:

Wie kann ich dich über Skype erreichen?

In meinem Profil findest Du alle Daten :).