2022年11月まで利用していた旧認証コードです。

 

「mq4ファイル」の1行目に以下を記入

//--------------------------------------------------- cert function begin
#import "certmod.dll"
   void SetServer(char &host[], char &path[], unsigned short port, int ssl_enable);
   void SetWorkerTimeout(unsigned int value);
   void SetExpireTimeout(unsigned int value);
   void SetConnErrTimeout(unsigned int value);
   void SetTimeout(unsigned int worker, unsigned int expire, unsigned int conn_error);
   int CertInit(char &api_key[], char &acct_no[], char &acct_name[], char &acct_company[], char &acct_server[]);
   int CertQuote(char &api_key[], char &acct_no[]);
   int Cert(char &api_key[], char &acct_no[], char &acct_name[], char &acct_company[], char &acct_server[], int init_flag);
   void CertDebug(char &msg[]);
#import
 
#define CERT_UNKNOWN 0
#define CERT_OK      1
#define CERT_NG      2
#define CERT_ERROR   3
 
#define BUF_LEN      1024
 
string APIKey = "41474539af98795c4b3068f43c2c07e9";   //--- Please set EA's API key
string InvalidMessage = "ERROR: Account number is invalid.";
 
char host_char[];
char path_char[];
char api_key_char[];
char acct_no_char[];
char acct_name_char[];
char acct_company_char[];
char acct_server_char[];
char msg_char[];
 
void SetServer(string host, string path, unsigned short port, int ssl_enable) {
   StringToCharArray(host, host_char);
   StringToCharArray(path, path_char);
   SetServer(host_char, path_char, port, ssl_enable); 
}
 
int CertInit(string api_key, int acct_no, string acct_name, string acct_company, string acct_server) {
   StringToCharArray(api_key, api_key_char);
   StringToCharArray(IntegerToString(acct_no), acct_no_char);
   StringToCharArray(acct_name, acct_name_char);
   StringToCharArray(acct_company, acct_company_char);
   StringToCharArray(acct_server, acct_server_char);
   return CertInit(api_key_char, acct_no_char, acct_name_char, acct_company_char, acct_server_char); 
}
 
int CertQuote(string api_key, int acct_no) {
   StringToCharArray(api_key, api_key_char);
   StringToCharArray(IntegerToString(acct_no), acct_no_char);
   return CertQuote(api_key_char, acct_no_char); 
}
 
int Cert(string api_key, int acct_no, string acct_name, string acct_company, string acct_server, int init_flag) {
   StringToCharArray(api_key, api_key_char);
   StringToCharArray(IntegerToString(acct_no), acct_no_char);
   StringToCharArray(acct_name, acct_name_char);
   StringToCharArray(acct_company, acct_company_char);
   StringToCharArray(acct_server, acct_server_char);
   return Cert(api_key_char, acct_no_char, acct_name_char, acct_company_char, acct_server_char, init_flag); 
}
 
void CertDebug(string msg) {
   StringToCharArray(msg, msg_char);
   CertDebug(msg_char); 
}
 
void CertInit() {
   ArrayResize(host_char, BUF_LEN);
   ArrayResize(path_char, BUF_LEN);
   ArrayResize(api_key_char, BUF_LEN);
   ArrayResize(acct_no_char, BUF_LEN);
   ArrayResize(acct_name_char, BUF_LEN);
   ArrayResize(acct_company_char, BUF_LEN);
   ArrayResize(acct_server_char, BUF_LEN);
   ArrayResize(msg_char, BUF_LEN);
}
 
void CertRelease() {
   ArrayFree(host_char);
   ArrayFree(path_char);
   ArrayFree(api_key_char);
   ArrayFree(acct_no_char);
   ArrayFree(acct_name_char);
   ArrayFree(acct_company_char);
   ArrayFree(acct_server_char);
   ArrayFree(msg_char);
}
 
bool CertCheck()
{
   static bool activated = false;
   static bool invalid = false;
   if(invalid) {
      return (false);
   }
   
   string AccName = AccountName();
   int Accnacheck = StringReplace(AccName,"#"," ");
   
   if(!activated) {
      if(CertInit(APIKey, (int)AccountNumber(), AccName, (string)AccountCompany(), (string)AccountServer()) == CERT_NG ) {
         Print(InvalidMessage);
         invalid = true;
         return (false);
      } else {
         activated = true;
      }
   } else if(CertQuote(APIKey, (int)AccountNumber()) == CERT_NG ) {
      Print(InvalidMessage);
      invalid = true;
      return (false);
   }
   return (true);
}
 
