配布したEA利用者のMT4にメッセージを一斉配信する方法

メッセージ送付機能
yuki
yuki
今回は、日付が変わるときに口座番号認証をするEAを作る手順で作ったEAに、EA利用者全員にメッセージを表示する機能を追加する方法をご説明します
カオチャイ
カオチャイ
新商品をリリースした際に既存のお客さんにお知らせしたり、大きな指標前にEA停止を推奨したりするのに便利ですよ!
yuki
yuki
この機能は無料でご利用できますが、MQLAuth.mqhのバージョン1.03以上がインストールされている必要がございますので、まだ準備ができていない方は下記の記事を参考にしてくださいね!
カオチャイ
カオチャイ
自分でつけるのが面倒くさいという方はシストレファクトリーのMQLAuth実装代行のサービスもご利用くださいね!
MQLAuth準備編
MQLAuthシステムを利用するための事前準備 MQLAuthを使うための準備 MQLAuthシステムを使う前提条件として「インジケーターをMT4の口座番号やパスワードで縛って管...

一斉送信機能で確実な宣伝が可能になります

MT4で一斉送信

MQLAuthの一斉送信機能は配布したEAやインジケーターのMT4のチャート上に数秒間メッセージを表示するものです。(どのEAに表示させるかも、MQLAuth管理画面より選択することが出来ます)

このメッセージ機能を使えば新しいEAの告知を行うことも容易ですし、応用すればテキストから自社HPへリンクを飛ばすことも出来ますので、マネタイズや広告収入を得ることにも応用できます。

 

MQL実装例
【コピペでOK】MT4のチャートから飛ばすURLをソースコードを編集せずに、MQLAuthの管理画面から変えられるようにする https://interactivebrokers.work/start_mqlauth/ メッセージのURL変更を簡単に ...

MQLAuth管理画面の設定

インジケーター設定画面まず、表示するメッセージと表示する期間を設定します。MQLAuthメイン画面から【EA・インジケーター管理】を選び、メッセージを付けたいEA・インジケーターの【編集】をクリックします。

 

MT4にメッセージを一括送信

編集画面に進むと【このEAを利用しているユーザー全員に表示することのできるメッセージの設定】ボタンがあるので、それをクリックするとメッセージの設定画面が表示されます。

そこへメッセージと表示期間を入力し、「保存」ボタンを押せば設定は完了です。続いてソースコードの編集にいきます。

 

ソースコードの編集

string _labelName = "appMessage"; // 追加した行
int OnInit() {
   if(IsTesting()) {
      // 省略
   }
   EventSetTimer(1);

   // ここから追加
   ObjectCreate(ChartID(), _labelName, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_BACK, true);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_SELECTED, false);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_HIDDEN, true);
   ObjectSetString(ChartID(), _labelName, OBJPROP_FONT, "Meiryo");
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_FONTSIZE, 14);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_XDISTANCE, 250);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_YDISTANCE, 50);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
   // ここまで

   return(INIT_SUCCEEDED);
}

今回はメッセージをラベルで表示してみます。まずはメッセージを表示するためのラベルを用意します。

 

void OnTimer() {
   if(AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      // 省略
   }

   string message = Auth_GetApplicationMessage(MQLAUTH_ID, APPLICATION_NAME); // 追加した行
}

MQLAuthで設定したメッセージを取得します。

 

void OnTimer() {
   if(AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      // 省略
   }

   string message = Auth_GetApplicationMessage(MQLAUTH_ID, APPLICATION_NAME);

   // ここから追加
   if(message != "") {
      ObjectSetString(ChartID(), _labelName, OBJPROP_TEXT, message); // 表示するテキスト
   }
   // ここまで
}

メッセージが設定されている場合はラベルにメッセージを表示するようにif文を書きます。

 

int _receiveMessageHour;
void OnTimer() {
   if(AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      // 省略
   }

   if(TimeHour(TimeLocal()) != _receiveMessageHour) { // 追加した行
      _receiveMessageHour= TimeHour(TimeLocal()); // 追加した行
      string message = Auth_GetApplicationMessage(MQLAUTH_ID, APPLICATION_NAME);

      if(message != "") {
         ObjectSetString(ChartID(), _labelName, OBJPROP_TEXT, message);
      }
   } // 追加した行
}

