English Русский Deutsch
preview
初心者からエキスパートへ:MQL5を使ったアニメーションニュース見出し(V) - イベントリマインダーシステム

初心者からエキスパートへ:MQL5を使ったアニメーションニュース見出し(V) - イベントリマインダーシステム

MetaTrader 5 |
63 1
Clemence Benjamin
Clemence Benjamin

内容


はじめに

影響力の大きい経済ニュースの発表は、価格の急激な変動を引き起こすことがあり、大きな利益をもたらす場合もあれば、突然の損失でトレーダーを驚かせることもあります。News Headline EAは、チャート上に今後のイベント、テクニカル指標の洞察、AI生成の解説を表示することで、複数のウィンドウを切り替えることなく取引の優位性を確保できるよう設計されています。しかし正直に言えば、次のデータの発表を待つために一日中画面に張り付きたくはありません。

このワークフローをより実用的にするために、次のステップとして、主要イベントの直前に自動で通知してくれるインテリジェントなアラートシステムを統合します。これにより、戦略に集中しながら、重要なニュースを見逃すことがないという安心感を得られます。

本連載は、経験豊富な開発者だけでなくMetaTrader 5を初めて使う方にも対応する内容となっており、通知関連の資料は専用のセクションにまとめています。ここでは、画面上のポップアップやサウンド、スマートフォンへのプッシュ通知など、プラットフォームに組み込まれたアラート機能を詳細に解説し、取引のスタイルに合わせて適切なタイミングでリマインダーを設定できるようにしています。

本ディスカッションでは、現在のNews Headline EAの制約を確認するとともに、MQL5のアラートを任意のプロジェクトに統合するためのスキルを提供します。次のセクションでは、MQL5アラートの仕組みを詳しく解説し、それをEAにシームレスに組み込むための計画をステップごとに説明します。この基盤を理解すれば、自信を持ってコーディング作業に進むことができるようになります。


概念

本セクションではまず、アラートに関してMQL5が提供する機能について確認し、その後、統合計画について解説します。次の段落では、MetaTrader 5におけるアラートの仕組みを理解していきます。

MQL5におけるアラートの理解

アラートはMetaTrader 5における重要な機能であり、特定の価格レベルに到達した場合や、インジケーターのシグナルが発生した場合、あるいは取引がおこなわれた場合など、重要な市場イベントや条件が発生した際にトレーダーの注意を喚起するために設計されています。MetaTrader 5ターミナルでは、デフォルトでは[ツールボックス] > [アラート]タブで基本的なアラート条件を設定して管理します。

一方、MQL5ではカスタマイズ可能なアラートを作成するための強力な関数が提供されています。代表的な関数にはAlert()、PlaySound()、SendMail()、SendNotification()などがあり、これらを使うことでポップアップダイアログ、音声通知、デスクトップおよびモバイル端末へのメッセージ送信が可能です。また、明示的なアラート関数を使用しなくても、Print()を使って重要なイベントをログとして[操作ログ]タブに出力することもできます。

さらに、ネイティブのAlert()機能を拡張することで、TelegramやDiscordなどの外部通知サービスとAPIを通じて連携させることも可能となります。本日のディスカッションでは外部連携については扱いませんが、過去のセッションで既に解説しています。

今回の焦点は、ニューストレードの文脈において、タイミングと情報の可視性が意思決定に極めて重要である状況において、アラートを効果的に活用する方法を理解することです。

以下の表に、MQL5で利用可能なアラート機能の概要と、それぞれの関数を本プロジェクトの文脈で効果的に適用する方法をまとめます。

関数説明 News Headline EAへの適応性
Alert()MetaTrader 5ターミナルにメッセージを表示するポップアップダイアログを出します。画面上で即座にユーザーの注意を引くとともに、メッセージはエキスパートログにも記録されます。高インパクトイベントの直前通知や、EAが検出した急激な変化を知らせるのに最適です。実取引中でもユーザーの注意を確実に引くことができます。
PlaySound()デスクトップターミナルでカスタム音声ファイル(WAV形式)を再生します。画面を見ていなくても音で通知が可能です。EA上で新しいニュースヘッドライン、インジケーターシグナル、AIのインサイトが発生した際に、音声で通知するのに適しています。マルチタスク中でもトレーダーに情報を届けられます。
SendMail()MetaTrader 5のオプションで設定したSMTPサーバーを通じてメールを送信します。件名や本文に取引関連の詳細情報を含めることができます。取引デスクから離れているトレーダー向けに、詳細なニュースサマリーや高インパクトイベントの通知をメールで届ける際に便利です。
SendNotification()MetaTrader 5モバイルアプリにプッシュ通知を送信します。スマートフォンやタブレットでリアルタイムにメッセージを受け取れます。重要イベントや主要ニュース、EAが検出したAIインサイトなどを瞬時に通知するのに最適です。物理的な場所に関係なくトレーダーをつなげます。

