MT4のEAやインジケーターにサーバー認証(口座番号縛り)を実装する方法

EAやインジケーターに認証をつける方法
yuki
yuki
この記事ではMQLAuth認証サービスを使って、EAやインジケーターにサーバー認証(口座番号縛り)を実装する方法を解説していきます。
カオチャイ
カオチャイ
MQLAuth認証システムは5口座までの縛りなら自前のサーバーをレンタルする必要がなく無料でご利用できますが、MQLAuth.mqhのバージョン1.02以上がインストールされている必要がございますので、まだ準備ができていない方は事前準備の記事を参考にしてくださいね!
yuki
yuki
自分で認証をつけるのが難しいという方はシストレファクトリーのMQLAuth実装代行のサービスもご利用くださいね!(要mq4ファイル)
MQLAuth準備編
MQLAuthシステムを利用するための事前準備 MQLAuthを使うための準備 MQLAuthシステムを使う前提条件として「インジケーターをMT4の口座番号やパスワードで縛って管...

※MQLAuth = エム・キュー・エル・オースと呼びます

MQLAuth認証サービスとは?

サーバー認証のしくみ

 

MQLAuth認証サービスは、個人の開発者では導入やコストの問題で敷居が高かったサーバー認証を手軽に導入できるサービスです。

MQLAuthはMT4やMT5の口座番号を読み取り、MQLAuthサーバー内に登録されていない口座番号のMT4では動かない縛りをつけることで、コピーや二次配布を防ぐことができます。

EAやインジケーターへの実装自体は開発者さんが自分で実装することができ、毎月の利用者数によってMQLAuth運営会社にサーバーレンタル料を支払うというシステムです。(1口座あたり月額50円~80円)

yuki
yuki
口座番号縛りだけでなく、無料お試し期間付与や、遠隔での利用停止、チャートへのメッセージ表示などもできる通常のサーバー認証の上位互換なシステムです 
カオチャイ
カオチャイ
ご自身で実装するのが難しいという方は下記のサービスもご利用くださいね
MQLAuthサーバー認証実装代行サービスはこちら
EAインジケーターに口座番号認証を実装
EAやインジケーターに口座縛りをつけてコピー対策【MQLAuth実装代行】 ※MQLAuth(エム・キュー・エル・オースと呼びます) MQLAuthのイメージ こちらは口座番号を登録するM...

 

口座数で決まる認証サーバーのご利用料金

MQLAuthシステム月額利用料
MQLAuth登録者数 料金
5人まで 無料
20人まで 1650円(税込)
30人まで 2200円(税込)
50人まで 3300円(税込)
100人まで 5500円(税込)
以降10人増えるごとに 550円(税込)加算
登録可能なEA・インジケーター数 上限なし

