CalendarValueLastByEvent

Ottiene l'array di valori di eventi in base al suo ID poiché lo stato del database di Calendar con un change_id specificato.

int  CalendarValueLastByEvent(
   ulong                event_id,      // ID evento 
   ulong&               change_id,     // valore ID evento 
   MqlCalendarValue&    values[]       // array per le descrizioni dei valori 
   );

Parametri

event_id

[in]  Event ID.

change_id

[in][out]  Change ID.

values[]

[out] MqlCalendarValue: è il tipo di array per ricevere i valori degli eventi

Valore di ritorno

Numero di valori di eventi ricevuti. Per ottenere informazioni su un errore, chiamare la funzione GetLastError(). Possibili errori:

  • 4001 – ERR_INTERNAL_ERROR  (errore di runtime generale),
  • 4004 – ERR_NOT_ENOUGH_MEMORY (memoria insufficiente per l'esecuzione di una richiesta),
  • 5401 – ERR_CALENDAR_TIMEOUT (tempo limite della richiesta ecceduto),
  • 5400 – ERR_CALENDAR_MORE_DATA (la dimensione dell'array è insufficiente per la ricezione delle descrizioni di tutti i valori, solo quelli che sono riusciti a rientrare sono stati ricevuti),

Nota

Tutte le funzioni per lavorare con il calendario economico utilizzano l'ora del trade server (TimeTradeServer). Ciò significa che il tempo nella struttura MqlCalendarValue e gli input di tempo nelle funzioni CalendarValueHistoryByEvent/CalendarValueHistory sono impostate nel fuso orario del trade server, piuttosto che nell'ora locale dell' utente.

Se l'array events[] di lunghezza fissa è stato passato alla funzione e non c'era spazio sufficiente per salvare l'intero risultato, l'errore ERR_CALENDAR_MORE_DATA (5400) viene attivato.

Se change_id = 0 viene passato alla funzione, la funzione restituisce sempre zero ma il database del calendario corrente viene restituito a change_id.

La funzione restituisce l'array per una notizia specificata ed un nuovo change_id che può essere utilizzato per le chiamate successive della funzione per ricevere i nuovi valori della notizia. Pertanto, è possibile aggiornare i valori per una notizia specificata chiamando questa funzione con l'ultimo change_id noto.

Se un valore di un evento non ha nessuno dei campi specificati di seguito

struct MqlCalendarValue
  {
   ...
   long              actual_value;              // valore attuale dell'evento
   long              prev_value;                // valore precedente dell'evento
   long              revised_prev_value;        // valore rivisto dell'evento precedente
   long              forecast_value;            // valore di previsione dell'evento
   ...
  };

quindi il valore del campo mancante viene restituito come INT64_MIN (-9223372036854775808).

L' EA di esempio che ascolta il rilascio del report Nonfarm payrolls:

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

Guarda anche

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById