English Русский 中文 Español Deutsch 日本語
preview
MQL5 Trading Toolkit (Parte 5): Expandindo a Biblioteca EX5 de Gerenciamento de Histórico com Funções de Posição

MQL5 Trading Toolkit (Parte 5): Expandindo a Biblioteca EX5 de Gerenciamento de Histórico com Funções de Posição

MetaTrader 5Exemplos |
97 0
Wanateki Solutions LTD
Kelvin Muturi Muigua

Introdução

No artigo anterior, começamos a desenvolver as funções principais da biblioteca HistoryManager EX5, que forma o núcleo responsável por recuperar, classificar e categorizar dados históricos em vários tipos, incluindo ordens, negociações (deals), ordens pendentes e posições. A maioria dessas funções foi projetada para operar em segundo plano, sem ser percebida pelos usuários da biblioteca, e não era diretamente acessível. As únicas funções exportáveis eram as funções de impressão, que permitiam aos usuários exibir listas descritivas simples de ordens, negociações, ordens pendentes ou posições no log do MetaTrader 5.

Neste artigo, ampliaremos o código-fonte HistoryManager.mq5 introduzindo funções adicionais acessíveis ao usuário que se baseiam nas funções fundamentais criadas no artigo anterior. Essas novas funções permitirão aos usuários da biblioteca consultar com facilidade os dados do histórico de negociações. Os usuários poderão recuperar detalhes essenciais, como a duração da negociação em segundos, os tickets das negociações de abertura e fechamento da última posição encerrada, se a posição foi iniciada por uma ordem pendente ou por uma entrada direta a mercado, métricas em pips como lucro, stop loss e take profit, bem como o lucro líquido após considerar despesas como comissões e swaps. Tudo isso permitirá que você importe a biblioteca EX5 em seus projetos MQL5 e consiga consultar o histórico de várias posições com o mínimo de esforço por meio de chamadas de função diretas.

Para começar, abriremos o arquivo HistoryManager.mq5 do artigo anterior e iniciaremos criando a função GetTotalDataInfoSize(). O arquivo-fonte inicial HistoryManager.mq5 está anexado ao final do artigo anterior ou também pode ser encontrado ao fim deste artigo (HistoryManager_Part1.mq5). Continuaremos adicionando novo código abaixo da função PrintPendingOrdersHistory(), que foi onde paramos anteriormente.


Função Get Total Data Info Size

A função GetTotalDataInfoSize() foi projetada para recuperar e retornar o tamanho de um array de dados históricos específico. Essa função trabalha em conjunto com a função FetchHistoryByCriteria(), garantindo que possamos determinar dinamicamente a quantidade de dados disponível em uma estrutura específica. Sua função principal é identificar qual conjunto de dados desejamos — negociações, ordens, posições ou ordens pendentes — e retornar o número total de elementos nesse conjunto.

A função GetTotalDataInfoSize() ajudará a agilizar operações onde o acesso dinâmico a diferentes conjuntos de dados históricos é necessário. Ao passar o critério apropriado como argumento, consultaremos de forma eficiente o tamanho da estrutura de dados relevante.

Começaremos definindo a assinatura da função. Como essa função retorna um integer representando o tamanho de um array de dados especificado, ela utiliza um tipo de retorno int. O parâmetro de entrada ou argumento é um inteiro sem sinal (uint), que permitirá passar constantes pré-definidas para especificar o tipo de dado que estamos consultando.

int GetTotalDataInfoSize(uint dataToGet)
  {
//-- Our function's code will go here
  }

Em seguida, declararemos uma variável local, totalDataInfo, que armazenará o tamanho do conjunto de dados solicitado.

int totalDataInfo = 0;

Utilizaremos uma instrução switch para verificar o valor do parâmetro dataToGet. Dependendo do valor, identificaremos o conjunto de dados correspondente e utilizaremos a função ArraySize() para determinar seu tamanho.

  • Dados do Histórico de Negociações (Deals): Se dataToGet for igual a GET_DEALS_HISTORY_DATA, calcularemos o tamanho do array dealInfo e o salvaremos em totalDataInfo.
  • Dados do Histórico de Ordens: Se dataToGet for igual a GET_ORDERS_HISTORY_DATA, calcularemos o tamanho do array orderInfo e o salvaremos em totalDataInfo.
  • Dados do Histórico de Posições: Para GET_POSITIONS_HISTORY_DATA, calcularemos o tamanho do array positionInfo e o salvaremos em totalDataInfo.
  • Dados de Ordens Pendentes: Quando dataToGet corresponder a GET_PENDING_ORDERS_HISTORY_DATA, determinaremos o tamanho do array pendingOrderInfo e o salvaremos em totalDataInfo.
  • Caso Padrão: Se nenhuma das constantes predefinidas corresponder, definiremos totalDataInfo como 0 como medida de fallback.

