//+------------------------------------------------------------------+
//| 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
*/
|