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());
      }
   }
}
//■□■□■□■□■□■□■□■□■□■□

関連記事

ページ上部へ戻る