#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
*/
|