//+------------------------------------------------------------------+
//| 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; // profondità della cronistoria trade in giorni
//--- imposta i limiti della cronistoria trade nell'ambito globale
datetime start; // data di inizio per la cronistoria di trade nella cache
datetime end; // data di fine per la cronistoria di trade nella cache
//--- contatori globali
int orders; // numero di ordini attivi
int positions; // numero di posizioni aperte
int deals; // numero di affari nella cache della cronistoria di trade
int history_orders; // numero di ordini nella cache della cronistoria di trade
bool started=false; // flag di rilevanza contatore
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
end=TimeCurrent();
start=end-days*PeriodSeconds(PERIOD_D1);
PrintFormat("Limiti della cronistoria da caricare: inizio -%s, fine - %s",
TimeToString(start),TimeToString(end));
InitCounters();
//---
return(0);
}
//+------------------------------------------------------------------+
//| inizializzazione di contatori di posizione, ordine e trade |
//+------------------------------------------------------------------+
void InitCounters()
{
ResetLastError();
//--- carica cronistoria
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Fallimento nel caricare la cronistoria da %s a %s nella cache. Codice errore: %d",
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- ottiene il valore corrente
orders=OrdersTotal();
positions=PositionsTotal();
deals=HistoryDealsTotal();
history_orders=HistoryOrdersTotal();
started=true;
Print("Contatori di ordini, posizioni e affari inizializzati con successo");
}
//+------------------------------------------------------------------+
//| Funzione tick Expert |
//+------------------------------------------------------------------+
void OnTick()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| chiamata quando arriva un evento Trade |
//+------------------------------------------------------------------+
void OnTrade()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| esempio di elaborazione delle modifiche nel trade e nella cronistoria
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
{
end=TimeCurrent();
ResetLastError();
//--- scarica la cronistoria di trading dall'intervallo specificato, nella cache del programma
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Fallimento nel caricare la cronistoria da %s a %s nella cache. Codice errore: %d",
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- ottiene i valori correnti
int curr_orders=OrdersTotal();
int curr_positions=PositionsTotal();
int curr_deals=HistoryDealsTotal();
int curr_history_orders=HistoryOrdersTotal();
//--- controlla se il numero di ordini attivi è stato modificato
if(curr_orders!=orders)
{
//--- il numero di ordini attivi è stato modificato
PrintFormat("Numero di ordini è stato cambiato. Il valore precedente è %d, il valore corrente è %d ",
orders,curr_orders);
//--- aggiorna il valore
orders=curr_orders;
}
//--- cambia il numero di posizioni aperte
if(curr_positions!=positions)
{
//--- il numero di posizioni aperte è stato cambiato
PrintFormat("Il numero di posizioni è stato cambiato Il valore precedente è %d, il valore corrente è %d ",
positions,curr_positions);
//--- aggiorna il valore
positions=curr_positions;
}
//--- cambia il numero di affari nella cache della cronistoria di trade
if(curr_deals!=deals)
{
//--- il numero di affari nella cache della cronologia di trade è stato modificato
PrintFormat("Il numero di affari è stato cambiato. Il valore precedente è %d, il valore corrente è %d ",
deals,curr_deals);
//--- aggiorna il valore
deals=curr_deals;
}
//--- cambio nel numero degli ordini storici nella cache della cronistoria di trade
if(curr_history_orders!=history_orders)
{
//--- il numero di ordini dello storico nella cache della cronistoria di trade commerciale è stato modificato
PrintFormat("Il numero di ordini nella cronistoria è stato cambiato. Il valore precedente è %d, il valore corrente è %d ",
history_orders,curr_history_orders);
//--- aggiornamento valore
history_orders=curr_history_orders;
}
//--- verifica se è necessario modificare i limiti della cronistoria di trade da richiedere nella cache
CheckStartDateInTradeHistory();
}
//+------------------------------------------------------------------+
//| modifica della data di inizio per la richiesta della cronistoria di trade
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
{
/ --- intervallo iniziale, se dovessimo iniziare a lavorare in questo momento
datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- assicurarsi che il limite iniziale della cronistoria di trade non sia andato
//--- più di 1 giorno oltre la data prevista
if(curr_start-start>PeriodSeconds(PERIOD_D1))
{
//--- corregge la data di inizio della cronistoria da caricare nella cache
start=curr_start;
PrintFormat("Nuovo limite iniziale della cronistoria di trade da caricare: start => %s",
TimeToString(start));
//--- ora ricarica la cronistoria degli scambi per l'intervallo aggiornato
HistorySelect(start,end);
//--- correggi l'ordine e i contatori dell'ordine nella cronistoria per ulteriori confronti
history_orders=HistoryOrdersTotal();
deals=HistoryDealsTotal();
}
}
//+------------------------------------------------------------------+
/* Esempio di Output :
Limiti della cronistoria da caricare: inizio - 2018.07.16 18:11, fine 2018.07.23 18:11
I contatori di ordini, posizioni ed affari sono inizializzati con successo
Il numero di ordini è stato cambiato. Valore precedente 0, valore corrente 1
Il numero di ordini è stato cambiato. Valore precedente 1, valore corrente 0
Il numero di posizioni è stato cambiato. Valore precedente 0, valore corrente 1
Il numero di offerte è stato cambiato. Valore precedente 0, valore corrente 1
Il numero di ordini nella cronistoria è stato modificato. Valore precedente 0, valore corrente 1
*/
|