CalendarValueLastByEvent

指定されたchange_idで、カレンダーデータベースのステータスからイベント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構造体はactual_value、forecast_value、prev_value、revised_prev_valueフィールドの値を確認/設定するメソッドを備えています。値が指定されていない場合、フィールドにはLONG_MIN (-9223372036854775808)が格納されます。

これらのフィールドに格納されている値は100万倍されることに注意してください。CalendarValueByIdCalendarValueHistoryByEventCalendarValueHistoryCalendarValueLastByEventCalendarValueLastのいずれかの関数を使用してMqlCalendarValueで値を受け取る場合、フィールド値がLONG_MINに等しいかどうかを確認する必要があります。フィールドに値が指定されている場合、値を取得するには、値を100万で除算する必要があります。値を取得するもう1つの方法は、MqlCalendarValue構造体の関数を使用して値を確認および取得することです。

非農業部門就業者数の公開リスナーであるサンプルEA:

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

参照

CalendarValueLastCalendarValueHistoryCalendarValueHistoryByEventCalendarValueById