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が関数に渡された場合、関数は常に0を返しますが、現在のカレンダーデータベースがchange_idに返されます。

country_codeおよびcurrencyによる絞り込みについては、NULLおよび""は道同等で、絞り込みがないことを意味します。

country_codeについては、MqlCalendarCountry構造体のcodeフィールドが使用されるべきです(例: "US"、"RU"、"EU")。

currencyについては、MqlCalendarCountry構造体のcurrencyフィールドが使用されるべきです(例: USD"、"RUB"、"EUR")。

フィルタは結合によって適用されます。つまり、論理 'AND'は、両方の条件(国と通貨)が同時に満たされるイベントの値のみを選択するために使用されます。

この関数は、指定されたニュースの配列と、それ以降の関数の呼び出しでニュースの新しい値を受け取るために使用できる新しい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 CalendarValueLast function"
#property description " to develop the economic calendar events listener."
#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;
//--- イベント値の配列
  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: 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 events in CalendarValueLast. Error code: %d",
                      __FUNCTION__,error_code);
          //--- 操作は失敗して終了し、タイマーの次の呼び出し中に再初期化される
          return;
          }
       }
    }
 
//--- カレンダーの変更IDの最後の既知の値(change_id)がある
  ulong old_change_id=calendar_change_id;
//--- 新しいカレンダーイベントがあるかどうか確認する
  if(CalendarValueLast(calendar_change_id,values)>0)
    {
    PrintFormat("%s: Received new Calendar events: %d",
                __FUNCTION__,ArraySize(values));
    //--- 'values'配列のデータを操作ログで表示する
    ArrayPrint(values);
    //--- 前のカレンダーIDと新しいカレンダーIDの値を操作ログで表示する
    PrintFormat("%s: Previous change_id=%d, new change_id=%d",
                __FUNCTION__,old_change_id,calendar_change_id);
    //--- 新しいイベントを操作ログで表示する
    ArrayPrint(values);
     /*
     ここでイベントの発生を処理するためのコードを書く
     */
    }
//---    
 }
/*
  リスナー操作の例:
  OnTimer: Received the Calendar database current ID: change_id=33281792
  OnTimer: Received new events for the Calendar: 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: Previous change_id=33281792, new 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: Received new events for the Calendar: 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: Previous change_id=33282048, new 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
 
*/  

参照

CalendarValueLastCalendarValueHistoryCalendarValueHistoryByEventCalendarValueById