English Русский Deutsch
preview
初心者からエキスパートへ:MQL5を使ったアニメーションニュース見出し(II)

初心者からエキスパートへ:MQL5を使ったアニメーションニュース見出し(II)

MetaTrader 5 |
300 0
Clemence Benjamin
Clemence Benjamin

内容


はじめに

前回の記事では、チャート上に横スクロールするバーを作成し、重要度順にニュースイベントを表示するとともに、それぞれの発表まで残り時間をカウントダウン形式で確認できる仕組みを紹介しました。記事の最後には「ライブニュースフィード用のプレースホルダー」を設置して終えましたが、今回はその機能を実際に動かしていきます。

新しいフィードプレースホルダー付きのNews headline EA

News Headline EAの最初のバージョン(API統合なし、MQL5経済指標カレンダーイベントのみ)

今回の焦点は、外部APIを通じてニュース見出しを統合し、MetaTrader 5プラットフォーム上でニュースにアクセスしやすくするという課題を解決することです。ここで扱うのは見出し、つまり簡潔なニュースタイトルです。これによりトレーダーは金融市場の動きを素早く把握し、必要に応じてブラウザやターミナル内の[ニュース]タブから詳細にアクセスするかどうかを判断できます。

本記事の重要なポイントは、以下の通りです。

  • 金融市場のさまざまなニュースソースを探索する
  • 外部ニュースAPIへのアクセス方法を学ぶ
  • ニュースデータをMQL5で扱いやすい形に構文解析(パース)する
  • WebRequest()関数を使いこなす
  • 外部APIをMQL5ツールにシームレスに統合する

この統合を支援するために、利用可能なニュースAPIを調査し、便利な一覧をまとめました。多くのサービスは無料プランを提供しており、利用制限はあるものの学習やテストには十分活用できます。以下は特におすすめの5サービスですが、他にも多数存在します。

プロバイダレート制限特徴データ範囲
NewsAPI.org500リクエスト/日キーワード・日付・発行元・言語による検索、ブール演算子、多言語対応(14言語)世界の一般ニュース(55か国・15万以上のソース)
Marketaux最大5件/リクエストエンティティ抽出(銘柄/企業)、エンティティごとのセンチメントスコア、AIによる金融ニュース分析企業指標付き金融ニュース 
Alpha Vantage500リクエスト/日、5リクエスト/分60以上の経済指標(GDP、インフレなど)、テクニカル/ファンダメンタルデータ、市場センチメント分析株式、FX、暗号資産、ETF 
Finnhub60リクエスト/分リアルタイムWebSocket配信、経済指標カレンダー、決算情報、AIセンチメント分析市場ニュース、経済指標、企業開示 
EODHD20リクエスト/日(無料プラン)日次センチメントスコア(-1~1)、50以上のトピックタグ(決算、IPOなど)、銘柄フィルタ付き全文記事株式、ETF、FX、暗号資産ニュース 

今回のプロジェクトではAlpha Vantageを使用します。このサービスは包括的な金融データとシンプルなアクセス方法で知られ、ドキュメントも整備されており、無料プランでも十分に実用的です。そのため、リアルタイムの見出しをEAに統合するには最適な選択肢と言えるでしょう。

次のセクションでは、APIキーの取得、WebRequestの実行、JSONレスポンスのパース、そしてニュースデータをチャート上に表示するまでのステップを整理します。その後、実際の実装へと進み、この機能を形にしていきます。


概要

