TimeCurrent()およびiTime()の不具合・問題点

 

こんにちは、皆さん。

興味深い問題/バグに遭遇しました。以前に確認されたことがあるかどうか、あるいはブローカー固有のものであるかどうかさえ分かりません。

いくつかのインジケータコードで以下を使用してみてください。インジケータを起動時に実行し、MT4を最初に実行したときの値を記録してください(MT4を再起動する前に、少なくとも10分間実行していないことを確認してください)。

Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Print(TimeToStr(iTime(NULL,PERIOD_M1,0),TIME_DATE|TIME_MINUTES));

返された時間は、実際にはMT4が最後に実行された時間であることがわかります。

これを回避するために、私は自分のコードに遅延を導入しなければなりませんでしたが、これはインジケータにとって理想的ではありません。

どなたかもっと雄弁な解決策をお持ちではないでしょうか。理想を言えば、毎回起動時に正しいMT4サーバーの時刻 を返して欲しいです。

よろしくお願いします。

PaulB

 
Paul_B:

こんにちは、皆さん。

興味深い問題/バグに遭遇しました。以前に確認されたことがあるかどうか、あるいはブローカー固有のものであるかどうかさえ分かりません。

いくつかのインジケータコードで以下を使用してみてください。インジケータを起動時に実行し、MT4を最初に実行したときの値を記録してください(MT4を再起動する前に、少なくとも10分間実行していないことを確認してください)。

返された時間は、実際にはMT4が最後に実行された時間であることがわかります。

これを回避するために、私は自分のコードに遅延を導入しなければなりませんでしたが、これはインジケータにとって理想的ではありません。

どなたかもっと雄弁な解決策をお持ちではないでしょうか。理想を言えば、毎回起動時に正しいMT4サーバーの時刻を返して欲しいです。

よろしくお願いします。

PaulB


この「?
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
 

こんにちは、deVriesです。

コードがinit{}の中かstart{}の最初にある限り、TIME_SECONDSも使用することができます。

重要なのは、MT4が最後に実行された時間を取得することで、それは潜在的に数時間または数日前であるかもしれません。

 
Paul_B:

こんにちは、皆さん。

興味深い問題/バグに遭遇しました。以前に確認されたことがあるかどうか、あるいはブローカー固有のものであるかどうかさえわかりません。

いくつかのインジケータコードで以下を使用してみてください。インジケータを起動時に実行し、MT4を最初に実行したときの値を記録してください(MT4を再起動する前に、少なくとも10分間実行していないことを確認してください)。

返された時間は、実際にはMT4が最後に実行された時間であることがわかります。

これを回避するために、私は自分のコードに遅延を導入しなければなりませんでしたが、これはインジケータにとって理想的ではありません。

どなたかもっと雄弁な解決策をお持ちではないでしょうか。理想を言えば、毎回起動時に正しいMT4サーバーの時刻を返して欲しいです。

よろしくお願いします。

PaulB

この点については、ドキュメントに100%明記されていないのですか? "最新のサーバー時刻(最新の気配値の受信時刻)を、1970年1月1日00:00からの経過秒数で返します。" もし最後のティックが10分前であれば、 TimeCurrent() はその時刻に基づいた datetime を返します . . ...
 
RaptorUK:
この点については、ドキュメントに100%明記されていないのでしょうか?

そうではありません。

EAとインディケータには重要な 違いがあり、ドキュメントでは説明されていません。EAはブローカーとの接続と新しいティックがある場合にのみstart()を呼び出しますが、インディケータはブローカーとの接続が確立される前、または確立されていなくても常に最初のstart()の呼び出しを受けます。したがって、TimeCurrent() は EA とインジケータで異なる意味を持つことがあります。

もし、インジケーターのTimeCurrent()の値を確実に更新したいのであれば、IsConnected()を使用して、TimeCurrent()が以前のセッションで最後に確認した時刻を参照しているかどうかをチェックすることができます。

 

追加ポイントとして、私も試したことがあるのですが

https://docs.mql4.com/windows/RefreshRates

を試してみましたが、違いはありませんでした。確かに覚えておくとよいでしょう。

MT4サーバ時刻とGMTのオフセットを取得するコードの一部として使用しているのですが、その後の計算が狂ってしまいます。

 
cyclops993:

そうではありません。

EAとインディケータには重要な違いがあり、ドキュメントでは説明されていません。EAはブローカーとの接続と新しいティックがある場合にのみstart()を呼び出しますが、インディケータはブローカーとの接続が確立される前、または確立されていなくても常に最初のstart()の呼び出しを受けます。したがって、TimeCurrent() は EA とインジケータで異なる意味を持つことがあります。

新しいティックが到着する前にTimeCurrent()をチェック すると、最後のティックの時間が表示されます。ドキュメントに書いてある通りではないでしょうか?
 
RaptorUK:
新しいティックが到着する前にTimeCurrent()をチェックすると、最後のティックの時刻が得られます。 ドキュメントに書いてある通りではないでしょうか?

まだ誤解を招きそうですが、杓子定規に言えば、問題はTimeCurrent()の定義ではなく、https://docs.mql4.com/runtime/start の定義にあると言えます。そこには、「新しい相場が到来すると、付属のエキスパートとカスタム・インディケータのstart()関数が実行される」とあります。これは、start()はEAのように新しいティックに関連してのみ呼び出され、暗黙のうちに、TimeCurrent()はMT4ソフトウェアを使用する前のセッションの最後のティックの時間を返すことができないということを明確に暗示しています。

[繰り返しになりますが、IsConnected()がfalseを返した場合、インジケータ内のstart()の呼び出しを無視することが、これらすべてに対する1つの答えです]。

 
cyclops993:

まだ誤解を招きそうですが、もしあなたが衒学的なことをお望みなら[...]です。

さらに衒学的なことを言うと、もしあなたがMT4を新規にインストールし、MT4を初めて起動する前にインジケータを添付したチャートファイルをそこにコピーした場合、おそらくインジケータは、TimeCurrent()が1970/1として報告されたstart()への呼び出しを受けることになるでしょう。したがって、TimeCurrent()のドキュメントには、「...最後の既知のサーバー時間、またはサーバー接続がない場合は1970年1月1日」と記載する必要があります。

 
cyclops993:

さらに衒学的に言えば、MT4を新規にインストールし、MT4を初めて起動する前にインジケータを添付したチャートファイルをコピーした場合、おそらくインジケータはTimeCurrent()が1970/1/1と報告された状態でstart()を呼び出されるでしょう。したがって、TimeCurrent()のドキュメントには、「...最後の既知のサーバー時間、またはサーバー接続がない場合は1970年1月1日」と記載する必要があります。

大騒ぎする必要はありません。ただ、最初の、あるいは次のティックを待つだけで、TimeCurrent()は更新され、すべてがうまくいくのです。履歴価格だけのインジケータは意味がありません。
 
angevoyageur:
大騒ぎをする必要はありません。最初のティック、次のティックを待つだけで、TimeCurrent()が更新され、すべてがうまくいきます。履歴価格だけのインジケータは意味がありません。
問題は、インディケータで最初にstart()が呼ばれたとき、新しいティックの結果ではないかもしれないことだと思います ... その場合、TimeCurrent()は間違った時間を報告します。 私はこれを検証していません ... ...

この場合、私は単に最初のティックを無視して ... 2ティック以降を通常通り続けます。