
※MQLAuth = エム・キュー・エル・オースと呼びます
目次
MQLAuth認証サービスとは?

MQLAuth認証サービスは従来、個人の開発者では導入の敷居が高かったサーバー認証を、月額制で手軽に導入できるサービスです。
MQLAuthはMT4やMT5の口座番号を読み取り、MQLAuthサーバー内に登録されていないMT4では動かないようにします。
利用料金
MQLAuth登録者数 | 料金 |
5人まで | 無料 |
20人まで | 1650円(税込) |
30人まで | 2200円(税込) |
50人まで | 3300円(税込) |
100人まで | 5500円(税込) |
以降10人増えるごとに | 550円(税込)加算 |
MQLAuthで口座番号認証するためにはMQLAuthシステムの月額利用料金が必要です。(登録者5人までなら永久に無料)
利用料金は月額制になっており、登録人数(課金者数)により毎月の利用料が決まる後払い方式です。
EAやインジケーターにつける認証の種類
MQLAuth認証サービス以外にも、不正コピーを防ぐための認証方法は存在します。
ここではMQLAuthの比較対象として、①従来の口座番号認証、②パスワード認証、③サーバーを使った認証方法のそれぞれの特徴を解説します。
①MT4の口座番号認証
この認証方法は、MT4の左上に表示される口座番号をmq4ファイルに書き込んでコンパイルし、EAやインジケーターを指定したMT4でのみ動かせるようにする仕組みです。
一度実装してしまえば破るのは難しく、セキュリティは高い反面、一人一人の利用者に口座番号を教えてもらい、それをコードへ直接打ち込んでコンパイルする作業があるため、大人数への配布や、利用期限を設定しての無料配布などは敷居が高いです。
また、EAやインジケーターのアップデートを行う場合に、当然アップデートしたファイルには書き込んだ口座番号は引き継がれないため、再び一つずつ口座番号を打ち込む手間が発生します。
②パスワード認証

こちらは利用の際にパスワードを入力してもらい、認証する方法です。
実装は比較的簡単でお手軽ですが、どうしてもEA配布とセットでパスワードを伝える必要がありますので、パスワード流出の懸念は拭えず、セキュリティはかなり低いです。
パスワードが分かれば複数人で一つのEAを使い回すことも可能ですので、無料配布のツールには問題ないですが、販売向けのEAやインジケーターに実装するとなると少々不安が残ります。
③サーバーを使った認証
こちらはMQLAuthと同じサーバー認証で、MT4の口座番号を利用する方法がポピュラーですが、個人で構築すると非常にコストがかかります。
まず認証専用のサーバーを立ち上げる部分を自作できればいいのですが、専門の知識が必要になるため大抵は難しく、外注の場合は10万円以上がかかります。そしてそこへ毎月のサーバー維持費もかかってきます。
メリットとしては強力なセキュリティと、カスタマイズが自由なこと。そしてたくさん配布しても認証番号を直接打ち込む労力がなく、アップデートにも対応できますが、個人で導入されている方はほぼいらっしゃらないのが現実です。
MQLAuthシステムを使った口座番号認証
口座認証失敗時のメッセージなども表示可能
それではMQLAuth認証システムを使ったMT4の口座番号認証を解説していきます。
基本的な仕組みとしては、記事前半でご紹介したサーバー経由の口座番号認証になりますが、認証専用サーバーや管理画面はすでに用意されているので、システムの立ち上げのわずらわしさやコストに関しては大幅に削減されており、個人の開発者さんも気軽に利用することができます。
また、認証だけでなくEAの遠隔停止や警告メッセージをMT4のチャート上に表示することもできます。
MQLAuthを使った認証には口座番号認証とパスワード認証の2つがありますが、ここでは管理の手間が楽で、セキュリティの面からも優秀な口座番号認証を解説していきます。
口座番号認証はパスワードのような入力の必要がありませんし、MQLAuthを使えばお客さんが自由に口座番号の変更もできますので開発者様の手間が省けます。

MQLAuth認証システムの実装方法
まずはMetaEditorでEAの.mq4を作ります

新規作成でファイルを作ります(画像はクリックで拡大できます)

名前はお好きなものをつけて下さい

認証にはOnTimerを利用するので、チェックを入れます。

テスターイベントハンドラは使わないのでそのまま「完了」

