見出し画像

MetaTraderライブラリ 簡単に通知機能を実装する「MyNotify」関数

  • 更新履歴:

    • 2025/09/02:新規作成

    • 2025/12/22:LibMyNotify 1.03→1.04

      • ファイルオープン時に共有読み取りフラグが不足していたため、他のプロセスがファイルにアクセスできない問題を修正


1. はじめに

MetaTrader(MT4/MT5)で自動売買(EA)やカスタムインジケーターを稼働させているトレーダーにとって、プログラムの状況をリアルタイムで把握することは非常に重要です。特に、エントリーや決済のタイミング、あるいはエラーの発生などをすぐに知ることは、機会損失を防ぎ、安定した運用を行う上で不可欠となります。

MetaTraderには標準でメール通知やプッシュ通知機能が備わっています。しかし、普段使い慣れているLINEやDiscordといったメッセージアプリで通知を受け取ることができれば、より手軽で素早く、そして確実に情報を受け取ることができます。

そこで、MetaTrader用の自作ライブラリ「MyNotify」を公開します。このライブラリは、LINE Messaging API、Discord、そしてMetaTraderのプッシュ通知という3つの異なる通知方法を、EAやインジケーターに簡単に組み込むことができるように設計されています。わずか数行のコードを追加するだけで、複雑な通知処理をシンプルに実現できます。

この記事では、MyNotifyライブラリの概要、導入方法、そして使い方を詳しく解説します。ぜひご自身のEAやインジケーターに組み込んで、より快適なトレーディング環境を構築してください。

2. ライブラリの概要:3つの通知機能を簡単に使いこなす

MyNotifyライブラリは、複雑な通知処理を簡単に利用できるように設計されています。このライブラリは、EAやインジケーターから直接呼び出して利用する3つの主要な関数を提供しています。これらの関数は、ライブラリ内部で複雑な処理(LINE Messaging APIやDiscordへのWebリクエスト、JSONの生成など)を自動的に実行します。

ユーザーが利用するのは、以下の3つの関数だけです。

  1. InitMyNotify 関数

    • 通知機能を利用するために、EAの起動時(OnInit関数内)に一度だけ呼び出します。

    • この関数で、どの通知方法(LINE、Discord、MT)を有効にするか、アクセストークンやWebhook URLなどの設定を行います。

    • 設定ファイル(MyNotify.ini)が存在する場合、その内容も自動的に読み込んで初期設定に反映します。

  2. MyNotify 関数

    • この関数に、通知として送りたいメッセージを引数として渡すだけで、設定されたすべての通知先にメッセージが送信されます。

    • EAのトレード結果やエラー、あるいは任意のイベントを通知したい時に、好きなタイミングで何度でも呼び出すことができます。

  3. SetMyNotifyUseOriginalWebRequest 関数

    • ライブラリに内蔵された独自のWebRequest関数ではなく、MetaTraderのデフォルトのWebRequest関数を使用するかどうかを切り替えるための応用的な関数です。

    • 特別な理由がない限り、通常は呼び出す必要はありません。

これらの関数を利用することで、EAのメインロジックとは切り離して通知処理を実装できるため、コードがシンプルになり、可読性も向上します。

3. 関数仕様

このライブラリが提供する主要な3つの関数の仕様について解説します。

3.1 InitMyNotify 関数

通知機能の初期設定を行う関数です。EAやインジケーターの初期化時(OnInit)に一度だけ呼び出します。

void InitMyNotify(
  bool   use_line_mapi,
  string line_channel_access_token,
  bool   use_discord,
  string discord_webhook_url,
  bool   use_mt,
  bool   use_message_header,
  string ea_name = "",
  int    timeout = 5000,
  bool   debug = false
);

パラメーター:

$$
\small
\begin{array}{|l|c|c|l|} \hline
パラメーター名 & 型 & 必須/任意 & 説明\\ \hline
\rm{use\_line\_mapi} & \rm{bool} & 必須 & \rm{\bold{true}でLINEへの通知を有効にします。}\\ \hline
\rm{line\_channel\_access\_token} & \rm{string} & 必須 & \rm{LINEのアクセストークン。}\\ \hline
\rm{use\_discord} & \rm{bool} & 必須 & \rm{\bold{true}でDiscordへの通知を有効にします。}\\ \hline
\rm{discord\_webhook}\_url & \rm{string} & 必須 & \rm{DiscordのWebhook URL。}\\ \hline
\rm{use\_mt} & \rm{bool} & 必須 & \bold{true}で\rm{MetaTrader}のプッシュ通知への通知を有効にします。\\ \hline
\rm{use\_message}\_header & \rm{bool} & 必須 & \bold{true}で\rm{EA}名や口座種別をメッセージヘッダーに付加します。\\ \hline
\rm{ea\_name} & \rm{string} & 任意 & \rm{通知ヘッダーや設定ファイル名に使用するEA名(空の場合はプログラム名を使用)。}\\ \hline
\rm{timeout} & \rm{int} & 任意 & \rm{Web}リクエストのタイムアウト時間(ミリ秒)。\\ \hline
\rm{debug} & \rm{bool} & 任意 & \bold{true}でデバッグモードを有効にします。\\ \hline
\end{array}
$$

3.2 MyNotify 関数

設定された通知先にメッセージを送信する関数です。

void MyNotify(
  string message
);

パラメーター:

$$
\small
\begin{array}{|l|c|c|l|} \hline
パラメーター名 & 型 & 必須/任意 & 説明\\ \hline
\rm{message} & \rm{string} & 必須 & 送信したいメッセージの文字列\\ \hline
\end{array}
$$

【注意事項】
ストラテジーテスターでのバックテスト実行時には、通知は送信されません。

3.3 SetMyNotifyUseOriginalWebRequest 関数

Webリクエストの実装を切り替えるための関数です。

void SetMyNotifyUseOriginalWebRequest(
  bool use_original
);

パラメーター:

$$
\small
\begin{array}{|l|c|c|l|} \hline
パラメーター名 & 型 & 必須/任意 & 説明\\ \hline
\rm{use\_original} & \rm{bool} & 必須 & \rm{\bold{true}でMetaTraderのデフォルトのWebRequest関数を使用します。通常は利用不要です。}\\ \hline
\end{array}
$$

【注意事項】
MetaTraderのデフォルトのWebRequest関数を利用した場合(use_originalをtrueに設定した場合)、インジケーターからLINEおよびDiscordへの通知はできません。これはMetaTraderの仕様によるものです。EA(Expert Advisor)からは問題なく利用できます。

4. 導入方法:2ステップで始めるMyNotify

MyNotifyライブラリの導入は非常にシンプルです。以下の2つのステップで、あなたのEAやインジケーターにすぐに通知機能を実装できます。

ステップ1:ファイルの配置

まず、ダウンロードしたライブラリファイルをMetaTraderの指定されたフォルダに配置します。

  • LibMyNotify.mqh を MetaTraderのデータフォルダ内の MQL5/Include (MT4の場合は MQL4/Include)フォルダに配置します。

  • LibMyNotify.ex5 を MQL5/Libraries フォルダに配置します。(MT4をご利用の方は、LibMyNotify.ex4 を MQL4/Libraries フォルダに配置してください。)

ステップ2:EA/インジケーターでの利用

次に、以下のコードをEAやインジケーターに追加します。

【EAでのコード例】

#property strict

#include <LibMyNotify.mqh>

#define LINE_CHANNEL_ACCESS_TOKEN ""
#define DISCORD_WEBHOOK_URL ""

input string __EA_INFO               = "### EA INFO";
input string MyEAName                = "MyNotify Test";
input string TestMessage             = "This is a test message.";