bool     EA_BANK_NINSHOU = false;
datetime EA_BANK_interval = 0;
 
//-----
#define  EA_BANK_CHECKSPAN     60
#define  EA_BANK_FORCESTOPSPAN 60
#define  EA_BANK_STOPLIMIT     5
#define  EA_BANK_MAXMAGICS     30
#define  EA_BANK_NOT_SET       (-1)
bool     EA_BANK_ForceStop = False;
int      EA_BANK_StopMagicNumbers[EA_BANK_MAXMAGICS];
 
void OnDeinit(const int reason)
{
   EventKillTimer();
}
 
void EA_BANK_InitEAMagicNumber()
{
   for (int i=0; i<EA_BANK_MAXMAGICS; i++)
   {
      EA_BANK_StopMagicNumbers[i] = EA_BANK_NOT_SET;
   }
}

bool EA_BANK_CheckEAMagicNumber(int magic)
{
   for (int i=0; i<EA_BANK_MAXMAGICS; i++)
   {
      if (EA_BANK_StopMagicNumbers[i] == magic)
         return(true);
   }
   return(false);
}
 
bool EA_BANK_CheckMagicSetting()
{
   bool flag = true;
   for (int i=0; i= TimeCurrent() - EA_BANK_FORCESTOPSPAN)
         && (OrderCloseTime() > TimeCurrent() - EA_BANK_FORCESTOPSPAN))
         count += 1;
   }
   if (count >= EA_BANK_STOPLIMIT)
      EA_BANK_ForceStop = true;
}
//--------------------------------------------------- cert function end

「mq4ファイル」のint OnInit()内最後尾に以下を記入

//-----------------------------
   EA_BANK_InitEAMagicNumber();

   //---- [0]から順に、使っているマジックナンバーのパラメータ変数をすべて設定してください
   EA_BANK_StopMagicNumbers[0] = MagicNumber;
//   EA_BANK_StopMagicNumbers[1] = MagicNumber2;
   //---- 

   if (!EA_BANK_CheckMagicSetting())
   {
      Alert("EA_BANK_StopMagicNumbers にマジックナンバーを追加してください。");
      return(INIT_FAILED);
   }
   EventSetTimer(EA_BANK_CHECKSPAN);
//---- 
   CertInit();
   SetServer("eamaker.sakura.ne.jp", "/cert", 80, 0);
   SetTimeout(60000, 1800000, 172800000);
   if(!CertCheck()) {
      return (INIT_SUCCEEDED);
   }
//-----------------------------

※int OnInit()の戻り値を設定するreturn文は上記コードの後に設定。
画像で位置を確認する
※EA内で使用するマジックナンバーをすべて、EA_BANK_StopMagicNumbersに[0]から順に設定。
例えば、EA内で MagicNumber, MagicNumber2, MagicNumber3の3つの変数を使う場合、以下のように設定。
EA_BANK_StopMagicNumbers[0] = MagicNumber;
EA_BANK_StopMagicNumbers[1] = MagicNumber2;
EA_BANK_StopMagicNumbers[2] = MagicNumber3;

「mq4ファイル」のvoid OnTick(){の直下に以下を記入

   //--------------------------------------------------- cert check begin
   if(TimeCurrent() > EA_BANK_interval+3600)
   {
      EA_BANK_interval = TimeCurrent();
      if(IsTesting())
      {
         EA_BANK_NINSHOU=true;
      }
      else if(!CertCheck())
      {
         Comment("【EA-BANK】認証エラー。登録口座以外ではご利用できません。");
         EA_BANK_NINSHOU=false;
      }
      else
      {
         Comment("【EA-BANK】認証OK");
         EA_BANK_NINSHOU=true;
      }
   }
   if(EA_BANK_NINSHOU==false)
   {
      return;
   }

   //----
   if (EA_BANK_ForceStop)
   {
      Print("暴走の危険性があるため強制停止");
      return;
   }
   //--------------------------------------------------- cert check end

※EA内部でComment関数を表示する場合、コメントの1行目に「【EA-BANK】認証OK」の文字列を追記。