TimeCurrent() und iTime() Fehler/Problem

 

Hallo Leute,

Ich bin gerade auf ein interessantes Problem/einen Fehler gestoßen und bin mir nicht sicher, ob es schon einmal identifiziert wurde oder ob es sogar brokerspezifisch ist.

Versuchen Sie, mit dem folgenden in einigen Indikator-Code, haben den Indikator läuft beim Start und notieren Sie die Werte, wenn Sie zum ersten Mal MT4 (stellen Sie sicher, dass MT4 nicht für mindestens 10 Minuten vor dem Neustart ausgeführt wurde).

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

Sie werden feststellen, dass die zurückgegebenen Zeiten tatsächlich die Zeit sind, zu der MT4 zuletzt lief.

Um dies zu umgehen, musste ich in meinem Code eine Verzögerung einführen, was für einen Indikator nicht ideal ist.

Ich frage mich, ob jemand eine eloquentere Lösung hat. Ich würde idealerweise wan't die korrekte MT4 Server Zeit zurückgegeben beim Start jedes Mal.

Mit freundlichen Grüßen

PaulB

 
Paul_B:

Hallo Leute,

Ich bin gerade auf ein interessantes Problem/Bug gestoßen und bin mir nicht sicher, ob es schon einmal identifiziert wurde oder ob es broker-spezifisch ist.

Versuchen Sie, mit dem folgenden in einigen Indikator-Code, haben den Indikator läuft beim Start und notieren Sie die Werte, wenn Sie zum ersten Mal MT4 (stellen Sie sicher, dass MT4 nicht für mindestens 10 Minuten vor dem Neustart ausgeführt wurde).

Sie werden feststellen, dass die zurückgegebenen Zeiten tatsächlich die Zeit sind, zu der MT4 zuletzt lief.

Um dies zu umgehen, musste ich in meinem Code eine Verzögerung einführen, was für einen Indikator nicht ideal ist.

Ich frage mich, ob jemand eine eloquentere Lösung hat. Ich würde idealerweise wan't die korrekte MT4 Server Zeit zurückgegeben beim Start jedes Mal.

Mit freundlichen Grüßen

PaulB


Diese ??
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
 

Hallo deVries,

du könntest auch TIME_SECONDS verwenden, das ist eigentlich egal, solange der Code in init{} oder am Anfang von start{} steht.

Der Punkt ist, Sie erhalten das letzte Mal, wenn MT4 lief, die möglicherweise vor Stunden oder Tagen sein könnte.

 
Paul_B:

Hallo Leute,

Ich bin gerade auf ein interessantes Problem/einen Fehler gestoßen und bin mir nicht sicher, ob es schon einmal identifiziert wurde oder ob es sogar brokerspezifisch ist.

Versuchen Sie, mit dem folgenden in einigen Indikator-Code, haben den Indikator läuft beim Start und notieren Sie die Werte, wenn Sie zum ersten Mal MT4 (stellen Sie sicher, MT4 wurde nicht für mindestens 10 Minuten vor dem Neustart).

Sie werden feststellen, dass die zurückgegebenen Zeiten tatsächlich die Zeit sind, zu der MT4 zuletzt lief.

Um dies zu umgehen, musste ich in meinem Code eine Verzögerung einführen, was für einen Indikator nicht ideal ist.

Ich frage mich, ob jemand eine eloquentere Lösung hat. Ich würde idealerweise wan't die korrekte MT4 Server Zeit zurückgegeben beim Start jedes Mal.

Mit freundlichen Grüßen

PaulB

Ist die Dokumentation in diesem Punkt nicht 100%ig klar? "Gibt die letzte bekannte Serverzeit (Zeitpunkt des Eingangs des letzten Kurses) als Anzahl der seit 00:00 Uhr am 1. Januar 1970 verstrichenen Sekunden zurück." Wenn der letzte Tick vor 10 Minuten war, dann gibt TimeCurrent() eine Datetime zurück, die auf dieser Zeit basiert...
 
RaptorUK:
Ist die Dokumentation in diesem Punkt nicht 100%ig klar?

Nein, das ist es nicht.

Es gibt einen wichtigen Unterschied zwischen EAs und Indikatoren, der in der Dokumentation nicht behandelt wird: EAs erhalten nur dann einen Aufruf von start(), wenn eine Broker-Verbindung und ein neuer Tick vorhanden sind, während Indikatoren immer einen ersten Aufruf von start() erhalten, bevor oder ohne dass eine Broker-Verbindung hergestellt wurde. Daher kann TimeCurrent() in EAs und Indikatoren unterschiedliche Bedeutungen haben.

