MetaTrader 5 herunterladen

OrderSend

Funktion OrderSend() ist für die Handelsaktivitaet innerhalb MQL5 bestimmt.

bool  OrderSend(
   MqlTradeRequest&  request      // Anforderungsstruktur 
   MqlTradeResult&   result       // Antwortstruktur 
   );

Parameter

request

[in] Anzeiger auf die Struktur  des Typs MqlTradeRequest, die Handelshandlung des Kunden beschreibt.

result

[in,out]  Anzeiger auf die Struktur  des MqlTradeResult, die das Ergebnis der Handelsoperation beschreibt, wenn diese erfolgreich durchgeführt ist (kehrt zurück beim true).

Rückgabewert

Wenn die Basenstrukturpruefung erfolgreich durchgeführt wird (Anzeigerpruefung) kommt true zurück - das bekundet erfolgreiche Operationsausführung nicht . Um die ausführliche Beschreibung vom Ergebnis der Funktiondurchführung zu bekommen, muss man Felder der Struktur result analysieren.

Hinweis

Die Handelsanfrage geht durch mehrere Stadien der Prüfungen auf dem Handelsserver. Zunächst wird überprüft, ob alle benötigten Felder des Parameter request korrekt ausgefüllt werden. Wenn es keine Fehler gibt, akzeptiert der Server die Order für die weitere Bearbeitung. Wird die Order erfolgreich vom Handel-Server akzeptiert, gibt die Funktion OrderSend() den Wert true zurück.

Es ist empfehlenswert, die Anfrage vor dem Senden an Handel-Server selbständig zu überprüfen. Um die Anfrage zu überprüfen, verwenden Sie die Funktion OrderCheck(). Sie prüft, ob es genügend Mittel für die Ausführung der Handelstransaktion gibt und gibt viele nützliche Parameter in den Ergebnissen der Prüfung von Handelsanfrage zurück:

  • Rückgabekode, der über Fehler in der Prüfanfrage informiert;
  • Wert der Bilanz nach Ausführung der Handelsoperation;
  • Wert der Eigenmittel nach Ausführung der Handelsoperation;
  • Wert des fließenden Gewinns nach Ausführung der Handelsoperation;
  • Grösse der Marge, die für die erforderliche Handelsoperation notwendig ist;
  • Grösse der freien Eigenmittel, die nach Ausführung der erforderlichen Handelsoperation bleiben;
  • Level der Marge nach Ausführung der erforderlichen Handelsoperation;
  • Kommentar zum Antwort-Code, Beschreibung des Fehlers.

Es ist bei der Ausstellung der Markt-Order zu beachten, dass der erfolgreiche Abschluss der Arbeit des Modus OrderSend() nicht immer eine erfolgreiche Ausführung des Deals bedeutet. Man muss in der zurückgegebenen Struktur des Ergebnisses result den Wert retcode, der den Rückgabekode des Handel-Servers enthält, und auch den Wert der Felder deal oder order je nach Typ der Operation überprüfen.

Jede angenommene Order wird auf dem Handel-Server während des Wartens auf die Bearbeitung aufbewahrt, solange bis eine der Bedingungen für ihre Ausführung erfüllt wird:

  • Gültigkeitsablauf,
  • Erscheinen einer entgegenkommenden Anfrage,
  • Auslösen der Order beim Erhalt von Ausführungspreis,
  • Eingang einer Anfrage für die Stornierung der Order.

Zum Zeitpunkt der Orderbearbeitung sendet der Handel-Server eine Meldung an das Terminal über das Auftreten von Handelsereignis Trade, das mit der Funktion OnTrade() bearbeitet werden kann.

Das Ergebnis der Ausführung des Handelsanfrage, das mit der Funktion OrderSend() gesendet wurde, kann mit Hilfe des Handlers OnTradeTransaction auf dem Server verfolgt werden. Dabei ist es zu beachten, dass als Ergebnis der Ausführung eines Handels-Anfrage der Handler OnTradeTransaction mehrmals aufgerufen wird.

Zum Beispiel, beim Senden Marktkauforder, wird Marktkauforder behandelt und eine entsprechende Marktkauforder für das Konto erstellt. Ist die Order ausgeführt, wird sie aus der Auftragsliste entfernt und zur Ordergeschichte hinzugefügt. Dann wird der entsprechende Deal zur Geschichte hinzugefügt und eine neue Position wird erstellt. Für jedes dieser Ereignisse wird die Funktion OnTradeTransaction aufgerufen.

Beispiel:

//--- Werte für ORDER_MAGIC
input long order_magic=55555;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- vergewissern wir uns, dass der Kode ein Uebungskode ist 
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
     {
      Alert("Arbeit des Scripts im realen Konto ist verboten!");
      return;
    ;}
