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(配列サイズはすべての値の説明を受け取るには不十分で、配列に収まるものだけが受信された)

注意事項

固定された長さの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 を使用してこの関数を呼び出すことで、特定のニュースの値を更新することができます。

イベント値に以下に指定されたフィールドがない場合は、

struct MqlCalendarValue
 {
  ...
  long              actual_value;             // イベントの実際の値
  long              prev_value;               // イベントの以前の値
  long              revised_prev_value;       // イベントの改正された以前の値
  long              forecast_value;           // イベントの予測値
  ...
 };

欠落したフィールドの値はINT64_MIN (-9223372036854775808)として返されます。

経済指標カレンダーイベントを聴取するサンプル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