English Русский
preview
MQL5入門(第26回):MQL5のAPIとWebRequest関数の習得

MQL5入門(第26回):MQL5のAPIとWebRequest関数の習得

MetaTrader 5トレーディング |
18 0
Israel Pelumi Abioye
Israel Pelumi Abioye

はじめに

連載「MQL5入門」の第27回へようこそ。MetaTrader 5が他のプラットフォームとどのように連携できるか疑問に思ったことはありますか。もしあるなら、この記事は必読です。

本記事では、APIの仕組みと、WebRequest関数を通じてMetaTrader 5が外部サーバーと通信する方法に焦点を当てます。学習をより実践的にするため、MetaTrader 5をTelegramと統合する小さなプロジェクトを進めます。このプロジェクトを通じて、MetaTrader 5からTelegram APIを使ってメッセージの送信、編集、削除をおこなう方法を学びます。

この記事の目的は、MQL5におけるWebRequest通信とAPIの基本的な考え方を紹介することです。次回以降の記事では、さらに複雑なAPIの使用例や、WebRequest関数の実務での応用例を詳しく解説していきます。

図1:Telegram API


アプリケーションプログラミングインターフェース(API)

APIとは、複数のソフトウェア間で通信を可能にする仕組みです。システム間に架かる橋に例えることができます。取引の分野では、APIによりMetaTrader 5のような取引プラットフォームが、ウェブサイトやメールサーバー、Telegramのような外部サービスと通信しデータを受け取ることが可能になります。

Telegram APIは、MetaTrader 5がTelegramのサーバーと接続する際に使用されます。MetaTrader 5からのリクエストを処理した後、APIはそれを適切なグループに転送します。これにより、2つのシステムが互いに理解し合い、その結果、この通信は迅速かつスムーズに実行されます。

HTTPはウェブブラウザが利用するプロトコルと同じもので、APIが使用する主要な通信プロトコルのひとつです。 WebRequest()は、取引プラットフォームと外部サーバーの間を仲介するMQL5の関数であり、この接続を管理します。APIをより理解するために、「アプリケーション」「プログラミング」「インターフェース」という3つの要素に分けて考えます。

アプリケーション

特定の機能を実行するソフトウェアプログラムはすべてアプリケーションと呼ばれます。ウェブサイト、Telegramのようなモバイルアプリ、あるいはMetaTrader 5も含まれます。それぞれのプログラムは内部データと機能を独自に管理しています。

プログラミング

プログラミングでは、システム同士が通信できるようにコードを書きます。APIは、アプリケーションの内部構造を完全に理解していなくても、その機能を利用できる仕組みを開発者に提供します。

インターフェース

インターフェースとは、2つのシステムが相互に通信するための接点です。どの情報を共有できるか、どのように通信できるかを規定します。たとえば、動画が保存されていない場合でも、コンピュータで検索して再生することができます。[再生]をクリックすると、YouTubeはサーバーに接続してリクエストをサーバーに送信し、  動画の再生を開始します。同様に、MetaTrader 5はAPIを通じて外部プラットフォームに接続することで、メッセージを送受信できます。

アプリケーションプログラミングインターフェースとは、定義されたプログラミング指示を用いてアプリケーション間の通信を可能にするシステムです。これは取引プラットフォームと、メールやTelegramのような他のプラットフォームをつなぐ橋として機能し、自動化を可能にします。

比喩的な説明

ニコライという少年を想像してください。彼には多くの才能がありますが、すべてを一人でおこなうことはできません。たとえば歌うことでは助けが必要かもしれません。すべての能力を身につける代わりに、ニコライには「API」という見えない仲間がいます。「API、友達のイワンにこの歌を歌ってもらって」とか「API、アナスタシアに夕食の手伝いを頼んで」といった具合に、ニコライは自分ができないことを依頼するとき、この見えない仲間に話しかけます。APIは迅速にイワンやアナスタシアに接続し、リクエストを送信して結果を返します。

ニコライはイワンがどう歌うかを知る必要はありません。知っておくべきなのは何を頼むか、そしてAPIをどう使うかだけです。これがデジタル世界におけるAPIの仕組みです。

この例でニコライは、MetaTrader 5のような主要なアプリケーションを象徴しています。MetaTrader 5をメールやTelegramなど他のプラットフォームに接続する橋が「見えない仲間(API)」です。MetaTrader 5はTelegramの内部システムがどのように動作しているかを理解する必要はありません。WebRequest関数を使ってリクエストを送るだけで、Telegramがそれを受信します。

 

WebRequest関数

APIとは何か、MetaTrader 5がどのようにAPIを通じて外部プラットフォームと通信できるかを理解したところで、次にMQL5の最も重要なツールのひとつであるWebRequest関数を見てみましょう。 簡単に言えば、WebRequest()は外部のウェブサーバーとMetaTrader 5ターミナルの間をつなぐ導管の役割を果たします。EAとインターネット間でデータを送受信できる関数であり、カスタムAPIと通信したり、ウェブサービスからデータを取得したりする場合に役立ちます。

想像してみてください。サーバーは通りの向かいのオフィスで、MetaTrader 5はそのオフィスに座るトレーダーです。メッセージはWebRequest関数を介して2つのオフィス間でやり取りされます。たとえばGETやPOSTを使用すると、どのメッセージを送るか、どこに届けるか、どのように届けるかを宅配係に指示できます。

WebRequest関数は、外部サーバーと通信することでウェブから情報を取得するために使用され、さまざまな方法で利用できます。WebRequest関数の使用方法には2つのバージョンがあります。

最初のバージョンは次の通りです。

int  WebRequest( 
   const string      method,           // HTTP method  
   const string      url,              // URL 
   const string      cookie,           // cookie 
   const string      referer,          // referer 
   int               timeout,          // timeout 
   const char        &data[],          // the array of the HTTP message body 
   int               data_size,        // data[] array size in bytes 
   char              &result[],        // an array containing server response data 
   string            &result_headers   // headers of server response 
   );

2番目のバージョンは次の通りです。

int  WebRequest( 
   const string      method,           // HTTP method 
   const string      url,              // URL 
   const string      headers,          // headers  
   int               timeout,          // timeout 
   const char        &data[],          // the array of the HTTP message body 
   char              &result[],        // an array containing server response data 
   string            &result_headers   // headers of server response 
   );

最も一般的に使われる2番目のバージョンは柔軟性に優れており、特にTelegramのような最新のAPIを利用する場合に適しています。これは単純な「key=value」形式の通信だけでなく、APIの要件に応じたカスタムヘッダを定義できるため、リクエスト管理に最適です。 Telegram APIを使用してメッセージの送信、編集、削除をおこなうために必要な柔軟性を提供することから、このWebRequest関数の2番目のバージョンが本記事の主な対象となります。このバージョンを理解することで、Telegramへの最初のメッセージ送信からリアルタイムの更新確認まで、外部サーバーとの通信のあらゆる側面を管理できるようになります。

WebRequest関数は特に扱いやすく設計されています。MQL5が開発者向けに多くの処理を簡略化しており、通信中にバックグラウンドで何がおこなわれているかを気にする必要はありません。最も重要なのは、まず関数の各パラメータの働きを理解することです。各パラメータは、リクエストの送信方法やレスポンスの受信方法に直接関わるため、どれも重要です。

メソッド

HTTPメソッドはWebRequest()の最初のパラメータであり、リモートサーバーに対しておこないたいアクションを伝える役割を持ちます。MQL5ではGETまたはPOSTを使用することで、データの保存場所やリクエストの扱い方に影響を与えるため、適切な選択をおこなうことが重要です。

GET

読み取り専用のデータを要求する際に使用します。

POST

MQL5では、サーバーの設定によって、データ送信に加えて、データの作成、削除、変更をおこなうこともできます。

URL

URLは、MQL5にリクエストをどこに送信するかを指示するウェブアドレスです。

const  string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";
const  string url = telegram_api_url + "/bot" + bot_token + "/editMessageText";
const  string url = telegram_api_url + "/bot" + bot_token + "/deleteMessage";

これらのURLはそれぞれTelegramサーバー上で特定のタスクをおこないます。WebRequest関数は指定されたURLにデータを送信し、Telegram APIは選択されたエンドポイントに従って処理をおこないます。たとえば、sendMessageエンドポイントを使用すると、チャットに新しいメッセージを作成するようTelegramに指示できます。editMessageTextを使用すると既存のメッセージを変更するよう指示し、deleteMessageを使用するとメッセージを削除するよう指示することになります。

telegram_api_url

は、Telegram APIの基本URLを保持する変数です。

const string telegram_api_url = "https://api.telegram.org";

すべてのTelegramボットリクエストはこの基本URLに転送されます。これはすべてのTelegramボットが動作する「基点」と考えることができます。メッセージの送信、編集、削除など、すべての操作はこの基本アドレスから始まります。

/bot

この部分により、Telegramはあなたがボットに接続しようとしていることを認識します。このキーワードにより、後続の操作はTelegramボットシステムによって処理されます。簡単に言えば、/botは「このリクエストはボット用である」という通知の役割を果たします。

bot_token

ボットトークンは文字と数字の長い文字列で、ボットのアクセスキーとして使用されます。API接続の最も重要な要素のひとつであり、このキーによりMQL5プログラムとサーバーの直接通信が可能になります。EAがWebRequestを送信するたびに、トークンはTelegramに「このリクエストは私のボットからであり、実行権限がある」ということを通知します。また、ボットにアクセスするためのパスワードの役割も果たします。

ボットトークンは非常に重要なため、常に秘密にして安全に管理する必要があります。誰でもボットにアクセスできる場合、あなたの代わりにメッセージを送信される可能性があります。別の設定ファイルに保存するか、EAの外部入力変数として管理するのが望ましい習慣です。この記事では後ほど、BotFatherを使用してTelegramから直接ボットトークンを取得する方法を説明します。

string url = telegram_api_url + "/bot" + bot_tokin + "/sendMessage";

この例では、「sendMessageエンドポイントを使ってメッセージを送信したい」とTelegramに伝えていることになります。これはデモ用のトークンです。

ヘッダ

次のパラメータはヘッダです。リクエストに追加する指示や認証情報のような役割を持ちます。

const string headers = "";

タイムアウト

このパラメータは、EAがリクエスト送信後にサーバーからの応答を待つ時間を指定します。

int timeout = 5000; // 5000 milliseconds = 5 seconds

この例ではMetaTrader 5は5秒間応答を待ちます。タイムアウトを過ぎると、接続は停止され、リクエストは失敗します。 タイムアウトは、電話を取る友達を待つことに例えることができます。10秒以内に応答がなければ電話を切るようなイメージです。「設定した時間内にサーバーが応答しなければ、待機をやめる」という動作がMetaTrader 5でおこなわれます。

データ

MetaTrader 5から外部プラットフォームに送信したい実際のメッセージは、char配列変数に格納されます。これは非常に重要です。 

string body = "chat_id=" + chatID + "&text=Hello from MT5!";
StringToCharArray(body, data, 0);

データは単なるテキストではなくバイトとして送信されるため、通常の文字列を文字配列に変換します。どのメッセージを変更するかを特定するために、メッセージIDも利用されます。

string body = "chat_id=" + chatID + "&message_id=" + MessageID + "&text=Hello from MT5!";
StringToCharArray(body, data, 0);

すでに送信されたメッセージを削除したい場合は、次のようにします。

string body = "chat_id=" + chatID + "&message_id=" + MessageID;
StringToCharArray(body, data, 0);

chat_idはTelegramのグループまたはボットを識別する一意のIDで、ユーザー名のような役割を果たします。サーバーに正確な送信先を伝えるための情報であり、住所に例えることができます。chat_idが間違っていると、メッセージは意図したチャットグループに届きません。すべてのTelegramグループには固有のIDがあるため、メッセージ本文にchat_idを含めることで、特定の住所に送信することを明示していることになります。

送信する各メッセージにはmessage_idという固有の識別番号が付与されます。この番号は、メッセージを削除したり編集したりする際に利用されます。

逆に、bot_tokenはボットのパスワードまたはアクセスキーとして機能します。これは特定のTelegramボットをMetaTrader 5アプリケーションに接続するための認証キーで、ボットのIDカードに例えることができます。このトークンがないとTelegramはどのボットからのリクエストか識別できず、メッセージは送信されません。

まとめると、次のようになります。

  • chat_idはサーバーにメッセージ送信先を伝える
  • message_idはどのメッセージを変更や削除するかを特定する
  • bot_tokenはTelegramにリクエスト元を知らせる

この記事の後半で、chat_id、message_id、bot_tokenを取得し、正しく利用する方法を説明します。

ここで、data[]配列についてさらに詳しく調べてみましょう。MetaTrader 5からTelegramサーバーにメッセージを送信する際の「配達箱」がdata[]配列です。まず、送信したいテキストをbodyという文字列変数に格納します(例:"Hello from MT5!")。このメッセージを安全にネットワーク越しに送信するため、WebRequest()が理解できる形式に正しく変換する必要があります。StringToCharArray()を使うことで、文字列を文字配列に変換します。

結果

WebRequest関数のresult変数には、サーバーからの応答が格納されます。 ここには、message_idやメッセージ送信の成功確認などの追加情報も含まれます。

char res[];
WebRequest("POST", url, "", 5000, data, res, resHeaders);

Print(CharArrayToString(res));

結果

{
  "ok": true,
  "result": {
    "message_id": 24,
    "from": {
      "id": 9467412345,
      "is_bot": true,
      "first_name": "MQL5 API BOT",
      "username": "MQL5APItest_bot"
    },
    "chat": {
      "id": -400395312345,
      "title": "Bot Testing Group",
      "type": "supergroup"
    },
    "date": 1761412345,
    "text": "Hello from MT5!"
  }
}

この場合、message_idは非常に重要です。このIDを使用することで、後で正確に特定のメッセージを更新したり削除したりできます。そのため、メッセージのテキストを変更したり完全に削除したりする場合は、別のWebRequest呼び出しで必ずこのmessage_idを使用します。

考え方としては、MetaTrader 5からメッセージを送信すると、Telegramは配達確認としてres[]に情報を返し、配達を確認し、追跡番号(message_id)を割り当てます。この番号を使用すれば、後でいつでもメッセージを検索、編集、削除することが可能です。

結果ヘッダ

リクエスト処理後にサーバーが返すヘッダは、WebRequest関数の最後のパラメータに格納されます。次のように宣言されます。

string resHeaders = "";
WebRequest("POST", url, "", 5000, data, res, resHeaders);
Print(resHeaders);

出力

図2:結果ヘッダ

ウェブサーバーは、通常MQL5から送信されたリクエストに対して、ヘッダと本文(コンテンツ)の2つの主要要素を返します。サーバーからのヘッダデータはresult_headersパラメータで取得されます。

これらのヘッダには、次のような重要な技術情報が含まれることが多いです。

  • Content-Type:レスポンスのフォーマットを示す
  • サーバー名とバージョン
  • レスポンスの日時
  • 接続タイプ(接続を維持するかどうか)

このデータは、セキュリティや接続情報を提供し、リクエストがTelegramサーバーで正しく受信されたことを確認し、返されたコンテンツの種類を示します。 WebRequest関数は、headersおよびresult_headersをさまざまな目的で使用することを理解することが重要です。サーバーに送信するデータは、リクエストの3番目の引数であるheadersで表されます。これらのヘッダは、送信するデータの種類を指定し、必要に応じて認証情報を含むこともあります。

これに対して、サーバーから返されるデータは、最後のパラメータ(result_headers)に格納されます。その他の有用な技術情報とともに、このパラメータはリクエストがどのように処理されたか、どのような種類のデータが返されたかを示します。 このプロセスは、2つのオフィス間の郵便のやり取りに例えると分かりやすくなります。手紙を送る前にラベルを貼るのと同様に、headersパラメータは手紙の中身とその扱い方を示します。一方、result_headersは、受け取った封筒の発送元、発送日時、配送方法などを示し、郵便物の消印や印記に例えることができます。MetaTrader 5と外部サーバー間の通信では、両者は異なる役割を持ちますが、どちらも重要です。


MetaTrader 5 からTelegramボットへメッセージを送信する

MQL5 APIとWebRequest関数の仕組みを十分に理解したところで、実際に学んだことを応用してみましょう。このセクションでは、MetaTrader 5からTelegramボットにメッセージを送信する方法を解説します。 ここで、これまで説明してきた理論が実際の操作で意味を持つようになります。MetaTrader 5ソフトウェアから、Telegramボットやグループに対してメッセージの送信、更新、削除をおこなうことができます。

MetaTrader 5のオプションウィンドウを開くにはCtrl + Oを押します。[エキスパートアドバイザ]タブを選択し、[WebRequestを許可するURLリスト]のチェックボックスをクリックしてオンにします。 

下のフィールドに次のURLを入力します。

https://api.telegram.org

図3:オプションウィンドウ

BotFatherを検索します。

図4:BotFatherを検索

新しいボットを作成するには、/newbotを選択します。

図5:新しいボット

ボットの表示名を選択します。

図6:表示名

ユーザー名を選択します。ユーザー名は「bot」または「_bot」で終わる必要があります。

図7:ユーザー名

作成後、BotFatherから2つの重要な情報を含むメッセージが届きます。

  • Bot Token:MetaTrader 5など外部プラットフォームとボットを接続するための一意のキーです。MQL5コード内でTelegram APIを通じてメッセージを送信する際に使用します。
  • Bot Link:ボットへのリンクです。このリンクをクリックすると直接ボットを開き、チャットを開始できます。

図8:ボット作成

以下のURLをブラウザのアドレスバーに入力します。

https://api.telegram.org/bot<YourBotToken>/getUpdates

<YourBotToken>の部分には、BotFatherで取得した実際のトークンを入力します。

たとえば、トークンが123456789:ABCdefGhIJklMNopQRstuVWxyzの場合、URLは次のようになります。

https://api.telegram.org/bot123456789:ABCdefGhIJklMNopQRstuVWxyz/getUpdates

図9:Pretty Print

ページが開くとテキストが表示されます。[Pretty-print]の前にボックスが表示されます。リンクをクリックします。 

Telegramボットに戻り、[Start]ボタンをクリックします。

図10:Start

再度ブラウザのページを更新すると、

図11:ページを更新

新しいアップデートが表示されます。これにより、ボットが正しく有効化されたことが確認できます。この更新には、MetaTrader 5からボットにメッセージを送信する際に必要なチャットIDなどの情報も含まれています。 すべての準備が完了したら、MetaEditor 5で新しいEAファイルを作成します。

EA内でチャットIDとボットトークンを使用してTelegram APIにアクセスし、MetaTrader 5から直接メッセージを送信できるようにします。これが、WebRequest()とAPI通信に関して学んだことを実際に応用する、実践的な最初のステップです。


const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string headers = "";
const int time_out = 5000;

const string bot_token  = "8345012345:AAHdAPtMQR6VHEQeHk1y_H9IuL3zc5abcde";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   string body = "chat_id=" + bot_chatID + "&text=Hello from MT5!";
   StringToCharArray(body, data, 0);

   string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";

   WebRequest(method,url,headers,time_out,data,res,resHeaders);

//---
   return(INIT_SUCCEEDED);
  }

出力

図12:送信されたメッセージ

説明

チャットID、ヘッダ、タイムアウト、HTTPメソッド、Telegram API URL、ボットトークンはすべて定数として指定されています。MetaTrader 5は、POSTメソッドを使用してサーバーにデータが送信されることを認識します。他のヘッダは必要ありません。チャットIDが特定のTelegramグループやチャットを識別し、MetaTrader 5は応答を受け取るまで5秒間待機します。

OnInit()関数内で、data、res、resHeadersの3つの変数が宣言されます。data配列は、WebRequest()がバイナリデータを必要とするため、送信するメッセージの文字形式を保持します。サーバーからの応答はresに保存され、resHeadersにはサーバーからの日付やコンテンツの種類などの追加情報が含まれます。

OnInit()関数は、data、res、resHeadersの3つの変数を宣言します。WebRequest()にはバイナリデータが必要であるため、データ配列はメッセージの文字形式を提供します。サーバーからの応答はresに保存され、resHeadersにはサーバーからの日付やコンテンツの種類などの追加情報が含まれます。次に、メッセージリクエストを処理する完全なTelegram API URLを作成します。これは次の行でおこないます。

string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";

ここで、すべての部分が組み合わされ、次のような完全なリンクが作成されます。

https://api.telegram.org/bot8345012345:AAHdAPtMQR6VHEQeHk1y_H9IuL3zc5abcde/sendMessage.

このURLは、指定されたトークンを持つボットを使ってメッセージを送信することをサーバーに伝えます。

WebRequest(method, url, headers, time_out, data, res, resHeaders);

POSTメソッドと指定したURLを使用して、char配列のデータをTelegram APIに送信します。ここでは空ですが、headersには追加情報を含めることも可能です。MetaTrader 5が応答を待つ時間はtime_outで決定されます。resHeadersはサーバータイプ、コンテンツ長、日付、接続情報などの追加応答情報を取得し、サーバーからの返答はres配列に格納されます。

まとめると、このプログラムはMetaTrader 5をTelegramボットに接続し、Telegramチャットに「Hello from MT5!」という簡単な挨拶メッセージを送信します。


MetaTrader 5からTelegramグループにメッセージを送信する

次のステップは、Telegramボットではなく、Telegramグループにメッセージを送信する方法を学ぶことです。プロセスはボットへの送信と似ていますが、グループの場合は少し異なります。 

Telegramグループを作成したら、グループのプロフィールアイコンをクリックします。

図13:グループの管理

表示されるオプションから[Manage Group]に移動し、[Administrators]をクリックします。

図14:管理者

[Add Administrator]をクリックし、検索バーを使って先ほど作成したTelegramボットをユーザー名(たとえば@MQL5APTtest_bot)で検索します。

図15:管理者の追加

ボットを選択したら、グループ内で操作するために必要な権限を付与します。

図16:権限

Telegramグループに戻り、メッセージを送信します。

図16:メッセージの送信

ブラウザに戻り、再び次のTelegram APIリンクを開きます。

https://api.telegram.org/bot<YourBotToken>/getUpdates

ウェブサイトを更新すると、先ほどグループに送信したメッセージに関する情報を含むJSON応答が表示されます。この応答のchat_idフィールドに、TelegramグループのIDが記載されています。MetaTrader 5からそのグループに直接メッセージを送信する際には、このchat_idを使用します。

図18:グループID

これで、取得したTelegramグループのチャットIDをMQL5コード内で使用できます。MetaTrader 5から送信するメッセージや通知は、このチャットIDによって特定のグループに正確に届けられるようになります。

const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string headers = "";
const int time_out = 5000;

const string group_chatID = "-1003271234567";

const string bot_token  = "8345012345:AAHdAPtMQR6VHEQeHk1y_H9IuL3zc5abcde";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   string body = "chat_id=" + group_chatID + "&text=Hello from MT5!";
   StringToCharArray(body, data, 0);

   string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";

   WebRequest(method,url,headers,time_out,data,res,resHeaders);

//---
   return(INIT_SUCCEEDED);
  }

出力

図19:MetaTrader 5からTelegramへ

説明

グループのチャットIDを保存するための文字列変数を宣言しました。ただし、メッセージをTelegramグループに届けたい場合はgroup_chatIDを使用してください。

また、サーバーの応答を取得するためにPrint(CharArrayToString(res));行を使用しました。この応答には重要な情報が含まれており、特に送信されたメッセージのmessage_idが重要です。次のセクションでは、MetaTrader 5から直接メッセージを変更または削除する方法を学ぶので、このメッセージIDは非常に役立ちます。

WebRequest関数によるメッセージの削除

WebRequest関数を使用して、削除リクエストをTelegramサーバーに直接送信できます。ボットは、削除したいメッセージのメッセージIDを知っていれば、グループ内のメッセージを削除できます。ボットは、管理者権限が与えられていれば、自分が送信したメッセージだけでなく、グループ内のメッセージも削除できます(以前に付与した権限に応じます)。

そのため、先ほど結果を出力したことが重要でした。サーバーの応答は次のようになっていました。 

{
  "ok": true,
  "result": {
    "message_id": 34,
    "from": {
      "id": 1234500523,
      "is_bot": true,
      "first_name": "MQL5 API Bot",
      "username": "MQL5APItest_bot"
    },
    "chat": {
      "id": -1234577012345,
      "title": "Bot Testing Group",
      "type": "supergroup"
    },
    "date": 1761498168,
    "text": "Hello from MT5 to Telegram Group!"
  }
}

この応答から、Telegramがmessage_idなどの有用なデータを返していることがわかります。このIDを使えば、後でWebRequest関数を使用して特定のメッセージを変更または削除できます。

注意すべき点は、EAが送信したメッセージの場合のみメッセージIDが取得できるということです。メッセージを手動でグループに送信した場合は、次のURLにアクセスしてメッセージを検索し、そのIDをコピーする必要があります。 

https://api.telegram.org/bot<YourBotToken>/getUpdates

const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string group_chatID = "-1003277012345";
const string headers = "";
const int time_out = 5000;

const string bot_token  = "8345012345:AAHdAPtMWR6VHEQeHk1y_H9IuL3zc5abcde";
const string MessageID = "34";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   const string url = telegram_api_url + "/bot" + bot_token + "/deleteMessage";

   string body = "chat_id=" + group_chatID +"&message_id=" + MessageID;
   StringToCharArray(body, data, 0);

   WebRequest(method,url,headers,time_out,data,res,resHeaders);
   
//  Print(CharArrayToString(res));

//---
   return(INIT_SUCCEEDED);
  }

説明

POSTオプションが選択されます。TelegramのAPIではメッセージを削除する際にPOSTを使用する必要がありますが、DELETEを使うべきなように思える場合もあります。POSTを使用することで、MQL5にリクエスト本文でサーバーにデータを送信するよう指示します。POSTは、Telegramサーバーに指示を記載した手紙を送るようなものと考えてください。削除するコマンドであっても、手紙に内容を書いて送る必要があります。

削除したいメッセージは、そのMessageIDによって特定されます。Telegramは、人間やボットがチャットに送信した各メッセージに固有のメッセージIDを割り当てます。このIDを使用して、Telegramサーバーにどのメッセージを削除するかを指示できます。通常、このメッセージIDはメッセージ送信後のサーバー応答から取得されます。

メッセージ削除のための完全なエンドポイントを作成するには、URLは複数の要素で構成されます。TelegramのAPIアドレスがベースURLとなります。リクエストがボットから送信されることは、botコンポーネントで示されます。ボット専用の認証キーはボットトークンと呼ばれます。最後にdeleteMessageを含めることで、サーバーに削除リクエストであることを伝えます。これらを組み合わせることで、削除リクエストを送信すべき正確な場所が示されます。

チャットIDとメッセージIDは、リクエスト本文に含まれます。Telegramは、どのメッセージを削除するかをメッセージIDで、どのチャットやグループのメッセージかをチャットIDで把握します。サーバーへの指示内容は基本的にこの本文に含まれています。

WebRequest関数によるメッセージの編集

最後のトピックとして、WebRequest関数を使ってメッセージを編集する方法を説明します。編集できるのは、ボットが送信したメッセージのみであることに注意してください。ボットは、他のユーザーがグループに直接送信したメッセージは編集できません。

メッセージの送信や削除と同様に、編集も同じように機能します。ここでもボットトークンとメッセージIDを使用します。

WebRequest関数を使用する際には、POSTメソッド、メッセージ編集用のURLエンドポイント、およびチャットID、メッセージID、更新したいテキストを含む本文が必要です。これにより、メッセージIDは固定されつつ、MetaTrader 5からメッセージを動的に更新できるようになります。

const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string group_chatID = "-10032771234567";
const string headers = "";
const int time_out = 5000;

const string bot_token  = "345012345:AAHdAPtMWR6VHEQeHk1y_H9IuL3zc5abcde";
const string MessageID = "35";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   string new_message = "Updated message text from MT5!";
   string url = telegram_api_url + "/bot" + bot_token +
                "/editMessageText";

   string body = "chat_id=" + group_chatID +"&message_id=" + MessageID + "&text=" + new_message;
   StringToCharArray(body, data, 0);

   WebRequest(method,url,headers,time_out,data,res,resHeaders);

   Print(CharArrayToString(res));

//---
   return(INIT_SUCCEEDED);
  }

説明

まず、送信したい新しいメッセージのテキストを定義します。Telegramグループやチャット内の元のメッセージは、この内容に置き換えられます。次に、URLを作成します。作成には、エンドポイント「/editMessageText」、ボットのトークン、そしてTelegram APIのベースURLを組み合わせます。このエンドポイントにより、Telegramはリクエストが既存のメッセージを編集することを意図していると認識します。 次にリクエスト本文を作成します。本文には、どのメッセージを編集するかを示すメッセージID、どの会話やグループのメッセージかを示すチャットID、そして更新したいテキストがすべて含まれます。 最後に、本文の文字列からchar配列を作成します。これは、WebRequest関数がメッセージ本文をウェブ上で送信する際に、文字配列形式で必要とするためです。

 

結論

本記事では、MQL5のWebRequest関数とAPIの基本的な使い方を学びました。MetaTrader 5がTelegramのような外部プラットフォームとどのように連携できるかを、実践的なプロジェクトを通して確認しました。MetaTrader 5から直接メッセージを送信、編集、削除する方法、チャットIDやグループIDの取得、Telegramボットの作成方法を学びました。次回以降の記事では、外部APIからのデータを受信・処理する方法も学び、実用的なAPI統合の理解をさらに深めます。

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

添付されたファイル |
初心者からエキスパートへ:予測価格経路 初心者からエキスパートへ:予測価格経路
フィボナッチレベルは、市場がしばしば尊重する実践的な枠組みを提供し、価格が反応しやすいゾーンを明確に示します。本記事では、フィボナッチリトレースメントのロジックを用いて将来の値動きを予測し、指値注文で押し目を狙うエキスパートアドバイザー(EA)を構築します。スイング検出からレベル描画、リスク管理、注文執行まで、一連のワークフロー全体を解説します。
MQL5 MVCパラダイムのテーブルのビューコンポーネント:シンプルな操作 MQL5 MVCパラダイムのテーブルのビューコンポーネント:シンプルな操作
本記事では、MVC (Model-View-Controller)パラダイムにおけるテーブル実装で、より複雑なグラフィック要素を構成するビューコンポーネントとしてのシンプルなコントロールについて解説します。ユーザーや他の要素との相互作用のための基本的な機能はコントローラーに実装されています。本記事はビューコンポーネントに関する第2回目の記事であり、MetaTrader 5クライアントターミナル向けテーブル作成に関する連載の第4回目です。
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
初心者からエキスパートへ:FX市場の取引期間 初心者からエキスパートへ:FX市場の取引期間
すべての市場の取引期間には始まりと終わりがあり、それぞれは終値によって完結します。この終値がその期間のセンチメントを定義します。各ローソク足のセッションも同様に、終値によってその性質が示されます。これらの基準点を理解することで、市場における現在のムードを測定でき、強気勢力と弱気勢力のどちらが支配しているのかを明らかにすることが可能になります。本記事では、Market Periods Synchronizerに新しい機能を開発するという重要な段階に進みます。この機能は、FX市場のセッションを可視化するものであり、より情報に基づいた取引判断を支援します。このツールは、強気派と弱気派のどちらがセッションを支配しているのかをリアルタイムで識別するうえで特に有効です。それでは、この概念について検討し、それが提供する洞察を明らかにしていきます。