CalendarValueLastByEvent

Obtiene la matriz de valores de un evento según su ID desde el momento en que se creó la base de datos del Calendario con el change_id indicado.

int  CalendarValueLastByEvent(
   ulong                event_id,      // identificador del evento 
   ulong&               change_id,     // identificador del valor del evento 
   MqlCalendarValue&    values[]       // matriz para obtener las descripciones de los valores 
   );

Parámetros

event_id

[in]  Identificador del evento.

change_id

[in][out]  Identificador del cambio.

values[]

[out]  Matriz del tipo MqlCalendarValue para obtener los valores del evento. Vea el siguiente ejemplo de procesamiento de eventos del calendario.

Valor retornado

Número de valores de evento obtenidos. Para obtener información sobre el error, necesitamos llamar la función GetLastError(). Posibles errores:

  • 4001 — ERR_INTERNAL_ERROR  (error general del sistema de ejecución),
  • 4004 — ERR_NOT_ENOUGH_MEMORY (memoria insuficiente para ejecutar la solicitud),
  • 5401 — ERR_CALENDAR_TIMEOUT (se ha superado el límite de solicitud por tiempo),
  • 5400 — ERR_CALENDAR_MORE_DATA (el tamaño de la matriz es insuficiente para obtener las descripciones de todos los valores, por eso ha recibido solo aquellas que cabían),

Observación

Todas las funciones para trabajar con el Calendario Económico utilizan la hora del servidor comercial (TimeTradeServer). Esto significa que la hora en la estructura MqlCalendarValue y los parámetros de entrada de hora en las funciones CalendarValueHistoryByEvent/CalendarValueHistory se establecen en el huso horario del servidor comercial, y no en la hora local del usuario.

Si se ha transmitido a la función la matriz events[] de longitud fija, y como resultado de la solicitud no ha habido espacio suficiente para guardar el resultado completo, se generará el error ERR_CALENDAR_MORE_DATA (5400).

Si se ha transmitido change_id = 0, la función retorna siempre cero, pero en este caso, además, al change_id se retorna el estado actual de la base de datos del Calendario.

La función retorna la matriz de valores para la noticia indicada y el nuevo change_id que se puede usar para las siguientes llamadas de esta función para obtener los nuevos valores de la noticia. Así, llamando esta función con el último change_id conocido, es posible obtener las actualizaciones de los valores para la noticia indicada.

La estructura MqlCalendarValue proporciona un método para obtener e comprobar valores a partir de los campos actual_value, forecast_value, prev_value y revised_prev_value. Si el valor del campo no está definido, éste almacenará el valor LONG_MIN (-9223372036854775808).

Es necesario tener en cuenta que los valores de estos campos se almacenan multiplicados por un factor de un millón. Eso quiere decir que cuando las funciones CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent y CalendarValueLast reciben valores en MqlCalendarValue, es necesario comprobar que los valores LONG_MIN de esos campos son idénticos; y si el valor está definido en el campo, para obtener el valor, el valor del campo debe dividirse entre 1000 000 (un millón). Otra forma de obtener valores es verificar y obtener valores mediante funciones de la propia estructura MqlCalendarValue.

Ejemplo de un experto que escucha la salida del informe de Nonfarm payrolls:

#property description "Ejemplo de uso de la función CalendarValueLastByEvent"
#property description " para captar la salida del informe del evento Nonfarm Payrolls."
#property description "Para ello, es necesario obtener el identificador actual de cambio"
#property description " de la base de datos del Calendario. Y después obtener con este identificador"
#property description " solo los nuevos eventos a través de una solicitud en el temporizador"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- identificador de cambio de la base de datos del Calendario
   static ulong calendar_change_id=0;
//--- señal del primer inicio
   static bool first=true;
//--- identificador del evento  
   static ulong event_id=0;
//--- nombre del evento  
   static string event_name=NULL;
//--- matriz de valores de los eventos
   MqlCalendarValue values[];
