【ソースコード付】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とし、リアル口座の場合だけ口座番号チェックをかける。
ここから先は
¥ 2,000
この記事が気に入ったらサポートをしてみませんか?