特定のEA利用者のMT4にメッセージを表示させる方法

メッセージ送付機能
yuki
yuki
今回は、日付が変わるときに口座番号認証をするEAを作る手順で作ったEAに、特定の利用者にピンポイントでメッセージを表示する機能を追加する方法をご説明します
カオチャイ
カオチャイ
基本的にはMQLAuthでEA利用者全員にメッセージを表示する方法と同じですが、口座番号認証の人とパスワード認証の人で少しだけ方法が異なります
yuki
yuki
こちらの機能は無料でご利用できますが、MQLAuth.mqhのバージョン1.04以降が必要ですので、まだご利用の準備ができていない方は下記の記事を参考にしてくださいね
カオチャイ
カオチャイ
自分でつけるのが面倒くさいという方はシストレファクトリーのMQLAuth実装代行のサービスもご利用くださいね!
MQLAuth準備編
MQLAuthシステムを利用するための事前準備 MQLAuthを使うための準備 MQLAuthシステムを使う前提条件として「インジケーターをMT4の口座番号やパスワードで縛って管...

個別メッセージ機能はこんなときに便利

MT4にメッセージ表示

個別メッセージ機能は、特定のユーザーがMT4にインジケーターをセットした時やMT4を立ち上げたタイミングでチャート上に表示されます。

相手の連絡先がわからなくても、メッセージを個別に表示できるのが利点です。

警告機能としても優秀で、例えばIBのEAを提供している場合などに、最低ロットを定めているのにそのルールを破って0.1などの小ロットで運用しているユーザーはコピーツールを利用している可能性が高いので、そのような場合にこの個別メッセージでの警告は非常に効果があります。

 

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

MQLAuth管理画面の設定

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

 

管理画面

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

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

 

ソースコードの編集

string _labelName = "userMessage"; // 追加した行
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);
}

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

MQLAuthでEA利用者全員にメッセージを表示する方法で機能を既に追加している方は、ラベル名が重複しないようにご注意ください。

 

カオチャイ
カオチャイ
ここまで書けましたら、次で口座番号認証とパスワード認証の2種類の方法をご説明していきますね

 

①口座番号認証の場合

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

   string message = Auth_GetUserMessageByAccountNumber(MQLAUTH_ID, APPLICATION_NAME); // 口座番号認証の場合
}

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

 

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

   string message = Auth_GetUserMessageByAccountNumber(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_GetUserMessageByAccountNumber(MQLAUTH_ID, APPLICATION_NAME);

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

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

 

MT4のメッセージMT4チャート画面の上部にメッセージが表示されるようになりました。

 

カオチャイ
カオチャイ
更新時間の設定を何も指定しないと1秒に1回サーバーにデータを取りに行きます。60秒間に10回以上アクセスがあるとアクセス禁止になりますので注意してくださいね

 

②パスワード認証の場合

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

   string message = Auth_GetUserMessageByPassword(MQLAUTH_ID, APPLICATION_NAME, _password); // パスワード認証の場合
}

MQLAuthで設定したメッセージを取得します。変数_passwordを準備するのを忘れずに。

 

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

   string message = Auth_GetUserMessageByAccountNumber(MQLAUTH_ID, APPLICATION_NAME, _password);

   // ここから追加
   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_GetUserMessageByAccountNumber(MQLAUTH_ID, APPLICATION_NAME, _password);

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

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

 

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 = "userMessage";
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_GetUserMessageByAccountNumber(MQLAUTH_ID, APPLICATION_NAME); // 口座番号認証の場合
      
      if(message != "") {
         ObjectSetString(ChartID(), _labelName, OBJPROP_TEXT, message);
      }
   }
}
//+------------------------------------------------------------------+

 

パスワード認証の場合)

//+------------------------------------------------------------------+
//|                                                   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

input string _password = "password"; // パスワード
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
string _labelName = "userMessage";
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_GetUserMessageByPassword(MQLAUTH_ID, APPLICATION_NAME, _password); // パスワード認証の場合
      
      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・インジケーター名に書き換える(※ユーザー名ではないので注意)

 

メッセージ送付機能
配布したEA利用者のMT4にメッセージを一斉配信する方法 https://interactivebrokers.work/start_mqlauth/ 一斉送信機能で確実な宣伝が可能に...
MQLAuth準備編
MQLAuthシステムを利用するための事前準備 MQLAuthを使うための準備 MQLAuthシステムを使う前提条件として「インジケーターをMT4の口座番号やパスワードで縛って管...
体験版EA
自動的に期限付き体験版になる機能をEAに追加する方法 https://interactivebrokers.work/start_mqlauth/ 体験版機能を使うとなにができる?...
バイナリーオプションツールに認証をつける
バイナリーオプションのインジケーターに口座認証を実装する方法 https://interactivebrokers.work/start_mqlauth/ 口座番号認証はパスワードよりも安...