Esta seção descreve as estruturas para trabalhar com o Calendário econômico que está disponível diretamente na plataforma MetaTrader. O calendário econômico é uma enciclopédia pronta com descrição, data de lançamento e grau de importância de indicadores macroeconômicos. Os valores reais dos indicadores macroeconômicos entram na plataforma MetaTrader imediatamente no momento da publicação e são exibidos no gráfico como tags, permitindo monitorar visualmente os indicadores necessários por países, por moedas e por importância.

As funções do calendário econômico permitem analisar automaticamente os eventos recebidos de acordo com critérios de importância individuais - países/pares de moedas.

As descrições do país são especificadas pela estrutura MqlCalendarCountry. São usadas as funções CalendarCountryById() e CalendarCountries()

struct MqlCalendarCountry
  {
   ulong                               id;                    // identificador de país pelo padrão ISO 3166-1
   string                              name;                  // nome do país (na codificação atual do terminal)
   string                              code;                  // nome de código do país ISO 3166-1 alpha-2
   string                              currency;              // código da moeda do país
   string                              currency_symbol;       // símbolo da moeda do país
   string                              url_name;              // nome do país usado no URL em mql5.com
  };

 

As descrições dos eventos são especificadas pela estrutura MqlCalendarEvent. É usado nas funções CalendarEventById(), CalendarEventByCountry() e CalendarEventByCurrency()

struct MqlCalendarEvent
  {
   ulong                               id;                    // identificador de evento
   ENUM_CALENDAR_EVENT_TYPE            type;                  // tipo de evento da enumeração ENUM_CALENDAR_EVENT_TYPE
   ENUM_CALENDAR_EVENT_SECTOR          sector;                // setor ao qual está relacionado o evento
   ENUM_CALENDAR_EVENT_FREQUENCY       frequency;             // frequência do evento
   ENUM_CALENDAR_EVENT_TIMEMODE        time_mode;             // modo de hora do evento
   ulong                               country_id;            // identificador do país
   ENUM_CALENDAR_EVENT_UNIT            unit;                  // unidade de medida da leitura do calendário econômico
   ENUM_CALENDAR_EVENT_IMPORTANCE      importance;            // importância do evento
   ENUM_CALENDAR_EVENT_MULTIPLIER      multiplier;            // multiplicador da leitura do calendário econômico
   uint                                digits;                // número de casas decimais
   string                              source_url;            // URL da fonte em que é publicado o evento
   string                              event_code;            // código do evento
   string                              name;                  // nome do evento na linguagem do terminal (no conjunto de caracteres atual do terminal)
  };

 

Os valores do evento são definidos pela estrutura MqlCalendarValue. É usado nas funções CalendarValueById(), CalendarValueHistoryByEvent(), CalendarValueHistory(), CalendarValueLastByEvent() e CalendarValueLast()

