【MQL5】CalendarValueLastByEvent関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク
  1. CalendarValueLastByEvent関数の働き・役割
  2. CalendarValueLastByEvent関数の引数について
    1. 第1引数: event_id
    2. 第2引数: change_id
    3. 第3引数: values[]
  3. CalendarValueLastByEvent関数の戻り値について
    1. 戻り値が関連するエラーコード
  4. CalendarValueLastByEvent関数を使う際の注意点
  5. CalendarValueLastByEvent関数を使ったサンプルコード
  6. サンプルコード解説1: グローバル領域部分
    1. #property descriptionについて
  7. サンプルコード解説2: OnInit関数部分
  8. サンプルコード解説3: OnDeinit関数部分とOnTick関数部分
    1. OnDeinit関数部分
    2. OnTick関数部分
  9. サンプルコード解説4: OnTimer関数その1
    1. OnTimer関数の役割
    2. 変数の解説
    3. 変数の特徴と役割
  10. サンプルコード解説5: OnTimer関数その2
    1. 初回実行時の処理
    2. 処理の流れと説明
  11. サンプルコード解説5: OnTimer関数その2
  12. サンプルコード解説6: OnTimer関数その3
    1. イベントの存在確認
    2. イベント数のログ出力
    3. 非農業部門就業者数の検索
    4. イベント名の小文字変換
  13. サンプルコード解説7: OnTimer関数その4
    1. 非農業部門就業者数を含むイベントの検索
    2. イベントIDと名前の記録
    3. ログにイベント情報を出力
    4. 処理の終了
  14. サンプルコード解説8: OnTimer関数その5
    1. イベントが見つからなかった場合の処理
    2. イベント取得が失敗した場合の処理
    3. 初回実行フラグの解除
  15. サンプルコード解説9: OnTimer関数その6
    1. カレンダーイベントの最新値を取得
    2. 新しいデータが取得された場合の処理
    3. データ取得に失敗した場合の処理
  16. CalendarValueLastByEvent関数を使ってEAを作る際のアイディア
    1. 経済指標発表時の自動トレード
    2. イベントデータを元にした分析ツール
    3. 特定指標を監視するリスク管理EA
    4. 複数指標を組み合わせたシステムトレード
    5. 発表データを元にしたアラートEA

CalendarValueLastByEvent関数の働き・役割

CalendarValueLastByEvent関数は、指定したイベントIDに関連する最新の経済指標データを取得するために使用されます。この関数は、経済カレンダーを活用して重要なイベントデータ(たとえば、非農業部門就業者数のような経済指標)を取得したり、それに基づいてトレードの判断を下したりする際に便利です。

この関数は、イベントの変化ID(change_id)を用いることで、以前に取得したデータからの更新がある場合にのみ新しいデータを受け取ります。これにより、無駄なデータ取得を避け、効率的に経済指標を追跡できます。

例えば、非農業部門就業者数のデータを取得したい場合、最初に「非農業部門就業者数」というイベントIDを指定し、この関数を使って最新のデータを受け取ります。その際、新しいデータがあるかどうかを確認しながら、値を効率的に更新できます。

CalendarValueLastByEvent関数の引数について

CalendarValueLastByEvent関数は、次の3つの引数を持っています。それぞれの引数の役割と使用方法を具体的に説明します。


第1引数: event_id

event_idは、取得したい経済指標イベントのIDを指定します。このIDは、カレンダーイベントを識別するためのユニークな値です。

型は符号なし長整数で、どの経済イベントに関連する値を取得するかを示します。

使用例として、非農業部門就業者数のデータを取得したい場合、そのイベントIDをこの引数に渡します。


第2引数: change_id

change_idは、経済指標のデータベースの変更状態を管理するために使用します。この値を使うことで、新しいデータが取得可能かどうかを判断します。

型は符号なし長整数で、関数呼び出し時に現在の変更IDを渡します。関数の実行後、最新の変更IDがこの引数に格納されます(出力引数としても機能します)。初回呼び出し時に0を指定することで、最新のデータベース状態を取得できます。


