CalendarValueLast

change_id를 지정한 캘린더 데이터베이스 상태 이후 국가 및 통화별로 정렬할 수 있는 모든 이벤트의 값 배열을 가져오기.

int  CalendarValueLast(
   ulong&               change_id,             // ID 변경 
   MqlCalendarValue&    values[],              // 값 설명을 위한 배열 
   const string         country_code=NULL,     // 국가 코드명 (ISO 3166-1 alpha-2)
   const string         currency=NULL          // 국가 통화 코드명 
   );

매개변수

change_id

[in][out]  ID 변경.

values[]

[out]  이벤트 값을 수신하기 위한 MqlCalendarValue 유형 배열.  다음을 확인 하세요캘린더 이벤트 핸들링 예제.

country_code=NULL

[in]  국가 코드명 (ISO 3166-1 alpha-2)

currency=NULL

[in]  국가 통화 코드명.

값 반환

수신된 이벤트 값의 수 오류에 대한 정보를 얻기 위해GetLastError() 함수 호출. 가능한 오류:

  • 4001 – ERR_INTERNAL_ERROR  (일반 실행시간 오류),
  • 4004 – ERR_NOT_ENOUGH_MEMORY (요청된 작업을 위한 메모리가 충분하지 않음),
  • 5401 – ERR_CALENDAR_TIMEOUT (요청시간 제한 초과),
  • 5400 – ERR_CALENDAR_MORE_DATA (배열 크기가 부족하여 모든 값에 대한 설명을 받을 수 없으며, 해당 값에 대한 설명만 수신됨),

주의

이코노믹 캘린더로 작업하는 모든 기능은 무역 서버 시간 (TimeTradeServer)을 사용합니다. 즉, MqlCalendarValue 구조 및 시간과 CalendarValueHistoryByEvent/CalendarValueHistory 기능의 시간 입력은 사용자의 로컬 시간이 아니라 거래 서버 시간대에 설정됩니다.

고정된 길이의 events[] 배열이 함수에 전달되어 전체 결과를 저장할 공간이 충분하지 않으면 ERR_CALENDAR_MORE_DATA (5400) 오류가 활성화됩니다.

change_id = 0이 함수에 전달되면 해당 매개 변수에 대한 캘린더 데이터베이스의 현재 change_id가 표시되고 함수는 0을 반환합니다

country_code통화 필터의 경우, NULL 및 "" 값은 동일하며 필터의 부재를 의미합니다.

country_code의 경우, MqlCalendarCountry 구조의코드필드(예:"US", "RU" 또는 "EU")를 사용해야 합니다.

통화의 경우, MqlCalendarCountry 구조의 통화 필드(예: "USD", "RUB" 또는 "EUR")를 사용해야 합니다.

필터는 연결로 적용되는데, 즉 논리적 'AND'는 두 조건(국가 및 통화)이 동시에 충족되는 이벤트 값만 선택하는데 사용됩니다

함수는 지정된 뉴스와 뉴스의 새로운 값을 수신하기 위해 함수의 후속 호출에 사용될 수 있는 새로운 change_id에 대한 배열을 반환합니다. 따라서, 마지막으로 알려진 change_id로 이 함수를 호출하여 지정된 뉴스에 대한 값을 업데이트할 수 있습니다.

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를 확인하고 가져오는 것입니다.

이코노믹 캘린더 이벤트에 대한 EA 수신 대기 샘플:

#property 설명 "CalendarValueLast 함수 사용 예제"
#property 설명 " 이코노믹 캘린더 이벤트를 청취하는 사람을 개발"
#property 설명 "이를 위해 현재 변경 ID 가져오기"
#property 설명 " 캘린더 데이터베이스의. 그 다음 수신하기 위해 이 ID를 사용"
#property 설명 " 타이머 조사를 통한 새로운 이벤트만"
//+------------------------------------------------------------------+
//| 엑스퍼트 초기화 함수                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 타이머 생성
   EventSetTimer(60);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 엑스퍼트 초기화 해제 함수                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 타이머 파괴
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| 엑스퍼트 틱 함수                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| 타이머 함수                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- 캘린더 데이터베이스 변경 ID
   static ulong calendar_change_id=0;
//--- 첫 번째 시작 속성
   static bool first=true;
//--- 이벤트 값 배열
   MqlCalendarValue values[];
//--- 초기화 수행 - 현재 calendar_change_id 가져오기
   if(first)
     {
      //--- 일정관리 데이터베이스 변경 ID를 가져오기   
      if(CalendarValueLast(calendar_change_id,values)>0)
        {
         //--- 이 코드 블록은 첫 번째 실행 중에 실행할 수 없지만 그래도 추가해 보십시오
         PrintFormat(""%s: Received the Calendar database current ID: change_id=%d",
                     __FUNCTION__,calendar_change_id);
         //--- 타이머의 다음 이벤트 전에 플래그를 설정하고 종료하십시오
         first=false;
         return;
        }
      else
        {
         //--- 데이터가 수신되지 않았으니(첫 번째 실행에서는 정상), 오류를 확인하십시오
         int error_code=GetLastError();
         if(error_code==0)
           {
            PrintFormat("%s: 캘린더 데이터베이스 현재 ID를 수신했습니다: change_id=%d",
                        __FUNCTION__,calendar_change_id);
            //--- 타이머의 다음 이벤트 전에 플래그를 설정하고 종료십시오
            first=false;
            //--- 이제 calendar_change_id 값을 가집니다
            return;
           }
         else
           {
            //--- 그리고 이는 진짜 오류입니다            
            PrintFormat("%s: CalendarValueLast에서 이벤트를 가져오는 데 실패했습니다. 오류 코드: %d",
                        __FUNCTION__,error_code);
            //--- 작업이 실패로 완료되었으니 타이머의 다음 호출 중에 다시 초기화         
            return;
           }
        }
     }
 
//--- 캘린더 변경 ID (change_id)의 마지막 알려진 값이 있습니다.
   ulong old_change_id=calendar_change_id;
//--- 새 캘린더 이벤트가 있는지 확인
   if(CalendarValueLast(calendar_change_id,values)>0)
     {
      PrintFormat("%s: 새 캘린더 이벤트 수신됨: %d",
                  __FUNCTION__,ArraySize(values));
      //--- 저널에 'values' 배열의 데이터를 표시 
      ArrayPrint(values);
      //--- 저널에 이전 및 새 캘린더 ID의 값을 표시
      PrintFormat("%s: 이전 change_id=%d, new change_id=%d",
                  __FUNCTION__,old_change_id,calendar_change_id);
      //--- 저널에 새 이벤트 표시
      ArrayPrint(values);
      /* 
     여기에 이벤트 발생을 처리하는 코드를 쓰십시오
      */
     }
//---     
  }
/*
  수신기 작업 예시:
  OnTimer: 캘린더 데이터베이스 현재 ID를 수신했습니다: change_id=33281792
  OnTimer: 캘린더에 대한 새 이벤트를 수신했습니다: 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: 이전 change_id=33281792, 새 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: 캘린더에 대한 새 이벤트를 수신했습니다: 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: 이전 change_id=33282048, 새 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
 
*/  

추가 참조

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById