OnTradeTransaktion

Die Funktion wird in EAs aufgerufen, wenn das Ereignis TradeTransaction eintritt. Die Funktion ist für die Behandlung der Ergebnisse der Ausführung von Handelsanfragen gedacht.

void  OnTradeTransaction()
   const MqlTradeTransaction&    trans,     // Struktur der Handelstransaktionen
   const MqlTradeRequest&        request,   // Abfrage der Struktur
   const MqlTradeResult&         result     // Ergebnis der Struktur
   );

Parameter

trans

[in] MqlTradeTransaction Typvariable, die eine auf einem Handelskonto getätigte Transaktion beschreibt.

request

[in] MqlTradeRequest Typvariable, die eine Handelsanforderung beschreibt, die zu einer Transaktion führte. Sie enthält nur die Werte für den Typ Transaktion TRADE_TRANSACTION_REQUEST.

result

[in] MqlTradeResult Typvariable, die das Ausführungsergebnis einer Handelsanforderung enthält, die zu einer Transaktion führte. Sie enthält nur die Werte für den Typ Transaktion TRADE_TRANSACTION_REQUEST.

Rückgabewert

Kein Rückgabewert

Hinweis

OnTradeTransaction() wird aufgerufen, um das Ereignis TradeTransaction zu behandeln, das vom Handelsserver an das Terminal in den folgenden Fällen gesendet wird:

  • Senden einer Handelsanfrage aus einem MQL5-Programm mit den Funktionen OrderSend()/OrderSendAsync() und deren anschließende Ausführung;
  • Manuelles Senden einer Handelsanfrage über die GUI und deren anschließende Ausführung;
  • Aktivierung von Pending und Stop Orders auf dem Server;
  • Durchführung von Operationen auf der Seite des Handelsservers.

 

Die Daten zum Transaktionstyp sind im Feld type der Variablen trans eingetragen. Die Arten von Handelsgeschäften sind beschrieben in der Enumeration ENUM_TRADE_TRANSACTION_TYPE:

  • TRADE_TRANSACTION_ORDER_ADD – Hinzufügen eines neuen Auftrages (order)
  • TRADE_TRANSACTION_ORDER_UPDATE – Ändern eines bestehenden Auftrags
  • TRADE_TRANSACTION_ORDER_DELETE – Löschen eines Auftrags aus der Liste der aktiven
  • TRADE_TRANSACTION_DEAL_ADD – Hinzufügen eines Deals zur Historie
  • TRADE_TRANSACTION_DEAL_UPDATE – Ändern einer Transaktion (deal) in der Historie
  • TRADE_TRANSACTION_DEAL_DELETE – Löschen einer Transaktion aus der Historie
  • TRADE_TRANSACTION_HISTORY_ADD – Hinzufügen eines Auftrages zur Historie als Ergebnis einer Ausführung oder einer Stornierung
  • TRADE_TRANSACTION_HISTORY_UPDATE – Ändern eines Auftrags in die Auftragshistorie
  • TRADE_TRANSACTION_HISTORY_DELETE – Löschen eines Auftrags aus der Auftragsliste
  • TRADE_TRANSACTION_POSITION – Änderung einer Position, die nicht auf einer Handelsausführung basiert
  • TRADE_TRANSACTION_REQUEST – Benachrichtigung, dass eine Handelsanfrage vom Server bearbeitet wurde und das Ergebnis der Bearbeitung eingegangen ist.

Wenn Transaktionen vom Typ TRADE_TRANSACTION_REQUEST behandelt werden, ist es notwendig, den zweiten und dritten Parameter der Funktion OnTradeTransaction() zu analysieren - request und result - um zusätzliche Informationen zu erhalten..

Das Senden einer Kaufanfrage führt zu einer Kette von Handelstransaktionen auf einem Handelskonto: 1) Anfrage wird zur Bearbeitung angenommen, 2) ein entsprechender Auftrag für das Konto angelegt, 3) der Auftrag wird dann ausgeführt, 4) der ausgeführte Auftrag wird aus der Liste der aktiven Aufträge entfernt, 5) zur Historie der Aufträge hinzugefügt, 6) die nachfolgende Transaktion wird zur Historie hinzugefügt und 7) eine neue Position wird angelegt. Alle diese Stufen sind Handelstransaktionen. Die Ankunft jeder solchen Transaktion im Terminal ist das Ereignis TradeTransaction. Die Priorität der Ankunft dieser Transaktionen im Terminal ist nicht garantiert. Daher sollten Sie bei der Entwicklung Ihres Handelsalgorithmus nicht erwarten, dass eine Gruppe von Transaktionen nach der anderen eintrifft.

Wenn Transaktionen von der Funktion OnTradeTransaction() des EA verarbeitet werden, verarbeitet das Terminal die eingehenden Handelstransaktionen weiter. So kann sich der Status des Handelskontos im Laufe der OnTradeTransaction() Operation ändern. Zum Beispiel, während ein MQL5-Programm eine neuen Auftrag erteilt, kann er ausgeführt, aus der Liste der offenen Aufträge gelöscht und in die Historie verschoben werden. Das Programm wird über alle diese Ereignisse informiert.

Die Länge der Warteschlange der Transaktionen umfasst 1024 Elemente. Wenn OnTradeTransaction() bei einer weiteren Transaktion zu lange verweilt, können in der Warteschlange die frühere Transaktionen durch neue ersetzt werden.

Ein Aufruf von OnTrade() entspricht einem oder mehreren OnTradeTransaction-Aufrufen. Im Allgemeinen gibt es keine genaue Korrelation zwischen der Anzahl der Aufrufe von OnTrade() und OnTradeTransaction(). Ein Aufruf von OnTrade() entspricht einem oder mehreren Aufrufen von OnTradeTransaction.

