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」の文字列を追記。