MQLAuthシステムはで口座番号認証するためにはMQLAuthシステムの月額利用料金が必要です。(登録者5人までなら永久に無料

利用料金は月額制になっており、EAやインジケーター登録は制限なしで、登録人数(課金者数)により毎月の利用料が決まる後払い方式です。

カオチャイ
カオチャイ
通常はシステム構築だけで10万円以上するサーバー認証のシステムが一人あたり月額50円~80円でご利用いただけますよ!

 

EAやインジケーターにつける認証の種類

MQLAuthのサーバー認証を解説する前に、用途によっては別の方法が適しているという場合もあるので、他の認証方法も解説しておきましょう。

ここではMQLAuthの比較対象として、①従来のコードに書き込む口座番号認証、②パスワード認証、③自前サーバーを使った認証方法のそれぞれの特徴を解説します。

 

①MT4の口座番号をコードに直接書き込む認証方法

この認証方法は、MT4の左上に表示される口座番号をEAやインジケーターのmq4ファイルに直接書き込んで、指定した口座番号のMT4でのみ動かせるようにする仕組みです。

一度実装してしまえば破るのは難しくてセキュリティは高い反面、あとから口座番号を変更したいという依頼があった場合に配布元の修正作業が発生します。

また、一人一人の利用者に口座番号を教えてもらい、それをコードへ直接打ち込んでコンパイルする作業は売れれば売れるほど苦しくなっていきますので、大人数への配布や利用期限を設定しての無料配布などは敷居が高いです。

あと最近問題になっている点として、もしEAやインジケーターにバグが見つかった場合は修正したファイルを配布しますが、この認証方式の場合、再び一つずつ口座番号を打ち込む作業が発生します。

その手間を煩わしいと考え、EAやインジケーターのアップデートがされることなく売りっぱなしでそのまま消えてしまう事案も多く存在します。

カオチャイ
カオチャイ
EAやインジケーターの勉強グループなどでは、この認証方法については定期的に注意喚起されており、評判はよろしくないですね

 

②mq4ファイルの直接書き込むパスワード認証

インジケーターのパスワード認証

こちらは利用に必要なパスワードをコードに直接書いておき、利用者にはEAやインジケーターのパラメータ画面からパスを入力してもらって認証する方法です。

実装は比較的簡単でお手軽ですが、どうしても配布とセットでパスワードを伝える必要がありますのでパスワード流出の懸念は拭えず、セキュリティはかなり低いです。

パスワードが分かれば複数人で一つのEAを使い回すことも可能ですし、あとからパスワードの変更もできないので、販売向けのEAやインジケーターに実装するとなるとセキュリティ面では残念ながら頼りになりません。

yuki
yuki
ちなみに直接コードに書き込むパスワード認証とは別で、MQLAuthサーバーを使ったパスワード認証ですと、遠隔で後からパスを変更できるようになります
カオチャイ
カオチャイ
その場合、例えばこちらのインジケーターのように無料配布しておき、利用者が十分に増えた時点でパスワードを変更し、有料への移行を促すといったことも可能になります

 

③自前のサーバーを使った認証

こちらはMQLAuthと同じサーバー認証で、MT4の口座番号縛りを利用しますが、自前でサーバーを構築するデメリットとして時間とコストがかかります。

まず認証専用のサーバーを立ち上げる部分を自作できればいいのですが、専門の知識が必要になるため難しく、外注の場合は10万円以上がかかります。そしてそこへ毎月のサーバー維持費もかかってきます。

メリットとしては強力なセキュリティと、カスタマイズが自由なこと。そしてたくさん配布しても認証番号をファイルごとに直接打ち込む労力がなく、アップデートにも対応できますが、個人で導入されている方はほぼいらっしゃらないのが現実です。

 

MQLAuthシステムを使った口座番号認証

口座認証時のエラーメッセージ口座認証失敗時のメッセージなども表示可能

 

それではMQLAuth認証システムを使ったMT4の口座番号認証を解説していきます。

基本的な仕組みとしては、さきほどご紹介したサーバーを使った口座番号認証になりますが、サーバーや管理画面はすでに用意されているので、システムの立ち上げのわずらわしさやコストに関しては大幅に削減されており、個人の開発者さんも気軽にサーバー認証を導入することができます。

また、認証だけでなく無料お試し期間の設定やEAの遠隔停止、警告メッセージやアップデートのお知らせをMT4のチャート上に表示することもできます。

MQLAuthを使った認証には口座番号認証とパスワード認証の2つがありますが、ここでは管理の手間が楽で、セキュリティの面からも優秀な口座番号認証を解説していきます。

MQLAuthの口座番号認証はお客さんが自由に後から口座番号の変更もできますので、開発者様の手間が省けます。

 

MQLAuth認証システムの実装(コード解説)

yuki
yuki
ここからはMQLAuthサーバーを使った口座番号認証を、EAに実装するコードを解説してきます
カオチャイ
カオチャイ
実装が難しい!面倒くさい!という方はこちらの実装代行サービスをご利用くださいね

 

まずはMetaEditorでEAの.mq4を作ります

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

 

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

 

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

 

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

 

これでMetaEditorで自動生成されるEAのテンプレートが表示されました。

 

MQLAuthサーバー認証を実装していきます

#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);
}

これでようやく完成です。

 