input string __MY_NOTIFY_SETTINGS    = "### MY Notify Settings";
input bool   UseMessageHeader        = true;
input bool   UseMyNotifyLINE_MAPI    = true;
input string LINE_ChannelAccessToken = LINE_CHANNEL_ACCESS_TOKEN;
input bool   UseMyNotifyDiscord      = true;
input string DiscordWebhookURL       = DISCORD_WEBHOOK_URL;
input bool   UseMyNotifyMT           = false;
input int    MyNotifyTimeout         = 5000;

int OnInit() {
  // ライブラリを初期化する
  InitMyNotify(UseMyNotifyLINE_MAPI, LINE_ChannelAccessToken, UseMyNotifyDiscord, DiscordWebhookURL, UseMyNotifyMT, UseMessageHeader, MyEAName, MyNotifyTimeout, true);

  // 通知を送りたい箇所でMyNotify関数を呼び出す
  MyNotify(TestMessage);

  return INIT_SUCCEEDED;
}

【インジケーターでのコード例】

#property indicator_chart_window
#property indicator_plots 0

#property strict

#include <LibMyNotify.mqh>

#define LINE_CHANNEL_ACCESS_TOKEN ""
#define DISCORD_WEBHOOK_URL ""

input string __EA_INFO               = "### EA INFO";
input string MyEAName                = "MyNotify Test";
input string TestMessage             = "This is a test message.";

input string __MY_NOTIFY_SETTINGS    = "### MY Notify Settings";
input bool   UseMessageHeader        = true;
input bool   UseMyNotifyLINE_MAPI    = true;
input string LINE_ChannelAccessToken = LINE_CHANNEL_ACCESS_TOKEN;
input bool   UseMyNotifyDiscord      = true;
input string DiscordWebhookURL       = DISCORD_WEBHOOK_URL;
input bool   UseMyNotifyMT           = false;
input int    MyNotifyTimeout         = 5000;

int OnInit() {
  // ライブラリを初期化する
  InitMyNotify(UseMyNotifyLINE_MAPI, LINE_ChannelAccessToken, UseMyNotifyDiscord, DiscordWebhookURL, UseMyNotifyMT, UseMessageHeader, MyEAName, MyNotifyTimeout, true);

  // 通知を送りたい箇所でMyNotify関数を呼び出す
  MyNotify(TestMessage);

  return INIT_SUCCEEDED;
}

int OnCalculate(const int32_t rates_total, const int32_t prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[],
                const long& volume[], const int& spread[]) {
  return (rates_total);
}

両方のコード例に共通して言えるのは、以下の2つの重要な処理を行っている点です。

  • 1. #include <LibMyNotify.mqh>: コードの冒頭でライブラリのインクルードファイルを取り込んでいます。これにより、InitMyNotify や MyNotify といったライブラリ内の関数が使えるようになります。

  • 2. InitMyNotify 関数の呼び出し: EAの初期化処理(OnInit)の中で、InitMyNotify 関数を一度だけ呼び出しています。ここで、パラメータのタブで設定した内容を引数として渡し、通知の準備を完了させます。

  • 3. MyNotify 関数の呼び出し: 通知を送りたいタイミングで、MyNotify 関数を呼び出します。引数に渡した文字列が、設定された通知先に送信されます。

ご覧の通り、このライブラリを使えば、わずか数行のコードを追加するだけで、簡単に多機能な通知システムを実装できます。
ただし、ストラテジーテスターでは通知は送信されません。

5. 各通知設定の詳細と応用的な使い方

MyNotifyライブラリは、LINE、Discord、そしてMetaTraderのプッシュ通知という3つの異なる通知方法をサポートしています。それぞれの通知機能を利用するためには、事前に設定が必要です。

各通知機能の設定方法について

各サービスでの具体的な設定手順については、私が既にnoteで公開している以下の記事をご参照ください。この記事では、それぞれの通知機能を有効にするためのアクセストークンやWebhook URLの取得方法を詳しく解説しています。

LINE Messaging APIの設定

Discord Webhookの設定

MetaTraderプッシュ通知の設定

