こんにちは、皆さん。
興味深い問題/バグに遭遇しました。以前に確認されたことがあるかどうか、あるいはブローカー固有のものであるかどうかさえ分かりません。
いくつかのインジケータコードで以下を使用してみてください。インジケータを起動時に実行し、MT4を最初に実行したときの値を記録してください(MT4を再起動する前に、少なくとも10分間実行していないことを確認してください)。
返された時間は、実際にはMT4が最後に実行された時間であることがわかります。
これを回避するために、私は自分のコードに遅延を導入しなければなりませんでしたが、これはインジケータにとって理想的ではありません。
どなたかもっと雄弁な解決策をお持ちではないでしょうか。理想を言えば、毎回起動時に正しいMT4サーバーの時刻を返して欲しいです。
よろしくお願いします。
PaulB
この「?
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
こんにちは、deVriesです。
コードがinit{}の中かstart{}の最初にある限り、TIME_SECONDSも使用することができます。
重要なのは、MT4が最後に実行された時間を取得することで、それは潜在的に数時間または数日前であるかもしれません。
こんにちは、皆さん。
興味深い問題/バグに遭遇しました。以前に確認されたことがあるかどうか、あるいはブローカー固有のものであるかどうかさえわかりません。
いくつかのインジケータコードで以下を使用してみてください。インジケータを起動時に実行し、MT4を最初に実行したときの値を記録してください(MT4を再起動する前に、少なくとも10分間実行していないことを確認してください)。
返された時間は、実際にはMT4が最後に実行された時間であることがわかります。
これを回避するために、私は自分のコードに遅延を導入しなければなりませんでしたが、これはインジケータにとって理想的ではありません。
どなたかもっと雄弁な解決策をお持ちではないでしょうか。理想を言えば、毎回起動時に正しいMT4サーバーの時刻を返して欲しいです。
よろしくお願いします。
PaulB
この点については、ドキュメントに100%明記されていないのでしょうか?
そうではありません。
EAとインディケータには重要な 違いがあり、ドキュメントでは説明されていません。EAはブローカーとの接続と新しいティックがある場合にのみstart()を呼び出しますが、インディケータはブローカーとの接続が確立される前、または確立されていなくても常に最初のstart()の呼び出しを受けます。したがって、TimeCurrent() は EA とインジケータで異なる意味を持つことがあります。
もし、インジケーターのTimeCurrent()の値を確実に更新したいのであれば、IsConnected()を使用して、TimeCurrent()が以前のセッションで最後に確認した時刻を参照しているかどうかをチェックすることができます。
追加ポイントとして、私も試したことがあるのですが
https://docs.mql4.com/windows/RefreshRates
を試してみましたが、違いはありませんでした。確かに覚えておくとよいでしょう。
MT4サーバ時刻とGMTのオフセットを取得するコードの一部として使用しているのですが、その後の計算が狂ってしまいます。
新しいティックが到着する前にTimeCurrent()をチェックすると、最後のティックの時刻が得られます。 ドキュメントに書いてある通りではないでしょうか?
まだ誤解を招きそうですが、杓子定規に言えば、問題はTimeCurrent()の定義ではなく、https://docs.mql4.com/runtime/start の定義にあると言えます。そこには、「新しい相場が到来すると、付属のエキスパートとカスタム・インディケータのstart()関数が実行される」とあります。これは、start()はEAのように新しいティックに関連してのみ呼び出され、暗黙のうちに、TimeCurrent()はMT4ソフトウェアを使用する前のセッションの最後のティックの時間を返すことができないということを明確に暗示しています。
[繰り返しになりますが、IsConnected()がfalseを返した場合、インジケータ内のstart()の呼び出しを無視することが、これらすべてに対する1つの答えです]。
さらに衒学的に言えば、MT4を新規にインストールし、MT4を初めて起動する前にインジケータを添付したチャートファイルをコピーした場合、おそらくインジケータはTimeCurrent()が1970/1/1と報告された状態でstart()を呼び出されるでしょう。したがって、TimeCurrent()のドキュメントには、「...最後の既知のサーバー時間、またはサーバー接続がない場合は1970年1月1日」と記載する必要があります。
大騒ぎをする必要はありません。最初のティック、次のティックを待つだけで、TimeCurrent()が更新され、すべてがうまくいきます。履歴価格だけのインジケータは意味がありません。
この場合、私は単に最初のティックを無視して ... 2ティック以降を通常通り続けます。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
こんにちは、皆さん。
興味深い問題/バグに遭遇しました。以前に確認されたことがあるかどうか、あるいはブローカー固有のものであるかどうかさえ分かりません。
いくつかのインジケータコードで以下を使用してみてください。インジケータを起動時に実行し、MT4を最初に実行したときの値を記録してください(MT4を再起動する前に、少なくとも10分間実行していないことを確認してください)。
返された時間は、実際にはMT4が最後に実行された時間であることがわかります。
これを回避するために、私は自分のコードに遅延を導入しなければなりませんでしたが、これはインジケータにとって理想的ではありません。
どなたかもっと雄弁な解決策をお持ちではないでしょうか。理想を言えば、毎回起動時に正しいMT4サーバーの時刻 を返して欲しいです。
よろしくお願いします。
PaulB