これでMetaEditorで自動生成されるEAのテンプレートが表示されました。
それではEAに口座番号認証機能を実装していきましょう
#define MQLAUTH_ID "" // 追加した行
#define APPLICATION_NAME "" // 追加した行
#property copyright "©2020 MT4ツール製作【シストレファクトリー】"
#property link "https://interactivebrokers.work/"
#property version "1.00"
#property strict
まずはMQLAUTH_IDとAPPLICATION_NAMEをdefineで宣言します。
MQLAUTH_IDにはご自身のMQLAuthIDを、APPLICATION_NAMEにはこちらで登録したEA・インジケーター名を入れてくださいね。
https://mql-auth.com/Home/Manual#menu6-3
MQLAuthはデフォルトでは2回目の認証以降はキャッシュを使うため、1日ごとに認証を行う等、MT4を起動してから一定期間ごとに認証を行う場合は、実装するEAに以下のコードを追記する必要があります。
#define HTTP_QUERY_FLAG -2147483648
このコードは、必ずMQLAuth.mqhをインクルードするコードの前に追加してください。
#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
MQLAuthのインクルードファイルをインクルードします。MT4を起動した後に何度も認証を行うときは、HTTP_QUERY_FLAGも宣言する必要があります。HTTP_QUERY_FLAGの宣言はインクールドの前に書きます。
int OnInit()
{
//--- create timer
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
OnTimer()を1秒おきに実行するように変更しておきます。
datetime _date; // 追加した行
void OnTimer()
{
}
OnTimer()内に、日付が変わったときに認証を行うコードを書きます。まずは日付が変わったかどうかを調べるため、日付を格納しておくグローバル変数を用意します。
datetime _date;
void OnTimer()
{
if(TimeDay(TimeLocal()) != TimeDay(_date)){ // 追加した行
_date = TimeLocal(); // 追加した行
} // 追加した行
}
_dateに入っている日付が現在の日付と違っていたら、日付が変わったと判断して認証を行います。TimeDay関数で、現在のローカル時刻の日付を取得し、_dateの日付と比較しています。
datetime _date;
void OnTimer() {
if(AccountInfoInteger(ACCOUNT_LOGIN) != 0) { // 追加した行
if(TimeDay(TimeLocal()) != TimeDay(_date)) {
_date = TimeLocal();
}
} // 追加した行
}
MT4が証券会社にログインするまではAccountInfoInteger(ACCOUNT_LOGIN)が0を返すので、ログインしてから認証するようにします。
口座認証部分を書く
datetime _date;
bool _isAuthorized = false; // 追加した行
void OnTimer() {
if(AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
if(TimeDay(TimeLocal()) != TimeDay(_date)) {
_date = TimeLocal();
}
}
}
認証状態を表すbool変数 _isAuthorized を用意します。初期状態はfalseにして、認証されていない状態にしておきます。
datetime _date;
bool _isAuthorized = false;
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();
}
// ここまで追加
}
}
}
AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)は口座番号認証が成功したらtrueを返します。
口座認証に成功したら_isAuthorizedにtrueを入れ、口座認証に失敗したらアラートで警告を出して_isAuthorizedにfalseを入れます。お好みで、ExpertRemove()でEAをチャートからはがします。
void OnTick() {
if(!_isAuthorized) return; // 追加した行
// EAの処理
}
あとはOnTick()の先頭で、_isAuthorizedがfalseのときはreturnして、その後ろに通常通りEAの内容を書いていけば、日付が変わるときに口座番号認証をするEAの完成です。
しかし、このままだとバックテストができません。なぜなら、バックテストではOnTimer()が動かないからです。そこで、バックテストの場合はOnInit()で認証するようにします。
int OnInit() {
// ここから追加
if(IsTesting()) {
if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
_isAuthorized = true;
Print("口座認証に成功しました。");
} else {
_isAuthorized = false;
Print("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
ExpertRemove();
}
}
// 追加ここまで
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
これでようやく完成です。
MQLAuth認証システムにユーザー登録を行い口座を登録

ユーザー管理画面より【ユーザーの登録】を選びます

必要事項を入力していきます
これで認証手続きが完了し、MT4でEAの利用ができるようになりました
今回作成したmqlのコード
//+------------------------------------------------------------------+
//| 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 |
//+------------------------------------------------------------------+
int OnInit()
{
if(IsTesting()) {
if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
_isAuthorized = true;
Print("口座認証に成功しました。");
} else {
_isAuthorized = false;
Print("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
ExpertRemove();
}
}
EventSetTimer(1);
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;
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();
}
}
}
}
//+------------------------------------------------------------------+
#define MQLAUTH_ID “” //””内に自分のMQLAUTH_IDを記入する
#define APPLICATION_NAME “” // “”内に自分の登録したEA・インジケーター名に書き換える(ユーザー名ではないので注意)
Q、ファイルが2つに分かれているインジケーターはそれぞれに料金がかかりますか?
ご自身でMQLAuthを実装される場合、ファイルが複数でもMQLAuth上には1つのインジケーターとして登録し、各ファイルからその登録情報を利用すれば、2つを1つのインジケーターとしてご利用できます。その場合、月額利用料も1つのEAに登録された口座縛り分でOKです。
(※ファイルをそれぞれ独立してMQLAuthに登録しますと、2つのファイルでしたら
2ファイル×口座縛り分の人数が月額料金としてかかってきますので、ご自身で実装される場合はご注意ください。)
なお、MQLAuthを実装代行サービスをご利用される場合の実装代金については、
実装するファイルの個数分の料金を頂戴いたしますのでご注意ください。








