HistorySelectByPosition

Recupera o histórico de operações e ordens no período e servidor especificados.

bool  HistorySelectByPosition(
   long   position_id     // identificar posição - POSITION_IDENTIFIER
   );

Parâmetros

position_id

[in]  Identificador de posição que está definido para cada ordem executada e cada operação.

Valor retornado

Retorna verdadeiro true se bem sucedido, caso contrário false.

Observação

Não confunda as ordens do histórico de negociação com as ordens pendentes que aparecem no separador "Comércio (Trade) da barra de "caixa de ferramentas" (Toolbox). A lista de ordens que foram cancelados ou levaram a uma transação, pode ser visto na aba "Histórico" da "caixa de ferramentas" do terminal do cliente.

HistorySelectByPosition() cria em um programa MQL5 uma lista de pedidos e uma lista de ofertas com um identificador de posição especificada para referência futura para os elementos da lista, utilizando as funções apropriadas. Para conhecer o tamanho da lista de operações, utilizar a função HistoryDealsTotal(), o tamanho da lista de ordens histórica pode ser obtida usando HistoryOrdersTotal(). Para percorrer os elementos da lista de ordens, utilize HistoryOrderGetTicket(), para iterar os elementos da lista de operações, use HistoryDealGetTicket().

Depois de usar a função HistoryOrderSelect(), a lista de ordens do histórico disponível no programa MQL5 é atualizada e a ordem correspondente é adicionada, caso a busca pelo ticket da ordem tenha sido bem-sucedida. O mesmo acontece com a lista de operações disponíveis no programa MQL5; ela é atualizada pela função HistoryDealSelect() e preenchida novamente caso um negócio seja encontrado com sucesso pelo número do ticket.

Exemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   long  pos_id_array[];         // array para armazenar os identificadores de posições
 
//--- consultamos todo o histórico
   if(!HistorySelect(0TimeCurrent()))
     {
      Print("HistorySelect() failed. Error "GetLastError());
      return;
     }
     
//--- coletamos em um array todos os IDs de posição que surgem apenas a partir de ordens pendentes
   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;
     }
   
//--- de acordo com a lista de identificadores de posição no array
   total=ArraySize(pos_id_array);
   for(int i=0i<totali++)
     {
      //--- imprimimos no log o cabeçalho, bem como a lista de ordens e operações da posição
      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
   */
  }
//+------------------------------------------------------------------+
//| Seleciona o histórico de ordens e operações pelo ID da posição e |
//| imprime no log a lista de ordens e operações dessa posição       |
//+------------------------------------------------------------------+
bool HistorySelectByPositionProcess(const long position_id)
  {
//--- solicitamos o histórico de operações e ordens que possuem o identificador de posição especificado
   if(!HistorySelectByPosition(position_id))
     {
      PrintFormat("HistorySelectByPosition(%I64d) failed. Error %d"position_idGetLastError());
      return(false);
     }
     
//--- imprimimos no log a lista de ordens da posição
   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 no log a lista de operações da posição
   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 a descrição do tipo de ordem                             |
//+------------------------------------------------------------------+
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 a descrição do tipo de operação da posição               | 
//+------------------------------------------------------------------+
string DealTypeDescription(const ENUM_DEAL_TYPE type)
  {
   switch(type)
     {
      //--- retornamos a descrição dos tipos de operação para Buy e Sell apenas,
      //--- já que todos os outros tipos não pertencem à posição
      case DEAL_TYPE_BUY   :  return("Buy");
      case DEAL_TYPE_SELL  :  return("Sell");
      default              :  return("Unknown deal type: "+(string)type);
     }
  }
//+------------------------------------------------------------------+
//| Retorna uma descrição de como a posição foi alterada             |
//+------------------------------------------------------------------+
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);
     }
  }

Também Veja

HistorySelect(), HistoryOrderGetTicket(), Propriedades de uma Ordem