OrderSelect

Auswahl des Auftrags für die weitere Arbeit.  Gibt true bei erfolgreicher Funktionsausführung zurück. Gibt false bei fehlerhafter Funktionsausführung zurück. Um Information zum Fehler zu bekommen, muss die Funktion GetLastError() aufgerufen werden.

bool  OrderSelect(
   ulong   ticket,      // Orderticket
   );

Parameter

ticket

[in]  Orderticket.

Rückgabewert

Wert vom Typ bool.

Hinweis

Man darf gültige schwebende Aufträge nicht mit Positionen verwechseln, die auch in der Registerkarte "Handel" in der Wekzeugleiste "Instrumente" des Client-Terminals dargestellt werden.

Im Netting Mode (ACCOUNT_MARGIN_MODE_RETAIL_NETTING und ACCOUNT_MARGIN_MODE_EXCHANGE) kann nur eine Position pro Symbol vorhanden sein, die das Ergebnis eines oder mehrerer Handelsgeschäfte darstellt. Man darf Positionen und aktuelle Pending Orders, die auch im Tab Handel in der Werkzeugleiste angezeigt werden, nicht miteinander verwechseln.

Bei einer unabhängigen Verrechnung von Positionen (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) können gleichzeitig mehrere Positionen für ein Symbol existieren.

Funktion OrderSelect() kopiert Daten über die Order in die Programmumgebung und ermöglicht die weiteren Aufrufe von OrderGetDouble(), OrderGetInteger(), OrderGetString(), um die jeweiligen Daten abzurufen. Das bedeutet, dass die Order selbst nicht mehr existiert könnte (oder sich Eröffnungspreis, Stop Loss, Take Profit oder Gültigkeitsfrist verändert haben), aber alten Daten dieser Order könnten trotzdem noch vorhanden sein. Um die neuesten Daten einer Position zu erhalten, ist es empfehlenswert, die Funktion PositionSelect() aufzurufen, bevor man diese Daten verwendet.

Beispiel:

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // Abstand vom aktuellen Preis, um die Order zu platzieren, in Punkten
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // Order-Typ
#define   VOLUME        1.0                     // Volumen
#define   DEVIATION     2                       // erlaubte Abweichung vom Preis
 
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- Handelsanfrage, Ergebnis und Variablen deklarieren und initialisieren
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   double          order_price=0;
   
//--- Parameter der Pending-Orders
   request.action    = TRADE_ACTION_PENDING;                               // Typ der Handelsoperation
   request.symbol    = _Symbol;                                            // Symbol
   request.volume    = VOLUME;                                             // Volumen
   request.deviation = DEVIATION;                                          // erlaubte Abweichung vom Preis
   request.magic     = EXPERT_MAGIC;                                       // MagicNumber der Order
   
//--- Prüfen des Auftragstyps
   switch(DIRECTION)
     {
      case ORDER_TYPE_BUY_LIMIT :
        request.type = ORDER_TYPE_BUY_LIMIT;                               // Order-Typ
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// Order-Preis
        request.priceNormalizeDouble(order_price_Digits);              // normalisierter Order-Preis
        break;
      case ORDER_TYPE_SELL_LIMIT :
        request.type = ORDER_TYPE_SELL_LIMIT;                              // Order-Typ
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// Order-Preis
        request.priceNormalizeDouble(order_price,_Digits);               // normalisierter Eröffnungspreis
        break;
      case ORDER_TYPE_BUY_STOP :
        request.type = ORDER_TYPE_BUY_STOP;                                // Order-Typ
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)+OFFSET*_Point;// Eröffnungspreis
        request.priceNormalizeDouble(order_price,_Digits);               // normalisierter Eröffnungspreis
        break;
      case ORDER_TYPE_SELL_STOP :
        request.type = ORDER_TYPE_SELL_STOP;                               // Order-Typ
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)-OFFSET*_Point;// Eröffnungspreis
        request.priceNormalizeDouble(order_price,_Digits);               // normalisierter Eröffnungspreis
        break;
      default// wenn eine nicht-schwebende oder StopLimit-Order gewählt wurde
        Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
        break;
     }
 
//--- eine Anfrage senden. Wenn das Senden einer Anfrage fehlgeschlagen ist, zeige den Fehlercode an und beende den Vorgang
   if(!OrderSend(requestresult))
     {
      Print("OrderSend error "GetLastError());
      return;
     }
     
//--- Operationsdaten anzeigen
   PrintFormat("Trade request result: retcode=%u, order=%I64u"result.retcoderesult.order);
   
//--- Order-Ticket aus dem Handelsoperationsergebnis abrufen und die Order nach Ticket auswählen
   ulong ticket=result.order;
   ResetLastError();
   if(!OrderSelect(ticket))
     {
      PrintFormat("OrderSelect(%I64u) failed. Error %d"ticketGetLastError());
      return;
     }
 
//--- Daten der per Ticket ausgewählten Order im Journal anzeigen
   ENUM_ORDER_TYPE   type  = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
   long              time  = OrderGetInteger(ORDER_TIME_SETUP_MSC);
   double            price = OrderGetDouble(ORDER_PRICE_OPEN);
   double            volumeOrderGetDouble(ORDER_VOLUME_CURRENT);
   string            symbolOrderGetString(ORDER_SYMBOL);
   int               digits= (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   PrintFormat("Current selected order: %s %.2f %s #%I64u at %.*f, %s",
               symbolvolumeOrderTypeDescription(type), ticketdigitspriceTimeMscToString(time));
   /*
  Ergebnis:
   Trade request resultretcode=10009order=2811006719
   Current selected orderEURUSD 1.00 Buy Limit #2811006719 at 1.105502024.09.04 10:38:28.563
   */
  }
//+------------------------------------------------------------------+
//| Rückgabe der Zeit in Millisekunden                               |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '0'));
  }
//+------------------------------------------------------------------+
//| Rückgabe der Beschreibung des Auftragstyps                       |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE type)
  {
   switch(type)
     {
      case ORDER_TYPE_BUY              :  return("Buy");
      case ORDER_TYPE_SELL             :  return("Sell");
      case ORDER_TYPE_BUY_LIMIT        :  return("Buy Limit");
      case ORDER_TYPE_SELL_LIMIT       :  return("Sell Limit");
      case ORDER_TYPE_BUY_STOP         :  return("Buy Stop");
      case ORDER_TYPE_SELL_STOP        :  return("Sell Stop");
      case ORDER_TYPE_BUY_STOP_LIMIT   :  return("Buy Stop Limit");
      case ORDER_TYPE_SELL_STOP_LIMIT  :  return("Sell Stop Limit");
      default                          :  return("Unknown order type");
     }
  }

Siehe auch

OrderGetInteger(), OrderGetDouble(), OrderGetString(), OrderCalcProfit(), OrderGetTicket(), Ordereigenschaften

OSZAR »