メッセージは少し早めに反映されるように、1時間に1回更新するようにしてみました。これで完成です。

 

MT4のメッセージMT4にはこんな感じで表示されるようになります。

 

今回作成したコード

//+------------------------------------------------------------------+
//|                                                   OneDayAuth.mq4 |
//|                                      ©2020  MT4ツール製作【シストレファクトリー】 |
//|                                 https://interactivebrokers.work/ |
//+------------------------------------------------------------------+
#define MQLAUTH_ID ""
#define APPLICATION_NAME ""

#define HTTP_QUERY_FLAG -2147483648
#include <MQLAuth.mqh>

#property copyright "©2020  MT4ツール製作【シストレファクトリー】"
#property link      "https://interactivebrokers.work/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
string _labelName = "appMessage";
int OnInit() {
   if(IsTesting()) {
      if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
         _isAuthorized = true;
         Print("口座認証に成功しました。");
      } else {
         _isAuthorized = false;
         Print("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
         ExpertRemove();
      }
   }
   EventSetTimer(1);

   ObjectCreate(ChartID(), _labelName, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_BACK, true);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_SELECTED, false);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_HIDDEN, true);
   ObjectSetString(ChartID(), _labelName, OBJPROP_FONT, "Meiryo");
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_FONTSIZE, 14);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_XDISTANCE, 250);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_YDISTANCE, 50);
   ObjectSetInteger(ChartID(), _labelName, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//--- destroy timer
   EventKillTimer();

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   if(!_isAuthorized) return;

   // EAの処理
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
datetime _date;
bool _isAuthorized = false;
int _receiveMessageHour;
void OnTimer() {
   if(AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      if(TimeDay(TimeLocal()) != TimeDay(_date)) {
         _date = TimeLocal();

         if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
            _isAuthorized = true;
            Print("口座認証に成功しました。");
         } else {
            _isAuthorized = false;
            Alert("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
            ExpertRemove();
         }
      }
   }

   if(TimeHour(TimeLocal()) != _receiveMessageHour) {
      _receiveMessageHour = TimeHour(TimeLocal());
      string message = Auth_GetApplicationMessage(MQLAUTH_ID, APPLICATION_NAME);

      if(message != "") {
         ObjectSetString(ChartID(), _labelName, OBJPROP_TEXT, message);
      }
   }
}
//+------------------------------------------------------------------+

 

yuki
yuki
MT4のラベルは半角だと63文字、全角だと31文字までしか書けないので注意が必要です。Comment()やPrint()を利用するなど、工夫してみてくださいね
カオチャイ
カオチャイ
なお、こちらのコードをそのまま使う場合は下記の2箇所を修正してくださいね

#define MQLAUTH_ID “” //””内に自分のMQLAUTH_IDを記入する

#define APPLICATION_NAME “” // “”内に自分の登録したEA・インジケーター名に書き換える(※ユーザー名ではないので注意)

インジケーターのカスタマイズ色々
MQLコードでEAをカスタマイズ
【MQLコード解説】EA・インジケーターのカスタマイズ【体験版・LINE通知】EAやインジケーターに口座番号認証を実装する方法を紹介しています。 認証システムにはMQLAuthを利用して解説していきます。...
インジケーターカスタマイズ参考記事
アップデート自動通知
EAアップデート時に自動でMT4のアラートを表示する機能を追加する https://interactivebrokers.work/start_mqlauth/ アップデートのお知らせとは? ...
体験版EA
自動的に期限付き体験版になる機能をEAに追加する方法 https://interactivebrokers.work/start_mqlauth/ 体験版機能を使うとなにができる?...
バイナリーオプションツールに認証をつける
バイナリーオプションのインジケーターに口座認証を実装する方法 https://interactivebrokers.work/start_mqlauth/ 口座番号認証はパスワードよりも安...
インジケーターのバックテスト&リペイントチェック代行サービスMT4やMT5に関するツールを作成する際の流れを説明しています。 シストレファクトリーでは一からEAの制作以外にもツールの修正や、統計的なアプローチができるソフトなどお客様の欲しいツールを形にいたします。...