HistorySelectByPosition

Fordert die Historie der Deals und der Order mit dem angegebenen Identifikator der Position an.

bool  HistorySelectByPosition(
   ulong   position_id     // Identifikator der Position - POSITION_IDENTIFIER
   );

Parameter

position_id

[in]  Der Identifikator der Position, der für jeden ausgeführten Auftrag und auf jede Transaktion festgelegt ist.

Rückgabewert

Gibt true im Erfolgsfall zurück, anderenfalls false.

Hinweis

Man darf Aufträge (order) aus der Historie und gültige schwebende Aufträge (pending order) nicht miteinander verwechseln, die in der Registerkarte "Handel" in der Werkzeugleiste "Instrumente" dargestellt werden. Die Liste der Order, die verändert wurden oder zur Ausführung der Handelsoperation geführt haben, kann man in der Registerkarte "Historie"in der Werkzeugleiste "Instrumente" des Client-Terminals sehen.

Die Funktion HistorySelectByPosition() erzeugt im mql5-Programm die Liste der Order und die Liste der Deals mit dem angegebenen Identifikator der Position für weitere Aufrufe der Elemente der Liste mittels der entsprechenden Funktionen. Die Größe der Liste der Deals kann man mittels der Funktion HistoryDealsTotal() erfahren, die Größe der Liste der Order kann man mittels HistoryOrdersTotal() erfahren. Die Elemente aus der Liste der Order ist es besser, sie mit der Funktion HistoryOrderGetTicket() durchzusehen, für die Elemente der Liste der Deals verwenden Sie am besten die Funktion HistoryDealGetTicket().

Nach der Verwendung der Funktion HistoryOrderSelect() wird die Liste der Order in der Historie, die für mql5-Programm zugänglich ist, gelöscht und von einer erneut gefundenen Order ausgefüllt, wenn die Suche der Order nach Ticket erfolgreich beendet hat. Dasselbe bezieht sich auf die Liste der Deals, die für mql5-Programm zugänglich ist – sie wird von der Funktion HistoryDealSelect() gelöscht und erneut ausgefüllt, wenn der Deal nach Ticketnummer erfolgreich erhalten wurde.

Beispiel:

//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   long  pos_id_array[];         // Array für die IDs der Positionen
 
//--- die ganze Historie anfordern
   if(!HistorySelect(0TimeCurrent()))
     {
      Print("HistorySelect() failed. Error "GetLastError());
      return;
     }
     
//--- alle IDs der Positionen nur aus schwebenden Aufträgen im Array sammeln
   int total=HistoryOrdersTotal();
   for(int i=0i<totali++)
     {
      ulong ticket=HistoryOrderGetTicket(i);
      if(ticket==0)
         continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticketORDER_TYPE);
      long pos_id=HistoryOrderGetInteger(ticketORDER_POSITION_ID);
      if(type<=ORDER_TYPE_SELL || pos_id==0)
         continue;
      
      int size=ArraySize(pos_id_array);
      if(ArrayResize(pos_id_arraysize+1)==size+1)
         pos_id_array[size]=pos_id;
     }
   
//--- nach Liste der Positions-IDs im Array
   total=ArraySize(pos_id_array);
   for(int i=0i<totali++)
     {
      //--- Druckt die Kopfzeile sowie die Liste der Positionsaufträge und die Dealliste
      long position_id=pos_id_array[i];
      Print("List of orders and deals for position with ID: "position_id);
      HistorySelectByPositionProcess(position_id);
     }
   /*
   Ergebnis:
   List of orders and deals for position with ID1819629924
     [0Order Sell Limit #1819629924
     [1Order Buy #1819633194
     [0Entry In Deal Sell #1794972472
     [1Entry Out Deal Buy #1794975589
    List of orders and deals for position with ID1841753970
     [0Order Sell Stop #1841753970
     [1Order Buy #1842322160
     [0Entry In Deal Sell #1817242142
     [1Entry Out Deal Buy #1817765341
   */
  }
//+------------------------------------------------------------------+
//| Historie der Aufträge und Deals nach Positions-ID auswählen und  |
//| Ausdruck der Liste der Aufträge und Deals der Position im Journal|
//+------------------------------------------------------------------+
bool HistorySelectByPositionProcess(const long position_id)
  {
//--- Anfrage nach der Historie der Deals und Aufträge mit der angegebenen Positions-ID
   if(!HistorySelectByPosition(position_id))
     {
      PrintFormat("HistorySelectByPosition(%I64d) failed. Error %d"position_idGetLastError());
      return(false);
     }
     
//--- Liste der Positionen drucken
   int orders_total=HistoryOrdersTotal();
   for(int i=0i<orders_totali++)
     {
      ulong ticket=HistoryOrderGetTicket(i);
      if(ticket==0)
         continue;
      ENUM_ORDER_TYPE order_type=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticketORDER_TYPE);
      PrintFormat("  [%d] Order %s #%I64u"iOrderTypeDescription(order_type), ticket);
     }
     
//--- eine Liste der Positionen im Journal ausdrucken
   int deals_total =HistoryDealsTotal();
   for(int i=0i<deals_totali++)
     {
      ulong ticket=HistoryDealGetTicket(i);
      if(ticket==0)
         continue;
      ENUM_DEAL_ENTRY deal_entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticketDEAL_ENTRY);
      ENUM_DEAL_TYPE  deal_type= (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticketDEAL_TYPE);
      if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL)
         continue;
      PrintFormat("  [%d] Entry %s Deal %s #%I64u"iDealEntryDescription(deal_entry), DealTypeDescription(deal_type), ticket);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| 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: "+(string)type);
     }
  }
//+------------------------------------------------------------------+
//| Rückgabe der Beschreibung des Deals-Typs der Position            |
//+------------------------------------------------------------------+
string DealTypeDescription(const ENUM_DEAL_TYPE type)
  {
   switch(type)
     {
      //--- nur die Beschreibung der Kauf- und Verkaufsgeschäfte zurückgeben,
      //--- da alle anderen Typen nicht auf die Position zutreffen
      case DEAL_TYPE_BUY   :  return("Buy");
      case DEAL_TYPE_SELL  :  return("Sell");
      default              :  return("Unknown deal type: "+(string)type);
     }
  }
//+------------------------------------------------------------------+
//| Rückgabe der Änderungsmethode der Position                       |
//+------------------------------------------------------------------+
string DealEntryDescription(const ENUM_DEAL_ENTRY entry)
  {
   switch(entry)
     {
      case DEAL_ENTRY_IN      :  return("In");
      case DEAL_ENTRY_OUT     :  return("Out");
      case DEAL_ENTRY_INOUT   :  return("InOut");
      case DEAL_ENTRY_OUT_BY  :  return("Out by");
      case DEAL_ENTRY_STATE   :  return("Status record");
      default                 :  return("Unknown deal entry: "+(string)entry);
     }
  }

Siehe auch

HistorySelect(), HistoryOrderGetTicket(), Ordereigenschaften