口座番号認証を使用する上での注意点
MQLのAccountInfoInteger(ACCOUNT_LOGIN)で得られる口座番号は、MT4サーバにログインしてからでないと0を返します。
MT4を起動した直後は、MT4サーバにログインする前なのでAccountInfoInteger(ACCOUNT_LOGIN)は必ず0を返します。
チャートにインジケーターを挿入している状態でMT4を起動したとき、MT4サーバにログインする前にインジケーターの初期化(OnInit())が終了してしまいます。
そのため、AccountInfoInteger(ACCOUNT_LOGIN)を利用する口座番号認証では、OnInit()内に認証用コードを書くと、MT4サーバにログインする前に認証が行われてしまうため、必ず認証に失敗します。
この問題を解決するため、口座番号認証を利用する場合は、OnTimer()内に認証用コードを書きます。
サンプル
void OnTimer() {
if(AccountNumber() != 0) { ・・・①
EventSetTimer(86400); ・・・②
if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
Print("[口座番号: " + (string)AccountNumber() + "] 認証に成功しました。");
} else {
Print("[口座番号: " + (string)AccountNumber() + "] 認証に失敗しました。"
+ "利用期限が過ぎているか、この口座番号では利用できません。");
}
}
}
① MT4サーバにログインする前はAccountInfoInteger(ACCOUNT_LOGIN)は0を返すので、その場合は認証を行いません。
② MT4サーバにログインした後はAccountInfoInteger(ACCOUNT_LOGIN)が口座番号を返すようになります。その後は繰り返し認証をする必要がないため、タイマー時間を延ばします。なお、OnTimer()で認証を繰り返し行ったとしても、デフォルトのMQLAuth.mqhではキャッシュの値を読み込むだけなので、2回目以降の認証ではサーバへのアクセスは行われません。