ここからの内容をスムーズに理解いただくために、本プロジェクトで頻繁に登場する重要な用語を整理しておきましょう。
  • API (Application Programming Interface):ソフトウェア同士がやり取りするためのルールや仕組み。今回のケースでは、MetaTrader 5がAlpha Vantageなどの外部データソースから情報を取得するために利用します。
  • APIドキュメント:API提供元が公開している公式ガイド。利用可能なエンドポイント、リクエスト形式、パラメータ、レスポンスの構造などが記載されています。
  • APIキー:API提供元から発行される固有の識別子。利用制限の管理やセキュアな通信の確保に使われます。
  • JSON (JavaScript Object Notation):軽量なデータ交換フォーマット。人間にとって読みやすく書きやすい一方で、機械にとってもパースや生成が容易です。特にWeb APIで、サーバーとアプリケーション間のデータ通信に広く利用されています。
  • パース:JSONのような構造化データをパースし、有用な情報を抽出する処理のことです。
  • WebRequest:MQL5で利用できる関数。HTTPリクエストをターミナルから外部サーバーに送信するために使用します。
  • 統合:APIから取得したデータをエキスパートアドバイザー(EA)に組み込み、チャート上でシームレスに動作させることを指します。

基盤となるコード(News Headline EA)はすでに用意済みなので、最初のステップはAlpha VantageからAPIキーを取得することです。公式サイトにアクセスし、無料アカウントを作成してください。氏名、メールアドレス、利用目的などの基本情報を入力すると、フォーム送信後すぐにAPIキーが発行されます。

続いて、Alpha Vantageが提供するAPIドキュメントを確認します。ここでリクエスト形式、利用可能なニュースエンドポイント、返却されるJSONデータの構造を理解することができます。この知識をもとに、EA側でデータをどのようにパースし、統合するかの設計を進めていきます。

Alpha VantageのJSONコード構造

今回のプロジェクト用APIキーはすでに取得済みで、Alpha Vantageは非常に幅広い機能を提供しています。ただし本記事では、金融ニュースに絞って扱っていきます。

APIからのJSON応答を表示するには、こちらのリンクを使用できます。

