OnTrade

É chamada em EAs quando ocorre o evento Trade. A função se destina ao processamento de alterações em listas de ordens, de posições e de transações.

void  OnTrade(void);

Valor retornado

Sem valor retornado

Observação

A OnTrade() é chamada apenas para EAs, é ignorada em indicadores e em scripts, mesmo se você adicionar uma função com esse nome e tipo a eles.

Para qualquer ação de negociação (colocação de uma ordem pendente, abertura/fechamento de uma posição, definição de stops, desencadeamento de ordens pendentes, etc.), são devidamente modificados o histórico de ordens e de transações e/ou a lista de posições e de ordens atuais.

Ao processar a ordem, o servidor de negociação envia uma mensagem ao terminal sobre a ocorrência do evento Trade. Para obter a partir do histórico dados atuais sobre ordens e transações, você deve primeiro executar uma solicitação de histórico de negociação usando HistorySelect().

Eventos de negociação são gerados pelo servidor nos seguintes casos:

  • alterações nas ordens atuais,
  • alterações nas posições,
  • alterações nas transações,
  • alterações no histórico de negociação.

 

Cada evento Trade pode ser o resultado de uma ou mais solicitações de negociação. As solicitações de negociação são enviadas para o servidor usando OrderSend() ou OrderSendAsync(). Cada solicitação pode gerar vários eventos de negociação. Você não pode confiar na regra «Uma solicitação - Um evento 'Trade'», já que o processamento de solicitações pode ocorrer em vários estágios e cada operação pode alterar o status de ordens, de posições e do histórico de negociação.

 

O manipulador OnTrade() é chamado após a chamadas correspondentes da OnTradeTransaction(). Em geral, não há correlação exata no número de chamadas da OnTrade() e da OnTradeTransaction(). Uma chamada da OnTrade() corresponde a uma ou mais chamadas da OnTradeTransaction.

Exemplo de EA com manipulador OnTrade()

//+------------------------------------------------------------------+
//|                                               OnTrade_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
input    int days=7;            // profundidade do histórico de negociação em dias
//--- definimos no nível global os limites do histórico de negociação
datetime     start;             // data de início do histórico de negociação em cache
datetime     end;               // data final do histórico de negociação em cache
//--- contadores globais
int          orders;            // número de ordens vigentes
int          positions;         // número de posições abertas
int          deals;             // número de transações no cache do histórico de negociação
int          history_orders;    // número de ordens no cache do histórico de negociaçãod
bool         started=false;     // sinalizador da relevância dos contadores
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   end=TimeCurrent();
   start=end-days*PeriodSeconds(PERIOD_D1);
   PrintFormat("Limites do histórico de negociação carregado: início - %s, fim - %s",
               TimeToString(start),TimeToString(end));
   InitCounters();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|  Inicializando contadores de posições, de ordens e de transações |
//+------------------------------------------------------------------+
void InitCounters()
  {
   ResetLastError();
//--- carregamos o histórico
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Não foi possível carregar no cache o histórico de %s a %s. Código de erro: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- obtemos os valores atuais
   orders=OrdersTotal();
   positions=PositionsTotal();
   deals=HistoryDealsTotal();
   history_orders=HistoryOrdersTotal();
   started=true;
   Print("Inicialização de contadores de ordens, de posições e de transações bem-sucedida");
  }  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| chamado quando ocorre o evento Trade                             |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| exemplo de processamento de alterações na negociação e no histórico
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
  {
   end=TimeCurrent();
   ResetLastError();
//--- carregamos no cache do programa o histórico de negociação a partir do intervalo especificado
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Não foi possível carregar no cache o histórico de %s a %s. Código de erro: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- obtemos os valores atuais
   int curr_orders=OrdersTotal();
   int curr_positions=PositionsTotal();
   int curr_deals=HistoryDealsTotal();
   int curr_history_orders=HistoryOrdersTotal();
//--- verificamos as alterações na quantidade de ordens vigentes
   if(curr_orders!=orders)
     {
      //--- número de ordens vigentes alterado
      PrintFormat("O número de ordens foi alterado de %d para %d",
                  orders,curr_orders);
      //--- atualizamo o valor
      orders=curr_orders;
     }
//--- alteração no número de posições abertas
   if(curr_positions!=positions)
     {
      //--- o número de posições abertas foi alterado
      PrintFormat("O número de posições abertas foi alterado de %d para %d",
                  positions,curr_positions);
      //--- atualizamo o valor
      positions=curr_positions;
     }
//--- alterações no número de transações no cache do histórico de negociação
   if(curr_deals!=deals)
     {
      //--- número de transações no cache do histórico de negociação foi alterado
      PrintFormat("O número de transações foi alterado de %d para %d",
                  deals,curr_deals);
      //--- atualizamo o valor
      deals=curr_deals;
     }
//--- alterações no número de ordens históricas no cache do histórico de negociação
   if(curr_history_orders!=history_orders)
     {
      //--- número de ordens históricas no cache do histórico de negociação foi alterado
      PrintFormat("O número de ordens no histórico foi alterado de %d para %d",
                  history_orders,curr_history_orders);
     //--- atualizamos o valor
     history_orders=curr_history_orders;
     }
//--- verificamos se é necessário alterar os limites do histórico de negociação para solicitação no cache
   CheckStartDateInTradeHistory();
  }
//+------------------------------------------------------------------+
//|  alterações da data de início para a solicitação do histórico de negociação      
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
  {
//--- intervalo de início, se começarmos a trabalhar agora
   datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- verificamos que o limite do início do histórico de transações seja inferior
//--- a 1 dia a partir da data planejada
   if(curr_start-start>PeriodSeconds(PERIOD_D1))
     {
      //--- deve-se corrigir a data de início do histórico carregado no cache
      start=curr_start;
      PrintFormat("Novo limite de início do histórico de negociação carregado: início => %s",
                  TimeToString(start));
      //--- agora recarregamos o histórico de transações para o intervalo atualizado
      HistorySelect(start,end);
      //--- corrigimos os contadores de transações e de ordens no histórico para a próxima comparação
      history_orders=HistoryOrdersTotal();
      deals=HistoryDealsTotal();
     }
  }
//+------------------------------------------------------------------+
/* Exemplo de exibição:
  Limites do histórico de negociação carregado: início - 2018.07.16 18:11, fim - 2018.07.23 18:11
  Contadores de ordens, deposições e de transações inicializados com sucesso
  O número de ordens foi alterado. Havia 0, há 1
  O número de ordens foi alterado. Havia 1, há 0
  O número de posições foi alterado. Havia 0, há 1
  O número de transações foi alterado. Havia 0, há 1
  O número de ordens no histórico foi alterado. Havia 0, há 1
*/

Veja também

OrderSend, OrderSendAsync, OnTradeTransaction, Eventos do terminal do cliente