【重要】Webリクエストの許可設定について
MetaTraderのデフォルトのWebRequest()関数を利用する場合、LINEやDiscordに通知を送信するためには、事前に許可されたURLのリストにサーバーのアドレスを追加する必要があります。 この設定は、MetaTraderの「ツール」>「オプション」から「エキスパートアドバイザー」タブを開き、「WebRequestsを許可するURLリスト」に以下のURLを追加してください。

$$
\small
\begin{array}{llr}
\rm{\bold{LINE:}} & \rm{https://api.line.me/v2/bot/message} &          \\
\rm{\bold{Discord:}} & \rm{https://discord.com/api/webhooks} &          \\
\end{array}
$$

応用的な使い方:設定ファイルの利用

前述のコード例では、通知設定をEAのパラメータとして直接記述しました。しかし、設定ファイルを利用することで、コードを再コンパイルすることなく設定を変更することが可能になります。

設定ファイルは MyNotify.ini という名前で作成し、MetaTraderのデータフォルダ内の MQL5/Files (MT4の場合は MQL4/Files)フォルダに配置します。

【MyNotify.ini の記述例】

# MyNotify.ini の記述例
UseMessageHeader=true
UseMyNotifyLINE_MAPI=false
LINE_ChannelAccessToken=your_line_channel_access_token_here
UseMyNotifyDiscord=true
DiscordWebhookURL=your_discord_webhook_url_here
UseMyNotifyMT=false
MyNotifyTimeout=5000

【INIファイルの仕様】

  • 行頭に#がある行はコメントとみなされ、スキップされます。

  • 文字列は"(ダブルクォーテーション)で囲みません。

  • InitMyNotify関数に渡した値よりも、INIファイルに記載されたパラメーターが優先されます(上書きされます)。

  • パラメーター名(例: UseMyNotifyLINE_MAPI)は、大文字小文字を区別しません。

このファイルを配置しておけば、InitMyNotify 関数が自動的にこの設定を読み込み、コードで直接設定した内容を上書きします。これにより、EAやインジケーターを配布する際にも、ユーザーはINIファイルを編集するだけで通知設定を行えるため、非常に便利です。

また、特定のEA専用の設定ファイルとして、MyNotify-EA名.ini のようにEA名をファイル名に含めることも可能です。これにより、複数のEAで異なる通知設定を使い分けることができます。

EA名には、InitMyNotify関数の引数ea_nameに指定した文字列が使用されます。ea_nameが空文字列の場合は、プログラム名がEA名として扱われます。

6. 最後に

ここまで読んでいただき、ありがとうございました。

この記事では、MetaTrader EA/インジケーター向けの自作ライブラリ「MyNotify」を紹介しました。このライブラリは、LINE、Discord、そしてMetaTraderのプッシュ通知という3つの通知機能を、シンプルな関数呼び出しだけで簡単に実装できるように設計されています。

EAのトレード結果をリアルタイムで受け取ったり、インジケーターの特定のシグナルを素早く確認したりすることで、ご自身のトレード環境がより快適で、効率的なものになることを願っています。

このライブラリのサブセット版ソースコードを以下の記事で有償で公開しています。

機能制限は以下の通りになります。

  • WebRequestがMetaTraderの標準しか使えない。

  • INIファイルからの設定値の読み込みができない。

ご興味のある方は、そちらも併せてご参照ください。

それでは。


【ダウンロード】

本ソフトウェアのご利用にあたっては、以下の利用規約への同意が必要です。必ずソフトウェアをダウンロードする前に、利用規約をご確認ください。本ソフトウェアのダウンロードをもって、利用規約のすべてに同意したものとみなされます。

LibMyNotify.mqhの利用規約:

MyNotifyライブラリの利用規約:

ヘッダーファイル

「LibMyNotify.mqh」は、以下からダウンロードしてください。MT4/MT5共通です。

MT4用MyNotifyライブラリ

「LibMyNotify.ex4」は、以下からダウンロードしてください。

MT5用MyNotifyライブラリ

「LibMyNotify.ex5」は、以下からダウンロードしてください。



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

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