前述の表を踏まえると、ターミナルのポップアップアラートや音声通知など、即座に注意を引く手段は特に重要です。これは、トレーダーが次のイベントに備えて十分な準備時間を確保できるようにするためです。この観点から、ターミナルベースのアラートを優先的に使用し、SendMail()SendNotification()は補助的な手段として利用します。メールやプッシュ通知はメッセージの送信によるわずかな遅延が発生しますが、通常は問題のない範囲です。しかし、タイミングが重要な場合には、この遅延を考慮する必要があります。

拡張性

前述の通り、EAの機能を拡張して、他のプラットフォームへの外部通知に対応させることも可能です。これには、アラート情報を取得してWebRequestを通じて外部サーバーに送信するカスタム関数を作成する方法が含まれます。これにより、Slack、Telegram、SMSゲートウェイ、カスタムWebアプリなどを通じて通知を配信でき、News Headline EAは多様な取引ワークフローや通知環境に柔軟に組み込むことができます。

統合計画

本日は、今後発生するニュースイベントのアラート実装に焦点を当てます。これらのアラートは、各イベント発生の事前に設定された時間でトリガーされるよう設計します。ニュースアラートには、高・中・低のインパクトレベルに応じた3つの重要なカテゴリがあります。今回は、これらのニュースイベントに関するアラートの管理に限定し、EAのその他の機能は一旦除外します。すべてのニュース項目がアラートを生成する必要はなく、トレーダーが通知を受け取りたいインパクトレベルを選択できる柔軟性を提供することが重要です。また、各イベント発生前に何分前に通知を受け取るかも設定可能とします。


実装

手順1:入力パラメータ構成 

統合は、アラートに関連するすべての設定を一か所にまとめて定義することから始まります。具体的には、アラート全体のオン/オフやプッシュ通知の有効/無効を切り替えるグローバルトグル、高・中・低インパクトの個別スイッチ、そして「minutes before」パラメータなどです。この集中型の設定により、ユーザーインターフェースが簡潔になり、トレーダーはどのイベントでポップアップやプッシュ通知を発動させるかを正確にカスタマイズできるようになります。また、EAの条件分岐ロジックもシンプルに保つことができます。EAの初期化時には、これらの入力値を読み取り、アラートを発動する際にはそれぞれの設定を順に確認するだけで済むため、コード内にハードコーディングされた値や散在するフラグを持たせる必要がありません

//--- ALERT INPUTS ---------------------------------------------------
input bool   InpEnableAlerts        = true; //Enable Alerts
input bool   InpAlertHigh           = true; //High Impact Alerts
input bool   InpAlertMed            = false; // Medium Impact Alerts
input bool   InpAlertLow            = false; // Low Impact Alerts
input int    InpAlertMinutesBefore  = 5; //Alert Minutes Before Event

//--- PUSH NOTIFICATIONS INPUTS -------------------------------------
input bool   InpEnablePush          = false; //Enable Push Notifications
input bool   InpPushHigh            = true;  //High Impact Push
input bool   InpPushMed             = false;  //Medium Impact Push
input bool   InpPushLow             = false;  //Low impact Push

手順2: イベント状態追跡

各カレンダーイベントはCEventオブジェクトでラップされており、各オブジェクトは自身のalertedフラグ(初期値はfalse)を保持しています。通知のタイミングが到来すると、EAはAlert()(画面上のポップアップ用)を呼び出し、必要に応じてSendNotification()(モバイルプッシュ用)も実行します。その直後に、そのイベントのalertedフラグをtrueに設定します。このパターンにより、外部の検索構造を用いなくても重複通知を防ぐことができます。注意点として、通知を呼び出した直後に必ずイベントの状態を更新することで、各イベントにつき正確に1回だけアラートが発生することを保証する必要があります。

// Event storage
class CEvent : public CObject
{
public:
  datetime time;
  string   sym, name;
  int      imp;
  bool     alerted;

  CEvent(datetime t,const string &S,const string &N,int I)
  {
    time    = t;
    sym     = S;
    name    = N;
    imp     = I;
    alerted = false;
  }
};

手順3: 通知ディスパッチロジック

