注意
このページでは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()); } } } //■□■□■□■□■□■□■□■□■□■□