struct MqlCalendarValue
  {
   ulong                               id;                    // ID do valor
   ulong                               event_id;              // ID do evento
   datetime                            time;                  // hora e data do evento
   datetime                            period;                // período de relatório do evento
   int                                 revision;              // revisão do indicador publicado em relação ao período de relatório
   long                                actual_value;          // valor real em ppm ou LONG_MIN se nenhum valor for especificado
   long                                prev_value;            // valor anterior em ppm ou LONG_MIN se não estiver definido
   long                                revised_prev_value;    // valor anterior revisado em ppm ou LONG_MIN se não estiver definido
   long                                forecast_value;        // valor previsto em ppm ou LONG_MIN se não estiver definido
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // impacto potencial na taxa de câmbio
  //--- funções para verificar valores
   bool                         HasActualValue(voidconst;   // retorna true se no campo estiver definido o valor actual_value
   bool                         HasPreviousValue(voidconst; // retorna true se no campo estiver definido o valor prev_value
   bool                         HasRevisedValue(voidconst;  // retorna true se no campo estiver definido o valor revised_prev_value
   bool                         HasForecastValue(voidconst; // retorna true se no campo estiver definido o valor forecast_value
  //--- funções para obter valores
   double                       GetActualValue(voidconst;   // retorna actual_value ou nan, se o valor não estiver definido
   double                       GetPreviousValue(voidconst; // retorna prev_value ou nan, se o valor não estiver definido
   double                       GetRevisedValue(voidconst;  // retorna revised_prev_value ou nan, se o valor não estiver definido
   double                       GetForecastValue(voidconst; // retorna forecast_value ou nan, se o valor não estiver definido
  };

A estrutura MqlCalendarValue disponibiliza método para obter e verificar valores a partir dos campos actual_value, forecast_value, prev_value e revised_prev_value. Se o valor do campo não estiver definido, ele armazenará o valor LONG_MIN (-9223372036854775808).

Deve-se ter em mente que os valores nestes campos são armazenados multiplicados por um fator de um milhão. Isso significa que quando as funções CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent e CalendarValueLast recebem valores em MqlCalendarValue, é necessário verificar se os valores LONG_MIN desses campos são iguais; e se no campo estiver definido o valor, para obter o valor deve-se dividir o valor do campo por 1000 000 (um milhão). Outra maneira de obter valores é verificar e obter valores por funções da própria estrutura MqlCalendarValue.

Exemplo de processamento de eventos de calendário:

//--- criamos nossa própria estrutura para armazenar eventos de calendário com valores reais em vez de valores inteiros
struct AdjustedCalendarValue
  {
   ulong                               id;                    // ID do valor
   ulong                               event_id;              // ID do evento
   datetime                            time;                  // hora e data do evento
   datetime                            period;                // período de relatório do evento
   int                                 revision;              // revisão do indicador publicado em relação ao período de relatório
   double                              actual_value;          // valor atual do indicador
   double                              prev_value;            // valor anterior do indicador
   double                              revised_prev_value;    // valor anterior revisado do indicador
   double                              forecast_value;        // valor previsto do indicador
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // impacto potencial na taxa de câmbio
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//--- código do país para a União Europeia de acordo com o padrão ISO 3166-1 Alpha-2
   string EU_code="EU";
//--- obtemos todos os valores dos eventos para a União Europeia
   MqlCalendarValue values[];
//--- definimos os limites do intervalo do qual tomamos os eventos
   datetime date_from=D'01.01.2021';  // tomamos todos os eventos de 2021
   datetime date_to=0;                // 0 representa todos os eventos conhecidos, mesmo aqueles que ainda não ocorreram
//--- solicitamos o histórico do evento para a União Europeia desde 2021
   if(!CalendarValueHistory(valuesdate_fromdate_toEU_code))
     {
      PrintFormat("Erro! Falha ao obter eventos por país country_code=%s"EU_code);
      PrintFormat("Código de erro: %d"GetLastError());
      return;
     }
   else
      PrintFormat("Recebidos valores de eventos para o país country_code=%s: %d",
                  EU_codeArraySize(values));
//--- reduzimos o tamanho da matriz para exibição no Diário
   if(ArraySize(values)>5)
      ArrayResize(values5);
//--- exibimos os valores dos eventos no Diário tal qual como estão, sem verificações e com os valores reais
   Print("Exibimos os valores do calendário tal qual como estão");
   ArrayPrint(values);
 
//--- verificamos os valores dos campos e os atualizamos para os valores atuais
//--- primeira opção para verificar e obter valores
   AdjustedCalendarValue values_adjusted_1[];
   int total=ArraySize(values);
   ArrayResize(values_adjusted_1total);
//--- copiarmos os valores verificados e corrigidos
   for(int i=0i<totali++)
     {
      values_adjusted_1[i].id=values[i].id;
      values_adjusted_1[i].event_id=values[i].event_id;
      values_adjusted_1[i].time=values[i].time;
      values_adjusted_1[i].period=values[i].period;
      values_adjusted_1[i].revision=values[i].revision;
      values_adjusted_1[i].impact_type=values[i].impact_type;
      //--- efetuamos a verificação de valores e dividimos por 1000 000
      if(values[i].actual_value==LONG_MIN)
         values_adjusted_1[i].actual_value=double("nan");
      else
         values_adjusted_1[i].actual_value=values[i].actual_value/1000000.;
 
      if(values[i].prev_value==LONG_MIN)
         values_adjusted_1[i].prev_value=double("nan");
      else
         values_adjusted_1[i].prev_value=values[i].prev_value/1000000.;
 
      if(values[i].revised_prev_value==LONG_MIN)
         values_adjusted_1[i].revised_prev_value=double("nan");
      else
         values_adjusted_1[i].revised_prev_value=values[i].revised_prev_value/1000000.;
 
      if(values[i].forecast_value==LONG_MIN)
         values_adjusted_1[i].forecast_value=double("nan");
      else
         values_adjusted_1[i].forecast_value=values[i].forecast_value/1000000.;
     }
   Print("Primeira maneira de verificar e obter valores do calendário");
   ArrayPrint(values_adjusted_1);
 
//--- segunda opção para verificar e obter valores
   AdjustedCalendarValue values_adjusted_2[];
   ArrayResize(values_adjusted_2total);
//--- copiarmos os valores verificados e corrigidos
   for(int i=0i<totali++)
     {
      values_adjusted_2[i].id=values[i].id;
      values_adjusted_2[i].event_id=values[i].event_id;
      values_adjusted_2[i].time=values[i].time;
      values_adjusted_2[i].period=values[i].period;
      values_adjusted_2[i].revision=values[i].revision;
      values_adjusted_2[i].impact_type=values[i].impact_type;
      //--- efetuamos as verificações e obtemos valores
      if(values[i].HasActualValue())
         values_adjusted_2[i].actual_value=values[i].GetActualValue();
      else
         values_adjusted_2[i].actual_value=double("nan");
 
      if(values[i].HasPreviousValue())
         values_adjusted_2[i].prev_value=values[i].GetPreviousValue();
      else
         values_adjusted_2[i].prev_value=double("nan");
 
      if(values[i].HasRevisedValue())
         values_adjusted_2[i].revised_prev_value=values[i].GetRevisedValue();
      else
         values_adjusted_2[i].revised_prev_value=double("nan");
 
      if(values[i].HasForecastValue())
         values_adjusted_2[i].forecast_value=values[i].GetForecastValue();
      else
         values_adjusted_2[i].forecast_value=double("nan");
     }
   Print("Segunda maneira de verificar e obter valores do calendário");
   ArrayPrint(values_adjusted_2);
 
//--- terceira opção para verificar e obter valores
   AdjustedCalendarValue values_adjusted_3[];
   ArrayResize(values_adjusted_3total);
//--- copiarmos os valores verificados e corrigidos
   for(int i=0i<totali++)
     {
      values_adjusted_3[i].id=values[i].id;
      values_adjusted_3[i].event_id=values[i].event_id;
      values_adjusted_3[i].time=values[i].time;
      values_adjusted_3[i].period=values[i].period;
      values_adjusted_3[i].revision=values[i].revision;
      values_adjusted_3[i].impact_type=values[i].impact_type;
      //--- obtemos valores sem verificações
      values_adjusted_3[i].actual_value=values[i].GetActualValue();
      values_adjusted_3[i].prev_value=values[i].GetPreviousValue();
      values_adjusted_3[i].revised_prev_value=values[i].GetRevisedValue();
      values_adjusted_3[i].forecast_value=values[i].GetForecastValue();
     }
   Print("Terceira maneira de obter valores do calendário, sem verificações");
   ArrayPrint(values_adjusted_3);
  }
/*
   Recebidos os valores de eventos segundo country_code=EU1051
  Exibimos os valores do calendário tal qual como estão
         [id] [event_id]              [time]            [period] [revision]       [actual_value]         [prev_value] [revised_prev_value]     [forecast_value] [impact_type] [reserved]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3             55200000             55500000 -9223372036854775808             55500000             2        ...
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0            143100000            143900000 -9223372036854775808 -9223372036854775808             0        ...
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808             0        ...
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0             11000000             10500000 -9223372036854775808             11000000             0        ...
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0              3100000              3100000              3200000              3100000             0        ...
  Primeira maneira de verificar e obter valores de calendário
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
  Segunda maneira de verificar e obter valores do calendário
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
  Terceira maneira de obter valores do calendário, sem verificações
         [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  999010019 2021.01.05 12:00:00 2020.11.01 00:00:00          0        3.10000      3.10000              3.20000          3.10000             0
*/

 

A frequência do evento é indicada na estrutura MqlCalendarEvent. Possíveis valores são listados ENUM_CALENDAR_EVENT_FREQUENCY

Identificador

Descrição

CALENDAR_FREQUENCY_NONE

Frequência de publicação não definida

CALENDAR_FREQUENCY_WEEK

Publicação uma vez por semana

CALENDAR_FREQUENCY_MONTH

Publicação uma vez por mês

CALENDAR_FREQUENCY_QUARTER

Publicação uma vez por trimestre

CALENDAR_FREQUENCY_YEAR

Publicação uma vez por ano

CALENDAR_FREQUENCY_DAY

Publicação uma vez por dia

 

O tipo de evento é indicado na estrutura MqlCalendarEvent. Possíveis valores são listados ENUM_CALENDAR_EVENT_TYPE

Identificador

Descrição

CALENDAR_TYPE_EVENT

Evento (reunião, discurso e assim por diante)

CALENDAR_TYPE_INDICATOR

Indicador

CALENDAR_TYPE_HOLIDAY

Feriado

 

O setor econômico do evento é indicado na estrutura MqlCalendarEvent. Possíveis valores são listados ENUM_CALENDAR_EVENT_SECTOR

Identificador

Descrição

CALENDAR_SECTOR_NONE

Setor não definido

CALENDAR_SECTOR_MARKET

Mercado, bolsa

CALENDAR_SECTOR_GDP

Produto Interno Bruto (PIB)

CALENDAR_SECTOR_JOBS

Mercado laboral

CALENDAR_SECTOR_PRICES

Preços

CALENDAR_SECTOR_MONEY

Dinheiro

CALENDAR_SECTOR_TRADE

Comércio

CALENDAR_SECTOR_GOVERNMENT

Governo

CALENDAR_SECTOR_BUSINESS

Negócio

CALENDAR_SECTOR_CONSUMER

Consumo

CALENDAR_SECTOR_HOUSING

Alojamento

CALENDAR_SECTOR_TAXES

Impostos

CALENDAR_SECTOR_HOLIDAYS

Feriados

 

A importância do evento é indicada na estrutura MqlCalendarEvent. Possíveis valores são listados ENUM_CALENDAR_EVENT_IMPORTANCE

Identificador

Descrição

CALENDAR_IMPORTANCE_NONE

Nível de importância não definido

CALENDAR_IMPORTANCE_LOW

Baixa importância

CALENDAR_IMPORTANCE_MODERATE

Importância média

CALENDAR_IMPORTANCE_HIGH

Alta importância

 

O tipo de unidade das leituras do evento é indicado na estrutura MqlCalendarEvent. Possíveis valores são listados ENUM_CALENDAR_EVENT_UNIT

Identificador

Descrição

CALENDAR_UNIT_NONE

Unidade não definida

CALENDAR_UNIT_PERCENT

Juros

CALENDAR_UNIT_CURRENCY

Moeda nacional

CALENDAR_UNIT_HOUR

Horas

CALENDAR_UNIT_JOB

Número de empregos

CALENDAR_UNIT_RIG

Equipamentos de perfuração

CALENDAR_UNIT_USD

Dólares estadunidenses

CALENDAR_UNIT_PEOPLE

Número de pessoas

CALENDAR_UNIT_MORTGAGE

Número de empréstimos hipotecários

CALENDAR_UNIT_VOTE

Número de votos

CALENDAR_UNIT_BARREL

Número de barris

CALENDAR_UNIT_CUBICFEET

Volume em pés cúbicos

CALENDAR_UNIT_POSITION

Posições líquidas de especuladores

CALENDAR_UNIT_BUILDING

Número de edifícios

 

Em alguns casos, os valores de um indicador econômico exigem a indicação de um multiplicador que é indicado na estrutura MqlCalendarEvent. Possíveis valores de multiplicadores são listados ENUM_CALENDAR_EVENT_MULTIPLIER

Identificador

Descrição

CALENDAR_MULTIPLIER_NONE

Multiplicador não definido

CALENDAR_MULTIPLIER_THOUSANDS

Milhares

CALENDAR_MULTIPLIER_MILLIONS

Milhões

CALENDAR_MULTIPLIER_BILLIONS

Bilhões

CALENDAR_MULTIPLIER_TRILLIONS

Trilhões

 

O impacto potencial do evento na taxa de câmbio nacional é indicado na estrutura MqlCalendarValue. Possíveis valores são listados ENUM_CALENDAR_EVENT_IMPACT

Identificador

Descrição

CALENDAR_IMPACT_NA

Impacto não especificado

CALENDAR_IMPACT_POSITIVE

Impacto positivo

CALENDAR_IMPACT_NEGATIVE

Impacto negativo

 

A hora do evento é indicada na estrutura MqlCalendarEvent. Possíveis valores são listados ENUM_CALENDAR_EVENT_TIMEMODE

Identificador

Descrição

CALENDAR_TIMEMODE_DATETIME

A fonte publica a hora exata do evento

CALENDAR_TIMEMODE_DATE

Evento leva o dia todo

CALENDAR_TIMEMODE_NOTIME

A fonte não publica a hora do evento

CALENDAR_TIMEMODE_TENTATIVE

A fonte não publica previamente a hora exata do evento, apenas seu dia. A hora é especificada quando o evento ocorre.

 

Veja também

Calendário econômico