MetaTrader口座認証サービス 挿入コードの解説

注意

このページではMetaTrader口座認証サービスの制限コードを書き込む方法をお伝えします。
内容は難しくありませんが、MQLについて理解されている方向けに書いているため
少しでも疑問点がある場合はお気軽にお問合せください。
短い間隔でサーバーに問い合わせし続けるといったコードを書いてしまうと認証エラーだけでなく、
サーバーに負荷がかかってサービス全体が停止となる可能性がありますのでご注意ください。

必要なパーツ

1.import文を冒頭に書く

Oninitよりも上、コードの先頭部分に下記のimport文を入れてください。
※MT5用は”MT5Inet.dll”に変更してください

#import "MT4Inet.dll" bool CheckKozaNo(string userName, string kozaNo, string expertName);
#import

2.パラメータとしてUserNameを指定しておく

お客様専用のIDをお伝えしますので、それをパラメータ「UserName」として設定しておきます。

string UserName = "User1234"; // ユーザー名

3.CheckKozaNo関数を使って認証判定をさせる

認証を行いたい部分に下記関数を入れます。
認証が通ればtrueが返ってきます。

CheckKozaNo(UserName, (string)AccountNumber(), WindowExpertName())

trueならそのまま稼働許可、falseならEAを外したり実行させない等の処理を行ってください。

例) EAのOnInitで認証チェックし、NGが出たらEAをチャートから外すコード
int OnInit()
{ if (CheckKozaNo(UserName, (string)AccountNumber(), WindowExpertName()) == false) { Alert("AccountNumber limitation"); ExpertRemove(); return(INIT_FAILED); } else { Print("AccountNumber OK"); } return(INIT_SUCCEEDED);
}

※CheckKozaNo関数をOnTick()やOnCalculate()で呼び出す場合は1分間に1回までに抑えてください
OnInitで1回だけ認証するのが基本ですが、
サーバー状況によってはエラーが出る場合もあるためOnTick()で実行させるパターンでも良いです。

ただしティックごとに認証が起きるとサーバーが壊れてしまうため
・認証が通った後は関数の実行をさせないようにする
・関数呼び出し自体を1分間に1回までに抑える(iBars(NULL,PERIOD_M1)を使って制限してください)
となるようにしてください。


具体的なコード例

■□■□■□■□■□■□■□■□■□■□ で囲まれている部分が認証関連のコードです。

■EA(MQL4)

OnTick()で1分ごとに認証を行い、OKが出れば稼働開始となるコードです。
CheckKozaNo関数はユーザー定義関数のCheckKoza()内で行っています。

#property copyright "Copyright 2024, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict



//■□■□■□■□■□■□■□■□■□■□

#import "MT4Inet.dll"
bool CheckKozaNo(string userName, string kozaNo, string expertName);
#import

string UserName = "User1234"; // ユーザー名
bool CheckOK;//認証通ればtrueになる
int CheckBar;

//■□■□■□■□■□■□■□■□■□■□




int OnInit()
{





//■□■□■□■□■□■□■□■□■□■□

//1分ごとに認証チェック
if(!CheckOK && CheckBar!=iBars(NULL,PERIOD_M1))
{
CheckKoza();
CheckBar=iBars(NULL,PERIOD_M1);
}

//■□■□■□■□■□■□■□■□■□■□






return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{



}

// スタート関数
void OnTick()
{




//■□■□■□■□■□■□■□■□■□■□
//1分ごとにチェック
if(!CheckOK && CheckBar!=iBars(NULL,PERIOD_M1))
{
CheckKoza();
CheckBar=iBars(NULL,PERIOD_M1);
}

//認証OKになっていなければ処理を進めない ※EAなのでreturnでこれより後の処理を飛ばす
if(!CheckOK)return;


//■□■□■□■□■□■□■□■□■□■□ 認証通ればここから下の処理がされる




//printf("tick");

}



//■□■□■□■□■□■□■□■□■□■□ 認証チェック関数
void CheckKoza()
{
if(!CheckOK && AccountNumber()>0 && !IsTesting())
{
// DLL口座番号判定
if (CheckKozaNo(UserName, (string)AccountNumber(), WindowExpertName()) == false)
{
Comment("認証NG");
Alert("AccountNumber limitation");
Print("NG - ",UserName,",",AccountNumber(),",",WindowExpertName());
}
else
{
CheckOK=true;//認証突破できたのでグローバル変数をtrue状態にする
Comment("");
Print("NG - ",UserName,",",AccountNumber(),",",WindowExpertName());
}
}
}
//■□■□■□■□■□■□■□■□■□■□

■インジケータ(MQL4)

OnCalculate()で1分ごとに認証を行い、OKが出れば表示開始となるコードです。
CheckKozaNo関数はユーザー定義関数のCheckKoza()内で行っています。

#property copyright "Copyright 2024, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
//#property indicator_separate_window


//■□■□■□■□■□■□■□■□■□■□

#import "MT4Inet.dll"
bool CheckKozaNo(string userName, string kozaNo, string expertName);
#import

string UserName = "User1234"; // ユーザー名
bool CheckOK;//認証通ればtrueになる
int CheckBar;//1分足のバー数を格納する変数

//■□■□■□■□■□■□■□■□■□■□






int OnInit()
{

//■□■□■□■□■□■□■□■□■□■□

//1分ごとに認証チェック
if(!CheckOK && CheckBar!=iBars(NULL,PERIOD_M1))
{
CheckKoza();
CheckBar=iBars(NULL,PERIOD_M1);
}

//■□■□■□■□■□■□■□■□■□■□


return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{





//■□■□■□■□■□■□■□■□■□■□
//1分ごとにチェック
if(!CheckOK && CheckBar!=iBars(NULL,PERIOD_M1))
{
CheckKoza();
CheckBar=iBars(NULL,PERIOD_M1);
}

//認証OKになっていなければ処理を進めない
//※インジケータなのでreturn(0)でこれより後の処理を飛ばす

if(!CheckOK)return(0);

//■□■□■□■□■□■□■□■□■□■□ 認証通ればここから下の処理がされる




//printf("tick");




return(rates_total);
}






//■□■□■□■□■□■□■□■□■□■□ 認証チェック関数
void CheckKoza()
{
if(!CheckOK && AccountNumber()>0 && !IsTesting())
{
// DLL口座番号判定
if (CheckKozaNo(UserName, (string)AccountNumber(), WindowExpertName()) == false)
{
Comment("認証NG");
Alert("AccountNumber limitation");
Print("NG - ",UserName,",",AccountNumber(),",",WindowExpertName());
}
else
{
CheckOK=true;//認証突破できたのでグローバル変数をtrue状態にする
Comment("");
Print("NG - ",UserName,",",AccountNumber(),",",WindowExpertName());
}
}
}
//■□■□■□■□■□■□■□■□■□■□