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()
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(void) const; // retorna true se no campo estiver definido o valor actual_value
bool HasPreviousValue(void) const; // retorna true se no campo estiver definido o valor prev_value
bool HasRevisedValue(void) const; // retorna true se no campo estiver definido o valor revised_prev_value
bool HasForecastValue(void) const; // retorna true se no campo estiver definido o valor forecast_value
//--- funções para obter valores
double GetActualValue(void) const; // retorna actual_value ou nan, se o valor não estiver definido
double GetPreviousValue(void) const; // retorna prev_value ou nan, se o valor não estiver definido
double GetRevisedValue(void) const; // retorna revised_prev_value ou nan, se o valor não estiver definido
double GetForecastValue(void) const; // 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(values, date_from, date_to, EU_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_code, ArraySize(values));
//--- reduzimos o tamanho da matriz para exibição no Diário
if(ArraySize(values)>5)
ArrayResize(values, 5);
//--- 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_1, total);
//--- copiarmos os valores verificados e corrigidos
for(int i=0; i<total; i++)
{
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_2, total);
//--- copiarmos os valores verificados e corrigidos
for(int i=0; i<total; i++)
{
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_3, total);
//--- copiarmos os valores verificados e corrigidos
for(int i=0; i<total; i++)
{
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=EU: 1051
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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55200000 55500000 -9223372036854775808 55500000 2 ...
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143100000 143900000 -9223372036854775808 -9223372036854775808 0 ...
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 ...
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11000000 10500000 -9223372036854775808 11000000 0 ...
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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