#property description "Example of using the CalendarValueLastByEvent function"
#property description " for tracking the release of the Nonfarm Payrolls report."
#property description "To achieve this, get the current change ID"
#property description " of the Calendar database. Then, use this ID to receive"
#property description " only new events via the timer survey"
//+------------------------------------------------------------------+
//| エキスパート初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- タイマーを作成する
EventSetTimer(60);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| エキスパート初期化解除関数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- タイマーを破壊する
EventKillTimer();
}
//+------------------------------------------------------------------+
//| エキスパートティック関数 |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer関数 |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- カレンダーデータベース変更ID
static ulong calendar_change_id=0;
//--- 1番目の実行属性
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";
//--- 米国のイベントを取得する
int events_count=CalendarEventByCountry(USA_code,events);
//--- 必要なイベントの'events'配列内の位置
int event_pos=-1;
//--- 米国のイベントを操作ログに表示する
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'演算子をコメントアウトしてすべてのイベントを表示できる
break;
}
}
//--- 「非農業部門就業者数」以降のイベントを削除してリストを減らす
ArrayRemove(events,event_pos+1);
//--- より便利な分析のために「非農業部門就業者数」以前の9つのイベントをそのままにする
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: Received the Calendar database current ID: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- フラグを設定してタイマーの次のイベントの前に終了する
first=false;
//--- calendar_change_idを取得した
return;
}
else
{
//--- 本当のエラー
PrintFormat("%s: Failed to get values for event_id=%d",__FUNCTION__,event_id);
PrintFormat("Error code: %d",error_code);
//--- 操作は失敗して終了したため、タイマーの次の呼び出し中に再試行する
return;
}
}
}
//--- カレンダーの変更IDの最後の既知の値(change_id)がある
ulong old_change_id=calendar_change_id;
//--- 「非農業部門就業者数」イベント値を確認する
if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
{
PrintFormat("%s: Received new events for \"%s\": %d",
__FUNCTION__,event_name,ArraySize(values));
//--- 'values'配列のデータを操作ログで表示する
ArrayPrint(values);
//--- 前のカレンダーIDと新しいカレンダーIDの値を操作ログで表示する
PrintFormat("%s: Previous 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" "Import Price Index m/m" 0
[5] 840030012 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "import-price-index-yy" "Import Price Index y/y" 0
[6] 840030013 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "export-price-index-mm" "Export Price Index m/m" 0
[7] 840030014 1 4 2 0 840 1 1 0 1 "https://www.bls.gov" "export-price-index-yy" "Export Price Index y/y" 0
[8] 840030015 1 3 2 0 840 1 2 0 1 "https://www.bls.gov" "unemployment-rate" "Unemployment Rate" 0
[9] 840030016 1 3 2 0 840 4 3 1 0 "https://www.bls.gov" "nonfarm-payrolls" "Nonfarm Payrolls" 0
OnTimer: Received the Calendar database current ID: change_id=33986560
*/
|