HistorySelectByPosition

Busca el historial de transacciones y órdenes que tienen el identificador de posición especificado.

bool  HistorySelectByPosition(
   ulong   position_id     // identificador de posición - POSITION_IDENTIFIER
   );

Parámetros

position_id

[in]  Identificador de posición que se asigna a cada orden ejecutada y en cada transacción.

Valor devuelto

Devuelve true en caso de éxito, de lo contrario devuelve false.

Nota

No se debe confundir las órdenes del historial de trading con las órdenes pendientes actuales que se muestran en la pestaña "Trading" del panel "Caja de Herramientas" del terminal de cliente. La lista de las órdenes que han sido canceladas o las que han llevado a la ejecución de una operación comercial se puede ver en la pestaña "Historial" del panel "Caja de Herramientas" del terminal de cliente.

La función HistorySelectByPosition() crea la lista de órdenes y la lista de transacciones con el identificador de posición especificado para recurrir posteriormente a estos elementos a través de las funciones correspondientes. El tamaño de la lista de transacciones se puede saber usando la función HistoryDealsTotal(), el tamaño de la lista de órdenes en el historial se puede obtener con HistoryOrdersTotal(). La selección de los elementos de la lista de órdenes es mejor realizar usando la función HistoryOrderGetTicket(), para los elementos de la lista de transacciones mejor conviene la función HistoryDealGetTicket().

Después de usar la función HistoryOrderSelect() la lista de órdenes en el historial, disponibles para el programa mql5, se pone a cero y se llena de nuevo con la orden encontrada, si la búsqueda de orden por el ticket ha sido completada con éxito. Lo mismo se refiere a la lista de transacciones disponibles en el programa mql5, es decir, se pone a cero con la función HistoryDealSelect() y vuelve a llenarse en caso de recibir con éxito una transacción por el número del ticket.

Ejemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   long  pos_id_array[];         // array para guardar el identificador de las posiciones
 
//--- solicitamos la historia completa
   if(!HistorySelect(0TimeCurrent()))
     {
      Print("HistorySelect() failed. Error "GetLastError());
      return;
     }
     
//--- recopilamos en un array todos los ID de posición que surgen solo de órdenes pendientes
   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;
     }
   
//--- según la lista de identificadores de posiciones en el array
   total=ArraySize(pos_id_array);
   for(int i=0i<totali++)
     {
      //--- imprimimos en el registro el encabezado y la lista de órdenes y operaciones de la posición
      long position_id=pos_id_array[i];
      Print("List of orders and deals for position with ID: "position_id);
      HistorySelectByPositionProcess(position_id);
     }
   /*
   resultado:
   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
   */
  }
//+------------------------------------------------------------------+
//| Elige la historia de órdenes y operaciones según el ID de la posición e   
//| imprime en el registro la lista de órdenes y operaciones de la posición     
//+------------------------------------------------------------------+
bool HistorySelectByPositionProcess(const long position_id)
  {
//--- solicitamos la historia de operaciones y órdenes con el ID de posición especificado
   if(!HistorySelectByPosition(position_id))
     {
      PrintFormat("HistorySelectByPosition(%I64d) failed. Error %d"position_idGetLastError());
      return(false);
     }
     
//--- imprimimos en el registro la lista de órdenes de la posición
   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);
     }
     
//--- imprimimos en el registro la lista de operaciones de la posición
   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);
  }
//+------------------------------------------------------------------+
//| Retorna la descripción del tipo de orden                         |
//+------------------------------------------------------------------+
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);
     }
  }
//+------------------------------------------------------------------+
//| Retorna la descripción del tipo de operación de la posición      |
//+------------------------------------------------------------------+
string DealTypeDescription(const ENUM_DEAL_TYPE type)
  {
   switch(type)
     {
      //--- retornamos la descripción solo de los tipos de operaciones Buy y Sell,
      //--- ya que todos los demás tipos no pertenecen a la posición
      case DEAL_TYPE_BUY   :  return("Buy");
      case DEAL_TYPE_SELL  :  return("Sell");
      default              :  return("Unknown deal type: "+(string)type);
     }
  }
//+------------------------------------------------------------------+
//| Retorna la descripción del método de cambio de posición          |
//+------------------------------------------------------------------+
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);
     }
  }

See also

HistorySelect(), HistoryOrderGetTicket(), Order Properties