第3引数: values[]

values[]は、経済指標の具体的な値を受け取るための配列です。この配列には、指定したイベントのデータが格納されます。

型はMqlCalendarValue構造体型の配列で、指定したイベントIDに関連するデータが格納される受け取り用配列です。必要な要素数を確保するため、事前にArrayResize関数などで配列サイズを調整する必要があります。値には、実際のデータや予想値、前回値などが含まれます。


CalendarValueLastByEvent関数の戻り値について

CalendarValueLastByEvent関数戻り値は、受け取ったイベント値の数です。この数値は、指定されたイベントに関連する最新のデータがいくつあるかを示します。関数が失敗した場合は、戻り値が0となり、エラーが発生したかどうかを確認するためにGetLastError関数を使用する必要があります。

戻り値が0であっても、change_idには新しい変更IDが設定される場合があります。この挙動を考慮し、エラー処理を適切に実装する必要があります。

戻り値が関連するエラーコード

関数の実行中にエラーが発生した場合、次のエラーコードがGetLastError関数で取得されることがあります。

これらのエラーコードを適切に処理することで、関数の動作をより確実なものにできます。特に、ERR_CALENDAR_MORE_DATAのエラーはvalues配列のサイズ不足が原因であるため、配列を拡張する必要があります。


CalendarValueLastByEvent関数を使う際の注意点

CalendarValueLastByEvent関数を使用するときには、いくつかの特性や制約を考慮する必要があります。


取引サーバの時間を基準にしてデータが扱われることを理解しておく必要があります。MqlCalendarValue構造体の時刻や関数で取得するデータは、取引サーバの時間で表示されます。このため、ユーザーの現地時間でデータを使用する場合は、取引サーバの時間を現地時間に変換する処理を加えることが必要です。

values配列には、取得したイベントデータが格納されますが、配列のサイズが不足していると、すべてのデータを格納できない場合があります。特に、関数を呼び出したときにERR_CALENDAR_MORE_DATAのエラーが発生した場合は、配列サイズを増やす必要があります。事前にArrayResize関数を使用して適切なサイズを設定することで、この問題を回避できます。

change_idに0を渡して関数を呼び出すと、最新のデータは返されません。その代わりに、最新のchange_idだけが設定されます。この動作は正常です。次回以降、このchange_idを使ってデータを取得できるようになります。

取得されるデータの実際の値は、100万倍された形で格納されます。このため、値を利用する際には100万で割る必要があります。例えば、実際のデータが3.5の場合、格納されている値は3500000となります。値の取り扱いには注意が必要です。

さらに、MqlCalendarValue構造体の各フィールドにデータが欠損している場合は、LONG_MINという特別な値が格納されます。この値は-9223372036854775808を意味し、データが提供されていないことを示しています。このような場合には、データがないことを前提とした処理を行う必要があります。


以上の点を考慮することで、CalendarValueLastByEvent関数をより正確かつ効率的に利用することができます。

CalendarValueLastByEvent関数を使ったサンプルコード

#property description "CalendarValueLastByEvent関数の使用例"
#property description "非農業部門就業者数の発表を追跡するためのエキスパートアドバイザ"
#property description "カレンダーデータベースの現在の変更IDを取得し"
#property description "タイマーで新しいイベントのみを取得します"