Por fim, retornaremos o valor armazenado em totalDataInfo após a saída do switch. Isso garantirá que a função retorne o tamanho correto para o tipo de dado especificado ou 0 caso nenhum tipo válido seja fornecido.

switch(dataToGet)
  {
   case GET_DEALS_HISTORY_DATA:
      totalDataInfo = ArraySize(dealInfo);
      break;

   case GET_ORDERS_HISTORY_DATA:
      totalDataInfo = ArraySize(orderInfo);
      break;

   case GET_POSITIONS_HISTORY_DATA:
      totalDataInfo = ArraySize(positionInfo);
      break;

   case GET_PENDING_ORDERS_HISTORY_DATA:
      totalDataInfo = ArraySize(pendingOrderInfo);
      break;

   default:
      totalDataInfo = 0;
      break;
  }
return(totalDataInfo);

Abaixo está a implementação completa da função GetTotalDataInfoSize() com todos os trechos de código em sua sequência correta.

int GetTotalDataInfoSize(uint dataToGet)
  {
   int totalDataInfo = 0; //- Saves the total elements of the specified history found
   switch(dataToGet)
     {
      case GET_DEALS_HISTORY_DATA: //- Check if we have any available deals history data
         totalDataInfo = ArraySize(dealInfo); //- Save the total deals found
         break;

      case GET_ORDERS_HISTORY_DATA: //- Check if we have any available orders history data
         totalDataInfo = ArraySize(orderInfo); //- Save the total orders found
         break;

      case GET_POSITIONS_HISTORY_DATA: //- Check if we have any available positions history data
         totalDataInfo = ArraySize(positionInfo); //- Save the total positions found
         break;

      case GET_PENDING_ORDERS_HISTORY_DATA: //- Check if we have any available pending orders history data
         totalDataInfo = ArraySize(pendingOrderInfo); //- Save the total pending orders found
         break;

      default: //-- Unknown entry
         totalDataInfo = 0;
         break;
     }
   return(totalDataInfo);
  }


Função Fetch History by Criteria

Ao consultar dados recentes de histórico com MQL5, como recuperar as últimas cinco posições de compra fechadas para um símbolo específico, não é necessário solicitar todo o histórico da conta ao servidor, pois isso desperdiçaria recursos valiosos. Em vez disso, você deve adotar uma abordagem ideal consultando primeiro o histórico mais recente, por exemplo, dentro do dia atual. Se os dados específicos que você busca não estiverem disponíveis nesse período, você poderá então expandir gradualmente o intervalo de tempo até encontrar as informações desejadas. Esse método garante eficiência e minimiza o uso de recursos, proporcionando o melhor desempenho ao recuperar os dados históricos necessários.

A função FetchHistoryByCriteria() recupera sistematicamente dados históricos com base em critérios específicos, começando pelas últimas 24 horas e expandindo o período de busca se necessário. Ela começa verificando os dados mais recentes e, se nenhum histórico relevante for encontrado, expande progressivamente para períodos mais antigos — primeiro por semana, até um ano. Se nenhum dado for encontrado após a varredura do ano inteiro, a função tentará recuperar todo o histórico disponível da conta.

A função FetchHistoryByCriteria() servirá como uma ferramenta essencial para buscar dados de negociação de diferentes períodos e permitirá que a biblioteca EX5 escaneie e recupere o histórico até que os dados necessários sejam encontrados. Se nenhum dado relevante for encontrado, ela garantirá que a biblioteca ainda possa tentar recuperar períodos mais antigos ou todo o histórico da conta.

Vamos começar definindo a assinatura da função. Como essa função será utilizada internamente pelos módulos centrais da biblioteca, ela não será exportável.