//--- stellen wir Order ein oder entfernen sie 
   if(GetOrdersTotalByMagic(order_magic)==0) 
     {
      //--- keine laufende Order - stellen wir Order ein 
      uint res=SendRandomPendingOrder(order_magic);
      Print("Rückgabekode des Handelsservers ",res);
    ;}
   else // es gibt Order - entfernen wir Order 
     {
      DeleteAllOrdersByMagic(order_magic);
    ;}
//---
 ;}
//+--------------------------------------------------------------------+
//| Laufende Anzahl der Order mit dem angegebenen ORDER_MAGIC erhalten |
//+--------------------------------------------------------------------+
int GetOrdersTotalByMagic(long const magic_number)
  {
   ulong order_ticket;
   int total=0;
//--- gehen wir durch alle wartenden Order 
   for(int i=0;i<OrdersTotal();i++)
      if((order_ticket=OrderGetTicket(i))>0)
         if(magic_number==OrderGetInteger(ORDER_MAGIC)) total++;
//---
   return(total);
 ;}
//+---------------------------------------------------------------------+
//| Entfernen wir alle wartenden Ordern mit dem angegebenen ORDER_MAGIC |
//+---------------------------------------------------------------------+
void DeleteAllOrdersByMagic(long const magic_number)
  {
   ulong order_ticket;
//---gehen wir durch alle wartenden Order  
   for(int i=0;i<OrdersTotal();i++)
      if((order_ticket=OrderGetTicket(i))>0)
         //--- Order mit dem passenden ORDER_MAGIC
         if(magic_number==OrderGetInteger(ORDER_MAGIC))
           {
            MqlTradeResult result={0};
            MqlTradeRequest request={0};
            request.order=order_ticket;
            request.action=TRADE_ACTION_REMOVE;
            OrderSend(request,result);
            //--- geben wir in log Serverantwort aus   
            Print(__FUNCTION__,":",result.comment,"Antwortkode",result.retcode);
          ;}
//---
 ;}
//+------------------------------------------------------------------+
//| Die zufaellig wartende Order einstellen                          |
//+------------------------------------------------------------------+
uint SendRandomPendingOrder(long const magic_number)
  {
//--- bereiten wir eine Anforderung vor 
   MqlTradeRequest request={0};
   request.action=TRADE_ACTION_PENDING;         // Einstellung der wartenden Order 
   request.magic=magic_number;                  // ORDER_MAGIC
   request.symbol=_Symbol;                      // Instrument
   request.volume=0.1;                          // Volumen 0.1 Lot
   request.sl=0;                                // Stop Loss nicht angegeben 
   request.tp=0;                                // Take Profit nicht angegeben     
//--- formieren wir Ordertyp 
   request.type=GetRandomType();                // Ordertyp
//---formieren wir den Preis für die wartende Order 
   request.price=GetRandomPrice(request.type);  // Eroeffnungspreis 
//--- senden wir die Handelsorder 
   MqlTradeResult result={0};
   OrderSend(request,result);
//--- geben wir in log die Serverantwort aus   
   Print(__FUNCTION__,":",result.comment);
   if(result.retcode==10016) Print(result.bid,result.ask,result.price);
//--- geben wir Antwortkode des Handelsservers zurück 
   return result.retcode;
 ;}
//+------------------------------------------------------------------+
//| Zufaellig Typ der wartenden Order erhalten                       |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE GetRandomType()
  {
   int t=MathRand()%4;
//---   0<=t<4
   switch(t)
     {
      case(0):return(ORDER_TYPE_BUY_LIMIT);
      case(1):return(ORDER_TYPE_SELL_LIMIT);
      case(2):return(ORDER_TYPE_BUY_STOP);
      case(3):return(ORDER_TYPE_SELL_STOP);
    ;}
//--- ungueltiger Wert 
   return(WRONG_VALUE);
 ;}
//+------------------------------------------------------------------+
//| Zufaellig den Preis erhalten                                     |
//+------------------------------------------------------------------+
double GetRandomPrice(ENUM_ORDER_TYPE type)
  {
   int t=(int)type;
//--- Stoplevel für Symbol 
   int distance=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
//--- erhalten wir Daten des letzten Ticks 
   MqlTick last_tick={0};
   SymbolInfoTick(_Symbol,last_tick);
//--- berechnen wir den Preis entsprechend dem Typ 
   double price;
   if(t==2 || t==5) // ORDER_TYPE_BUY_LIMIT oder ORDER_TYPE_SELL_STOP
     {
      price=last_tick.bid; // gehen wir vom Preis Bid aus
      price=price-(distance+(MathRand()%10)*5)*_Point;
    ;}
   else             // ORDER_TYPE_SELL_LIMIT oder ORDER_TYPE_BUY_STOP
     {
      price=last_tick.ask; // gehen wir vom Preis Ask aus
      price=price+(distance+(MathRand()%10)*5)*_Point;
    ;}
//---
   return(price);
 ;}

Sehen Sie auch

Typen der Handelsoperationen, Struktur der Handelsanfoderung, Struktur des Ergebnisses der Handelsanfoderung