//+------------------------------------------------------------------+
//| エキスパート初期化関数                                            |
//+------------------------------------------------------------------+
int OnInit()
 {
  //--- タイマーを設定する(60秒ごとにOnTimer関数を呼び出す)
  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_execution = true;

  //--- イベントIDを保持する変数
  static ulong event_id = 0;

  //--- イベント名を保持する変数
  static string event_name = NULL;

  //--- カレンダーイベントの値を格納する配列
  MqlCalendarValue values[];

  //--- 初回の実行時にはカレンダー変更IDを取得する
  if (first_execution)
    {
      //--- 国コード「US(アメリカ)」を指定してイベントを取得する
      MqlCalendarEvent events[];
      string country_code = "US";

      //--- 指定された国のイベントを取得する
      int event_count = CalendarEventByCountry(country_code, events);

      //--- イベントが存在するか確認する
      if (event_count > 0)
        {
          //--- ログにアメリカのイベント数を出力する
          PrintFormat("国コード: %s に関連するイベント数: %d", country_code, event_count);

          //--- 非農業部門就業者数のイベントを探す
          for (int i = 0; i < event_count; i++)
            {
              //--- イベント名を取得し、小文字に変換する
              string current_event_name = events[i].name;
              StringToLower(current_event_name);

              //--- 非農業部門就業者数(Nonfarm Payrolls)を含むイベントを検索する
              if (StringFind(current_event_name, "nonfarm payrolls") != -1)
                {
                  //--- イベントIDと名前を記録する
                  event_id = events[i].id;
                  event_name = events[i].name;

                  //--- ログにイベント情報を出力する
                  PrintFormat("非農業部門就業者数のイベントが見つかりました: ID=%d 名称=%s", event_id, event_name);

                  break;
                }
            }

          //--- イベントが見つからなかった場合、次回のタイマー実行を待つ
          if (event_id == 0)
            {
              Print("非農業部門就業者数のイベントが見つかりませんでした。次回のタイマーイベントで再試行します。");
              return;
            }
        }
      else
        {
          //--- イベントが存在しない場合のエラーメッセージ
          PrintFormat("指定された国のイベントが取得できませんでした。エラーコード: %d", GetLastError());
          return;
        }

      //--- 初回の実行フラグを解除する
      first_execution = false;
    }

  //--- カレンダーイベントの最新値を取得する
  if (CalendarValueLastByEvent(event_id, calendar_change_id, values) > 0)
    {
      //--- 取得したイベントデータをログに出力する
      PrintFormat("新しいイベントデータが取得されました: %d 件", ArraySize(values));
      ArrayPrint(values);

      //--- 非農業部門就業者数のデータを処理するコードをここに追加する
    }
  else
    {
      //--- イベントデータが取得できなかった場合のエラーチェック
      int error_code = GetLastError();
      if (error_code != 0)
        {
          PrintFormat("データ取得に失敗しました。エラーコード: %d", error_code);
        }
    }
 }

サンプルコード解説1: グローバル領域部分

#property description "CalendarValueLastByEvent関数の使用例"
#property description "非農業部門就業者数の発表を追跡するためのエキスパートアドバイザ"
#property description "カレンダーデータベースの現在の変更IDを取得し"
#property description "タイマーで新しいイベントのみを取得します"

このサンプルコードでは、非農業部門就業者数(Nonfarm Payrolls)の発表を追跡するエキスパートアドバイザを作成しています。まず、グローバル領域のコード部分を解説します。


#property descriptionについて

コードの冒頭では、#property descriptionディレクティブを使用して、エキスパートアドバイザEA)の説明を指定しています。以下はその役割です。

このコードでは「CalendarValueLastByEvent関数の使用例」や「非農業部門就業者数の発表を追跡する」など、EAの具体的な目的を説明しています。


サンプルコード解説2: OnInit関数部分

//+------------------------------------------------------------------+
//| エキスパート初期化関数                                            |
//+------------------------------------------------------------------+
int OnInit()
 {
  //--- タイマーを設定する(60秒ごとにOnTimer関数を呼び出す)
  EventSetTimer(60);

  //--- 初期化成功を返す
  return(INIT_SUCCEEDED);
 }

OnInit関数は、エキスパートアドバイザがチャート上で実行を開始するときに最初に呼び出される関数です。この関数では、エキスパートアドバイザの初期化を行い、動作を開始するための準備を整えます。

関数内で最も重要な処理は、EventSetTimer関数を使用してタイマーを設定している部分です。このタイマー設定により、エキスパートアドバイザは一定の間隔でOnTimer関数を自動的に呼び出します。

