自動売買·

MT5のニュースフィルター:内蔵カレンダーとAPI、どちらを使う?

MetaTrader 5には、EAがダウンロードなしで読み取れる経済指標カレンダーが内蔵されています。それで足りる場合と足りない場合、そして代わりに無料のカレンダーAPIを使う方法を、両方のMQL5コード付きで解説します。

MetaTrader 5でEA(エキスパートアドバイザー)を作っているなら、MT4ユーザーにはない選択肢があります。ターミナルには経済指標カレンダーが内蔵されていて、MQL5のいくつかの関数で読み取れるのです。ダウンロードも、URLの許可も、データの解析もいりません。

では、なぜわざわざ外部のAPIを使うのでしょうか。内蔵カレンダーにはいくつか弱点があり、そのうち3つがニュースフィルターでは効いてくるからです。このガイドでは、まず内蔵カレンダーを使うコード、次にAPIを使うコードを紹介し、どちらを選べばよいかを説明します。

⚖️ 2つの方法を並べて比較

MQL5の内蔵カレンダーShowMyTradesカレンダーAPI
準備不要ツール → オプション → エキスパートアドバイザ(Tools → Options → Expert Advisors)でhttps://showmytrades.comを許可
データの提供元MetaQuotes。ブローカーのサーバー経由で配信ShowMyTradesが複数の公開カレンダーを統合。主要な指標の発表日は、発表元の政府機関や中央銀行の情報と照合済み(confidence: official)
使える環境カレンダーを有効にしているブローカー(大半は有効。一部のホワイトラベルのサーバーは非対応)すべてのブローカー、インターネットにつながるすべてのターミナル
MT4対応いいえはい、同じファイルで
テスター対応はい、過去データありいいえ(テスターではネットワークが使えない)
タイムゾーン取引サーバーの時刻。UTCとの差は自分で割り出す必要ありUTC(tsはUnixタイムの秒)。どのレスポンスにもサーバーの現在のUTC時刻が入っているため、EAがブローカーやVPSの時計に左右されることはありません
値予想、前回、結果(改定値あり)予想、前回、結果
費用無料無料、キー不要

🧱 方法A:内蔵カレンダー

次の関数は、チャートの銘柄を構成するどちらかの通貨について、重要度の高い指標発表が停止時間帯に入っているかどうかを返します。時刻は取引サーバーの時刻で、CalendarValueHistory()もこの時刻を前提にしています。

NativeNewsFilter.mqh
//--- MQL5の内蔵カレンダー:チャートの通貨について、重要度「高」の発表が
//--- 現在時刻の[-minutesBefore, +minutesAfter]の範囲にあるあいだtrueを返す
bool NativeNewsTime(const int minutesBefore, const int minutesAfter, string &reason)
{
   reason = "";
   datetime now  = TimeTradeServer();
   datetime from = now - minutesAfter * 60;
   datetime to   = now + minutesBefore * 60;

   string currencies[2];
   currencies[0] = SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
   currencies[1] = SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);

   for(int c = 0; c < 2; c++)
   {
      if(c == 1 && currencies[1] == currencies[0]) break;
      MqlCalendarValue values[];
      if(CalendarValueHistory(values, from, to, NULL, currencies[c]) <= 0) continue;
      for(int i = 0; i < ArraySize(values); i++)
      {
         MqlCalendarEvent ev;
         if(!CalendarEventById(values[i].event_id, ev)) continue;
         if(ev.importance != CALENDAR_IMPORTANCE_HIGH) continue;
         reason = currencies[c] + ": " + ev.name;
         return true;
      }
   }
   return false;
}

ほかのフィルターと同じように、OnTick()から呼び出します。

string news;
if(NativeNewsTime(30, 30, news)) { Comment("News filter: ", news); return; }

頼る前に知っておきたい点が3つあります。

  1. ブローカー次第です。カレンダーは取引サーバーを通じてターミナルに届きます。使っているブローカーでCalendarValueHistory()が-1を返し、エラーが5402なら、そのサーバーではカレンダーが有効になっていません。コードではどうにもなりません。
  2. UTCではなくサーバー時刻です。実際のチャートで動かす分には問題ありませんが、ほかのデータと突き合わせるときに苦労します。
  3. MT5専用です。MT4向けにも配布するEAでは、別の実装をもう1つ用意する必要があります。

🌐 方法B:カレンダーAPI

もう1つの方法は、無料のHTTPエンドポイントです。選んだ通貨と重要度について、今後数日分のニュースをCSVまたはJSONで返します。

https://showmytrades.com/api/public/calendar/v1?currency=EUR,USD&impact=high&days=2&format=csv

これを読み込むインクルードファイルSMT_NewsFilter.mqhは、MT4のガイドとAPIリファレンスに全文を載せています。MQL5でもそのままコンパイルできます。MQL5\Includeに保存し、ツール → オプション → エキスパートアドバイザでhttps://showmytrades.comを許可したら、次のように呼び出します。

#include <SMT_NewsFilter.mqh>

void OnTick()
{
   string news;
   if(SMT_IsNewsTime(news)) { Comment("News filter active: ", news); return; }
   Comment("");
   // ... エントリーのロジック ...
}

ダウンロードは15分に1回で、比較はTimeGMT()を使ってUTCで行います。入力パラメーター(SMT_Currencies、SMT_Impact、発表前と発表後の分数)は、EAの設定画面にそのまま並びます。

🎯 どちらを選ぶか

状況選ぶもの
MT5だけで使う、ブローカーがカレンダーに対応している、フィルターをバックテストしたい内蔵
同じEAをMT4とMT5で使うAPI:ファイル1つで、同じ動作
カレンダーに対応していないブローカー(5402)API
cTraderでcBotも動かしているAPI:cTraderでも同じデータ
あとで見直せるよう、ニュースを取引と一緒に記録したいどちらでも。APIのタイムスタンプはUTCなので、ほかのログと時刻がそろいます

両方を併用してもかまいません。内蔵カレンダーが応答すればそれを使い、応答しなければAPIを使う、という形です。ただ実際には、どちらか1つで十分です。

🧪 ニュースフィルターのバックテスト

2つのうち、ストラテジーテスターで使えるのは内蔵カレンダーだけです。テスターではインターネットが使えないからです。ただし、ニュースフィルターのバックテストで何が証明できるのかには注意が必要です。テストで使われるのは現在のカレンダーで、時刻は修正済み、あとから追加されたイベントも入っています。実運用のフィルターが知っているのは、その時点で予定されていた情報だけです。

❓ よくある質問

MT5の内蔵カレンダーは無料ですか?

はい。ターミナルの機能の一部で、ブローカーのサーバー経由で届きます。自分の側で有効にする設定はありません。

使っているブローカーでCalendarValueHistory()が何も返さないのはなぜですか?

一部のサーバー、特にホワイトラベルのサーバーは、カレンダーを中継していません。GetLastError()を確認し、5402ならカレンダーは利用できません。その場合はAPIを使ってください。

別の銘柄の通貨で絞り込めますか?

はい。_Symbolから読み取る代わりに、使いたい通貨コードを渡してください。API版では、EUR,USD,GBPのような文字列で入力パラメーターに指定します。

APIを使うのに会員登録は必要ですか?

不要です。キーもログインもいりません。上限はIPアドレスごとに毎分600リクエストで、15分に1回のリクエストなら、チャートをいくつ開いていても余裕で収まります。

🔗 関連ガイド


どちらのカレンダーを選んでも、結果は運用実績に表れます。指標発表の急変動に飛び込むエントリーが減り、ドローダウンもなだらかになります。MT5口座を無料で連携して、チャートで確かめてください。