個別メッセージ機能はこんなときに便利
個別メッセージ機能は、特定のユーザーがMT4にインジケーターをセットした時やMT4を立ち上げたタイミングでチャート上に表示されます。
相手の連絡先がわからなくても、メッセージを個別に表示できるのが利点です。
警告機能としても優秀で、例えばIBのEAを提供している場合などに、最低ロットを定めているのにそのルールを破って0.1などの小ロットで運用しているユーザーはコピーツールを利用している可能性が高いので、そのような場合にこの個別メッセージでの警告は非常に効果があります。
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利用者全員にメッセージを表示する方法で機能を既に追加している方は、ラベル名が重複しないようにご注意ください。
①口座番号認証の場合
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チャート画面の上部にメッセージが表示されるようになりました。
②パスワード認証の場合
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回更新するようにしてみました。これで完成です。
こんな感じで表示されるようになります。
今回作成したコード
(口座番号認証の場合)
//+------------------------------------------------------------------+
//| 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);
}
}
}
//+------------------------------------------------------------------+
#define MQLAUTH_ID “” //””内に自分のMQLAUTH_IDを記入する
#define APPLICATION_NAME “” // “”内に自分の登録したEA・インジケーター名に書き換える(※ユーザー名ではないので注意)