タイマーを使用して、指定した間隔(この例では60秒)ごとにOnTimer関数を実行します。この間隔を設定することで、定期的な処理が可能になります。例えば、このコードでは、非農業部門就業者数の最新データを継続的に取得する仕組みを実現しています。

タイマーのパラメータとして渡される60は、タイマーが60秒間隔で動作することを示します。これにより、OnTimer関数が正確に1分ごとに呼び出されるようになります。

また、関数の最後で、初期化が正常に完了したことを示すINIT_SUCCEEDEDを返しています。この値を返すことで、エキスパートアドバイザが問題なく初期化されたことをMT5プラットフォームに通知します。

サンプルコード解説3: OnDeinit関数部分とOnTick関数部分

//+------------------------------------------------------------------+
//| エキスパート終了時の関数                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
  //--- タイマーを停止する
  EventKillTimer();
 }
//+------------------------------------------------------------------+
//| ティックごとに呼び出される関数(今回は未使用)                   |
//+------------------------------------------------------------------+
void OnTick()
 {
  //--- 処理なし
 }

OnDeinit関数部分

OnDeinit関数は、エキスパートアドバイザがチャート上から削除されるとき、または操作が終了するときに呼び出される関数です。この関数では、終了時の後片付けやリソースの解放などを行います。

このコードでは、タイマーを停止するためにEventKillTimer関数を呼び出しています。
タイマーが停止されないまま残ると、不要なリソースが消費されたり、不要なOnTimerイベントが発生したりすることがあります。タイマーを確実に停止することで、エキスパートアドバイザの終了後も安定した動作を維持できます。

引数reasonは、エキスパートアドバイザが終了する理由を示す値ですが、このコードでは具体的に使用されていません。必要に応じて、終了理由に応じた処理を追加することもできます。


OnTick関数部分

OnTick関数は、新しいティック(価格の変動)が発生するたびに呼び出される関数です。この関数は通常、トレードロジックや価格の変化に基づく処理を行う場所です。

このコードでは、OnTick関数が未使用であり、何も処理を行っていません。そのため、関数内の処理は空白となっています。未使用である理由として、このエキスパートアドバイザは、価格の変動ではなくタイマーによって定期的に処理を行う設計になっているためです。

サンプルコード解説4: OnTimer関数その1