Wenn Sie einen definitiv aktuellen Wert für TimeCurrent() in einem Indikator wünschen, dann können Sie wahrscheinlich IsConnected() verwenden, um zu prüfen, ob sich TimeCurrent() auf die letzte bekannte Zeit in einer früheren Sitzung beziehen kann.

 

Als zusätzlichen Punkt habe ich sogar versucht

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

vor dem Aufruf von TimeCurrent() und es machte keinen Unterschied. Es ist sicherlich etwas im Auge zu behalten.

Ich benutze es als Teil von einigen Code, um den Offset zwischen MT4-Server-Zeit und GMT zu erhalten, und es ist werfen nachfolgende Berechnungen aus.

 
cyclops993:

Nein, das ist es nicht.

Es gibt einen wichtigen Unterschied zwischen EAs und Indikatoren, der in der Dokumentation nicht behandelt wird: EAs erhalten nur dann einen Aufruf von start(), wenn eine Broker-Verbindung und ein neuer Tick vorhanden sind, während Indikatoren immer einen ersten Aufruf von start() erhalten, bevor oder ohne dass eine Broker-Verbindung hergestellt wurde. Daher kann TimeCurrent() in EAs und Indikatoren unterschiedliche Bedeutungen haben.

Ich sehe das nicht als relevant an, wenn man bedenkt, was in der Dokumentation steht ... wenn Sie TimeCurrent() prüfen, bevor ein neuer Tick eintrifft, erhalten Sie die Zeit des letzten Ticks. Steht das nicht auch in der Dokumentation?
 
RaptorUK:
Ich sehe das nicht als relevant an, wenn man bedenkt, was die Dokumentation sagt ... wenn Sie TimeCurrent() prüfen, bevor ein neuer Tick eintrifft, erhalten Sie die Zeit des letzten Ticks. Steht das nicht auch in der Dokumentation?

Es ist immer noch irreführend, aber wenn Sie pedantisch sein wollen, könnten Sie sagen, dass das Problem nicht in der Definition von TimeCurrent() liegt, sondern in der Definition auf https://docs.mql4.com/runtime/start. Dort heißt es: "Bei Eingang neuer Kurse wird die start()-Funktion der angehängten Experten und benutzerdefinierten Indikatoren ausgeführt". Dies impliziert eindeutig, dass start() nur in Bezug auf neue Ticks aufgerufen wird, wie es bei EAs der Fall ist, und dass TimeCurrent() daher implizit nicht die Zeit des letzten Ticks in einer früheren Sitzung der MT4-Software zurückgeben kann.

[Auch hier besteht eine Antwort darin, Aufrufe von start() in einem Indikator zu ignorieren, wenn IsConnected() false zurückgibt.]

 
cyclops993:

Es ist immer noch irreführend, aber wenn Sie pedantisch sein wollen, [...]

Um noch pedantischer zu sein: Wenn Sie eine brandneue MT4-Installation haben und eine Chart-Datei mit einem Indikator hineinkopieren, bevor Sie MT4 zum ersten Mal starten, dann würde der Indikator vermutlich einen Aufruf von start() erhalten, wobei TimeCurrent() als 1/1/1970 gemeldet wird. Daher sollte in der Dokumentation von TimeCurrent() stehen: "...die letzte bekannte Serverzeit oder der 1.1.1970, wenn keine Serververbindung bestand".

 
cyclops993:

Um noch pedantischer zu sein: Wenn Sie eine brandneue MT4-Installation haben und eine Chart-Datei mit einem Indikator hineinkopieren, bevor Sie MT4 zum ersten Mal starten, dann würde der Indikator vermutlich einen Aufruf von start() erhalten, wobei TimeCurrent() als 1/1/1970 gemeldet wird. Daher sollte in der Dokumentation von TimeCurrent() stehen: "...die letzte bekannte Serverzeit oder der 1.1.1970, wenn keine Serververbindung bestand".

Kein Grund zur Aufregung. Warten Sie einfach den ersten/nächsten Tick ab, TimeCurrent() wird aktualisiert und alles ist gut. Ein Indikator nur für historische Kurse ist nutzlos.
 
angevoyageur:
Kein Grund zur Aufregung. Warten Sie einfach den ersten/nächsten Tick ab, TimeCurrent() wird aktualisiert und alles ist gut. Ein Indikator auf Geschichte Preise nur ist nutzlos.
Ich denke, das Problem ist, dass der erste Aufruf von start() für einen Indikator möglicherweise nicht das Ergebnis eines neuen Ticks ist ... in diesem Fall wird TimeCurrent() die falsche Zeit melden. Ich habe das nicht überprüft...

In diesem Fall würde ich den ersten Tick einfach ignorieren ... und ab Tick 2 normal weitermachen.