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("CheckKozaNG - UserName : ",UserName,", AccountNumber() : ",AccountNumber(),", WindowExpertName() : ",WindowExpertName()); } else { CheckOK=true;//認証突破できたのでグローバル変数をtrue状態にする Comment(""); Print("CheckKozaOK - UserName : ",UserName,", AccountNumber() : ",AccountNumber(),", WindowExpertName() : ",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("CheckKozaNG - UserName : ",UserName,", AccountNumber() : ",AccountNumber(),", WindowExpertName() : ",WindowExpertName()); } else { CheckOK=true;//認証突破できたのでグローバル変数をtrue状態にする Comment(""); Print("CheckKozaOK - UserName : ",UserName,", AccountNumber() : ",AccountNumber(),", WindowExpertName() : ",WindowExpertName()); } }
}
//■□■□■□■□■□■□■□■□■□■□