//+------------------------------------------------------------------+
//| タイマーイベント関数                                              |
//+------------------------------------------------------------------+
void OnTimer()
 {
  //--- カレンダーデータベースの変更IDを保持する変数
  static ulong calendar_change_id = 0;

  //--- 最初の実行かどうかを判定するためのフラグ
  static bool first_execution = true;

  //--- イベントIDを保持する変数
  static ulong event_id = 0;

  //--- イベント名を保持する変数
  static string event_name = NULL;

  //--- カレンダーイベントの値を格納する配列
  MqlCalendarValue values[];

OnTimer関数の役割

OnTimer関数は、タイマーイベントが発生するたびに自動的に呼び出されます。このエキスパートアドバイザでは、非農業部門就業者数などの経済指標データを定期的に取得する処理を実装しています。関数内では、カレンダーイベントのデータを管理するための初期化やデータ取得の準備を行っています。


変数の解説

  1. calendar_change_id
  • カレンダーデータベースの変更IDを保持する変数です。
  • このIDは、前回取得したデータと現在のデータを比較する際に使用されます。
  • staticとして宣言されているため、関数が再呼び出しされても値が保持されます。
  1. first_execution
  • 初回の関数呼び出しかどうかを判定するためのフラグです。
  • 初めてOnTimer関数が呼び出された場合のみ特定の初期化処理を行います。
  • staticとして宣言されているため、値が保持され続けます。
  1. event_id
  • 追跡対象のイベント(ここでは非農業部門就業者数)のIDを保持します。
  • このIDを使って特定のカレンダーイベントのデータを取得します。初期値は0に設定されています。
  1. event_name
  • イベントの名前を保持する変数です。
  • ここでは特定の経済指標(非農業部門就業者数)の名称を記録します。初期値NULLに設定されています。
  1. values
  • カレンダーイベントのデータを格納する配列です。
  • MqlCalendarValue構造体型の配列で、非農業部門就業者数の実際の値や予想値などが格納されます。

変数の特徴と役割

これらの変数は、タイマーイベントが発生するたびに更新やデータの取得に利用されます。特に、calendar_change_idやvalues配列は、データベースの変更内容を効率的に追跡するための重要な役割を果たします。また、first_executionフラグによって、初回のみ実行すべき処理と通常の処理を分ける設計がなされています。

サンプルコード解説5: OnTimer関数その2

  //--- 初回の実行時にはカレンダー変更IDを取得する
  if (first_execution)
    {
      //--- 国コード「US(アメリカ)」を指定してイベントを取得する
      MqlCalendarEvent events[];
      string country_code = "US";

      //--- 指定された国のイベントを取得する
      int event_count = CalendarEventByCountry(country_code, events);

初回実行時の処理

OnTimer関数では、最初の呼び出し時(first_executionがtrueの状態)にカレンダーデータベースの初期化と特定イベントの取得を行います。この部分は、非農業部門就業者数のイベントデータを追跡するために、カレンダーから必要なイベント情報を準備する役割を担っています。


処理の流れと説明

first_executionの判定

  • このフラグがtrueである場合に初回実行の処理を行います。
  • 初回実行時のみカレンダーデータベースのイベントIDや関連情報を取得し、以降の処理に備えます。

国コードを指定してイベントを取得

  • アメリカの経済指標イベントを取得するために、国コードとして”US”を使用します。このコードはISO3166-1 Alpha-2形式で指定されています。
  • string型変数country_codeに”US”を代入し、この値をCalendarEventByCountry関数に渡します。

イベントデータを格納する配列を準備

CalendarEventByCountry関数の呼び出し

  • CalendarEventByCountry関数を使用して、指定された国(ここではアメリカ)に関連するカレンダーイベントを取得します。
  • この関数は、指定した国コードに基づいて関連するすべての経済指標イベントをevents配列に格納します。

戻り値として取得したイベントの数

  • CalendarEventByCountry関数戻り値は取得したイベントの数を示します。この値をint型変数event_countに格納します。
  • event_countが0より大きい場合は、指定された国のイベントが取得できたことを示します。

了解しました。今後、このようなセクションは含めません。それでは再度修正して出力します。


サンプルコード解説5: OnTimer関数その2

  //--- 初回の実行時にはカレンダー変更IDを取得する
  if (first_execution)
    {
      //--- 国コード「US(アメリカ)」を指定してイベントを取得する
      MqlCalendarEvent events[];
      string country_code = "US";

      //--- 指定された国のイベントを取得する
      int event_count = CalendarEventByCountry(country_code, events);

OnTimer関数の初回実行部分では、非農業部門就業者数のような特定の経済指標を追跡するための準備として、アメリカの経済指標イベントを取得しています。

まず、first_executionがtrueであることを確認します。これは、OnTimer関数が初めて呼び出されたかどうかを判断するためのフラグです。初回実行時のみこの処理を実行します。

次に、国コードを指定してイベントを取得します。アメリカの経済指標データを取得するため、ISO形式の国コードである”US”を使用しています。このコードはcountry_code変数に格納され、後続の関数呼び出しで使用されます。

MqlCalendarEvent構造体

型の配列eventsを宣言し、アメリカに関連するすべての経済指標イベントを格納するための準備を行います。この配列には、CalendarEventByCountry関数が取得したデータが格納されます。

CalendarEventByCountry関数を呼び出し、country_codeを渡してイベントを取得します。戻り値として取得したイベントの数が返され、それをevent_count変数に格納します。この戻り値を利用して、イベントが存在するかどうかを確認することができます。event_countが0より大きければ、指定された国の経済指標イベントが正常に取得されたことを示します。

サンプルコード解説6: OnTimer関数その3

      //--- イベントが存在するか確認する
      if (event_count > 0)
        {
          //--- ログにアメリカのイベント数を出力する
          PrintFormat("国コード: %s に関連するイベント数: %d", country_code, event_count);

          //--- 非農業部門就業者数のイベントを探す
          for (int i = 0; i < event_count; i++)
            {
              //--- イベント名を取得し、小文字に変換する
              string current_event_name = events[i].name;
              StringToLower(current_event_name);

OnTimer関数のこの部分では、初回実行時に取得したアメリカの経済指標イベントから、特定のイベント(非農業部門就業者数)を検索する処理を行います。


イベントの存在確認

まず、CalendarEventByCountry関数戻り値として取得したイベント数(event_count)が0より大きいかどうかを確認します。これは、指定した国(ここではアメリカ)に関連する経済指標イベントが存在するかを判断するための条件です。

event_countが0の場合、イベントが存在しないことを意味します。この場合、後続の処理をスキップするよう実装されています。


イベント数のログ出力

イベントが存在する場合は、アメリカに関連するイベント数をログに出力します。PrintFormat関数を使用して、国コードとイベント数を記録しています。このログは、デバッグ時に取得したデータの確認に役立ちます。


非農業部門就業者数の検索

次に、forループを使用して取得したすべてのイベントを一つずつ調べます。ループの各反復では、現在のイベント名(events配列のnameフィールド)をcurrent_event_name変数に格納します。このイベント名は、指定した経済指標(非農業部門就業者数)を検索するために利用されます。


イベント名の小文字変換

イベント名を検索する際、大小文字の違いによる一致ミスを防ぐため、StringToLower関数を使用してcurrent_event_nameを小文字に変換します。このように変換することで、イベント名を小文字で統一し、一貫した方法で検索することが可能になります。


この部分では、取得したイベントの中から指定した経済指標(非農業部門就業者数)を特定するための準備が進められています。次の段階では、この処理を元に具体的な検索とIDの取得を行います。

サンプルコード解説7: OnTimer関数その4

   //--- 非農業部門就業者数(Nonfarm Payrolls)を含むイベントを検索する
              if (StringFind(current_event_name, "nonfarm payrolls") != -1)
                {
                  //--- イベントIDと名前を記録する
                  event_id = events[i].id;
                  event_name = events[i].name;

                  //--- ログにイベント情報を出力する
                  PrintFormat("非農業部門就業者数のイベントが見つかりました: ID=%d 名称=%s", event_id, event_name);

                  break;
                }
            }

OnTimer関数のこの部分では、取得した経済指標イベントの中から「非農業部門就業者数(Nonfarm Payrolls)」を含むイベントを検索し、その情報を記録する処理を行います。


非農業部門就業者数を含むイベントの検索

if文StringFind関数を使用して、current_event_name(イベント名)に”nonfarm payrolls”という文字列が含まれているかを確認しています。この関数は、指定された文字列が見つかった場合にその位置を返し、見つからなかった場合には-1を返します。

この条件が真(文字列が見つかった)である場合、そのイベントが非農業部門就業者数に関連するものとみなし、次の処理を実行します。


イベントIDと名前の記録

非農業部門就業者数のイベントが見つかった場合、そのイベントのIDと名前を記録します。これらの情報は、後続の処理で具体的な値を取得するために必要となります。

  • event_idには、該当するイベントのIDを格納します。
  • event_nameには、該当するイベントの名前を格納します。

ログにイベント情報を出力

PrintFormat関数を使用して、見つかったイベントのIDと名前をログに出力します。この情報は、デバッグや動作確認の際に非常に役立ちます。特に、複数のイベントが候補に上がる場合でも、ログを参照して正確に見つかったイベントを確認できます。


処理の終了

break文を使用してforループを終了します。これは、非農業部門就業者数に該当するイベントが見つかった時点で、以降のイベントを探索する必要がなくなるためです。


この部分の処理により、非農業部門就業者数に該当するイベントIDと名前を特定し、ログに記録する準備が整いました。これにより、エキスパートアドバイザは、指定した経済指標データを効率的に追跡する基盤を確立できます。

サンプルコード解説8: OnTimer関数その5

 //--- イベントが見つからなかった場合、次回のタイマー実行を待つ
          if (event_id == 0)
            {
              Print("非農業部門就業者数のイベントが見つかりませんでした。次回のタイマーイベントで再試行します。");
              return;
            }
        }
      else
        {
          //--- イベントが存在しない場合のエラーメッセージ
          PrintFormat("指定された国のイベントが取得できませんでした。エラーコード: %d", GetLastError());
          return;
        }

      //--- 初回の実行フラグを解除する
      first_execution = false;
    }

OnTimer関数のこの部分では、非農業部門就業者数のイベントが見つからなかった場合や、取得自体が失敗した場合のエラーハンドリングを行い、処理の再試行や終了を適切に制御します。


イベントが見つからなかった場合の処理

event_idが0の場合、つまり非農業部門就業者数に該当するイベントが見つからなかった場合の処理が記述されています。この場合、次回のタイマーイベントで再試行する旨をログに出力します。

  • Print関数で「非農業部門就業者数のイベントが見つかりませんでした。次回のタイマーイベントで再試行します。」というメッセージを出力します。
  • return文を使って関数の実行を終了し、次回のタイマーイベントまで待機します。

これにより、初回のデータ取得が失敗しても、エキスパートアドバイザが安定して動作を続けるよう設計されています。


イベント取得が失敗した場合の処理

取得したイベント数が0である場合、つまり指定された国のイベント自体が取得できなかった場合の処理が記述されています。

  • PrintFormat関数で、「指定された国のイベントが取得できませんでした」というエラーメッセージと、GetLastError関数で取得したエラーコードをログに出力します。
  • return文を使って関数の実行を終了します。

この処理は、イベント取得に失敗した場合でもエラーを適切に記録し、デバッグ時に問題を特定しやすくする目的があります。


初回実行フラグの解除

初回の実行処理が正常に完了した場合、first_executionフラグをfalseに設定して、次回以降のタイマーイベントではこの処理をスキップするようにしています。

この設計により、初回の実行時にだけ行うべき処理(非農業部門就業者数のイベントを検索して設定する処理)が、不要な再実行を避けて効率的に動作するようになります。


この部分の処理では、エラーやデータ取得の失敗に対応し、安定した再試行と初回処理の終了を適切に制御する仕組みが実装されています。これにより、エキスパートアドバイザの動作を止めることなく、問題に柔軟に対応することが可能となります。

サンプルコード解説9: OnTimer関数その6

//--- カレンダーイベントの最新値を取得する
  if (CalendarValueLastByEvent(event_id, calendar_change_id, values) > 0)
    {
      //--- 取得したイベントデータをログに出力する
      PrintFormat("新しいイベントデータが取得されました: %d 件", ArraySize(values));
      ArrayPrint(values);

      //--- 非農業部門就業者数のデータを処理するコードをここに追加する
    }
  else
    {
      //--- イベントデータが取得できなかった場合のエラーチェック
      int error_code = GetLastError();
      if (error_code != 0)
        {
          PrintFormat("データ取得に失敗しました。エラーコード: %d", error_code);
        }
    }
 }

OnTimer関数のこの部分では、非農業部門就業者数のような特定のカレンダーイベントの最新データを取得し、取得結果に応じて処理やエラー対応を行います。


カレンダーイベントの最新値を取得

CalendarValueLastByEvent関数を呼び出し、指定されたイベントID(event_id)に関連する最新の値を取得します。この関数は、イベントID、変更ID(calendar_change_id)、値を格納する配列(values)を引数として受け取ります。

  • 戻り値は、取得できたデータの数を示します。
  • 取得データ数が0より大きい場合、新しいイベントデータが取得されたと判断し、次の処理を行います。

新しいデータが取得された場合の処理

取得したデータが存在する場合は、以下の操作を実行します。

  1. 取得したデータのログ出力
    PrintFormat関数を使用して、「新しいイベントデータが取得されました」というメッセージと、values配列要素数をログに出力します。これにより、どのくらいのデータが取得されたのかを確認できます。
  2. 取得データの内容を表示
    ArrayPrint関数を使用して、values配列の中身をログに出力します。この配列には、非農業部門就業者数の実際の値や予想値などの情報が含まれています。
  3. データの処理
    コメントアウトで「非農業部門就業者数のデータを処理するコードをここに追加する」と示されている箇所に、取得したデータを解析し、トレード戦略に活用するための処理を記述します。

データ取得に失敗した場合の処理

CalendarValueLastByEvent関数戻り値が0である場合、データ取得に失敗したことを意味します。この場合は以下の処理を実行します。

  1. エラーコードの取得と確認
    GetLastError関数を呼び出して、発生したエラーのコードを取得します。
  2. エラーコードが0でない場合のログ出力
    PrintFormat関数を使用して、「データ取得に失敗しました」というメッセージとエラーコードをログに出力します。これにより、問題発生時にエラー内容を迅速に特定できます。

この部分では、非農業部門就業者数の最新データを取得し、その結果に応じて処理を分岐させています。取得が成功した場合はデータをログに記録し、解析や利用の準備を整えます。一方で、失敗した場合もエラーを適切に記録することで、問題解決に役立つ情報を提供します。

CalendarValueLastByEvent関数を使ってEAを作る際のアイディア

CalendarValueLastByEvent関数を活用すると、経済指標イベントに基づいた高度なエキスパートアドバイザEA)を作成することが可能です。以下に、この関数を用いて実現できるEAのアイディアをいくつか紹介します。


