Ich bin kein Profi, aber ich glaube, dieser Code ist falsch. Die Variable Recount ist immer true. Daher wird jeder Tick als ein neuer Balken behandelt. Warum ist diese Variable überhaupt vorhanden? Warum CopyClose aufrufen? Werden die geposteten Codes überhaupt auf ihre korrekte Funktionsweise überprüft? Wenn ich falsch liege, bitte ich um Korrektur und Erklärung.
Ich habe alles noch einmal überprüft und einen Fehler gefunden. In der angehängten Datei selbst gibt es keine Zuordnung von Recount zu false, aber im Beispielcode ist alles korrekt.
Vielleicht liege ich falsch, aber ich denke, das ist der richtige Weg, es zu tun.
if(TNew>m_TOld)Andernfalls wird es beim Blättern (Bearbeiten der Historie) ungenau sein.
Könnten Sie erklären, was das ist und warum diese Prüfung eingefügt wird?
if(... && TNew)Ich verstehe das nicht. Wann ist diese Bedingung erfüllt und wann ist sie falsch? Vielen Dank für Ihre Hilfe.
Können Sie erklären, was das ist und warum diese Prüfung eingefügt wird?
Ich verstehe das nicht. Wann ist diese Bedingung wahr und wann ist sie falsch? Vielen Dank!
Imho prüft sie, dass TNew nicht gleich m_TOld und gleichzeitig nicht gleich Null ist ( d.h. D'1970.01.01.01 00:00:00:00')....
Die zweite Bedingung prüft, ebenfalls imho, dass die Funktion
datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));
etwas anderes als Null zurückgegeben hat...
Jetzt habe ich das Skript mit dieser Funktion ausgeführt - es hat mir genau 0 zurückgegeben. Vielleicht wegen des Wochenendes.
Können Sie erklären, was das ist und warum diese Prüfung eingefügt wird?
Ich verstehe das nicht. Wann ist diese Bedingung wahr und wann ist sie falsch? Ich danke Ihnen.
Vielleicht liege ich falsch, aber ich denke, dass dies der richtige Weg ist.
Andernfalls kommt es zu Ungenauigkeiten bei der Arbeit während des Blätterns (Bearbeitung der Historie).
Könnten Sie erklären, was das ist und warum diese Prüfung eingefügt wird?
Ich verstehe das nicht. Wann ist diese Bedingung erfüllt, wann ist sie falsch? Ich danke Ihnen.
Ich denke, es wäre logischer, dies als Vorsichtsmaßnahme zu tun.
if(TNew>m_TOld && TNew) obwohl TNew immer noch Null sein wird, wenn der Verlauf ausgetauscht wird. Eine Null kann jederzeit in die TNew-Variable gelangen, daher sollten Sie immer auf Null prüfen.
Es gibt einen kleinen Fehler in Ihrer Klasse(wie in den meisten Funktionen , bei denen ich den Code gesehen habe ). Das erste Mal, wenn Sie die Methode IsNewBar aufrufen, gibt sie immer true zurück, unabhängig von der Existenz eines echten neuen Balkens.
Aber eine solche Funktion enthält eine statische Variable, und deshalb können wir nicht mehrere Aufrufe dieser Funktion verwenden.
Man kann auch ein zweidimensionales Array verwenden, um die Öffnungszeit des letzten Balkens zu speichern.
class CIsNewBar{
private:
long checkedMs;
datetime lastBarOpenedAt;
bool lastValue;
CTickUtils tickUtils;
public:
CIsNewBar(){}
~CIsNewBar(){}
bool isNewBar(){
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
long tickMs = tick.time_msc;
if(checkedMs >= tickMs){ //wurde diese Funktion bereits bei diesem Tick ausgeführt?
return lastValue; //so, Rückgabe des gepufferten Wertes
}
datetime time[1];
CopyTime(_Symbol, _Period, 0, 1, time);
if(lastBarOpenedAt != time[0]){
lastBarOpenedAt = time[0];
lastValue = true;
} else {
lastValue = false;
}
checkedMs = tickMs;
return lastValue;
}
Ich denke, dies ist eine schnelle, leichtgewichtige Klasse, die die oben genannten Probleme behebt.
Diese Version:
- gibt beim ersten Aufruf der Funktion.isNewBar() keinen falschen Alarm aus.
- eliminiert die ständige Neuinstantiierung neuer Variablen bei jedem Funktionsaufruf, ohne statische Variablen zu verwenden, was die Ausführung beschleunigt.
- gibt nur einmal pro Balken true zurück.
- hat einen geringen Speicherbedarf.
class CIsNewBar{ private: datetime lastBarOpenedAt; datetime time[1]; public: CIsNewBar(){CopyTime(_Symbol, _Period, 0, 1, time);lastBarOpenedAt = time[0];} ~CIsNewBar(){} bool isNewBar(){ CopyTime(_Symbol, _Period, 0, 1, time); if(lastBarOpenedAt < time[0]){ lastBarOpenedAt = time[0]; return(true); } else { return(false);} } };
Um die Klasse zu implementieren:
CIsNewBar someName; void OnTick(){ if(someName.isNewBar()){ /// Aufruf eines neuen Bar-Event-Handlers oder /// Arbeit für neuen Balken erledigen. } }
- www.mql5.com
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
IsNewBar:
СIsNewBar Klasse erlaubt es, den Augenblick des Wechsels eines Balkens festzustellen.
Normalerweise wird die IsNewBar() Funktion statt einer Klasse dafür verwendet. Aber eine solche Funktion enthält eine statische Variable, und daher können wir nicht mehrere Anrufe von dieser Funktion durchführen. Um diese Funktion wiederholt im Expert Advisor Code verwenden zu können, wäre es viel einfacher, einen Klassenmember zu erstellen. In diesem Fall wurde das mit IsNewBar.mqh erreicht.
Autor: Nikolay Kositsin