OrderSelect() immer true egal ob MODE_TRADES order MODE_HISTORY

Einloggen oder registrieren, um einen Kommentar zu schreiben
Susi1600
11
Susi1600  

Liebe Community, 

ich hoffe Ihr könnt mir bei meinem Problem helfen.
Ich möchte prüfen, ob meine ausgelöste Pending Order zwischenzeitlich geschlossen wurde.

Ich dachte dabei an 

if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY))

Diese Abfrage liefert mir ein true zurück. Allerdings auch, wenn der Order noch aktiv ist, also bei Status ORDER_BUY/ORDER_SELL - somit liefert die Abfrage ein falsches Ergebnis.
Versuche ich es nun mit der gleichen Abfrage nur jedoch mit MODE_TRADES, bekomme ich auch ein true.

Das heißt, OrderSelect liefert sowohl mit MODE_HISTORY als auch mit MODE_TRADES ein true. Gleiche Uhrzeit, gleiches Ticket - habe ich hier etwas falsch verstanden, oder gibt es noch einen anderen Weg, abzufragen, ob eine Order geschlossen wurde?

Frage OrderCloseTime ab , wie es in der Doku steht, dann komme ich auch auf keinen grünen Zweig. 

if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY) && (OrderCloseTime() != 0))

Auch diese Abfrage gibt beim laufenden Order ein true zurück. Print OrderCloseTime ergibt 01.01.1970 - was ja eigentlich 0 ist, aber scheinbar ist es doch nicht 0 ?!?

Weiß hier jemand Rat?

Carl Schreiber
Moderator
7072
Carl Schreiber  
  1. Der Modus SELECT_BY_TICKET benötigt keine Poolangabe (siehe nach F1 in der Referenz des Editors!)
  2. Wenn das Ticket existiert, egal in welchem Pool, ist OrderSelect() immer true!
  3. Vielleicht ist Ticket falsch?
Susi1600
11
Susi1600  
Carl Schreiber:
  1. Der Modus SELECT_BY_TICKET benötigt keine Poolangabe (siehe nach F1 in der Referenz des Editors!)
  2. Wenn das Ticket existiert, egal in welchem Pool, ist OrderSelect() immer true!
  3. Vielleicht ist Ticket falsch?

Danke für die Antwort.
Wenn es keine Poolangabe benötigt, wofür kann ich sie dann machen? Nur so ein Gedanke... 

Das Ticket ist richtig. Abgesehen davon - wie kann ich dann abfragen, ob die Order noch offen oder bereits geschlossen ist?

Da die OrderCloseTime() auch nicht 0 zurückgibt, wie sie eigentlich sollte, habe ich nun eine etwas unschöne Abfrage, mit der es funktioniert:

if(OrderSelect(ticket, SELECT_BY_TICKET)
   && (
	(OrderClosePrice() != OrderStopLoss()) 
	&& (OrderClosePrice() != OrderTakeProfit())
	&& (OrderClosePrice() != OrderOpenPrice()))
   )
{
// Close Order...
}


Geht das irgendwie kürzer oder "schöner"?

Carl Schreiber
Moderator
7072
Carl Schreiber  
  1. OrderSelect() kann  direkt mit dem Ticket eine Order auswählen (egal wo) oder über eine Laufnummer in einer Schleife, dafür muss man dann den Pool angeben: History oder Offen.
  2. Warum nimmst Du nicht das Beispiel aus der Referenz (Kursor auf OrderCloseTime() & F1):
    //original: if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true) // org 
    if(OrderSelect(ticket,SELECT_BY_TICKET)==true) // für Dich :)
        { 
         datetime ctm=OrderOpenTime(); 
         if(ctm>0) Print("Open time for the order 10 ", ctm); 
         ctm=OrderCloseTime(); 
         if(ctm>0) Print("Close time for the order 10 ", ctm); 
         else { ... }
        } 
      else 
        Print("OrderSelect failed error code is",GetLastError());
     
    
    


Christian
2095
Christian  
Susi1600:

Danke für die Antwort.
Wenn es keine Poolangabe benötigt, wofür kann ich sie dann machen? Nur so ein Gedanke... 

Das Ticket ist richtig. Abgesehen davon - wie kann ich dann abfragen, ob die Order noch offen oder bereits geschlossen ist?

Da die OrderCloseTime() auch nicht 0 zurückgibt, wie sie eigentlich sollte, habe ich nun eine etwas unschöne Abfrage, mit der es funktioniert:


Geht das irgendwie kürzer oder "schöner"?

Hallo Susi , ich hoffe du schreibst in MQL5.

Schöner getht es wenn du die Server Ereignisse die per OnTradeTransaction() zurückkommen selber auswertest.

So weißt wann die Order ausgeführt wurde weil dann OnTradeTransaction() angelaufen wird.

Es ist ein wenig mehr Aufwand am Anfang aber so hast du vollen Zugriff auf das Trade-Management zwischen MT5 und dem Trade-Server

Kurz gesagt wird jedes mal wenn sich der Status eines Order ändert ( akzeptiert vom Server, Ausgeführt,geändert,closed,) wird OnTradeTransaction() angelaufen .


Hier ein Artikel dazu -> https://www.mql5.com/de/articles/40

https://www.mql5.com/de/docs/basis/function/events

Gruß Christian

Handels-Ereignisse im Expert Advisor mit Hilfe der OnTrade() Funktion bearbeiten
Handels-Ereignisse im Expert Advisor mit Hilfe der OnTrade() Funktion bearbeiten
  • 2016.01.11
  • KlimMalgin
  • www.mql5.com
Bevor wir beginnen, beschreibe ich zunächst ganz allgemein wie Handels-Ereignisse funktionieren sowie kurz alle dafür notwendigen Details. Jedes Mal wenn eine Handels-Operation abgeschlossen ist, wir das Handels-Ereignis erzeugt. Und ebenfalls jedes Mal nach einem erzeugten Handels-Ereignis wird die OnTrade() Funktion aufgerufen. Die...
Einloggen oder registrieren, um einen Kommentar zu schreiben