口座番号認証を使用する上での注意点

MQLのAccountInfoInteger(ACCOUNT_LOGIN)で得られる口座番号は、MT4サーバにログインしてからでないと0を返します。

インジケーターの場合、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回目以降の認証ではサーバへのアクセスは行われません。

なお、EAに関しては現状アカウントにログインされてからOnInit()が実行される仕様となっているようであり、この問題は発生しません。ただし、この仕様はMetaQuotes社公式やMQLリファレンスで公開されているものではないため、いつ仕様が変更されるかわからない懸念があります。そのため、MQLAuthではEA・インジケーター両方について、OnTimer()内に認証用コードを書く方法を推奨しております。

また、EAの場合ではMT4の起動直後OnTimer()内の認証が実行される前にOnTick()が実行されることで認証前にOrderSend()等の認証前に実行されたくない処理が行われる可能性が発生するため、例えば認証済みかどうかを表す変数(bool _isAuthorized = false)を用意し、認証が行われたら_isAuthorizedにTrueを代入、OnTick内(例えば先頭行やOrderSend()の直前など認証前に実行されたくない箇所)に if(!_isAuthorized) return; を書き加えることで、認証前の注文を防ぐことができます。必要に応じ、このような仕組みを組み込んでください。

On this page