【MQL5】CalendarCountries関数の使い方と自動売買実装コード

1. CalendarCountries関数の概要と実務での活用法

MQL5に搭載されている「経済カレンダー機能」は、ファンダメンタルズ要因を自動売買(EA)に組み込むための非常に強力なツールです。その入り口となるのが CalendarCountries 関数です。

この関数は、MQL5の経済カレンダーがサポートしている全国家・地域の情報を取得するためのものです。具体的には、国名、通貨コード、ISO国コード(”US”, “JP”など)のリストを取得できます。

実務での活用シーン

実務開発において、単に「指標発表がある」という情報だけでは不十分です。「USDに関する重要指標があるときはドルストレートの新規ポジションを制限する」「JPYの指標発表前後でスプレッドが拡大しそうな時に決済を早める」といった条件分岐を作る必要があります。
CalendarCountries を使って特定の国(米国や日本)の内部IDを事前に取得しておくことで、その後の指標詳細データ(CalendarValueHistory など)を効率的にフィルタリングできるようになります。

初心者の方が陥りやすい罠として、「国名や通貨コードを直接文字列で指定してイベントを探そうとする」ことが挙げられます。MQL5のカレンダー操作では、速度と精度の観点から、まずこの関数で「国ID」を取得し、そのIDをキーにしてイベントを検索するのが定石です。


2. 構文と戻り値

CalendarCountries 関数の構文は非常にシンプルです。

int  CalendarCountries(
   MqlCalendarCountry  countries[]      // 国情報を格納する配列
);

パラメーター

  • countries[]: MqlCalendarCountry 構造体の動的配列を渡します。関数実行後、この配列に全国家の情報が格納されます。

戻り値

  • 成功した場合:取得した要素数(国・地域の数)を返します。
  • 失敗した場合:-1 を返します。

MqlCalendarCountry 構造体の内容

取得できる配列の各要素(構造体)には以下のメンバが含まれています。
id: 国の識別ID(他のカレンダー関数で多用します)
name: 国の名称(例: “United States”)
code: ISO 3166-1 alpha-2 国コード(例: “US”)
currency: その国の通貨(例: “USD”)
currency_symbol: 通貨記号(例: “$”)


3. 具体的な使い方・実践サンプルコード

以下のサンプルコードは、現在MQL5で利用可能な全ての国と通貨のリストを取得し、エキスパートログに出力するスクリプトです。特定の国のIDを探す際のベースコードとして活用してください。

void OnStart()
{
   // 国情報を格納するための動的配列を宣言
   MqlCalendarCountry countries[];

   // カレンダーから全国家情報を取得
   int count = CalendarCountries(countries);

   // 取得に失敗した場合の処理
   if(count < 0)
   {
      Print("カレンダー情報の取得に失敗しました。エラーコード: ", GetLastError());
      return;
   }

   PrintFormat("%d 個の国・地域情報を取得しました。", count);

   // 取得したデータをループで確認
   for(int i = 0; i < count; i++)
   {
      PrintFormat("ID: %lld | 国コード: %s | 通貨: %s | 名称: %s", 
                  countries[i].id, 
                  countries[i].code, 
                  countries[i].currency, 
                  countries[i].name);

      // 実践例:日本(JP)のIDを特定して保存したい場合
      if(countries[i].code == "JP")
      {
         long japanID = countries[i].id;
         Print(">>> 日本のIDを確認: ", japanID);
      }
   }
}

4. 使用上の注意点とよくあるエラー

1. 配列のサイズ管理

CalendarCountries に渡す配列は必ず動的配列(サイズを指定しない [])にしてください。関数側で自動的にリサイズされます。

2. データ取得のタイミング

MetaTrader 5(MT5)を起動した直後や、ネットワーク環境が不安定な場合、一時的にカレンダーデータが空(0を返す)になることがあります。EAの OnInit で一度だけ呼び出すのではなく、取得できるまでリトライするか、データが空でないかチェックするロジックを含めるのが安全です。

3. IDのハードコーディング禁止

「日本のIDは現在 392 だから直接 392 と書こう」というハードコーディングは推奨されません。将来的にMQL5側のデータベース更新でIDが変更される可能性がゼロではないため、必ず CalendarCountries を呼び出して code == "JP" などからIDを動的に取得するようにしてください。


5. 【重要】自動売買における約定スピードと環境の罠

どれほど高度なロジックを CalendarCountries で組み、完璧な経済指標回避システムを構築したとしても、実行環境が「自宅のPC」であれば、その優位性は一瞬で崩壊します。FX取引、特に指標発表時の激しい値動きの中では、1ミリ秒(0.001秒)の遅延が致命的なスリッページを引き起こし、本来得られるはずだった利益を奪うだけでなく、想定外の損失を招くからです。

自宅のインターネット回線は、プロバイダーを経由する複雑な経路を通るため、証券会社のサーバーに到達するまでに大きなタイムラグ(レイテンシ)が発生します。この遅延を極限まで排除し、プロレベルの約定スピードを実現するには、証券会社のサーバーと同じデータセンター内、あるいは至近距離に設置された「専用のVPS(仮想専用サーバー)」での稼働が不可欠です。24時間365日の安定稼働と、ネットワーク遅延の最小化。このインフラへの投資を惜しむことは、シストレにおける最大のリスクであることをエンジニアとして理解しておく必要があります。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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