Jedes Ergebnis Trade kann als Ergebnis einer oder mehrerer Anfragen an den Handelsserver erscheinen. Handelsanfrage werden mit Trade mittels OrderSend() oder OrderSendAsync() an der Server gesendet. Jede Anfrage kann zu mehreren Handelsereignissen führen. Sie können nicht der Vorstellung vertrauen: "Eine Anfrage - Ein Handelsereignis", da die Verarbeitung von Ereignissen in mehreren Stufen erfolgt kann und jede Operation den Status von Aufträgen, Positionen und die Handelsgeschichte verändern kann.

Beispiel-EA, der die Funktion OnTradeTransaction() verwendet

//+------------------------------------------------------------------+
//|                                    OnTradeTransaction_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Sample listener of TradeTransaction events"
//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PrintFormat("LAST PING=%.f ms",
               TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Tick-Funktion des Experten                                       |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| TradeTransaction Funktion                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   static int counter=0;   // Zähler der Aufrufe von OnTradeTransaction()
   static uint lasttime=0; // Zeitpunkt des letzten Aufrufs von OnTradeTransaction()
//---
   uint time=GetTickCount();
//--- wenn die letzte Transaktion vor mehr als 1 Sekunde war
   if(time-lasttime>1000)
     {
      counter=0; // das ist jetzt eine neue Handelsoperation und der Zähler kann zurückgesetzt werden
      if(IS_DEBUG_MODE)
         Print(" New trade operation");
     }
   lasttime=time;
   counter++;
   Print(counter,". ",__FUNCTION__);
//--- Ergebnis der Ausführungsanfrage eines Handels
   ulong            lastOrderID   =trans.order;
   ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
   ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- Name des Symbols der Transaktion
   string trans_symbol=trans.symbol;
//--- Typ der Transaktion
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   switch(trans.type)
     {
      case  TRADE_TRANSACTION_POSITION:   // Positionsänderung
        {
         ulong pos_ID=trans.position;
         PrintFormat("MqlTradeTransaction: Position  #%I64u %s modified: SL=%.5f TP=%.5f",
                     pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
        }
      break;
      case TRADE_TRANSACTION_REQUEST:     // Senden einer Handelsanfrage
         PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
         break;
      case TRADE_TRANSACTION_DEAL_ADD:    // Hinzufügen eines Deals
        {
         ulong          lastDealID   =trans.deal;
         ENUM_DEAL_TYPE lastDealType =trans.deal_type;
         double        lastDealVolume=trans.volume;
         //--- ID des Deals im internen System - eine Ticketnummer wird vom Börsenplatz zugewiesen
         string Exchange_ticket="";
         if(HistoryDealSelect(lastDealID))
            Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
         if(Exchange_ticket!="")
            Exchange_ticket=StringFormat("(Exchange deal=%s)",Exchange_ticket);
 
         PrintFormat("MqlTradeTransaction: %s deal #%I64u %s %s %.2f lot   %s",EnumToString(trans_type),
                     lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD// Hinzufügen eines Auftrages zur Historie
        {
         //--- Auftrags-ID im internen System - eine Ticketnummer wird vom Börsenplatz zugewiesen
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_FILLED)
           {
            if(HistoryOrderSelect(lastOrderID))
               Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("(Exchange ticket=%s)",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%I64u %s %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
      default// andere Transaktionen
        {
         //--- Auftrags-ID im internen System - eine Ticketnummer wird vom Börsenplatz zugewiesen
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_PLACED)
           {
            if(OrderSelect(lastOrderID))
               Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("Exchange ticket=%s",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%I64u %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
     }
//--- Ticketnummer des Auftrags    
   ulong orderID_result=result.order;
   string retcode_result=GetRetcodeID(result.retcode);
   if(orderID_result!=0)
      PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//---   
  }
//+------------------------------------------------------------------+
//| Konvertieren eines numerischen Codes in eine Textbeschreibung    |
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
  {
   switch(retcode)
     {
      case 10004: return("TRADE_RETCODE_REQUOTE");             break;
      case 10006: return("TRADE_RETCODE_REJECT");              break;
      case 10007: return("TRADE_RETCODE_CANCEL");              break;
      case 10008: return("TRADE_RETCODE_PLACED");              break;
      case 10009: return("TRADE_RETCODE_DONE");                break;
      case 10010: return("TRADE_RETCODE_DONE_PARTIAL");        break;
      case 10011: return("TRADE_RETCODE_ERROR");               break;
      case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
      case 10013: return("TRADE_RETCODE_INVALID");             break;
      case 10014: return("TRADE_RETCODE_INVALID_VOLUME");      break;
      case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
      case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
      case 10017: return("TRADE_RETCODE_TRADE_DISABLED");      break;
      case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
      case 10019: return("TRADE_RETCODE_NO_MONEY");            break;
      case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
      case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
      case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION");  break;
      case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
      case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
      case 10025: return("TRADE_RETCODE_NO_CHANGES");          break;
      case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT");  break;
      case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT");  break;
      case 10028: return("TRADE_RETCODE_LOCKED");              break;
      case 10029: return("TRADE_RETCODE_FROZEN");              break;
      case 10030: return("TRADE_RETCODE_INVALID_FILL");        break;
      case 10031: return("TRADE_RETCODE_CONNECTION");          break;
      case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
      case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");        break;
      case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");        break;
      case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
      case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
      default:
         return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
         break;
     }
//---
  }

Siehe auch

OrderSend, OrderSendAsync, OnTradeTransaction, Trade request structure, Trade transaction structure, Trade transaction types, Trade operation types, Ereignisse des Client-Terminals