MQL5 のサーバー時間を取得する方法として、TimeCurrent() と TimeTradeServer() がありますが、その違いが若干わかりにくいのはないでしょうか?
MQL4 に TimeCurrent() はありますが、TimeTradeServer() はないのでMT5に移行したばっかりの人は TimeTradeServer() が何なのか、知りたいと思います。
実際、どちらを使うべきか悩んでいる人も多いと思うので、「何が異なっていて、どちらを使うべきなのか」を解説したいと思います。
Contents
共にサーバー時間を取得するための関数
これらの共通点はともに「サーバーの時間」を取得するものであるという点です。
何が違うのか?
では何が違うのでしょうか?
実際には、2つの点が異なります。
(2) 現在時刻の「定義」
が異なります。
1つずつ解説します。
① 現在時刻の「計算方法」の違い
時刻の計算方法が異なります。
TimeCurrent() は「サーバー本体の時刻」がベースとなっているのに対して、
TimeTradeServer() は「自分のコンピューターのローカル時刻」をベースに計算を行います。
TimeCurrent() の利点は、「コンピュータの時間の設定」に依存しないという点ですが、
実際には TimeTradeServer() はローカル時刻をベースに計算を行うというだけで、
「(自動的に)取引サーバーのタームゾーン(時間帯)にあわせた時間を計算してくれる」ので、
その点においては、そこまで変わらないと思います。
② 現在時刻の「定義」の違い
同じ現在時刻といっても、その定義は異なります。「最終時刻」の意味合いとしては
TimeCurrent() では「最終ティックの到達時刻」になりますが、
TimeTradeServer() では「実際の現在の時刻」を意味します。
TimeCurrent() の「最終ティックの到達時刻」というのは、
詳しく言うと「気配値ウィンドウにて受信されている銘柄の中で、一番最後に到達した銘柄の、ティックの時刻」という意味です。
つまり「気配値ウィンドウ」にて受信している銘柄(symbol)に依存します。
また、ティックが到達しない間は TimeCurrent() は更新されないことになります。
その反対に、TimeTradeServer() では常に現在の実際の時刻を返すので、ティックの到達に関係なく値は常に更新されることになります。
これが一番の違いかもしれません。
どちらを使うべきなのか?
一長一短なのでどちらとは明確に言えませんが、個人的には TimeTradeServer() の方が便利だと思います。
私はアービトラージのシステムをメインに運用していて、
「各ティックが到達してからどれぐらいの時間が経っているか」を知りたい場面が多いので、常に現在時刻を返してくれる TimeTradeServer() は助かります。
ともに MqlDateTime 型 として呼び出すことが可能
これらの関数はともに「2パターンの呼び出し方法」があります。
(1) 引数なしで呼び出す方法と、 (2) 引数として MqlDateTime 型の変数を渡して、そこに格納する方法 です。
(1) 引数なしで呼び出す場合は、
TimeTradeServer();
とすると値が返ってきます。
一方、(2) MqlDateTime 型の変数に格納する場合は、
MqlDateTime mydatetime; // 構造体を宣言する
TimeTradeServer(mydatetime); // 関数を実行することで、構造体に値を格納する
などとして、まずMqlDateTime型の変数を宣言してから呼び出す必要があります。
なお、MqlDateTime 構造体を含めた、「MQL5 で予め定義済みの構造体」に関してはこの記事で解説しているので、興味があったら是非読んでみてください。
まとめ
今回は、MQL5 に特有の TimeTradeServer() を紹介し、TimeCurrent() 関数との違いに関しても述べました。
用途によってどちらが適しているのかは異なりますが、常に現在時刻を返してくれる TimeTradeServer() も有効活用できるといいと思います。