//--- inicializamos - obtenemos el calendar_change_id actual
   if(first)
     {
      MqlCalendarEvent events[];
      //--- código del país para los EE.UU. según el estándar ISO 3166-1 Alpha-2 
      string USA_code="US";
      //--- obtenemos los eventos para los Estados Unidos    
      int events_count=CalendarEventByCountry(USA_code,events);
      //--- posición del evento que necesitamos en la matriz events
      int event_pos=-1;
      //--- mostramos los eventos de los Estados Unidos en el Registro
      if(events_count>0)
        {
         PrintFormat("%s: Eventos para los Estados Unidos: %d",__FUNCTION__,events_count);
         for(int i=0;i<events_count;i++)
           {
            string event_name_low=events[i].name;
            //--- convertimos el nombre del evento en registro menor            
            if(!StringToLower(event_name_low))
              {
               PrintFormat("StringToLower() ha retornado el error %d",GetLastError());
               //--- salimos de la función de forma anticipada
               return;
              }
            //--- buscando el evento "Nonfarm Payrolls"            
            if(StringFind(event_name_low,"nonfarm payrolls")!=-1)
              {
               //--- evento localizado, guardamos su id
               event_id=events[i].id;
               //--- registramos su nombre para el evento "Nonfarm Payrolls" 
               event_name=events[i].name;
               //--- guardamos la posición de los eventos en la matriz events[]               
               event_pos=i;
               //--- en realidad, en el Calendario existen varios eventos que contienen en su nombre "nonfarm payrolls", téngalo en cuenta
               PrintFormat("Evento \"Nonfarm Payrolls\" localizado: event_id=%d  event_name=%s",event_id,event_name);
               //--- mire todos los eventos tras comentar más abajo el operador break, para comprender mejor este ejemplo
               break;
              }
           }
         //--- reducimos la lista, eliminamos los eventos después del evento "Nonfarm Payrolls"
         ArrayRemove(events,event_pos+1);
         //--- para que el estudio sea más cómodo, dejamos los 9 eventos antes de "Nonfarm Payrolls"         
         ArrayRemove(events,0,event_pos-9);
         ArrayPrint(events);
        }
      else
        {
         PrintFormat("%s: CalendarEventByCountry(%s) ha retornado 0 eventos, código de error=%d",
                     USA_code,__FUNCTION__,GetLastError());
         //--- el trabajo ha finalizado de forma errónea, vamos a intentarlo de nuevo en la siguiente llamada del temporizador         
         return;
        }
 
      //--- obtenemos para el evento indicado el identificador de cambio de la base de datos del Calendario   
      if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
        {
         //--- este bloque de código no puede ejecutarse en el primer inicio, pero lo registramos de todas formas
         PrintFormat("%s: Se ha obtenido el identificador actual de la base de datos del Calendario: change_id=%d",
                     __FUNCTION__,calendar_change_id);
         //--- mostramos la bandera y salimos hasta el siguiente evento del temporizador
         first=false;
         return;
        }
      else
        {
         //--- los datos no han sido obtenidos (esto es normal para el primer inicio), comprobamos si hay errores
         int error_code=GetLastError();
         if(error_code==0)
           {
            PrintFormat("%s: Se ha obtenido el identificador actual de la base de datos del Calendario: change_id=%d",
                        __FUNCTION__,calendar_change_id);
            //--- mostramos la bandera y salimos hasta el siguiente evento del temporizador
            first=false;
            //--- ahora tenemos el valor calendar_change_id
            return;
           }
         else
           {
            //--- y esto es realmente un error            
            PrintFormat("%s: No se ha logrado obtener los valores para el evento event_id=%d",__FUNCTION__,event_id);
            PrintFormat("Código de error: %d",error_code);
            //--- el trabajo ha finalizado de forma errónea, vamos a intentarlo de nuevo en la siguiente llamada del temporizador         
            return;
           }
        }
     }
 
//--- tenemos el último valor conocido del identificador de cambio del Calendario (change_id)
   ulong old_change_id=calendar_change_id;
//--- comprobamos si ha aparecido un valor nuevo del evento "Nonfarm Payrolls"
   if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
     {
      PrintFormat("%s: Se han obtenido nuevos eventos para \"%s\": %d",
                  __FUNCTION__,event_name,ArraySize(values));
      //--- mostramos en el Registro la información de la matriz values 
      ArrayPrint(values);
      //--- mostramos en el Registro los valores del identificador anterior y el actual del Calendario
      PrintFormat("%s: Anterior change_id=%d, nuevo change_id=%d",
                  __FUNCTION__,old_change_id,calendar_change_id);
/* 
      escriba aquí su propio código para procesar la publicación de los datos de "Nonfarm Payrolls"
      */
     }
//---     
  }
/*
  Resultado:
   OnTimer: Eventos para los EE.UU.: 202
   Evento "Nonfarm Payrolls" localizado: 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: Se ha obtenido el identificador actual de la base de datos del Calendario: change_id=33986560
 
*/  

Ver también

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById