見出し画像

MetaTraderからスマホに通知を送るには? 「LINE 」で試す

作成日:2024.11.20
更新日:2024.11.25


はじめに

MetaTraderのEAやインジケーターあるいはリモートPCから、別のPCやスマホに通知を送りたいと思ったことはありませんか?

MTでEAを運用していると、状況確認をするためにPCやスマホで頻繁にチェックするかと思います。これは面倒な作業ですので、エントリー/クローズのタイミングやエラーなどの問題発生時だけ、スマホに通知が届けば非常に助かります。

通知を受け取るアプリとしては、「LINE」「Discord」「MetaTrader」を検証しました。まずは、日本では利用者が多い「LINE」で通知を受け取る方法を紹介します。

Messaging APIについて

LINEには、手軽に通知を送ることができるLINE Notifyという無料のサービスがあります。私もこのサービスを利用していましたが、残念ながら、このサービスは2025年3月31日に提供終了します。LINEヤフー株式会社は、代替手段としてMessaging API を推奨しています。LINE公式アカウントを通して通知のやり取りができるWeb APIです。

Messaging APIは、無料のコミュニケーションプランだと月200通という制限があります。1ヶ月で約20日間の利用を想定すると、1日あたり10通くらいです。制限があっても利用者のアプリはLINEしか駄目という場合、選択肢はMessaging APIとなるでしょう。

つまり、既にLINE Notifyで運用しているケースでLINE以外に変更しないなら、通知を送る側はMessaging APIへの変更が必要になります。また、通知を受け取る側も設定変更(友だち追加)が必要です。LINE Notifyの場合はトークルームに通知されましたが、Messaging APIでは、LINE公式アカウントから通知を受け取れるように友だち追加が必要です。

LINE Notifyはもうすぐ終了してしまうので、概要や使い方は参考サイトを紹介するのみとし、本記事ではMessaging APIで通知を送る方法を紹介します。

尚、どちらのAPIもWeb APIなので、HTTPプロトコルを用いてのデータ送受信という形になります。

LINE Notifyの紹介

LINE Notifyとは、外部のWebサービスやアプリと連携するために、LINEが公式に提供しているAPIです。連携すれば、LINEが提供する公式アカウント「LINE Notify(サービス名と同じ)」から通知が送れるようになります。以下がAPIのドキュメントです。

LINE Notifyの設定方法やWindowsから通知を送る方法は、以下のサイトを参考にしてください。

また、PC版MetaTraderのEAから送る方法は、以下のサイトが参考になります。

Messaging APIの利用環境を整える

Messaging APIを使うには以下の準備が必要です。尚、スマホのLINEアプリを利用している(アカウントを既に持っている)ことを前提としています。

環境構築の流れ

  1. LINE公式アカウントの作成

  2. Messaging APIの有効化

  3. プロバイダーの作成

  4. Messaging APIチャネルを作成

  5. チャネルアクセストークンの発行

尚、「2.Messaging APIの有効化」の作業中に、「3.プロバイダーの作成」「4.Messaging APIチャネルの作成」が行われます。流れの4.まではLINE Official Account Managerで作業を行います。5.の作業は、LINE Developersコンソールで行います。

用語の説明

用語の意味や関係が分かりづらいと思いますので、簡単に説明しておきます。

LINE公式アカウント」については、「店のQRコードを友だち追加をすると、宣伝などが通知される、あのアカウント」と言えば、わかるかと思います。

プロバイダー」は、サービスを提供する個人あるいは組織を指します。例えば、個人や企業の名前をプロバイダーとして使用できます。プロバイダーの提供サービスが利用する通信路を「チャネル」といいます。チャネルの種類には、「Messaging API」、「LINEログイン」、「LINEミニアプリ」、「ブロックチェーンサービス」があります。Messaging APIチャネルは、1対1でLINE公式アカウントに紐付けます。

チャネルアクセストークン」は、チャネルを使用しようとするアプリケーションが、チャネルを使用する権限を持っているかどうかを確認する際に用いる文字列です。この文字列はMessaging APIの認証に利用します。

プロバイダーとチャネルについての詳細は、「LINE Developersコンソールの概要」を参考にしてください。他には以下のサイトも参考になります。

LINEビジネスID(LINE Business ID)」は、LINEが提供するビジネス向け、または開発者向けの各種管理画面にログインができる共通認証システムのためのIDです。簡単に言うと、LINE DevlopersコンソールLINE Official Accont ManagerにログインするためのIDになります。

LINE Official Account Manager」は、LINE公式アカウントの開設者向けに提供されている運用管理画面です。詳しくはマニュアルを参照してください。

LINE Devlopersコンソール」は、プロバイダーとチャネル、および開発者を管理するツールです。詳しくはこちらを参照してください。

LINE公式アカウントの作成

LINE Official Account Managerを使ってLINE公式アカウントを作成します。このツールを利用するには、LINEビジネスID に登録する必要があります。こちらを参照してLINE公式アカウントを作成してください。「Messaging APIドキュメント」の「1. LINE公式アカウントを作成する」よりも分かりやすいかと思います。

LINE公式アカウントの作成が完了すると、以下の画面が表示されます。

作成完了画面

「LINE Official Account Managerへ」ボタンをクリックします。

情報利用に関する同意の画面

「情報利用に関する同意について」画面の下の方にある「同意」ボタンをクリックします。

「LINEヤフーグループへの情報提供に関する個別規約への同意」の画面

「LINEヤフーグループへの情報提供に関する個別規約への同意について」画面の下の方にある「同意」ボタンをクリックします。

友だち追加のお知らせ

連携したLINEアカウントに友だち通知したことのお知らせです。「次へ」ボタンをクリックします。

単なるお知らせの画面

「まずは友だちを集めましょう」というお知らせの画面です。「ホーム画面に移動」ボタンをクリックします。

ホーム画面

ホーム画面で「設定」タブをクリックします。

設定の画面

設定の画面に遷移します。

Messaging APIの有効化

続いて、Messaging APIを有効化します。Messaging APIの利用を有効にする作業の中に、プロバイダーの作成とMessaging APIチャネルの作成が含まれます。
公式のドキュメントである「2. LINE公式アカウントでMessaging APIを有効にする」も参照するようにしてください。

設定の画面

設定の画面の左にあるメニューの「Messaging API」をクリックします。

Messaging APIの設定の画面

Messaging APIの設定の画面に遷移します。ここで「Messaging APIを利用する」ボタンをクリックします。

開発者情報の入力の画面

LINE Official Account Managerにログインする時に使っているアカウントで、LINE Developersコンソールにログインしたことがない場合は、操作の途中で、上の開発者情報を入力する画面が表示されます。名前とメールアドレスを入力して「同意する」ボタンをクリックします。

開発者情報の登録の画面

開発者情報を登録して、プロバイダーの作成に進みます。

プロバイダーの作成

プロバイダーの作成の画面

プロバイダー名を入力して「同意する」ボタンをクリックします。

プライバシーポリシーと利用規約の画面

後で変更できるので、ここは未入力で進めます。

Messaging APIの利用の確認画面

Messaging APIの利用の確認です。「OK」ボタンをクリックします。

Messaging APIチャネルを作成

Messaging APIが有効化され、Messaging APIチャネルが作成されました。

Messaging APIが有効化された画面

チャネルアクセストークンの発行

チャネルアクセストークンを発行するために、LINE Developersを起動します。

Messaging APIが有効化された画面

画面の下部の「LINE Developers」リンクをクリックします。

LINE Developersのトップ画面

LINE Developersのトップ画面が開くので、右上の「コンソール」ボタンをクリックします。

LINE Developersコンソール

LINE Developersコンソールが開くので、作成したMessaging APIチャネルをクリックします。

Messaging APIチャネルの設定画面

Messaging APIチャネルの設定画面が開くので、「Messaging API設定」タブをクリックします。

Messaging API設定画面

Messaging API設定に表示が切り替わります。下にスクロールします。

チャネルアクセストークン

「発行」ボタンをクリックして、チャネルアクセストークン(長期)を発行します。

チャネルアクセストークンの発行

無事、長い文字列であるチャネルアクセストークンが発行されました。この文字列は控えておいてください。通知を送る時に必要になります。

LINE Official Account ManagerおよびLINE Developersコンソールを終了してください。お疲れ様でした。

本記事でのメッセージ送信方法について

Messaging APIで提供される機能の1つ「任意のタイミングでメッセージを送信する」を利用して通知を送ります。

メッセージは、様々な送信方法やタイプがありますが、送信方法は「ブロードキャストメッセージ:1対多(すべての友だち)」、タイプは「テキストメッセージ」を使います。この送信方法の詳細は、公式のAPIリファレンスの「ブロードキャストメッセージを送る」に記載されています。

Windows上でcurlを使って送信

LINE公式アカウントと友だちになっているすべてのユーザーにメッセージを送信する方法が以下に記載されています。

curlを使ったShellの例には以下の内容が記載されています。APIリクエストの再試行はしないので、「X-Line-Retry-Key」の行は削除して、チャネルアクセストークンの部分を書き換えれば、macOSの場合、ターミナルから実行できます。

curl -v -X POST https://api.line.me/v2/bot/message/broadcast \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-H 'X-Line-Retry-Key: {UUID}' \
-d '{
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'

Windowsでもcurlは利用可能なので、これをベースにしてWindowsのコマンドプロンプト向けに変更します。

APIリクエストの再試行はしないので、「X-Line-Retry-Key」は削除します。メッセージはシンプルに1つだけにします。また、Windows のコマンドプロンプトでは、シングルクォーテーション「 '」 を文字列の指定に利用できません。したがって、ダブルクォーテーション 「"」に変更し、かつ内部で使用されたダブルクォーテーションは「\」でエスケープします。

「{channel access token}」の部分は控えておいたチャネルアクセストークンに書き換えます。例として「XYZabcdefghijklmnoppqrstuvwxyzABC」としています。送信するメッセージは「はじめての通知です。よろしく!」にします。

修正した結果は以下の通りです。

curl -X POST "https://api.line.me/v2/bot/message/broadcast" -H "Content-Type: application/json" -H "Authorization: Bearer XYZabcdefghijklmnoppqrstuvwxyzABC" -d "{\"messages\":[{\"type\":\"text\",\"text\":\"はじめての通知です。よろしく!\"}]}"

Windowsのコマンドプロンプトで実行して、Messaging APIのLINE公式アカウントから通知が届けば成功です。

私の場合、リモートPCの起動確認をするために、これをバッチファイルにして、電源オンや再起動したときに通知が届くようにしています。タスクスケジューラを使って、トリガー(システム起動時)でバッチファイルが動くようにすれば可能です。

PC版MetaTraderから送信

送信方法について

MetaTraderのEAでも同様の処理が可能です。以下のWebRequest関数を利用します。注意事項としては、この関数が使えるのはEAとスクリプトだけです。インジケーターからは実行できません(コンパイルエラーにはなりません)。またストラテジーテスター内でも実行できません。インジケーターから通知を送りたい場合は、SendNotification関数になりますが、ここでは触れません。

int WebRequest(
  const string method,          // HTTP メソッド
  const string url,             // URL
  const string headers,         // ヘッダ
  int          timeout,         // タイムアウト
  const char   &data[],         // HTTPメッセージ本文の配列
  char         &result[],       // サーバ応答データの配列
  string       &result_headers  // サーバ応答ヘッダ
);

事前準備

MetaTrader4のメニューの「ツール」→「オプション」を選択します。表示されたダイアログの「エキスパートアドバイザ」タブを選択します。「WebRequestを許可するURLリスト」にチェックを入れます。

オプション画面

「新しいURLを追加」をダブルクリックすると、URLリストに追加できるようになります。以下のURLを入力して「OK」ボタンをクリックします。

https://api.line.me/v2/bot/message

MetaTrader5で送信する場合も同じ準備で大丈夫です。

EAからメッセージ送信

Windowsのcurlの例と同等の処理をするには、以下のようにWebRequest関数を使います。チャネルアクセストークンは、Windowsのcurlの例と同じ文字列の「XYZabcdefghijklmnoppqrstuvwxyzABC」としています。送信するメッセージも「はじめての通知です。よろしく!」です。流れがわかりやすいようにエラー処理などは入れていません。

// HTTPメソッド
string method = "POST";

// URL
string url = "https://api.line.me/v2/bot/message/broadcast";

// ヘッダ
string headers = "Content-Type: application/json\r\nAuthorization: Bearer \"XYZabcdefghijklmnoppqrstuvwxyzABC\"";

// タイムアウト
int timeout = 5000;

