CalendarValueLast

Obtiene la matriz de valores de todos los eventos con filtrado por país y/o divisa desde el momento en que se creó la base de datos del Calendario con el change_id indicado.

int  CalendarValueLast(
   ulong&               change_id,             // identificador  del cambio
   MqlCalendarValue&    values[],              // matriz para obtener las descripciones de los valores 
   const string         country_code=NULL,     // nombre clave del país ISO 3166-1 alpha-2
   const string         currency=NULL          // nombre clave de la divisa del país
   );

Parámetros

change_id

[in][out]  Identificador del cambio.

values[]

[out]  Matriz del tipo MqlCalendarValue para obtener los valores del evento.

country_code=NULL

[in]  Nombre clave del país según ISO 3166-1 alpha-2

currency=NULL

[in]  Nombre clave de la divisa del país.

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.

Para los filtros country_code y currency los valores NULL y "" son equivalentes: designan la ausencia de filtro.

Para country_code es mejor usar el campo code de la estructura MqlCalendarCountry, por ejemplo, "US", "RU" o "EU".

Para currency es mejor usar el campo currency de la estructura MqlCalendarCountry, por ejemplo, "USD", "RUB" o "EUR".

Los filtros se usan mediante conjunción, es decir, a través de un 'Y' lógico se eligen los valores solo de aquellos eventos para los que se cumplen simultáneamente las dos condiciones: país y divisa

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.

Si para el valor del evento no existe alguno de los campos de abajo

struct MqlCalendarValue
  {
   ...
   long              actual_value;              // valor actual del evento
   long              prev_value;                // valor anterior del evento
   long              revised_prev_value;        // valor anterior revisado del evento
   long              forecast_value;            // valor pronosticado del evento
   ...
  };

entonces el valor del campo ausente se retornará como INT64_MIN (-9223372036854775808).

Ejemplo de un experto que escucha la aparición de eventos del Calendario Económico:

#property description "Ejemplo de uso de la función CalendarValueLast"
#property description " para crear un escuchador de eventos del Calendario Económico."
#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;
//--- matriz de valores de los eventos
   MqlCalendarValue values[];
//--- inicializamos - obtenemos el calendar_change_id actual
   if(first)
     {
      //--- obtenemos el identificador de cambio de la base de datos del Calendario   
      if(CalendarValueLast(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 podido obtener el evento en CalendarValueLast. Código de error: %d",
                        __FUNCTION__,error_code);
            //--- el trabajo ha finalizado de forma errónea, vamos a intentar inicializar 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 han aparecido nuevos eventos del Calendario
   if(CalendarValueLast(calendar_change_id,values)>0)
     {
      PrintFormat("%s: Se han obtenido nuevos eventos del Calendario: %d",
                  __FUNCTION__,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);
      //--- mostramos los nuevos eventos en el Registro
      ArrayPrint(values);
      /* 
     escriba aquí su propio código para procesar la aparición de eventos
      */
     }
//---     
  }
/*
  Ejemplo de funcionamiento del escuchador:
  OnTimer: Se ha obtenido el identificador actual de la base de datos del Calendario: change_id=33281792
  OnTimer: Se han obtenido los nuevos eventos para el Calendario: 1
        [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91040   76020013 2019.03.20 15:30:00 1970.01.01 00:00:00          0       -5077000     -1913000 -9223372036854775808         -4077000             2          0
  OnTimer: Anterior change_id=33281792, nuevo change_id=33282048
        [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91040   76020013 2019.03.20 15:30:00 1970.01.01 00:00:00          0       -5077000     -1913000 -9223372036854775808         -4077000             2          0
  OnTimer: Se han obtenido los nuevos eventos para el Calendario: 1
        [id] [event_id]              [time]            [period] [revision]       [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91041   76020013 2019.03.27 15:30:00 1970.01.01 00:00:00          0 -9223372036854775808     -5077000 -9223372036854775808         -7292000             0          0
  OnTimer: Anterior change_id=33282048, nuevo change_id=33282560
        [id] [event_id]              [time]            [period] [revision]       [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
   [0] 91041   76020013 2019.03.27 15:30:00 1970.01.01 00:00:00          0 -9223372036854775808     -5077000 -9223372036854775808         -7292000             0          0
 
*/  

Ver también

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById