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