カオチャイ
カオチャイ
EA側の作業はこれで終わりですが、この後に、サーバー側のMQLAuthにMT4口座の認証許可をもらうための登録をおこないます

 

MQLAuth認証システムにユーザー登録を行い口座を登録

yuki
yuki
完成したEAが取得する口座番号を、下記の手順でMQLAuth認証システムに事前に登録することで利用許可がおります

 

ユーザー登録

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

 

口座認証管理画面

必要事項を入力していきます

 

口座番号認証管理画面ここに登録された口座番号のMT4のみ、EAが稼働します

 

今回作成したMQLAuthサーバー認証のコード

//+------------------------------------------------------------------+
//|                                                   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();
         }
      }
   }
}
//+------------------------------------------------------------------+

 

カオチャイ
カオチャイ
以上で基本的なMQLAuthサーバー認証の実装は完成です。おつかれさまでした!
yuki
yuki
上記のコードをそのままコピペで使う場合は下記の2箇所を修正すればOKですよ!

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

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

 

Q、ファイルが2つに分かれているインジケーターはそれぞれに料金がかかりますか?

ご自身でMQLAuthを実装される場合、ファイルが複数でもMQLAuth上には1つのインジケーターとして登録し、各ファイルからその登録情報を利用すれば、2つを1つのインジケーターとしてご利用できます。その場合、月額利用料も1つのEAに登録された口座縛り分でOKです。

(※ファイルをそれぞれ独立してMQLAuthに登録しますと、2つのファイルでしたら
2ファイル×口座縛り分の人数が月額料金としてかかってきますので、ご自身で実装される場合はご注意ください。)

なお、MQLAuthを実装代行サービスをご利用される場合の実装代金については、
実装するファイルの個数分の料金を頂戴いたしますのでご注意ください。

 

EAインジケーターに口座番号認証を実装
EAやインジケーターに口座縛りをつけてコピー対策【MQLAuth実装代行】 ※MQLAuth(エム・キュー・エル・オースと呼びます) MQLAuthのイメージ こちらは口座番号を登録するM...

 

認証を実装したらこのあたりから挑戦してみましょう
アップデート自動通知
EAアップデート時に自動でMT4のアラートを表示する機能を追加する https://interactivebrokers.work/start_mqlauth/ アップデートのお知らせとは? ...
インジケーターからLINE通知を送る方法
EA・インジケーターからLINEにメッセージを送信する方法 https://interactivebrokers.work/start_mqlauth/ LINEでメッセージを送信 ...
MT4からブラウザを開く方法
MT4のチャートに表示させた文字列をクリックでブラウザを開いてみよう https://interactivebrokers.work/start_mqlauth/ MT4からブラウザを開くとなにが...
メッセージ送付機能
配布したEA利用者のMT4にメッセージを一斉配信する方法 https://interactivebrokers.work/start_mqlauth/ 一斉送信機能で確実な宣伝が可能に...
インジケーターのカスタマイズ色々
MQLコードでEAをカスタマイズ
【MQLコード解説】EA・インジケーターのカスタマイズ【体験版・LINE通知】EAやインジケーターに口座番号認証を実装する方法を紹介しています。 認証システムにはMQLAuthを利用して解説していきます。...
EA・インジケーター制作などのご依頼はこちら
インジケーターのバックテスト&リペイントチェック代行サービスMT4やMT5に関するツールを作成する際の流れを説明しています。 シストレファクトリーでは一からEAの制作以外にもツールの修正や、統計的なアプローチができるソフトなどお客様の欲しいツールを形にいたします。...
EA&インジケーター制作代行
【MT4&MT5】EA&インジケーター制作代行承ります EA&インジケーター制作代行とは? EA&インジケーター制作代行では、皆さんが日頃使っている手法をMT4(MT5)でエントリーサイ...
バックテストの代行
バイナリーオプションの精度の高いバックテスト代行承ります業務用の価格データを使ったバイナリーオプションのバックテストを承っています。 アナライザーで分析可能な状態でデータをお渡しするので、後から時間や曜日などを変更して分析が可能です。...