すべての通知ディスパッチはCheckAndAlertEvents()内でおこなわれ、この関数はタイマーごとに実行されます。ルーチンはまず、マスターアラートスイッチが有効かどうかを確認し、次に期限タイムスタンプ(now + minutesBefore * 60)を計算します。その後、高・中・低インパクトのイベント配列を順番にループ処理します。まだ通知されていないイベントで、締切時刻内にあり、かつユーザーが選択したインパクトレベルに該当する場合、EAは簡潔なメッセージを作成し、通知関数を呼び出します。このロジックを一か所に集約することで、メールやSMSなどの代替通知チャネルを追加する場合も、EAの複数箇所を修正する必要がなく、この単一関数を拡張するだけで対応可能となります。

//+------------------------------------------------------------------+
//| CheckAndAlertEvents: popups and optional push                    |
//+------------------------------------------------------------------+
void CheckAndAlertEvents()
{
  if(!InpEnableAlerts) return;
  datetime now = TimeTradeServer();
  datetime threshold = now + InpAlertMinutesBefore * 60;
  string msg;

  for(int i=0;i<ArraySize(highArr);i++)
  {
    CEvent *e=highArr[i];
    if(!e.alerted && e.time<=threshold && InpAlertHigh)
    {
      msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name;
      Alert(msg);
      if(InpEnablePush && InpPushHigh) SendNotification(msg);
      e.alerted = true;
    }
  }
  for(int i=0;i<ArraySize(medArr);i++)
  {
    CEvent *e=medArr[i];
    if(!e.alerted && e.time<=threshold && InpAlertMed)
    {
      msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name;
      Alert(msg);
      if(InpEnablePush && InpPushMed) SendNotification(msg);
      e.alerted = true;
    }
  }
  for(int i=0;i<ArraySize(lowArr);i++)
  {
    CEvent *e=lowArr[i];
    if(!e.alerted && e.time<=threshold && InpAlertLow)
    {
      msg = "In "+IntegerToString(InpAlertMinutesBefore)+"m: "+e.sym+" "+e.name;
      Alert(msg);
      if(InpEnablePush && InpPushLow) SendNotification(msg);
      e.alerted = true;
    }
  }
}

 手順4:OnTimer

チャートアニメーションをスムーズに保つため、EAはOnTimer()の先頭でCheckAndAlertEvents()を呼び出します。これは、データの取得や描画処理の前に実行されます。MQL5ではAlert()およびSendNotification()がノンブロッキングで動作するため、その後の20ミリ秒ごとの再描画やスクロール操作は中断されずに進行します。この手法は有効で、ループ内で副作用のある処理を先に実行することで、後続のレンダリング処理を滑らかに保つことができます。

void OnTimer()
{
  CheckAndAlertEvents();   // fire alerts and pushes first
  ReloadEvents();
  FetchAlphaVantageNews();
  FetchAIInsights();
  DrawAll();
  // … remaining drawing and scrolling …
}

この仕組みの背後にはモジュール化された設計があります。具体的には、inputsが設定の管理をおこない、ReloadEventsFetchAlphaVantageNewsがデータ取得を担当し、CheckAndAlertEventsが通知処理を担い、DrawAllとその補助関数群がチャート上の描画を管理しています。この明確な関心事の分離により、通知メカニズムの差し替えや拡張(SMS、メール、Webhookなどの追加)をおこなう場合でも、関数ひとつを変更するだけで済み、EAの他の部分には影響を与えません。このように疎結合で、かつ十分にドキュメント化された形でエキスパートアドバイザー(EA)を構築することで、長期的な保守、機能拡張、デバッグが格段に容易になります。


テスト

新しいアラート機能をテストするため、更新済みのNews Headline EAをライブチャートにロードし、「minutes before」の入力値を次回の予定イベントに合わせて設定しました。この入力パネルを使うことで、各アラートを受け取りたい正確な分数を指定できるため、まさに適切なタイミングで通知を受け取ることが可能になります。以下は私自身のハンズオンテストのスクリーンショットです。1枚目はEAの入力設定、2枚目はイベント発生数分前に表示された画面上のポップアップ、そして最後は対応するプッシュ通知がモバイル端末に届いた様子を示しています。

アラートの設定News Headline EA

News Headline EAの設定

プッシュ通知のテスト

