見出し画像

【ソースコード付】MT4用EAの簡易WEB認証システムを作ろう(PHP)

EAのWeb認証システムとは?

EAを正規のユーザーにだけ使ってもらうために、Webサーバーと通信してアカウントの有効性を確認する仕組みです。
仕組みとしては、ゴゴジャンやレッツリアルなどで採用されている方法です。(全く同じかは分かりません)

EAをIB紐づけ配布されている方で、口座番号を紐づけて大量にビルドしている方をみかけますが、Web認証のほうが管理は楽です。
EAをバージョンアップしたら、また大量に再ビルドするんですかね…
何かあれば、あとから特定のユーザーを使えなくすることもできます。

このnoteは有料にしていますが、コアな部分は無料部分にほぼ書いていますので、MQL言語、サーバー側の言語(今回はPHP)での開発に慣れている方であれば、有料部分を買う必要はないかと思います。

Web認証のデメリット

サーバー側で管理でき、ビルドしなおす必要がないという大きなメリットがありますが、デメリットもあります。
それは、認証サーバーが止まったらEAが使えなくなるということ。この記事の例では、認証に失敗したらEAを使えなくしています。アカウント管理機能としては想定通りな反面、認証サーバーが何らかの原因で停止したときに、全EAユーザーが一気に使えなくなる!という最悪のシナリオがありえます。
今回の記事では触れませんが、すぐEA機能停止するのではなく、5回連続で認証失敗したら停止、とかのロジックを組んでもよいかもしれません。

認証のロジックとコード

単純に「口座番号」だけで認証するようにします。
認証タイミングは、EAをセットしたときです。
認証に失敗したら、強制的にEAをチャートから剝がしてメッセージをだします。

mql4コード web_auth_sample_01.mq4

記事本文には、必要な部分だけ以下にコード載せますが、エラーなくコンパイルできるファイルは下からダウンロード可能です。

OnInitのタイミング(EAをセットした直後)に、web_authという関数で通信し、WEBサーバーから「OK」という文字列が返ってきたら、認証OKとしてEAが動作します。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//WEB認証を実行
   if(web_auth())
     {
      //成功
      Comment("認証に成功しました");
      return(INIT_SUCCEEDED);
     }
   else
     {
      //失敗
      MessageBox("認証に失敗しました。","WEB認証エラー",MB_OK);
      return(INIT_FAILED);
     }
//---

  }
//+------------------------------------------------------------------+
//| WEB認証                                                          |
//+------------------------------------------------------------------+
bool web_auth()
  {
   bool ret = false;
//接続先URL
   string postURL = "https://api.myfxlogger.com/note_test_01.php";
//アカウント番号を送信する
   string datastr = "accountnum="+IntegerToString(AccountNumber());
//タイムアウト時間(ミリ秒)
   int timeout = 5000;
   char post[],result[];
   string cookie = NULL,headers;
   ArrayResize(post,StringToCharArray(datastr,post,0,WHOLE_ARRAY,CP_UTF8)-1);
   int rest = WebRequest("POST", postURL, cookie, NULL, timeout, post, 0, result, headers);
   if(rest==200)
     {
      string ret_str = CharArrayToString(result);
      if(ret_str == "OK")
        {
         //OKという文字列が返ってきたら認証成功
         ret = true;
        }
     }
   return ret;
  }
//+------------------------------------------------------------------+

上記ファイルのダウンロードは以下からどうぞ。

MT4の設定

MT4で、通信するWebサーバーとの通信を許可する必要があります。
[ツール]→[オプション]→[エキスパートアドバイザ]の中の「WebRequestを許可するURLリスト」にチェックを入れ、通信するURLのドメイン名までを入力します。上のソースの例だと以下の通りです。

PHPコード note_test_01.php

口座番号が「13040356」なら「OK」という文字列を、そうでなければ「NG」という文字列を返します。

<?php
if(isset($_POST['accountnum']) && $_POST['accountnum']=='13040356'){
	echo 'OK';
}else{
	echo 'NG';
}

上記ファイルのダウンロードは以下からどうぞ。

以上、超簡単でしたね!!
Webサーバーの契約やPHPの設置方法などは、てきとうにググってください。

有料コードのロジック

この先の有料部分では、もうすこし実用に近づけて、以下の動作をする別のサンプルをのせています。

  • 起動時だけではなく、24時間ごとに認証チェックをかける。

  • 複数の口座番号を準備しておき、その中から合致したら認証OKとする。

  • デモ口座は必ず認証OKとし、リアル口座の場合だけ口座番号チェックをかける。

ここから先は

3,109字 / 2ファイル

¥ 2,000

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?