経済指標発表時の自動トレード

非農業部門就業者数の発表やその他の重要な経済指標イベント時に、リアルタイムで市場の変化を追跡し、自動的にトレードを実行するEAを作成できます。

  • 指標値が市場予想より大幅に異なる場合にポジションを取る。
  • 発表直後にスプレッドボラティリティを監視し、条件が整った場合のみ取引を実行する。

イベントデータを元にした分析ツール

CalendarValueLastByEvent関数で取得したデータを分析し、過去のトレンドや市場の反応を可視化するツールを作成できます。

  • 各経済指標イベントの実際の値、予測値、前回値を比較して統計を出力する。
  • 発表直後の価格変動(例: 10分間のボラティリティや最大値・最小値)を計算してレポートを作成する。

特定指標を監視するリスク管理EA

特定の経済指標イベント(非農業部門就業者数やGDPなど)が発表される直前に、保有ポジションを自動的に閉じたり、ストップロスを設定するリスク管理用のEAを開発できます。

  • 重要指標の発表前にポジションを閉じる。
  • 発表前後の価格変動を監視し、リスクが高まった場合は即座にエグジットする。

複数指標を組み合わせたシステムトレード

CalendarValueLastByEvent関数で取得したデータを元に、複数の経済指標を組み合わせてトレード判断を行うEAを作成します。

  • 非農業部門就業者数と失業率の相関性を利用して取引戦略を構築する。
  • 発表された数値が複数の条件を同時に満たした場合にのみエントリーする。

発表データを元にしたアラートEA

特定の経済指標が設定した条件に一致した場合に、アラートや通知を送信するEAを開発できます。

  • 経済指標の値が設定した閾値を超えた場合にMT5の通知を送信。
  • メールやスマートフォンの通知機能を活用してリアルタイムで情報を提供。

CalendarValueLastByEvent関数を使うことで、経済指標を軸にした多様なトレード戦略や補助ツールを実現できます。これらのアイディアを基に、ユーザーのニーズに合った独自のEAを開発することが可能です。

タイトルとURLをコピーしました