yuki
今回は、日付が変わるときに口座番号認証をするEAを作る手順で作ったEAに、EA利用者全員にメッセージを表示する機能を追加する方法をご説明します
カオチャイ
新商品をリリースした際に既存のお客さんにお知らせしたり、大きな指標前にEA停止を推奨したりするのに便利ですよ!
yuki
この機能は無料でご利用できますが、MQLAuth.mqhのバージョン1.03以上がインストールされている必要がございますので、まだ準備ができていない方は下記の記事を参考にしてくださいね!
カオチャイ
自分でつけるのが面倒くさいという方はシストレファクトリーのMQLAuth実装代行のサービスもご利用くださいね!
MQLAuthシステムを利用するための事前準備
MQLAuthを使うための準備
MQLAuthシステムを使う前提条件として「インジケーターをMT4の口座番号やパスワードで縛って管...
一斉送信機能で確実な宣伝が可能になります
MQLAuthの一斉送信機能は配布したEAやインジケーターのMT4のチャート上に数秒間メッセージを表示するものです。(どのEAに表示させるかも、MQLAuth管理画面より選択することが出来ます)
このメッセージ機能を使えば新しいEAの告知を行うことも容易ですし、応用すればテキストから自社HPへリンクを飛ばすことも出来ますので、マネタイズや広告収入を得ることにも応用できます。
【コピペでOK】MT4のチャートから飛ばすURLをソースコードを編集せずに、MQLAuthの管理画面から変えられるようにする
https://interactivebrokers.work/start_mqlauth/
メッセージのURL変更を簡単に
...
MQLAuth管理画面の設定
まず、表示するメッセージと表示する期間を設定します。MQLAuthメイン画面から【EA・インジケーター管理】を選び、メッセージを付けたいEA・インジケーターの【編集】をクリックします。
編集画面に進むと【この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にはこんな感じで表示されるようになります。
今回作成したコード
//+------------------------------------------------------------------+
//| 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
MT4のラベルは半角だと63文字、全角だと31文字までしか書けないので注意が必要です。Comment()やPrint()を利用するなど、工夫してみてくださいね
カオチャイ
なお、こちらのコードをそのまま使う場合は下記の2箇所を修正してくださいね
#define MQLAUTH_ID “” //””内に自分のMQLAUTH_IDを記入する
#define APPLICATION_NAME “” // “”内に自分の登録したEA・インジケーター名に書き換える(※ユーザー名ではないので注意)
インジケーターのカスタマイズ色々
【MQLコード解説】EA・インジケーターのカスタマイズ【体験版・LINE通知】EAやインジケーターに口座番号認証を実装する方法を紹介しています。
認証システムにはMQLAuthを利用して解説していきます。...
インジケーターカスタマイズ参考記事
EAアップデート時に自動でMT4のアラートを表示する機能を追加する
https://interactivebrokers.work/start_mqlauth/
アップデートのお知らせとは?
...
自動的に期限付き体験版になる機能をEAに追加する方法
https://interactivebrokers.work/start_mqlauth/
体験版機能を使うとなにができる?...
バイナリーオプションのインジケーターに口座認証を実装する方法
https://interactivebrokers.work/start_mqlauth/
口座番号認証はパスワードよりも安...
インジケーターのバックテスト&リペイントチェック代行サービスMT4やMT5に関するツールを作成する際の流れを説明しています。
シストレファクトリーでは一からEAの制作以外にもツールの修正や、統計的なアプローチができるソフトなどお客様の欲しいツールを形にいたします。...