MetaTrader 5がサポート対象のモバイルターミナルにインストールされると、各ターミナルには固有のMetaQuotes ID (MQID)が割り当てられます。このMQIDは、MQL5プラットフォームとデスクトップ版MetaTrader 5ターミナル間の通信を可能にするために重要です。モバイルターミナルでプッシュ通知を受け取るには、デスクトップターミナルにMQIDを追加し、プッシュ通知を有効化する必要があります。

この操作は、オプションダイアログを開くことで行います。オプションダイアログは、[ツール]メニューから開くか、ショートカット「Ctrl + O」を使用して呼び出すことができます。ダイアログ内の通知設定セクションで、モバイルアプリに表示される自身のMQIDを確認し、通知に使用するIDリストに入力します。下の画像を参考にしてください。 この設定は必須で、これをおこなわないとモバイル端末で通知を受け取ることができません。

さらに、モバイル端末側でもMetaTrader 5の通知を許可しておく必要があります。必要に応じて独自の通知音を設定すると、重要なアラートを見逃すことなく確実に把握できます。この種の通知は特にトレーダーにとって有用で、モバイル端末を手元に置いていれば、News Headline EAからの重要なアラームをタイムリーに受け取ることができます。

プッシュ通知の設定

プッシュ通知の設定

私のモバイルMetaTrader 5ターミナルでは、プッシュ通知が期待どおりに届きました。以下は、上記のチャート上の例に対応するアラートを示すスクリーンショットからの抜粋です。

AndroidモバイルMetaTrader 5でプッシュ通知を受信 

AndroidモバイルMetaTrader 5で受信したプッシュ通知


結論

インジケーターやEAにアラート機能を組み込むことは、トレーダーにとっての実用性を大幅に向上させるために不可欠です。本プロジェクトでは、通知システムを統合することに成功し、News Headline EAをより実践的で頼れる取引コンパニオンに進化させることができました。EAには幅広い機能があり、取引操作をおこなうだけでなく、インジケーターやスクリプトのように情報提供や可視化、または自動応答をおこなうことも可能です。

今回のEAは、取引実行ではなく、主にインサイトの提供と今後の経済イベントの表示に焦点を当てています。現実的に考えると、トレーダーが一日中チャートを監視しながらニュースやカレンダーの更新を待つことは不可能です。この点で、アラート機能の統合は、ユーザーに対して重要なイベントを能動的に通知する理想的な解決策となります。さらにプッシュ通知を追加することで、モバイル端末でもタイムリーに情報を受け取れるようになり、オンラインでEAを稼働させながら、リモートのモバイル端末と通信できる真のモビリティと柔軟性を実現しています。

当初、この更新がNews Headline EAの最終バージョンになる予定でした。しかし、この段階に到達することで、新しい可能性や改善の余地が見えてきました。たとえば、ニュースイベントに直接連動する取引ロジックの統合、ニュース主導型戦略のための取引ダッシュボードの設計など、今後の開発において魅力的な拡張の機会がまだ多数あります。出版後には新しいアイデアが生まれることも多く、機会があれば、このプロジェクトをさらに発展させたいと考えています。

今回のディスカッションから、有益な知見を提供できていれば幸いです。下記には、本記事で解説した内容をすべて反映したソースコード全文と、前回の記事で使用したPythonファイルを添付しています。 自由にカスタマイズしたり、新機能を追加したり、EAをさらに洗練させることが可能です。ご意見やフィードバックもコメント欄でお待ちしております。


重要な学び

学び説明
集中型設定ユーザーが調整可能なパラメータ(トグル、閾値、APIキーなど)をコードの先頭にまとめて配置します。これにより、設定が簡単に見つけられ、ドキュメント化や修正も容易になり、ロジックを掘り下げる必要がなくなります。
タイマー駆動型アーキテクチャミリ秒単位のタイマー(OnTimer)を用いて、データ取得、アラートチェック、キャンバス更新などの定期タスクを実行します。レスポンス性とCPU負荷のバランスを考慮した設計です。
キャンバスのダブルバッファリング描画操作をオフスクリーンのビットマップ(Canvas)におこない、その後Updateを呼び出すことでフリッカーを防ぎ、チャート上のアニメーションをスムーズに保ちます。
ノンブロッキング通知ループの早い段階でAlert()やSendNotification()を呼び出します。これらはノンブロッキングで動作するため、再描画やデータ処理を停止させることがありません。
状態を持つイベントオブジェクト各イベントオブジェクトにalertedフラグを埋め込み、どのイベントがすでに通知されたかを追跡します。これにより、外部マップを使わずに重複通知を防止できます。
モジュール化による関心事の分離EAを明確なセクション(設定、データ取得、アラートロジック、描画)に分割します。これにより、保守や将来の拡張が容易になります。
レート制限ロジック単純な時間ベースのチェック(例:「minutes before」閾値)を実装し、過剰または早すぎるアラートの発生を防ぎ、外部API呼び出しの頻度も制御します。
WebRequestとの統合MQL5のWebRequestを活用して、ニュースAPIやAIサーバーなどの外部サービスを呼び出します。ヘッダ設定、タイムアウト、レスポンス解析もEA内で処理します。
JSON解析の手法返却されたJSON文字列から必要なフィールド(タイトルやインサイトテキストなど)だけを抽出します。StringFindや部分文字列操作を使うことで、解析ロジックをシンプルかつ堅牢に保ちます。
クリーンアップとリソース管理作成したオブジェクト(キャンバス、タイマーなど)を必ず破棄し、動的メモリをOnDeinitで解放します。これによりメモリリークを防ぎ、プラットフォームの安定性を維持できます。