bool FetchHistoryByCriteria(uint dataToGet)
  {
//-- Our function's code will go here
  }

Definiremos a variável de intervalo, que modulá o período de recuperação do histórico. Inicialmente, ela será definida como 1 para começar com um intervalo de 24 horas.

int interval = 1;

Calcularemos o intervalo de tempo a partir de 24 horas atrás até o tempo atual.

datetime fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_D1) * interval);
datetime toDateTime = TimeCurrent();

Em seguida, utilizaremos a função GetHistoryData() para obter os dados dentro do intervalo definido.

GetHistoryData(fromDateTime, toDateTime, dataToGet);

Se nenhum dado for encontrado nas últimas 24 horas, entraremos em um loop onde aumentaremos o intervalo em uma semana por vez. Continuaremos esse processo até varrer até um ano completo (53 semanas). Durante cada iteração, o intervalo de tempo é atualizado para refletir a semana adicional.

while(GetTotalDataInfoSize(dataToGet) <= 0)
  {
   interval++;
   fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_W1) * interval);
   toDateTime = TimeCurrent();
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

   if(interval > 53)
     {
      break;
     }
  }

Se os dados ainda não forem encontrados após a varredura de um ano, redefiniremos o intervalo de tempo para cobrir todo o histórico da conta (desde a época inicial até o tempo atual). Isso garante que todo o histórico disponível seja verificado.

fromDateTime = 0;
toDateTime = TimeCurrent();
GetHistoryData(fromDateTime, toDateTime, dataToGet);

Por fim, verificaremos se algum histórico foi recuperado com sucesso. Se nenhum dado for encontrado após a varredura de todo o histórico da conta, registraremos a falha e retornaremos false. Se os dados forem encontrados, retornaremos true para indicar sucesso.

if(GetTotalDataInfoSize(dataToGet) <= 0)
  {
   return(false);
  }
else
  {
   return(true);
  }

Aqui está a implementação completa da função FetchHistoryByCriteria() com todos os trechos de código incluídos.

bool FetchHistoryByCriteria(uint dataToGet)
  {
   int interval = 1; //- Modulates the history period

//- Save the history period for the last 24 hours
   datetime fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_D1) * interval);
   datetime toDateTime = TimeCurrent();

//- Get the specified history
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

//- If we have no history in the last 24 hours we need to keep increasing the retrieval
//- period by one week untill we scan a full year (53 weeks)
   while(GetTotalDataInfoSize(dataToGet) <= 0)
     {
      interval++;
      fromDateTime = TimeCurrent() - 1 * (PeriodSeconds(PERIOD_W1) * interval);
      toDateTime = TimeCurrent();
      GetHistoryData(fromDateTime, toDateTime, dataToGet);

      //- If no history is found after a one year scanning period, we exit the while loop
      if(interval > 53)
        {
         break;
        }
     }

//- If we have not found any trade history in the last year, we scan and cache the intire account history
   fromDateTime = 0; //-- 1970 (Epoch)
   toDateTime = TimeCurrent(); //-- Time now
   GetHistoryData(fromDateTime, toDateTime, dataToGet);

//- If we still havent retrieved any history in the account, we log this info by
//- printing it and exit the function by returning false
   if(GetTotalDataInfoSize(dataToGet) <= 0)
     {
      return(false); //- Specified history not found, exit and return false
     }
   else
     {
      return(true); //- Specified history found, exit and return true
     }
  }


Função Get The Last Closed Position Data

A função GetLastClosedPositionData() é responsável por recuperar as propriedades da posição fechada mais recente e armazenar esses dados na referência fornecida lastClosedPositionInfo. Essa função dependerá da FetchHistoryByCriteria() para obter os dados relevantes do histórico de negociações, garantindo que tenha acesso às informações necessárias da posição. Se nenhuma posição fechada for encontrada, a função registrará uma mensagem de erro e retornará false. Se bem-sucedida, ela recuperará os dados e retornará true.

Vamos começar definindo a assinatura da função. Como essa função é destinada ao uso externo, ela é exportada e pode ser importada por outros arquivos MQL5.

bool GetLastClosedPositionData(PositionData &lastClosedPositionInfo) export
  {
//-- Our function's code will go here
  }