Alpha Vantage APIから返されるJSON応答をパースするロジックを実装する前に、各ニュース項目にはtitlesummaryurltime_publishedといった複数のフィールドが含まれていることを理解しておく必要があります。しかし、本EAの初期設計段階では、シンプルさと視覚的な明瞭さを優先し、titleフィールドの抽出に注力します。titleは簡潔でハイレベルな説明を提供するもので、ニュース内容のスナップショットを把握するのに最適です。これは、EAの目的である「素早く・ノイズの少ないスクロールティッカー表示」と合致しています。titleだけにフォーカスすることで、長文テキストのパースによるオーバーヘッドを避けつつ、チャート上でクリーンかつコンパクトな表示を維持できます。その結果、トレーダーは余計な情報に煩わされることなく、市場動向を効率的に把握できるようになります。 以下に、実際に返却されるデータ構造を理解するためのJSONコード例を示します。

 {
    "items": "50",
    "sentiment_score_definition": "x <= -0.35: Bearish; -0.35 < x <= -0.15: Somewhat-Bearish; -0.15 < x < 0.15: Neutral; 0.15 <= x < 0.35: 
	Somewhat_Bullish; x >= 0.35: Bullish",
    "relevance_score_definition": "0 < x <= 1, with a higher score indicating higher relevance.",
    "feed": [
        {
            "title": "How To Trade Tesla Today Using Technical Analysis - Tesla  ( NASDAQ:TSLA ) ",
            "url": "https://www.benzinga.com/markets/equities/25/06/45857951/how-to-trade-tesla-today-using-technical-analysis",
            "time_published": "20250610T121929",
            "authors": [
                "RIPS"
            ],
            "summary": "Good Morning Traders! In today's Market Clubhouse Morning Memo, we will discuss SPY, QQQ, AAPL, MSFT, NVDA, GOOGL, META, and TSLA. 
	Our proprietary formula, exclusive to Market Clubhouse, dictates these price levels. This dynamic equation takes into account price, volume, and options flow.",
            "banner_image": "https://cdnwp-s3.benzinga.com/wp-content/uploads/2024/10/22181427/Paolo-and-Gali.jpg?optimize=medium&dpr=2&auto=webp&width=230",
            "source": "Benzinga",
            "category_within_source": "Trading",
            "source_domain": "www.benzinga.com",
            "topics": [
                {
                    "topic": "Technology",
                    "relevance_score": "0.5"
                },
                {
                    "topic": "Financial Markets",
                    "relevance_score": "0.5855"
                },
                {
                    "topic": "Manufacturing",
                    "relevance_score": "0.5"
                }
            ],
            "overall_sentiment_score": 0.216021,
            "overall_sentiment_label": "Somewhat-Bullish",
            "ticker_sentiment": [
                {
                    "ticker": "MSFT",
                    "relevance_score": "0.101012",
                    "ticker_sentiment_score": "0.303818",
                    "ticker_sentiment_label": "Somewhat-Bullish"
                },
                {
                    "ticker": "GOOG",
                    "relevance_score": "0.033751",
                    "ticker_sentiment_score": "0.075535",
                    "ticker_sentiment_label": "Neutral"
                },
                {
                    "ticker": "NVDA",
                    "relevance_score": "0.101012",
                    "ticker_sentiment_score": "0.346995",
                    "ticker_sentiment_label": "Somewhat-Bullish"
                },
                {
                    "ticker": "AAPL",
                    "relevance_score": "0.134402",
                    "ticker_sentiment_score": "0.077776",
                    "ticker_sentiment_label": "Neutral"
                },
                {
                    "ticker": "TSLA",
                    "relevance_score": "0.134402",
                    "ticker_sentiment_score": "0.111086",
                    "ticker_sentiment_label": "Neutral"
                }
            ]
        },

計画中のEAは、取引日ごとに一度ニュース見出しを取得し、canvasオブジェクトを使って連続スクロールするティッカーバーとして表示します。titleフィールドは生のJSON文字列から直接パースし、MQL5において効率の悪いフルJSONデシリアライゼーションを回避します。これによりEAは軽量かつ安定したリアルタイム更新処理を実現できます。ニュースタイトルはもともと短く視認性が高いため、素早くスキャンするのに適しています。将来的にはsummaryやurlといった追加フィールドもパースして、詳細表示やツールチップ機能に活用することが可能です。しかし現時点ではtitleのみを使うことで、既存のビジュアル構造とパフォーマンス要件にそのまま適合する、低レイテンシーなソリューションを提供できます。

今後のセクションでは、APIへのアクセス、データ処理、そしてMetaTrader 5のチャート上にNews Headline EAを用いて表示するまでの各ステップを順を追って解説していきます。



外部ニュースAPIとNews Headline EAの統合

このセクションでは、外部ニュースAPIをNews Headline EAに統合し、チャート上でスムーズかつリアルタイムに見出しをティッカー形式で流す方法を解説します。これにより、トレーダーはプラットフォームを切り替えることなく、市場心理を動かす最新の見出しをチャート上で直接確認でき、EAの価値を大きく高められます。ここでは各処理がどのように動作し、なぜその設計になっているのかを具体的に示していきます。

手順1:ユーザー設定用APIキー入力フィールドの追加

input string InpAlphaVantageKey = "";  // your Alpha Vantage API key

ここではユーザーがEA設定パネルに自分のAlpha Vantage APIキーを貼り付けられるよう、ユーザー設定可能な入力パラメータInpAlphaVantageKeyを定義します。有効なキーがなければニュースデータは取得できません。Alpha Vantageは無料のAPIキーを発行しており(通常500リクエスト/日)、この入力フィールドにより認証情報をハードコーディングせずに運用できます。さらに、この値が空の場合はニュース取得処理を問題なくスキップする設計にしておき、ユーザーがキー入力を忘れた場合でもEAが不安定にならないようにします。

手順2:見出し保存と制御ロジック用の状態変数宣言

string   newsHeadlines[];     // holds the extracted headline titles
int      totalNews = 0;       // keeps track of how many headlines we’ve stored
datetime lastNewsReload = 0;  // helps ensure we fetch news only once per day

これらの変数がニュース管理システムの中核になります。

  • newsHeadlines[]は動的な文字列配列で、APIレスポンスからパースしたタイトルを格納します。各要素が1件の見出しを表します。
  • totalNewsは格納済み見出し数をカウントする整数で、描画時に正しい件数を扱うために使用します。
  • lastNewsReloadは1日1回の更新ポリシーを強制するために使用されます。Alpha Vantageは過剰利用をペナルティ対象とする可能性があるため、この変数によって特別な処理をしない限り、ニュース見出しの取得は1日に1度だけおこなわれます。また、同じ取引セッション中に不要なネットワークリクエストを繰り返すことも防ぎます。

手順3:WebRequestを使ってAlpha Vantageからニュースを取得する

void FetchAlphaVantageNews()
{
  if(StringLen(InpAlphaVantageKey) == 0) return;

まずユーザーがAPIキーを入力しているかどうかを確認します。もし空であれば、その時点で関数は即座に終了します。このチェックにより、不必要なネットワーク通信を防ぎ、システムが適切に設定されるまで安定して静かに動作することを保証します。また、誤ったリクエストによって無効な結果が返されたり、APIサーバーのレート制限エラーを引き起こしたりするのを回避できます。

次に、当日の取引日が開始した時点(サーバー時間の午前0時)を表す正規化されたdatetime値を構築します。これをlastNewsReloadと比較することで、その日のニュースをすでに取得済みかどうかを判断できます。生のタイムスタンプではなくこの方法を使うことで、EAのティック頻度に関わらず、新しい日ごとにニュースが一度だけ取得されるようになります。このアプローチにより、APIの利用は効率的かつ予測可能なものとなります。

MqlDateTime tm; TimeToStruct(TimeTradeServer(), tm);
tm.hour = tm.min = tm.sec = 0;
datetime today = StructToTime(tm);

if(lastNewsReload == today) return;
lastNewsReload = today;

ユーザーのAPIキーをベースエンドポイントに付加することで、APIリクエストURLを動的に構築します。このURLをWebRequestに渡して使用します。NEWS_SENTIMENT関数は、複数の信頼性の高いニュースソースからJSON形式のメタデータとセンチメント情報を含む見出しを返すよう設計されています。ランタイムでこの文字列を生成することで、EAをモジュール化し、特定のAPIキーに依存しない柔軟な実装が可能になります。

  string url = "https://www.alphavantage.co/query?function=NEWS_SENTIMENT&apikey=" + InpAlphaVantageKey;

このセクションでは、WebRequest関数に必要なパラメータを初期化します。

char post[];
char response_data[];
string headers;
int timeout = 5000;
ResetLastError();

  • post[]は空のままにしてあります。これはGETリクエストをおこなうため、ボディコンテンツを送信しないためです。
  • response_data[]は、サーバーから返却される生のバイトレスポンスを格納するための配列です。
  • headersは空文字列のままです。このエンドポイントではAlpha Vantage APIがカスタムHTTPヘッダを必要としないためです。
  • timeoutは5000ミリ秒に設定しており、接続が遅い場合でも長時間待機してフリーズすることを防ぎます。
  • ResetLastError()は、前回のエラーコードをクリアするために使用します。これにより、次に検出される失敗が今回のリクエスト由来であることを確実にできます。

int result = WebRequest("GET", url, headers, timeout, post, response_data, headers);
if(result != 200)
{
  Print("WebRequest failed with result: ", result, ", error: ", GetLastError());
  return;
}

このブロックでは、実際のHTTPリクエストを実行します。WebRequestはHTTPステータスコードを返します(例:200は成功、403はアクセス禁止など)。もし返り値が200でなければ、リクエストは失敗またはブロックされたことを意味するため、エラーコードとともに診断メッセージを出力し、処理を早期に終了します。これにより、EAをクラッシュさせたりデータを破損させたりすることなく、接続や認証の問題を特定できます。

リクエストが成功したことを確認した後、バイト配列response_data[]を人間が読める文字列(resultStr)に変換します。この文字列には、Alpha Vantageから返されたJSONレスポンス全体が含まれます。見出しの抽出を開始する前に、newsHeadlines[]配列をクリアして古いデータを破棄し、新しい日の見出しを格納できるようにします。

string resultStr = CharArrayToString(response_data, 0, WHOLE_ARRAY);
ArrayResize(newsHeadlines, 0);

次にパースロジックを準備します。変数posはJSON文字列内を走査するポインタとして使用します。配列keys[]には、レスポンスJSON内で各見出しタイトルの前に現れるキーの一般的な2つのバリエーションを格納しています。空白あり/なしの両方を含めることで、APIレスポンスの微細なフォーマット変更に対しても頑健に対応できます。

  int pos = 0;
  const string keys[2] = { "\"title\": \"", "\"title\":\"" };

このループは、JSON文字列を順に走査し、各ニュースタイトルを見つけて抽出します。

  while(true)
  {
    int start = -1;
    for(int k=0;k<ArraySize(keys);k++)
    {
      start = StringFind(resultStr, keys[k], pos);
      if(start >= 0)
      {
        start += StringLen(keys[k]);
        break;
      }
    }
    if(start < 0) break;

    int end = StringFind(resultStr, "\"", start);
    if(end < 0) break;

    string title = StringSubstr(resultStr, start, end - start);
    title = Trim(title);

この処理では以下の手順を実行します。

  • 次のtitleキーを探す
  • 実際のテキストコンテンツの開始位置にstartを調整する
  • 引用符で囲まれたタイトル文字列の終了位置を見つける
  • Trim()でタイトルを抽出し、前後の余白を削除して整形する

この単純なパターンマッチング方式により、フルJSONパーサーを使用する必要がなく、限定的かつ特定用途のケースでは十分に効率的です。

タイトルを見つけるたびに、newsHeadlines[]配列を動的に拡張し、新しいタイトルを追加します。すべてのタイトルを処理し終えたら、totalNewsを更新して取得済み件数を反映させます。これにより、後で見出しを描画する際に正確な件数を扱うことができます。

    int idx = ArraySize(newsHeadlines);
    ArrayResize(newsHeadlines, idx + 1);
    newsHeadlines[idx] = title;
  }

  totalNews = ArraySize(newsHeadlines);

手順4:チャート上にスクロールするニュースティッカーを描画する

ここでは、取得したすべての見出しを結合して、1つのスクロール文字列として視覚的なティッカーを構築します。

  • エントリ間には可読性を高めるために|区切りを挿入します。
  • 見出しが存在しない場合は、ティッカーを維持するためにプレースホルダメッセージを表示します。
  • TextOut()を使用して、キャンバス上の指定したoffNewsオフセット位置に文字列を描画し、スクロール効果を作り出します。
  • offNews -= InpNewsSpeed;の行により、時間経過とともにテキストが左方向に移動し、連続的なスクロールを実現します。文字列が画面外に完全に出た場合は、メインの描画ループ内で位置をリセットします。

string ticker = "";
for(int i=0;i<totalNews;i++)
{
  ticker += newsHeadlines[i];
  if(i < totalNews - 1) ticker += "   |   ";
}
if(totalNews == 0) ticker = placeholder;

newsCanvas.TextOut(offNews, yOff, ticker, XRGB(255,255,255), ALIGN_LEFT);
offNews -= InpNewsSpeed;

手順5:タイマーによるニュース取得のスケジューリング

FetchAlphaVantageNews()の呼び出しをOnTimer()関数内に配置し、定期的に実行されるようにします。内部の日付ロジックにより、APIへのアクセスは1日1回に制限されます。この設計により、チャートを再読み込みしたりユーザー操作を行ったりすることなく、EAが自動で自身を更新できるようになります。また、DrawAll()もここで呼び出し、各タイマーティックごとにキャンバスを更新することで、ティッカーが画面上で滑らかにスクロールすることを保証します。

void OnTimer()
{
  //...for the other code
  FetchAlphaVantageNews();  // only updates once daily
  //...for the rest of the code
  DrawAll();  // redraws canvas each timer tick
}

手順6:EA削除時のクリーンアップ

OnDeinit()関数内にクリーンアップ処理を組み込み、newsHeadlines配列をクリアします。これにより、EAがアンロードされた後にメモリが残らず、リソースリークを防ぎ、次回EAをロードした際にクリーンな状態から再スタートできるようになります。

void OnDeinit(const int reason)
{
  //...our preivous code here
  ArrayResize(newsHeadlines,0);  // clear stored headlines
}

これで、外部API (Alpha Vantage)を統合し、内蔵のMQL5経済指標カレンダーも活用した強化版News Headline EAが完成しました。これらの機能により、リアルタイムのニュースや経済イベントをチャート上に直接表示でき、トレーダーはプラットフォームを離れることなく重要情報に即座にアクセスできるようになります。

記事の最後には、ここまでで説明したすべてを含むソースコード全文を添付します。次のステップでは、新機能を徹底的にテストして、設計通りに動作することを確認します。テスト結果に基づき、最終評価を行い、今後のアップデート計画についても概説します。


テスト

MetaTrader 5ターミナルで、WebRequestアクセスが有効になっていること、およびAlpha VantageのサーバーURLが許可URLリストに追加されていることを確認してください。これらの設定は、メニューの[ツール]>[オプション]>[エキスパートアドバイザ]からアクセスするか、キーボードのCtrl + Oで開くことができます。以下の画像を参照してください。

WebRequestオプションを許可する

WebRequestを許可し、Alpha Vantageリンクを追加する

コンパイル済みのEAは、ナビゲータウィンドウのExpert Advisorsセクション(ショートカット:Ctrl + N)からアクセスできます。チャートに適用するには、EAを右クリックして[チャートに添付]を選択するか、目的のチャートにドラッグ&ドロップしてください。下の画像を参照して、視覚的に確認してください。

ターミナルでコンパイル済みファイルにアクセスする

ニュース見出しにアクセスする

今回の統合により、入力設定が強化され、新機能が追加されました。特に注目すべきは、外部APIを通じてリアルタイムのニュース見出しを取得できるようになったことです。チャート上でニューススクロール機能を有効にするには、Alpha VantageからAPIキーを取得し、適切な入力フィールドに入力する必要があります。下の画像では、入力設定画面の現在の表示例を見ることができます。APIキーが未入力の場合、EAはリアルタイムの見出しの代わりにプレースホルダテキストをニュース欄に表示します。

入力設定(News Headline EA)

入力設定(News Headline EA)

下の図は、EAをチャートに適用した後の動作例です。6月11日のすべての経済イベントがスムーズにスクロールし、同時に世界市場のニュース見出しも表示されています。詳細は画像をご覧ください。

News Headline EAをチャートに添付

News Headline EAをチャートに添付

また、6月11日にターミナル上で表示されたイベントをクリアにキャプチャできました。これにより、News Headline EAがチャート上で重要情報を直接確認できることがよくわかります。トレーダーはチャート分析を中断することなく最新情報を把握できます。さらに、このEAは効率的なピクセル管理を考慮して設計されており、ニュースやイベントを統合してもチャート全体が縮小されたり視認性が損なわれたりすることがありません。下のアニメーションでは、News Headline EAが経済イベントと市場ニュースをどのように効率的に表示するかが示されています。

1行でニュースへのアクセスを簡略化するNews Headline EAの利点

News Headline EAは、チャートを明確で見やすい状態に保ちながら、イベントとニュースをクリーンかつ非侵襲的に表示する

私たちはさまざまなスクロール速度を試し、その結果に大きな感動を覚えました。これにより、チャート上で滑らかかつリソース効率の高い視覚化を直接作成できる可能性が示されました。この実験は、MQL5ライブラリの強力さと使いやすさも体感できる機会となりました。特に注目すべきはCCanvasクラスの使用で、ニュースとイベントのレーンに半透明の背景を描画しつつ、下のチャートグリッドを見える状態に保つことができました。これにより、ユーザーはチャート全体の視認性を損なうことなく情報を把握できます。

現在の実装では、表示要素とのインタラクティブ性はありませんが、将来的な拡張の可能性を示しています。下の例では、高速スクロール設定を使用した場合、テキストが高速移動によりややブレますが、性能と視覚的ポテンシャルを十分に示しています。

カレンダーイベントとニュースの高速スクロール設定

ニュースとカレンダーイベントの高速スクロール設定



結論

CCanvasクラスの実装が成功したことには、心から興奮しています。これは私たちが直面していた明確な課題を効果的に解決するものでした。今回、ニュースや経済イベントに直接チャート上からアクセスする代替手段を開発することに成功しました。MetaTrader 5自体もこれらの更新情報にアクセス可能ですが、トレード中にその情報を視認・利用するのはやや手間がかかります。スクロール見出しによる表示を簡略化することで、よりユーザーフレンドリーで視覚的に統合されたソリューションを提供できました。

もちろん、現行バージョンにはいくつかの制限があります。見出しニュースは簡潔なタイトルに限定されており、ネイティブターミナル版のようにクリックして全文記事を読むことはできません。しかし、経済指標カレンダーイベントに関しては非常に有効で、トレーダーは作業中でも最新情報を把握できます。見出しについては、関心のあるトピックを素早く把握できることが利点であり、その後ターミナル外で詳細を確認することも可能です。一般的に、人は興味を引かれたニュース見出しだけを読むことが多いため、チャート上でスクロールさせることで、日常のトレードを中断せずに重要なグローバル金融ニュースを見逃すことがありません。

特筆すべき利点の一つは、すべての情報をチャート上に重ねて非侵襲的に表示できる点で、チャートの視認性を犠牲にすることなく、情報に基づいた取引判断を可能にします。

今後の改善点としては、各見出しに日付ラベルを付与すること、異なるチャートスケールに応じて動的にサイズを調整すること、予定されたイベント前にトレーダーに通知するアラートシステムの導入などが考えられます。私は、このプロジェクトの第3フェーズで、トレーダーのニーズに合わせた新しい情報レーンを追加することを楽しみにしています。

最終的に、このプロジェクトのより大きな目的の一つは、MQL5プログラミングをより身近で学びやすいものにすることです。特に初心者に向けて、各開発フェーズの最後に使用した主要なプログラミング概念のまとめを提供する予定であり、本連載の今後の章でもこの取り組みを継続していきます。



重要な学び

以下は、本ディスカッションで示された主要なプログラミング概念のまとめ表です。
コンセプト詳細
オブジェクト指向設計カレンダーイベントを専用クラスにカプセル化し、時間、銘柄、名称、重要度のプロパティを持たせることで、モジュール性と可読性を向上
動的メモリと配列可変長配列や動的割り当てを使用して、重要度別(高・中・低)のイベントオブジェクトを別コレクションで管理
イベント駆動型アーキテクチャEAの起動時、タイマーティックごと、終了時に動作する初期化、定期更新、クリーンアップのライフサイクル関数
API統合外部ニュースサービスへのHTTPリクエスト接続、レスポンスとエラー処理、返却データから見出しテキストを抽出
グラフィックプログラミングキャンバスオブジェクトを用いた透明オーバーレイ上へのテキストと図形描画により、イベントと見出しの滑らかなスクロールレーンを作成
日時ロジックサーバー時間を日付境界に変換し、当日の将来イベントのみ読み込み、ニュース取得を1日1回に制限
モジュール関数設計位置計算、データ読み込み、レーン描画、テキスト整形などのタスクを専用ヘルパー関数に分離し、コードを整理、保守しやすくする
リソースのクリーンアップEA削除時に視覚オブジェクトや動的に生成したイベントオブジェクトを適切に破棄し、メモリリークを防止
ユーザー入力処理スクロール速度、表示切替、タイマー間隔、オフセット設定、APIキー入力などのパラメータを公開し、ユーザーによるカスタマイズを可能にする
効率的な再描画技術必要なキャンバス部分だけを消去・更新し、チャートサイズ変更に対応することで再描画負荷を最小化
MQL5経済指標カレンダーカレンダーイベントの取得、日付によるフィルタリング、重要度による分類、時間順のソートにより、優先度順のイベントリストを表示

参考として、ニュースの優先度を示す3色の矩形の意味を示した図もあります。色が主要な指標として用いられていますが、円形などの形状でも表示可能です。

イベントの重要度ラベル



添付ファイル

以下にEAのソースコードを添付しています。コンパイルしてテストを行い、コメント欄でフィードバックや拡張アイデアを共有してください。次回の記事もぜひご期待ください。
ファイル名バージョン詳細
News Headline EA.mq51.03内蔵のMQL5キャンバスとAlpha Vantage APIを活用して、チャート上に経済指標カレンダーのイベントとリアルタイムの市場ニュース見出しを直接表示するEA

目次に戻る

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

添付されたファイル |
データサイエンスとML(第43回):潜在ガウス混合モデル(LGMM)を用いた指標データにおける隠れパターン検出 データサイエンスとML(第43回):潜在ガウス混合モデル(LGMM)を用いた指標データにおける隠れパターン検出
チャートを見ていて、奇妙な感覚を覚えたことはありませんか。表面のすぐ下にパターンが隠されている気がして、もし解読できれば価格がどこに向かうか分かるかもしれない、そんな秘密のコードが存在するかもしれないという感覚です。ここで紹介するのがLGMM、マーケットの隠れたパターンを検出するモデルです。これは機械学習モデルで、隠れた市場のパターンを識別する手助けをします。
ログレコードをマスターする(第8回):自己翻訳するエラーレコード ログレコードをマスターする(第8回):自己翻訳するエラーレコード
「ログレコードをマスターする」第8回では、MQL5向けの強力なログライブラリであるLogifyにおける多言語エラーメッセージの実装について探っていきます。本記事では、コンテキストを含めたエラー構造の作り方、メッセージを複数言語に翻訳する方法、そして重大度レベルに応じたログの動的フォーマット方法について学びます。これらはすべて、クリーンで拡張可能であり、本番環境でも利用可能な設計にします。
プライスアクション分析ツールキットの開発(第28回):Opening Range Breakout Tool プライスアクション分析ツールキットの開発(第28回):Opening Range Breakout Tool
各取引セッションの始まりでは、市場の方向性の偏りは、価格が初期価格幅(オープニングレンジ)を突破して初めて明確になります。本記事では、MQL5エキスパートアドバイザー(EA)を構築し、セッション開始直後の初期価格幅のブレイクアウトを自動的に検出して分析し、タイムリーでデータ駆動型のシグナルを提供して自信ある日中エントリーを可能にする方法を探ります。
知っておくべきMQL5ウィザードのテクニック(第71回):MACDとOBVのパターンの使用 知っておくべきMQL5ウィザードのテクニック(第71回):MACDとOBVのパターンの使用
移動平均収束拡散法(MACD)オシレーターとオンバランスボリューム(OBV)オシレーターは、MQL5のエキスパートアドバイザー(EA)内で併用できるもう一つの指標ペアです。本連載における慣例どおり、この組み合わせも補完関係にあり、MACDがトレンドを確認し、OBVが出来高を検証します。MQL5ウィザードを用いて、この2つが持つ潜在力を構築、検証します。