OnTrade

Die Funktion wird von EAs aufgerufen, wenn das Ereignis Trade eintritt. Die Funktion reagiert auf Änderungen von den Aufträgen, Positionen und der Handelslisten.

void  OnTrade(void);

Rückgabewert

Kein Rückgabewert

Hinweis

OnTrade() steht nur Expert Advisor zur Verfügung. Sie kann nicht von Indikatoren oder Scripts verwendet werden, auch wenn man dort eine Funktionen mit dem gleichen Namen und Typ hinzufügt.

Für jede Handelsaktion (Platzieren einer Pending Order, Öffnen/Schließen einer Position, Platzieren von Stopps, Aktivieren von Pending Orders, usw.) wird die Historie der Orders und Trades und/oder die Liste der Positionen und aktuellen Aufträge entsprechend geändert.

Wenn ein Handelsserver einen Auftrag bearbeitet, sendet er dem Terminal eine Nachricht über das eingehende Ereignis Trade. Um relevante Daten über Aufträge und Positionen aus der Historie abzurufen, ist es notwendig, zuerst eine Anfrage an die Handelshistorie mit der Funktion HistorySelect(). zu stellen.

Die Handelsereignisse werden vom Server erstellt und zwar für:

  • Veränderte aktive Aufträge,
  • Veränderte Positionen,
  • Veränderte Transaktionen,
  • Veränderte Handelshistorie.

 

Jedes Ereignis Trade kann als Ergebnis einer oder mehrerer Handelsanfragen auftreten. Handelsanfragen werden mit OrderSend() oder OrderSendAsync() an den 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 und jede Operation den Status von Aufträgen, Positionen und die Handelsgeschichte verändern kann.

 

Die Funktion OnTrade() wird nach den entsprechenden Aufrufen von OnTradeTransaction() ausgeführt. 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.

Beispiel-EA, der die Funktion OnTrade() verwendet

//+------------------------------------------------------------------+
//|                                               OnTrade_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
input    int days=7;            // Umfang der Handelshistorie in Tagen
//--- Setzen der Grenzen für die Handelshistorie in globaler Umgebung
datetime     start;             // Anfangsdatum der Handelshistorie im Cache
datetime     end;               // Enddatum der Handelshistorie im Cache
//--- Globale Zähler
int          orders;            // Anzahl der aktiven Aufträge
int          positions;         // Anzahl der offenen Positionen
int          deals;             // Anzahl der Deals in der Handelshistorie im Cache
int          history_orders;    // Anzahl der Aufträge in der Handelshistorie
bool         started=false;     // Flag der Relevanz des Zählers
 
//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   end=TimeCurrent();
   start=end-days*PeriodSeconds(PERIOD_D1);
   PrintFormat("Limits of the history to be loaded: start - %s, end - %s",
               TimeToString(start),TimeToString(end));
   InitCounters();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|  Initialisierung Zähler von Position, Auftrag und Deals          |
//+------------------------------------------------------------------+
void InitCounters()
  {
   ResetLastError();
//--- Laden der Historie
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- Abfrage des aktuellen Wert
   orders=OrdersTotal();
   positions=PositionsTotal();
   deals=HistoryDealsTotal();
   history_orders=HistoryOrdersTotal();
   started=true;
   Print("Counters of orders, positions and deals successfully initialized");
  }  
//+------------------------------------------------------------------+
//| Tick-Funktion des Experten                                       |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| Aufruf wenn ein Handelsereignis eintritt                         |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| Beispiel für das Bearbeiten der Änderungen im Handel und Historie|
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
  {
   end=TimeCurrent();
   ResetLastError();
//--- Laden der Handelshistorie des bestimmten Intervalls in den Cache des Programms
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- Abfrage der aktuellen Wert
   int curr_orders=OrdersTotal();
   int curr_positions=PositionsTotal();
   int curr_deals=HistoryDealsTotal();
   int curr_history_orders=HistoryOrdersTotal();
//--- Prüfen, ob sich die Zahl der aktiven Aufträge verändert hat
   if(curr_orders!=orders)
     {
      //--- Anzahl der aktiven Aufträge hat sich geändert
      PrintFormat("Number of orders has been changed. Previous value is %d, current value is %d",
                  orders,curr_orders);
      //--- Aktualisieren des Wertes
      orders=curr_orders;
     }
//--- Ändern der Anzahl der offenen Position
   if(curr_positions!=positions)
     {
      //--- Anzahl der offenen Positionen hat sich geändert
      PrintFormat("Number of positions has been changed. Previous value is %d, current value is %d",
                  positions,curr_positions);
      //--- Aktualisieren des Wertes
      positions=curr_positions;
     }
//--- Veränderung der Anzahl der Deals im Cache der Handelshistorie
   if(curr_deals!=deals)
     {
      //--- Anzahl der Deals in der Handelshistorie wurde geändert
      PrintFormat("Number of deals has been changed. Previous value is %d, current value is %d",
                  deals,curr_deals);
      //--- Aktualisieren des Wertes
      deals=curr_deals;
     }
//--- Veränderung der Anzahl der historischen Orders im Cache der Handelshistorie
   if(curr_history_orders!=history_orders)
     {
      //--- Anzahl der historischen Aufträge der Handelshistorie im Cache wurde geändert
      PrintFormat("Number of orders in history has been changed. Previous value is %d, current value is %d",
                  history_orders,curr_history_orders);
     //--- Aktualisieren des Wertes
     history_orders=curr_history_orders;
     }
//--- Prüfen, ob es notwendig ist die Grenzen der Handelshistorie im Cache zu verändern
   CheckStartDateInTradeHistory();
  }
//+------------------------------------------------------------------+
//|  Ändern des Anfangsdatum zur Anforderung der Handelshistorie     |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
  {
//--- erstes Intervall, falls jetzt mit der Arbeit begonnen werden soll
   datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- Sicherstellen, dass die Anfangsdatum der Handelshistorie nicht mehr als
//--- ein Tag über dem intendierten liegt
   if(curr_start-start>PeriodSeconds(PERIOD_D1))
     {
      //--- Korrektes Anfangsdatum der Historie für den Cache
      start=curr_start;
      PrintFormat("New start limit of the trade history to be loaded: start => %s",
                  TimeToString(start));
      //--- jetzt die Handel neu laden, um das Intervall zu aktualisieren
      HistorySelect(start,end);
      //--- Korrigieren der Zähler der Deals und der Aufträge in der Historie für spätere Vergleiche
      history_orders=HistoryOrdersTotal();
      deals=HistoryDealsTotal();
     }
  }
//+------------------------------------------------------------------+
/* Sample output:
  Limits of the history to be loaded: start - 2018.07.16 18:11, end - 2018.07.23 18:11
  The counters of orders, positions and deals are successfully initialized
  Number of orders has been changed. Previous value 0, current value 1
  Number of orders has been changed. Previous value 1, current value 0
  Number of positions has been changed. Previous value 0, current value 1
  Number of deals has been changed. Previous value 0, current value 1
  Number of orders in the history has been changed. Previous value 0, current value 1
*/

Siehe auch

OrderSend, OrderSendAsync, OnTradeTransaction, Ereignisse des Client-Terminals