CalendarValueLastByEvent

change_id가 지정된 캘린더 데이터베이스 상태 이후 ID별로 이벤트 값 배열을 가져오기.

int  CalendarValueLastByEvent(
   ulong                event_id,      // 이벤트 ID 
   ulong&               change_id,     // 캘린더 변경 ID 
   MqlCalendarValue&    values[]       // 값 설명을 위한 배열 
   );

매개변수

event_id

[in]  이벤트 ID.

change_id

[in][out]  ID 변경.

values[]

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

값 반환

수신된 이벤트 값의 수 오류에 대한 정보를 얻기 위해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이 함수에 전달되면 함수는 항상 0을 반환하지만, 현재 캘린더 데이터베이스는 change_id로 반환됩니다.

함수는 지정된 뉴스와 뉴스의 새로운 값을 수신하기 위해 함수의 후속 호출에 사용될 수 있는 새로운 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를 확인하고 가져오는 것입니다.

Nonfarm 급여 보고서 릴리즈에 대한 EA 수신 대기 샘플:

#property 설명 "CalendarValueLastByEvent 함수 사용 예시"
#property 설명 " Nonfarm 급여 보고서의 공개를 추적용."
#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;
//--- 이벤트 ID  
   static ulong event_id=0;
//--- 이벤트명  
   static string event_name=NULL;
//--- 이벤트 값 배열
   MqlCalendarValue values[];
//--- 초기화 수행 - 현재 calendar_change_id 가져오기
   if(first)
     {
      MqlCalendarEvent events[];
      //--- 미국의 국가 코드 (ISO 3166-1 Alpha-2)
      string USA_code="US";
      //--- USA의 이벤트 가져오기    
      int events_count=CalendarEventByCountry(USA_code,events);
      //--- '이벤트' 배열에서 필요한 이벤트의 포지션
      int event_pos=-1;
      //--- 저널에 USA 이벤트 표시
      if(events_count>0)
        {
         PrintFormat("%s: USA events: %d",__FUNCTION__,events_count);
         for(int i=0;i<events_count;i++)
           {
            string event_name_low=events[i].name;
            //--- 이벤트명을 소문자로 변경            
            if(!StringToLower(event_name_low))
              {
               PrintFormat("StringToLower() returned %d error",GetLastError());
               //--- 시간 전에 나가기
               return;
              }
            //--- "논팜 페이롤" 이벤트를 찾기            
            if(StringFind(event_name_low,"nonfarm payrolls")!=-1)
              {
               //--- 이벤트를 발견, 그 ID를 기억하기
               event_id=events[i].id;
               //--- "논팜 페이롤" 이벤트명 쓰기 
               event_name=events[i].name;
               //--- 'events[]' 배열에 이벤트의 포지션 기억하기               
               event_pos=i;
               //--- 캘린더 이름에 "논팜 페이롤"가 포함된 여러 이벤트가 있음을 명심하십시오
               PrintFormat("Event \"Nonfarm Payrolls\" found: event_id=%d  event_name=%s",event_id,event_name);
               //--- 이 예시를 더 잘 이해하기 위해 '브레이크' 연산자를 언급하여 모든 이벤트를 보기
               break;
              }
           }
         //--- "논팜 페이롤" 후 이벤트를 삭제하여 목록을 줄임
         ArrayRemove(events,event_pos+1);
         //--- 보다 편리한 분석을 위해 9개의 이벤트트를 "Nonfarm Payroll" 앞에 두기         
         ArrayRemove(events,0,event_pos-9);
         ArrayPrint(events);
        }
      else
        {
         PrintFormat("%s: CalendarEventByCountry(%s) returned 0 events, error code=%d",
                     USA_code,__FUNCTION__,GetLastError());
         //--- 작업이 실패로 완료되었으니 타이머의 다으 음 호출 중에 다시 시도하십시오         
         return;
        }
 
      //--- 지정된 이벤트에 대한 캘린더 데이터베이스 변경 ID를 가져오기   
      if(CalendarValueLastByEvent(event_id,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: event_id=%d에 대한 값을 가져오는 데 실패했습니다",__FUNCTION__,event_id);
            PrintFormat("Error code: %d",error_code);
            //--- 작업이 실패로 완료되었으니 타이머의 다음 호출 중에 다시 시도하십시오         
            return;
           }
        }
     }
 
//--- 캘린더 변경 ID (change_id)의 마지막 알려진 값이 있습니다.
   ulong old_change_id=calendar_change_id;
//--- Nonfarm Payrolls 이벤트 값을 확인
   if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
     {
      PrintFormat("%s: 새 이벤트를 수신 \"%s\": %d",
                  __FUNCTION__,event_name,ArraySize(values));
      //--- 저널에 'values' 배열의 데이터를 표시 
      ArrayPrint(values);
      //--- 저널에 이전 및 새 캘린더 ID의 값을 표시
      PrintFormat("%s: 이전 change_id=%d, new change_id=%d",
                  __FUNCTION__,old_change_id,calendar_change_id);
/* 
      여기에 "논팜 페이롤" 데이터 릴리스를 처리하는 코드를 쓰기
      */
     }
//---     
  }
/*
  결과:
   OnTimer: USA events: 202
  Event "Nonfarm Payrolls" found: event_id=840030016  event_name=Nonfarm Payrolls
            [id] [type] [sector] [frequency] [time_mode] [country_id] [unit] [importance] [multiplier] [digits]          [source_url]                             [event_code]                   [name] [reserved]
   [0] 840030007      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "consumer-price-index-yy"                "CPI y/y"                         0
   [1] 840030008      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "consumer-price-index-ex-food-energy-yy" "Core CPI y/y"                    0
   [2] 840030009      1        4           2           0          840      0            1            0        3 "https://www.bls.gov" "consumer-price-index-nsa"               "CPI n.s.a."                      0
   [3] 840030010      1        4           2           0          840      0            1            0        3 "https://www.bls.gov" "consumer-price-index-ex-food-energy"    "Core CPI"                        0
   [4] 840030011      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "import-price-index-mm"                  "수입 가격 인덱스 m/m"          0
   [5] 840030012      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "import-price-index-yy"                  "수입 가격 인덱스 y/y"          0
   [6] 840030013      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "export-price-index-mm"                  "수출 가격 인덱스 m/m"          0
   [7] 840030014      1        4           2           0          840      1            1            0        1 "https://www.bls.gov" "export-price-index-yy"                  "수출 가격 인덱스 y/y"          0
   [8] 840030015      1        3           2           0          840      1            2            0        1 "https://www.bls.gov" "unemployment-rate"                      "실업률"               0
   [9] 840030016      1        3           2           0          840      4            3            1        0 "https://www.bls.gov" "nonfarm-payrolls"                       "Nonfarm Payrolls"                0
   OnTimer: 캘린더 데이터베이스 현재 ID를 수신했습니다: change_id=33986560
 
*/  

추가 참조

CalendarValueLast, CalendarValueHistory, CalendarValueHistoryByEvent, CalendarValueById