Primeiro tentaremos obter o histórico disponível de posições chamando a função FetchHistoryByCriteria() com o argumento GET_POSITIONS_HISTORY_DATA. Essa chamada de função buscará no histórico de negociações disponível para recuperar dados relacionados a posições.

if(!FetchHistoryByCriteria(GET_POSITIONS_HISTORY_DATA))
  {
   Print(__FUNCTION__, ": No trading history available. Last closed position can't be retrieved.");
   return(false);
  }

Se nenhum histórico de posições estiver disponível (ou seja, se FetchHistoryByCriteria() retornar false), registramos uma mensagem de erro usando a função Print(), que ajuda na depuração fornecendo informações úteis sobre a falha. A função então retorna false, indicando que não foi possível recuperar a última posição fechada.

Se os dados do histórico de posições forem recuperados com sucesso, então salvaremos as informações da última posição fechada na variável lastClosedPositionInfo. Isso é feito atribuindo o primeiro elemento do array positionInfo a lastClosedPositionInfo, pois esse array contém o histórico de todas as posições, com a posição fechada mais recente no início. Para concluir a função, retornaremos true para indicar que os dados da última posição fechada foram recuperados com sucesso e armazenados na variável de referência fornecida.

lastClosedPositionInfo = positionInfo[0];
return(true);

Aqui está a implementação completa da função GetLastClosedPositionData() com todos os trechos de código incluídos.

bool GetLastClosedPositionData(PositionData &lastClosedPositionInfo) export
  {
   if(!FetchHistoryByCriteria(GET_POSITIONS_HISTORY_DATA))
     {
      Print(__FUNCTION__, ": No trading history available. Last closed position can't be retrieved.");
      return(false);
     }

//-- Save the last closed position data in the referenced lastClosedPositionInfo variable
   lastClosedPositionInfo = positionInfo[0];
   return(true);
  }


Função Last Closed Position Type

A função LastClosedPositionType() será responsável por determinar o tipo da posição fechada mais recentemente na conta de negociação e armazená-lo na variável referenciada lastClosedPositionType. Essa função é uma extensão lógica de GetLastClosedPositionData(), aproveitando sua capacidade de recuperar a última posição fechada e extrair seu tipo específico.

A função LastClosedPositionType() é necessária para cenários onde é preciso analisar o tipo da negociação mais recente, como diferenciar entre posições de compra e venda ou identificar estratégias mais complexas com base no tipo da posição.

Vamos começar definindo a assinatura da função. Como essa função é destinada ao uso por arquivos MQL5 que importam a biblioteca EX5, marcá-la-emos como exportável. Isso garantirá que a função seja acessível externamente, aumentando a modularidade e a usabilidade.

bool LastClosedPositionType(ENUM_POSITION_TYPE &lastClosedPositionType) export
  {
//-- Our function's code will go here
  }

Iniciamos declarando uma variável local lastClosedPositionInfo do tipo PositionData. Essa variável armazenará temporariamente os detalhes da última posição fechada, que extrairemos usando a função GetLastClosedPositionData().

PositionData lastClosedPositionInfo;

Invocamos a função GetLastClosedPositionData(), passando lastClosedPositionInfo como argumento. Se a função retornar true, significa que os dados da última posição fechada foram recuperados com sucesso.

if(GetLastClosedPositionData(lastClosedPositionInfo))
{
   //- Process the retrieved data
}

Se GetLastClosedPositionData() falhar (retornar false), esta função encerrará imediatamente retornando false para indicar que a operação não pôde ser concluída.

Dentro do if block, extraímos a propriedade type de lastClosedPositionInfo e a atribuiremos à variável referenciada lastClosedPositionType. Isso garante que o código que chamou a função tenha acesso ao tipo da última posição fechada. Após salvar o tipo com sucesso, retornamos true para indicar que a operação foi concluída com êxito e encerramos a função.

lastClosedPositionType = lastClosedPositionInfo.type;
return(true);

Se a recuperação da última posição fechada falhar, a função ignora o if block e retorna diretamente false. Isso indica que o tipo da posição não pôde ser determinado.

return(false);

Aqui está a implementação completa da função LastClosedPositionType() com todos os trechos de código em sua ordem correta.

bool LastClosedPositionType(ENUM_POSITION_TYPE &lastClosedPositionType) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionType = lastClosedPositionInfo.type;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Volume

A função LastClosedPositionVolume() é responsável por recuperar o volume da posição fechada mais recentemente no histórico de negociações. Ela salva esse volume na variável referenciada lastClosedPositionVolume. Se a função LastClosedPositionVolume() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionVolume com o valor do volume e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionVolume permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionVolume(double &lastClosedPositionVolume) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionVolume = lastClosedPositionInfo.volume;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Symbol

A função LastClosedPositionSymbol() é responsável por recuperar o símbolo da posição fechada mais recentemente no histórico de negociações. Ela salva esse símbolo na variável referenciada lastClosedPositionSymbol. Se a função LastClosedPositionSymbol() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionSymbol com o valor do símbolo e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionSymbol permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionSymbol(string &lastClosedPositionSymbol) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSymbol = lastClosedPositionInfo.symbol;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Ticket

A função LastClosedPositionTicket() é responsável por recuperar o número do ticket da posição fechada mais recentemente no histórico de negociações. Ela salva esse ticket número na variável referenciada lastClosedPositionTicket. Se a função LastClosedPositionTicket() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionTicket com o número do ticket e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionTicket permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionTicket(ulong &lastClosedPositionTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTicket = lastClosedPositionInfo.ticket;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Profit

A função LastClosedPositionProfit() é responsável por recuperar o lucro da posição fechada mais recentemente no histórico de negociações. Ela salva esse lucro na variável referenciada lastClosedPositionProfit. Se a função LastClosedPositionProfit() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionProfit com o valor do lucro e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionProfit permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionProfit(double &lastClosedPositionProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionProfit = lastClosedPositionInfo.profit;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Net Profit

A função LastClosedPositionNetProfit() é responsável por recuperar o lucro líquido da posição fechada mais recentemente no histórico de negociações. O lucro líquido da posição é o valor final após todas as cobranças, como a comissão e os swaps, terem sido deduzidas do lucro da posição. Ela salva esse lucro líquido na variável referenciada lastClosedPositionNetProfit. Se a função LastClosedPositionNetProfit() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionNetProfit com o valor do lucro líquido e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionNetProfit permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionNetProfit(double &lastClosedPositionNetProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionNetProfit = lastClosedPositionInfo.netProfit;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Pip (Point) Profit

A função LastClosedPositionPipProfit() é responsável por recuperar o lucro em pips da posição fechada mais recentemente no histórico de negociações. Ela salva esse lucro em pips na variável referenciada lastClosedPositionPipProfit. Se a função LastClosedPositionPipProfit() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionPipProfit com o valor do lucro em pips e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionPipProfit permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionPipProfit(int &lastClosedPositionPipProfit) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionPipProfit = lastClosedPositionInfo.pipProfit;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Close Price

A função LastClosedPositionClosePrice() é responsável por recuperar o preço de fechamento da posição fechada mais recentemente no histórico de negociações. Ela salva esse preço de fechamento na variável referenciada lastClosedPositionClosePrice. Se a função LastClosedPositionClosePrice() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionClosePrice com o valor do preço de fechamento e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionClosePrice permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionClosePrice(double &lastClosedPositionClosePrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionClosePrice = lastClosedPositionInfo.closePrice;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Open Price

A função LastClosedPositionOpenPrice() é responsável por recuperar o preço de abertura da posição fechada mais recentemente no histórico de negociações. Ela salva esse preço de abertura na variável referenciada lastClosedPositionOpenPrice. Se a função LastClosedPositionOpenPrice() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionOpenPrice com o valor do preço de abertura e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionOpenPrice permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionOpenPrice(double &lastClosedPositionOpenPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpenPrice = lastClosedPositionInfo.openPrice;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Stop Loss Price

A função LastClosedPositionSlPrice() é responsável por recuperar o preço de stop loss da posição fechada mais recentemente no histórico de negociações. Ela salva esse preço de stop loss na variável referenciada lastClosedPositionSlPrice. Se a função LastClosedPositionSlPrice() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionSlPrice com o valor do preço de stop loss e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionSlPrice permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionSlPrice(double &lastClosedPositionSlPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSlPrice = lastClosedPositionInfo.slPrice;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Take Profit Price

A função LastClosedPositionTpPrice() é responsável por recuperar o preço de take profit da posição fechada mais recentemente no histórico de negociações. Ela salva esse preço de take profit na variável referenciada lastClosedPositionTpPrice. Se a função LastClosedPositionTpPrice() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionTpPrice com o valor do preço de take profit e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionTpPrice permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionTpPrice(double &lastClosedPositionTpPrice) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTpPrice = lastClosedPositionInfo.tpPrice;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Stop Loss Pips (Points)

A função LastClosedPositionSlPips() é responsável por recuperar o valor de stop loss da posição fechada mais recentemente em pontos (pips). Ela salva esse valor de stop loss na variável referenciada lastClosedPositionSlPips. Se a função LastClosedPositionSlPips() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionSlPips com o valor de stop loss em pips e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionSlPips permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionSlPips(int &lastClosedPositionSlPips) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSlPips = lastClosedPositionInfo.slPips;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Take Profit Pips (Points)

A função LastClosedPositionTpPips() é responsável por recuperar o valor de take profit da posição fechada mais recentemente em pontos (pips). Ela salva esse valor de take profit na variável referenciada lastClosedPositionTpPips. Se a função LastClosedPositionTpPips() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionTpPips com o valor de take profit em pips e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionTpPips permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionTpPips(int &lastClosedPositionTpPips) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionTpPips = lastClosedPositionInfo.tpPips;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Open Time

A função LastClosedPositionOpenTime() é responsável por recuperar o horário de abertura da posição fechada mais recentemente. Ela salva esse horário de abertura na variável referenciada lastClosedPositionOpenTime. Se a função LastClosedPositionOpenTime() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionOpenTime com o valor do horário de abertura e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionOpenTime permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionOpenTime(datetime &lastClosedPositionOpenTime) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpenTime = lastClosedPositionInfo.openTime;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Close Time

A função LastClosedPositionCloseTime() é responsável por recuperar o horário de fechamento da posição fechada mais recentemente. Ela salva esse horário de fechamento na variável referenciada lastClosedPositionCloseTime. Se a função LastClosedPositionCloseTime() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionCloseTime com o valor do horário de fechamento e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionCloseTime permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionCloseTime(datetime &lastClosedPositionCloseTime) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionCloseTime = lastClosedPositionInfo.closeTime;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Swap

A função LastClosedPositionSwap() é responsável por recuperar o valor do swap da posição fechada mais recentemente. Ela salva esse valor de swap na variável referenciada lastClosedPositionSwap. Se a função LastClosedPositionSwap() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionSwap com o valor de swap e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionSwap permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionSwap(double &lastClosedPositionSwap) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionSwap = lastClosedPositionInfo.swap;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Commission

A função LastClosedPositionCommission() é responsável por recuperar o valor da comissão da posição fechada mais recentemente. Ela salva esse valor de comissão na variável referenciada lastClosedPositionCommission. Se a função LastClosedPositionCommission() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionCommission com o valor da comissão e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionCommission permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionCommission(double &lastClosedPositionCommission) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionCommission = lastClosedPositionInfo.commission;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Initiating Order Type

A função LastClosedPositionInitiatingOrderType() é responsável por recuperar o tipo da ordem inicial da posição fechada mais recentemente. Isso nos permite saber se a posição foi iniciada por uma ordem pendente (Buy Stop, Buy Limit, Sell Stop, Sell Limit, Buy Stop Limit ou Sell Stop Limit) ou por uma ordem de entrada a mercado direta. Ela salva esse tipo de ordem inicial na variável referenciada lastClosedPositionInitiatingOrderType. Se a função LastClosedPositionInitiatingOrderType() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionInitiatingOrderType com o valor do tipo de ordem inicial e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionInitiatingOrderType permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionInitiatingOrderType(ENUM_ORDER_TYPE &lastClosedPositionInitiatingOrderType) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionInitiatingOrderType = lastClosedPositionInfo.initiatingOrderType;
      return(true);
     }
   return(false);
  }


Função Last Closed Position ID

A função LastClosedPositionId() é responsável por recuperar o ID da posição fechada mais recentemente. Ela salva esse ID da posição na variável referenciada lastClosedPositionId. Se a função LastClosedPositionId() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionId com o valor do ID da posição e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionId permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionId(ulong &lastClosedPositionId) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionId = lastClosedPositionInfo.positionId;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Initiated by Pending Order

A função LastClosedPositionInitiatedByPendingOrder() é responsável por verificar se a posição fechada mais recentemente foi iniciada a partir de uma ordem pendente. Ela salva essa informação na variável referenciada lastClosedPositionInitiatedByPendingOrder. Se a função LastClosedPositionInitiatedByPendingOrder() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionInitiatedByPendingOrder com o resultado e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionInitiatedByPendingOrder permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionInitiatedByPendingOrder(bool &lastClosedPositionInitiatedByPendingOrder) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionInitiatedByPendingOrder = lastClosedPositionInfo.initiatedByPendingOrder;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Opening Order Ticket

A função LastClosedPositionOpeningOrderTicket() é responsável por recuperar o número do ticket da ordem de abertura da posição fechada mais recentemente. Ela salva esse número de ticket na variável referenciada lastClosedPositionOpeningOrderTicket. Se a função LastClosedPositionOpeningOrderTicket() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionOpeningOrderTicket com o número do ticket e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionOpeningOrderTicket permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionOpeningOrderTicket(ulong &lastClosedPositionOpeningOrderTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpeningOrderTicket = lastClosedPositionInfo.openingOrderTicket;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Opening Deal Ticket

A função LastClosedPositionOpeningDealTicket() é responsável por recuperar o número do ticket da negociação de abertura da posição fechada mais recentemente. Ela salva esse número de deal ticket na variável referenciada lastClosedPositionOpeningDealTicket. Se a função LastClosedPositionOpeningDealTicket() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionOpeningDealTicket com o número do deal ticket e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionOpeningDealTicket permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionOpeningDealTicket(ulong &lastClosedPositionOpeningDealTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionOpeningDealTicket = lastClosedPositionInfo.openingDealTicket;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Closing Deal Ticket

A função LastClosedPositionClosingDealTicket() é responsável por recuperar o número do ticket da negociação de fechamento da posição fechada mais recentemente. Ela salva esse número de deal ticket na variável referenciada lastClosedPositionClosingDealTicket. Se a função LastClosedPositionClosingDealTicket() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionClosingDealTicket com o número do deal ticket e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionClosingDealTicket permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionClosingDealTicket(ulong &lastClosedPositionClosingDealTicket) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionClosingDealTicket = lastClosedPositionInfo.closingDealTicket;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Magic

A função LastClosedPositionMagic() é responsável por recuperar o magic number da posição fechada mais recentemente. Ela salva esse magic number na variável referenciada lastClosedPositionMagic. Se a função LastClosedPositionMagic() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionMagic com o magic number e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionMagic permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionMagic(ulong &lastClosedPositionMagic) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionMagic = lastClosedPositionInfo.magic;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Comment

A função LastClosedPositionComment() é responsável por recuperar o comentário associado à posição fechada mais recentemente. Ela salva esse comentário na variável referenciada lastClosedPositionComment. Se a função LastClosedPositionComment() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionComment com o comentário e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionComment permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionComment(string &lastClosedPositionComment) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionComment = lastClosedPositionInfo.comment;
      return(true);
     }
   return(false);
  }


Função Last Closed Position Duration

A função LastClosedPositionDuration() é responsável por recuperar a duração da posição fechada mais recentemente em segundos. Ela salva essa duração na variável referenciada lastClosedPositionDuration. Se a função LastClosedPositionDuration() recuperar com sucesso os dados da última posição fechada, ela atualizará a variável lastClosedPositionDuration com a duração e confirmará que a operação foi bem-sucedida retornando true. Se falhar ao recuperar os dados, a variável lastClosedPositionDuration permanecerá inalterada, e a função indicará a falha retornando false.

bool LastClosedPositionDuration(long &lastClosedPositionDuration) export
  {
   PositionData lastClosedPositionInfo;
   if(GetLastClosedPositionData(lastClosedPositionInfo))
     {
      lastClosedPositionDuration = lastClosedPositionInfo.duration;
      return(true);
     }
   return(false);
  }


Conclusão

Neste artigo, você aprendeu como funções utilitárias menores e focadas, como aquelas que projetamos para recuperar propriedades específicas das últimas posições fechadas, podem trabalhar juntas para realizar tarefas direcionadas enquanto mantêm clareza e modularidade dentro da base de código da biblioteca EX5. Ao isolar a lógica para extração de várias propriedades das posições, essas funções tornam o processo de coleta de dados específicos mais simples e eficiente.

Para manter este artigo conciso e focado, deixaremos a criação das funções da biblioteca responsáveis por recuperar as várias propriedades das últimas ordens pendentes executadas e canceladas para o próximo artigo. Nesse artigo, exploraremos essas funções em detalhes, garantindo que estejam bem integradas ao framework existente. Em seguida, avançaremos para o desenvolvimento de um conjunto de funções de relatórios analíticos, que permitirá aos usuários gerar resumos informativos e relatórios detalhados com base nos dados históricos de negociações. Essa abordagem passo a passo garantirá clareza e nos permitirá cobrir cada tópico de forma abrangente, sem sobrecarregá-lo com muitas informações de uma só vez.

Ao final deste artigo, você encontrará a versão mais recente do código-fonte da biblioteca HistoryManager.mq5, que inclui todas as funções criadas neste artigo, bem como aquelas apresentadas no anterior. Muito obrigada por acompanhar, e aguardo você no próximo artigo.

Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/16681

Arquivos anexados |
HistoryManager.mq5 (55.17 KB)
Gerenciamento de riscos (Parte 1): Fundamentos da construção de uma classe de gerenciamento de riscos Gerenciamento de riscos (Parte 1): Fundamentos da construção de uma classe de gerenciamento de riscos
Neste artigo, analisaremos os fundamentos do gerenciamento de riscos no trading e veremos como criar nossas primeiras funções para calcular o lote adequado para uma operação, assim como o stop loss. Além disso, examinaremos em detalhes como essas funções funcionam, explicando cada etapa. Nosso objetivo é fornecer uma compreensão clara de como aplicar esses conceitos na negociação automática. No final, aplicaremos tudo na prática, criando um script simples com o arquivo incluível que desenvolveremos.
Construindo um Modelo de Restrição de Tendência com Candlestick (Parte 10): Golden Cross e Death Cross Estratégicos (EA) Construindo um Modelo de Restrição de Tendência com Candlestick (Parte 10): Golden Cross e Death Cross Estratégicos (EA)
Você sabia que as estratégias Golden Cross e Death Cross, baseadas no cruzamento de médias móveis, são alguns dos indicadores mais confiáveis para identificar tendências de mercado de longo prazo? Um Golden Cross sinaliza uma tendência de alta quando uma média móvel mais curta cruza acima de uma média mais longa, enquanto o Death Cross indica uma tendência de baixa quando a média mais curta cruza abaixo. Apesar de sua simplicidade e eficácia, aplicar essas estratégias manualmente frequentemente leva a oportunidades perdidas ou negociações atrasadas.
Desenvolvimento de sistemas de trading avançados ICT: Implementação de sinais no indicador Order Blocks Desenvolvimento de sistemas de trading avançados ICT: Implementação de sinais no indicador Order Blocks
Neste artigo você vai aprender como desenvolver um indicador Order Blocks baseado no volume do livro de ofertas (profundidade de mercado) e otimizá-lo usando buffers para melhorar a precisão. Com isso, concluímos a etapa atual do projeto e nos preparamos para as próximas, nas quais será implementada uma classe de gerenciamento de risco e um robô de negociação que utilizará os sinais gerados pelo indicador.
Simulação de mercado: Position View (XX) Simulação de mercado: Position View (XX)
Neste artigo iremos ver como modificar o código do indicador de posição a fim de conseguir, criar um tipo de sombra para que possamos visualizar onde o preço se encontra atualmente no servidor de negociação. Tal principio tem como finalidade facilitar o planejamento de operações. Onde temos uma movimentação das linhas de stop loss ou take profit. Porém adicionar tal funcionalidade, ou seja sombras de preço. Pode parecer algo extremamente complexo. Mas neste artigo mostrarei que você conseguirá fazer isto de maneira muito simples e prática.