添付ファイル

ファイル名バージョン説明
News Headline EA.mq51.07経済指標カレンダー、Alpha Vantageニュース、チャート上インジケーターの洞察(RSI、Stoch、MACD、CCI)、AIによる解説レーンに加え、イベントアラートとオプションのプッシュ通知機能を搭載しています。
download_model.py1.00Hugging Face Hubクライアントを使用して量子化済みGGUFモデルをダウンロード・キャッシュし、ローカルファイルパスを出力するシンプルなPythonスクリプトです。
serve_insights.py1.00llama-cpp経由でGGUFモデルを読み込むFastAPIアプリケーションです。「POST /insights」エンドポイントを提供し、AIによる洞察を生成して返します。

目次に戻る

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/18750

添付されたファイル |
download_model.py (0.28 KB)
serve_insights.py (1.77 KB)
最後のコメント | ディスカッションに移動 (1)
Jason Smith
Jason Smith | 11 7月 2025 において 08:41
とても素晴らしい。ありがとう
プライスアクション分析ツールキットの開発(第31回):Python Candlestick Recognitionエンジン(I) - 手動検出 プライスアクション分析ツールキットの開発(第31回):Python Candlestick Recognitionエンジン(I) - 手動検出
ローソク足パターンはプライスアクション取引において基本的な要素であり、市場の反転や継続の可能性を示す貴重な手がかりを提供します。信頼できるツールを想像してみてください。このツールは、新しい価格バーが生成されるたびにそれを監視し、包み足、ハンマー、十字線、スターなどの主要な形成を特定し、重要な取引セットアップが検出された際に即座に通知します。これがまさに私たちが開発した機能です。このシステムは、取引初心者の方から経験豊富なプロフェッショナルまで幅広く活用できます。ローソク足パターンをリアルタイムで通知することで、取引の実行に集中し、より自信を持って効率的に取引をおこなうことが可能になります。以下では、本ツールの動作方法と、どのように取引戦略を強化できるかについて詳しく説明します。
MQL5で自己最適化エキスパートアドバイザーを構築する(第8回):複数戦略分析(2) - 加重投票方策 MQL5で自己最適化エキスパートアドバイザーを構築する(第8回):複数戦略分析(2) - 加重投票方策
本記事では、アンサンブル内で最適な戦略数を決定することがどれほど複雑な課題であるか、その解決がMetaTrader 5の遺伝的アルゴリズム最適化ツールを用いることで容易になるかを検討します。さらに、バックテストおよび最適化の高速化を目的として、MQL5クラウドも主要なリソースとして活用します。これらの議論を通じて、初期のアンサンブル結果に基づき、取引戦略を評価し、改善するための統計モデルを開発するための基盤を整えることを目的としています。
MQL5取引ツール(第4回):動的配置とトグル機能による多時間軸スキャナダッシュボードの改善 MQL5取引ツール(第4回):動的配置とトグル機能による多時間軸スキャナダッシュボードの改善
この記事では、MQL5の多時間軸スキャナーダッシュボードを、移動可能および切り替え機能付きにアップグレードします。ダッシュボードをドラッグできるようにし、画面の使用効率を高めるために最小化/最大化オプションを追加します。これらの機能強化を実装し、テストすることで、より柔軟な取引環境を実現します。
MQL5における特異スペクトル解析 MQL5における特異スペクトル解析
本記事は、特異スペクトル解析(SSA: Singular Spectrum Analysis)の概念に不慣れな方を対象に、MQL5で利用可能な組み込みツールを実際に活用できるようになるためのガイドとして作成されたものです。