#property description "Esempio di utilizzo della funzione CalendarValueLastByEvent"
#property description " per tenere traccia del rilascio del report Nonfarm Payrolls"
#property description "Per ottenere ciò, ottieni l'ID della modifica corrente"
#property description " del database del Calendario. Quindi, usa questo ID per ricevere "
#property description " solo nuovi eventi tramite il sondaggio del timer"
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- crea il timer
EventSetTimer(60);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funzione di deinitializzazione dell' Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- distruggi il timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Funzione tick dell' Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Funzione del timer |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- Cambia ID del database del calendario
static ulong calendar_change_id=0;
//--- primo attributo di lancio
static bool first=true;
//--- ID evento
static ulong event_id=0;
//--- nome dell'evento
static string event_name=NULL;
//--- arra del valore di evento
MqlCalendarValue values[];
//--- esegue l'inizializzazione - ottiene l'attuale calendar_change_id
if(first)
{
MqlCalendarEvent events[];
//--- codice Paese per gli USA (ISO 3166-1 Alpha-2)
string USA_code="US";
//--- ottieni eventi per gli USA
int events_count=CalendarEventByCountry(USA_code,events);
//--- posizione di un evento necessario nell' array 'events'
int event_pos=-1;
//--- visualizza gli eventi USA nel Journal
if(events_count>0)
{
PrintFormat("%s: eventi USA: %d",__FUNCTION__,events_count);
for(int i=0;i<events_count;i++)
{
string event_name_low=events[i].name;
//--- cambia il nome di un evento in minuscolo
if(!StringToLower(event_name_low))
{
PrintFormat("StringToLower() ha restituito l'errore %d",GetLastError());
//--- esce dalla funzione prima del tempo
return;
}
//--- cerca l'evento "Nonfarm Payrolls"
if(StringFind(event_name_low,"nonfarm payrolls")!=-1)
{
//--- evento trovato, ricorda il suo ID
event_id=events[i].id;
//--- scrive il nome dell'evento "Nonfarm Payrolls"
event_name=events[i].name;
//--- ricorda la posizione degli eventi nell' array 'events[]'
event_pos=i;
//--- tieni presente che il Calendario presenta diversi eventi contenenti "nonfarm payrolls" nei loro nomi
PrintFormat("Evento \"Nonfarm Payrolls\" trovato: event_id=%d event_name=%s",event_id,event_name);
//--- visualizza tutti gli eventi commentando l'operatore 'break' per capire meglio questo esempio
break;
}
}
//--- riduci la lista cancellando gli eventi dopo "Nonfarm Payrolls"
ArrayRemove(events,event_pos+1);
//--- lascia 9 eventi prima di "Nonfarm Payrolls" per analisi più convenienti
ArrayRemove(events,0,event_pos-9);
ArrayPrint(events);
}
else
{
PrintFormat("%s: CalendarEventByCountry(%s) ha restituito 0 eventi, codice errore=%d",
USA_code,__FUNCTION__,GetLastError());
//--- operazione completata in errore, riprovare durante la prossima chiamata del timer
return;
}
//--- ottiene l'ID di modifica del database di Calendar per l'evento specificato
if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
{
//--- questo blocco di codice non può essere eseguito durante il primo avvio, ma aggiungiamolo comunque
PrintFormat("%s: Ricevuto l'ID corrente del database del calendario: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- imposta la flag ed esce prima del prossimo evento del timer
first=false;
return;
}
else
{
//--- i dati non vengono ricevuti (questo è normale per il primo avvio), controllare per un errore
int error_code=GetLastError();
if(error_code==0)
{
PrintFormat("%s: Ricevuto l'ID corrente del database del calendario: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- imposta la flag ed esce prima del prossimo evento del timer
first=false;
//--- ora abbiamo il valore calendar_change_id
return;
}
else
{
//--- e questo è davvero un errore
PrintFormat("%s: Fallimento nell'ottenere valori per event_id=%d",__FUNCTION__,event_id);
PrintFormat("Codice errore: %d",error_code);
//--- operazione completata con errore, riprovare durante la prossima chiamata del timer
return;
}
}
}
// --- abbiamo l'ultimo valore conosciuto del change ID del calendario (change_id)
ulong old_change_id=calendar_change_id;
//--- controlla un nuovo valore dell' evento Nonfarm Payrolls
if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
{
PrintFormat("%s: Ricevuti nuovi eventi per \"%s\": %d",
__FUNCTION__,event_name,ArraySize(values));
//--- visualizza i dati dall' arra 'values' nel Journal
ArrayPrint(values);
//--- mostra i valori del precedente e del nuovo ID del diario
PrintFormat("%s: Precedente change_id=%d, nuovo change_id=%d",
__FUNCTION__,old_change_id,calendar_change_id);
/*
scrivi il tuo codice che deve gestire la data di rilascio di "Nonfarm Payrolls"qui
*/
}
//---
}
/*
Risultato:
OnTimer: USA events: 202
Evento "Nonfarm Payrolls" trovato: event_id=840030016 event_name=Nonfarm Payrolls
[id] [type] [sector] [frequency] [time_mode] [country_id] [unit] [importance] [multiplier] [digits] [source_url] [event_code] [name] [reserved]
[0] 840030007 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "consumer-price-index-yy" "CPI y/y" 0
[1] 840030008 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "consumer-price-index-ex-food-energy-yy" "Core CPI y/y" 0
[2] 840030009 1 4 2 0 840 0 1 0 3 "https://www.bls.gov" "consumer-price-index-nsa" "CPI n.s.a." 0
[3] 840030010 1 4 2 0 840 0 1 0 3 "https://www.bls.gov" "consumer-price-index-ex-food-energy" "Core CPI" 0
[4] 840030011 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "import-price-index-mm" "Import Price Index m/m" 0
[5] 840030012 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "import-price-index-yy" "Import Price Index y/y" 0
[6] 840030013 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "export-price-index-mm" "Export Price Index m/m" 0
[7] 840030014 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "export-price-index-yy" "Export Price Index y/y" 0
[8] 840030015 1 3 2 0 840 1 2 0 1 "https://www.bls.gov" "unemployment-rate" "Unemployment Rate" 0
[9] 840030016 1 3 2 0 840 4 3 1 0 "https://www.bls.gov" "nonfarm-payrolls" "Nonfarm Payrolls" 0
OnTimer: Ha ricevuto l'ID corrente del database del Calendar: change_id=33986560
*/
|