경제 달력 구조

이 절에서는 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() 함수에 사용됩니다

struct MqlCalendarEvent
  {
   ulong                               id;                    // 이벤트 ID
   ENUM_CALENDAR_EVENT_TYPE            type;                  // ENUM_CALENDAR_EVENT_TYPE 열거의 이벤트 유형
   ENUM_CALENDAR_EVENT_SECTOR          sector;                // 이벤트와 관련된 섹터
   ENUM_CALENDAR_EVENT_FREQUENCY       frequency;             // 이벤트 빈도
   ENUM_CALENDAR_EVENT_TIMEMODE        time_mode;             // 이벤트 타임 모드
   ulong                               country_id;            // 국가 ID
   ENUM_CALENDAR_EVENT_UNIT            unit;                  // 경제 지표 값의 측정 단위
   ENUM_CALENDAR_EVENT_IMPORTANCE      importance;            // 이벤트 중요도
   ENUM_CALENDAR_EVENT_MULTIPLIER      multiplier;            // 경제 지표 값 곱하기
   uint                                digits;                // 소수점 이하 자릿수
   string                              source_url;            // 이벤트가 게시된 소스의 URL
   string                              event_code;            // 이벤트 코드
   string                              name;                  // 터미널 언어로 된 이벤트 텍스트 이름(현재 터미널 인코딩)
  };

 

이벤트 값은 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(voidconst;   // actual_value가 있으면 true를 리턴
   bool                         HasPreviousValue(voidconst; // prev_value가 있으면 true를 리턴
   bool                         HasRevisedValue(voidconst;  // revised_prev_value가 있으면 true를 리턴
   bool                         HasForecastValue(voidconst; // forecast_value가 있으면 true를 리턴
  //--- valuesfmf 받는 함수
   double                       GetActualValue(voidconst;   // value가 없으면 actual_value를 리턴하거나 nan
   double                       GetPreviousValue(voidconst; // value가 없으면 prev_value나nan을 리턴
   double                       GetRevisedValue(voidconst;  // value가 없으면 revised_prev_value 혹은 nan을 리턴
   double                       GetForecastValue(voidconst; // value가 없으면 returns forecast_value 혹은 nan을 리턴
  };

MqlCalendarValue structure는 actual_value, forecast_value, prev_valuerevised_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(valuesdate_fromdate_toEU_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_codeArraySize(values));
//--- 저널에 출력할 배열의 크기를 줄임.
   if(ArraySize(values)>5)
      ArrayResize(values5);
//--- 이벤트 값을 실제 값으로 확인하거나 변환하지 않고 그대로 저널에 출력
   Print("Output calendar values as they are");
   ArrayPrint(values);
 
//--- 필드 값을 체크하고 실제 값으로 변환
//--- 값을 체크하고 얻기 위한 옵션 1 
   AdjustedCalendarValue values_adjusted_1[];
   int total=ArraySize(values);
   ArrayResize(values_adjusted_1total);
//--- 확인하고 조정한 값을 복사
   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;
      //--- 값을 확인하고 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_2total);
//--- 확인하고 조정한 값을 복사
   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;
      //--- 확인하고 값을 얻음
      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_3total);
//--- 확인하고 조정한 값을 복사
   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;
      //--- 확인하지 않고 값을 얻음
      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=EU1051
  캘린더 값을 있는 그대로 출력
         [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        ...
  캘린더 값을 얻기 위한 첫번째 메서드 
         [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
  캘린더 값을 덕기 위한 두번째 메서드 
         [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
  캘린더 값을 얻기 위한 세번째 메서드 - 확인하지 않음 
         [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
*/

 

이벤트 빈도는 MqlCalendarEvent 구조에 명시되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_FREQUENCY

ID

설명

CALENDAR_FREQUENCY_NONE

출시 빈도가 설정되지 않았습니다

CALENDAR_FREQUENCY_WEEK

한 주에 한 번 출시됩니다

CALENDAR_FREQUENCY_MONTH

한 달에 한 번 출시됩니다

CALENDAR_FREQUENCY_QUARTER

한 분기에 한 번 출시됩니다

CALENDAR_FREQUENCY_YEAR

일 년에 한 번 출시됩니다

CALENDAR_FREQUENCY_DAY

하루에 한 번 출시됩니다

 

이벤트 유형은 MqlCalendarEvent 구조에 지정되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_TYPE

ID

설명

CALENDAR_TYPE_EVENT

이벤트 (미팅, 스피치 및 기타)

CALENDAR_TYPE_INDICATOR

지표

CALENDAR_TYPE_HOLIDAY

휴일

 

이벤트와 관련된 경제 부문은 MqlCalendarEvent 구조에 명시되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_SECTOR

ID

설명

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

ID

설명

CALENDAR_IMPORTANCE_NONE

중요도가 설정되지 않았습니다

CALENDAR_IMPORTANCE_LOW

낮은 중요도

CALENDAR_IMPORTANCE_MODERATE

중간 중요도

CALENDAR_IMPORTANCE_HIGH

높은 중요도

 

이벤트 값을 표시하는 데 사용되는 측정 단위 유형이 MqlCalendarEvent 구조에 명시되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_UNIT

ID

설명

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

ID

설명

CALENDAR_MULTIPLIER_NONE

승수가 설정되지 않았습니다

CALENDAR_MULTIPLIER_THOUSANDS

수천

CALENDAR_MULTIPLIER_MILLIONS

수백

CALENDAR_MULTIPLIER_BILLIONS

수십억

CALENDAR_MULTIPLIER_TRILLIONS

수조

 

이벤트가 국가 환율에 미치는 잠재적 영향은 MqlCalendarValue 구조에 나타나 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_IMPACT

ID

설명

CALENDAR_IMPACT_NA

임팩트가 설정되지 않았습니다

CALENDAR_IMPACT_POSITIVE

긍정 임팩트

CALENDAR_IMPACT_NEGATIVE

부정 임팩트

 

이벤트 시간은 MqlCalendarEvent 구조에 지정되어 있습니다. 가능한 값은 리스트에서 설정됩니다 ENUM_CALENDAR_EVENT_TIMEMODE

ID

설명

CALENDAR_TIMEMODE_DATETIME

소스가 정확한 이벤트 시간을 게시합니다

CALENDAR_TIMEMODE_DATE

이벤트가 하루 종일 소요됨

CALENDAR_TIMEMODE_NOTIME

소스가 이벤트의 시간을 게시하지 않음

CALENDAR_TIMEMODE_TENTATIVE

소스는 정확한 시간이 아닌 이벤트의 날짜를 게시합니다. 시간은 이벤트 발생에 따라 지정됩니다.

 

더 보기

경제 달력