// HTTPメッセージ本文の配列
char data[];
int data_size =  StringToCharArray("{\"messages\":[{\"type\":\"text\",\"text\":\"はじめての通知です。よろしく!\"}]}", data, 0, WHOLE_ARRAY, CP_UTF8);
ArrayResize(data, data_size - 1);

// サーバ応答データの配列
char result[];

// サーバ応答ヘッダ
string result_headers;

// WebRequestの実行
WebRequest(
  method,
  url,
  headers,
  timeout,
  data,
  result,
  result_headers
);

判りにくい部分は、HTTPメッセージ本文のchar配列「data」を作るところかと思います。少し補足します。

文字列をchar配列に変換するには、StringToCharArray関数を利用します。但し、
StringToCharArray関数は、文字列をバイト配列に変換する際、null終端文字を含みます。これを削るため、ArrayResize関数で配列を1つ減らしています。これで文字列がうまくchar配列にセットされます。

では、実際にEAでメッセージを送信させます。以下のように、OnInit関数の中にメッセージ送信の処理を入れました。EAを開始した直後や、EAの設定(プロパティ)変更、タイムフレーム変更などをした時に、メッセージの着信の通知が届くはずです。確認してみてください。ちなみに、このソースコードはMetaTrader4と5の両方に対応しています。

#property strict

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  // HTTPメソッド
  string method = "POST";

  // URL
  string url = "https://api.line.me/v2/bot/message/broadcast";

  // ヘッダ
  string headers = "Content-Type: application/json\r\nAuthorization: Bearer \"XYZabcdefghijklmnoppqrstuvwxyzABC\"";

  // タイムアウト
  int timeout = 5000;

  // HTTPメッセージ本文の配列
  char data[];
  int data_size =  StringToCharArray("{\"messages\":[{\"type\":\"text\",\"text\":\"はじめての通知です。よろしく!\"}]}", data, 0, WHOLE_ARRAY, CP_UTF8);
  ArrayResize(data, data_size - 1);

  // サーバ応答データの配列
  char result[];

  // サーバ応答ヘッダ
  string result_headers;

  // WebRequestの実行
  WebRequest(
    method,
    url,
    headers,
    timeout,
    data,
    result,
    result_headers
  );

  return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  //---
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  //---
}
//+------------------------------------------------------------------+

確認できたでしょうか?
後はエラー処理を追加して関数化すれば、便利に使えるかと思います。

処理を関数化したソースコード

前述のソースコードをベースに、以下の変更を加えます。

  • メッセージ送信処理を関数化

  • エラー処理を追加

  • LINE Notifyにも対応(環境準備が必要)

  • メッセージの先頭にEAの名前とデモ口座かどうかを付加する機能(既定値はオフ)

また、送信するメッセージにエンコード処理を追加します。LINE Notifyの場合、URLエンコード処理が必要なようです。Messaging APIの場合は、JSON用に「\」「"」「\r」「\n」をエスケープ処理します。

修正した結果が、以下のソースコードです。

これもMetaTrader4および5に対応しています。MetaTrader5の場合は拡張子を「.mq5」に変更してください。また、MetaTrader4のみで使うなら、互換処理の部分は冗長になるので、「#ifdef __MQL5__」から「#endif」までの部分を削除してもOKです。

ソースコードの説明は以上です。コンパイルして試してみてください。ご参考になれば幸いです。

最後に

実際のところ、ソースコード自体は、LINE Notifyの時に作成していたものを、JSONの送信に対応させるだけだったので、時間はあまりかかっていません。一番面倒だったのは、Messaging APIの利用環境を理解して整えるところでした。もう少し簡単にならないですかね。

とはいえ、仕様変更されると何らかの変更が必要になるかもしれませんので、それも厄介です。

LINE Notifyが提供終了(2025/03/31に終了)にならなければ、余計な手間はいらなかったのに。困ったものです。

次回は、『MetaTraderからスマホに通知を送るには? 「Discord 」で試す』の予定です。

参考:よく見るサイトの一覧

LINE Messaging API
https://developers.line.biz/ja/services/messaging-api/

LINE公式アカウントをはじめる
https://www.lycbiz.com/jp/service/line-official-account/

LINE Official Account Manager
https://manager.line.biz

LINE Developers
https://developers.line.biz/ja/

LINE Developersコンソール
https://developers.line.biz/console/

いいなと思ったら応援しよう!

SORA PAPA
よろしければ応援お願いします!