경제 달력 구조
이 절에서는 MetaTrader 플랫폼에서 직접 사용할 수 있는 경제 달력으로 작업하기 위한 구조를 설명합니다. 경제 달력은 만들어져있는 백과 사전으로 거시 경제 지표, 발표 날짜 및 중요도에 대한 설명이 포함되어 있습니다. 거시 경제 지표의 관련 값은 게시 즉시 MetaTrader 플랫폼으로 전송되며 필요한 지표의 국가, 통화 및 중요도를 시각적으로 추적할 수 있는 태그로 차트에 표시됩니다.
경제 달력 함수를 사용하면 필요한 국가/통화 쌍의 관점에서 사용자 지정 중요도 기준에 따라 들어오는 이벤트의 자동 분석을 수행할 수 있습니다.
국가 설명은 MqlCalendarCountry 구조로 설정됩니다. 이는 CalendarCountryById() 및 CalendarCountries() 함수에서 사용됩니다
struct MqlCalendarCountry
{
ulong id; // 국가 ID (ISO 3166-1)
string name; // 국가 텍스트 이름(현재 터미널 인코딩)
string code; // 국가 코드명 (ISO 3166-1 alpha-2)
string currency; // 국가 통화 코드
string currency_symbol; // 국가 화폐 심볼
string url_name; // mql5.com 웹 사이트 URL에서 사용되는 국가 이름
};
|
이벤트 설명은 MqlCalendarEvent 구조로 설정됩니다. 이는 CalendarEventById(), CalendarEventByCountry() 및 CalendarEventByCurrency() 함수에 사용됩니다
이벤트 값은 MqlCalendarValue 구조로 설정됩니다. 이는 CalendarValueById(), CalendarValueHistoryByEvent(), CalendarValueHistory(), CalendarValueLastByEvent() 및 CalendarValueLast() 함수에 사용됩니다
struct MqlCalendarValue
{
ulong id; // 밸류 ID
ulong event_id; // 이벤트 ID
datetime time; // 이벤트 날짜와 시간
datetime period; // 이벤트 리포팅 피리어드
int revision; // 리포팅 피리어드와 관련된 퍼블리쉬된 보조지표의 수정
long actual_value; // value가 정해지지 않을 경우 ppm 혹은 LONG_MIN 형식의 실제 value
long prev_value; // value가 정해지지 않을 경우 ppm 혹은 LONG_MIN 형식의 이전 value
long revised_prev_value; // value가 정해지지 않을 경우 ppm 혹은 LONG_MIN 형식의 수정된 이전 value
long forecast_value; // value가 정해지지 않을 경우 ppm 혹은 LONG_MIN 형식의 예상 value
ENUM_CALENDAR_EVENT_IMPACT impact_type; // 환율에 대한 가능한 영향
//--- value를 체크하는 함수
bool HasActualValue(void) const; // actual_value가 있으면 true를 리턴
bool HasPreviousValue(void) const; // prev_value가 있으면 true를 리턴
bool HasRevisedValue(void) const; // revised_prev_value가 있으면 true를 리턴
bool HasForecastValue(void) const; // forecast_value가 있으면 true를 리턴
//--- valuesfmf 받는 함수
double GetActualValue(void) const; // value가 없으면 actual_value를 리턴하거나 nan
double GetPreviousValue(void) const; // value가 없으면 prev_value나nan을 리턴
double GetRevisedValue(void) const; // value가 없으면 revised_prev_value 혹은 nan을 리턴
double GetForecastValue(void) const; // value가 없으면 returns forecast_value 혹은 nan을 리턴
};
|
MqlCalendarValue structure는 actual_value, forecast_value, prev_value 와 revised_prev_value 필드의 value를 체크하고 세팅하는 메서드를 제공합니다. 만약 아무런 value도 없을 경우 필드는 LONG_MIN (-9223372036854775808)을 저장합니다.
이들 필드에 저장된 value에는 백만이 곱해집니다. 다음의 함수를 사용하여 MqlCalendarValu에서 밸류를 받을때 CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent and CalendarValueLast, 필드 밸류가 LONG_MIN과 같은지 확인해야 합니다; 만약 필드에 밸류가 지정된 경우 밸류를 얻기 위해서는 밸류를 1,000,000로 나누어 줘야 합니다. value를 가져오는 또 다른 방법은 MqlCalendarValue 구조의 함수를 사용하여 value를 확인하고 가져오는 것입니다.
캘린더 이벤트 처리의 예:
//--- 정수 대신 실제 값으로 캘린더 이벤트를 저장하는 구조를 만듭니다.
struct AdjustedCalendarValue
{
ulong id; // 밸류 ID
ulong event_id; // 이벤트 ID
datetime time; // 이벤트 날짜와 시간
datetime period; // 이벤트 리포팅 피리어드
int revision; // 리포팅 피리어드와 관련된 퍼블리쉬된 보조지표의 수정
double actual_value; // 실제 밸류값
double prev_value; // 이전 밸류값
double revised_prev_value; // 수정된 이전 밸류값
double forecast_value; // 예상 밸류값
ENUM_CALENDAR_EVENT_IMPACT impact_type; // 환율에 대한 잠제적 위험
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
//--- EU 컨트리 코드(ISO 3166-1 Alpha-2)
string EU_code="EU";
//--- 모든 EU관련 이벤트 값을 받음
MqlCalendarValue values[];
//--- 이벤트를 가져오는 간격을 설정합니다.
datetime date_from=D'01.01.2021'; // 2021부터 모든 이벤트를 가져옴
datetime date_to=0; // 0은 모든 알려진 이벤트와 아직 일어나지 않은 이벤트를 의미
//---2021년부터의 EU 관련 이벤트 히스토리를 요청
if(!CalendarValueHistory(values, date_from, date_to, EU_code))
{
PrintFormat("Error! Failed to get events for country_code=%s", EU_code);
PrintFormat("Error code: %d", GetLastError());
return;
}
else
PrintFormat("Received event values for country_code=%s: %d",
EU_code, ArraySize(values));
//--- 저널에 출력할 배열의 크기를 줄임.
if(ArraySize(values)>5)
ArrayResize(values, 5);
//--- 이벤트 값을 실제 값으로 확인하거나 변환하지 않고 그대로 저널에 출력
Print("Output calendar values as they are");
ArrayPrint(values);
//--- 필드 값을 체크하고 실제 값으로 변환
//--- 값을 체크하고 얻기 위한 옵션 1
AdjustedCalendarValue values_adjusted_1[];
int total=ArraySize(values);
ArrayResize(values_adjusted_1, total);
//--- 확인하고 조정한 값을 복사
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;
//--- 값을 확인하고 1,000,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("The first method to check and get calendar values");
ArrayPrint(values_adjusted_1);
//--- option 2 to check and get the values
AdjustedCalendarValue values_adjusted_2[];
ArrayResize(values_adjusted_2, total);
//--- 확인하고 조정한 값을 복사
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;
//--- 확인하고 값을 얻음
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("The second method to check and get calendar values");
ArrayPrint(values_adjusted_2);
//--- 값을 얻는 옵션 3 - 확인하지 않음
AdjustedCalendarValue values_adjusted_3[];
ArrayResize(values_adjusted_3, total);
//--- 확인하고 조정한 값을 복사
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;
//--- 확인하지 않고 값을 얻음
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("The third method to get calendar values - without checks");
ArrayPrint(values_adjusted_3);
}
/*
다음의 이벤트 값을 얻었습니다 country_code=EU: 1051
캘린더 값을 있는 그대로 출력
[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 ...
캘린더 값을 얻기 위한 첫번째 메서드
[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
캘린더 값을 덕기 위한 두번째 메서드
[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
캘린더 값을 얻기 위한 세번째 메서드 - 확인하지 않음
[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
*/
|
이벤트 빈도는 MqlCalendarEvent 구조에 명시되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_FREQUENCY
|
|
CALENDAR_FREQUENCY_NONE
|
출시 빈도가 설정되지 않았습니다
|
CALENDAR_FREQUENCY_WEEK
|
한 주에 한 번 출시됩니다
|
CALENDAR_FREQUENCY_MONTH
|
한 달에 한 번 출시됩니다
|
CALENDAR_FREQUENCY_QUARTER
|
한 분기에 한 번 출시됩니다
|
CALENDAR_FREQUENCY_YEAR
|
일 년에 한 번 출시됩니다
|
CALENDAR_FREQUENCY_DAY
|
하루에 한 번 출시됩니다
|
이벤트 유형은 MqlCalendarEvent 구조에 지정되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_TYPE
|
|
CALENDAR_TYPE_EVENT
|
이벤트 (미팅, 스피치 및 기타)
|
CALENDAR_TYPE_INDICATOR
|
지표
|
CALENDAR_TYPE_HOLIDAY
|
휴일
|
이벤트와 관련된 경제 부문은 MqlCalendarEvent 구조에 명시되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_SECTOR
|
|
CALENDAR_SECTOR_NONE
|
섹터가 설정되지 않았습니다
|
CALENDAR_SECTOR_MARKET
|
시장, 거래소
|
CALENDAR_SECTOR_GDP
|
국내총생산(GDP)
|
CALENDAR_SECTOR_JOBS
|
노동시장
|
CALENDAR_SECTOR_PRICES
|
가격
|
CALENDAR_SECTOR_MONEY
|
자금
|
CALENDAR_SECTOR_TRADE
|
거래
|
CALENDAR_SECTOR_GOVERNMENT
|
정부
|
CALENDAR_SECTOR_BUSINESS
|
비즈니스
|
CALENDAR_SECTOR_CONSUMER
|
소비
|
CALENDAR_SECTOR_HOUSING
|
주거
|
CALENDAR_SECTOR_TAXES
|
세금
|
CALENDAR_SECTOR_HOLIDAYS
|
휴일
|
이벤트 중요도는 MqlCalendarEvent 구조에 명시되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_IMPORTANCE
|
|
CALENDAR_IMPORTANCE_NONE
|
중요도가 설정되지 않았습니다
|
CALENDAR_IMPORTANCE_LOW
|
낮은 중요도
|
CALENDAR_IMPORTANCE_MODERATE
|
중간 중요도
|
CALENDAR_IMPORTANCE_HIGH
|
높은 중요도
|
이벤트 값을 표시하는 데 사용되는 측정 단위 유형이 MqlCalendarEvent 구조에 명시되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_UNIT
|
|
CALENDAR_UNIT_NONE
|
측정 단위가 설정되지 않았습니다
|
CALENDAR_UNIT_PERCENT
|
백분율
|
CALENDAR_UNIT_CURRENCY
|
국가 통화
|
CALENDAR_UNIT_HOUR
|
시간
|
CALENDAR_UNIT_JOB
|
직업
|
CALENDAR_UNIT_RIG
|
시추기
|
CALENDAR_UNIT_USD
|
USD
|
CALENDAR_UNIT_PEOPLE
|
사람
|
CALENDAR_UNIT_MORTGAGE
|
담보대출
|
CALENDAR_UNIT_VOTE
|
투표
|
CALENDAR_UNIT_BARREL
|
배럴
|
CALENDAR_UNIT_CUBICFEET
|
입방피트
|
CALENDAR_UNIT_POSITION
|
비상업적 순포지션
|
CALENDAR_UNIT_BUILDING
|
건물
|
경우에 따라 경제적 매개변수 값은 MqlCalendarEvent 구조에 승수 집합을 필요로 합니다. 가능한 승수 값이 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_MULTIPLIER
|
|
CALENDAR_MULTIPLIER_NONE
|
승수가 설정되지 않았습니다
|
CALENDAR_MULTIPLIER_THOUSANDS
|
수천
|
CALENDAR_MULTIPLIER_MILLIONS
|
수백
|
CALENDAR_MULTIPLIER_BILLIONS
|
수십억
|
CALENDAR_MULTIPLIER_TRILLIONS
|
수조
|
이벤트가 국가 환율에 미치는 잠재적 영향은 MqlCalendarValue 구조에 나타나 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_IMPACT
|
|
CALENDAR_IMPACT_NA
|
임팩트가 설정되지 않았습니다
|
CALENDAR_IMPACT_POSITIVE
|
긍정 임팩트
|
CALENDAR_IMPACT_NEGATIVE
|
부정 임팩트
|
이벤트 시간은 MqlCalendarEvent 구조에 지정되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_TIMEMODE
|
|
CALENDAR_TIMEMODE_DATETIME
|
소스가 정확한 이벤트 시간을 게시합니다
|
CALENDAR_TIMEMODE_DATE
|
이벤트가 하루 종일 소요됨
|
CALENDAR_TIMEMODE_NOTIME
|
소스가 이벤트의 시간을 게시하지 않음
|
CALENDAR_TIMEMODE_TENTATIVE
|
소스는 정확한 시간이 아닌 이벤트의 날짜를 게시합니다. 시간은 이벤트 발생에 따라 지정됩니다.
|
더 보기