MQL5-Fehler bei der Arbeit mit iClose/iOpen-Zeitreihenzugriff usw.

 
Hallo!
 

Die#Eigenschaft tester_everytick_calculate kann Probleme lösen?

MQL5: Neue Eigenschaft für benutzerdefinierte Indikatoren hinzugefügt #property tester_everytick_calculate. Sie wird im Strategietester verwendet und ermöglicht es, die Berechnung der Indikatoren bei jedem Tick zu erzwingen.

25. Tester: Bei der nicht-visuellen Prüfung/Optimierung werden jetzt alle verwendeten Indikatoren (Standard- und benutzerdefinierte) nur durch Abfrage von Daten berechnet. Eine Ausnahme bilden die Indikatoren, die Aufrufe der FunktionEventChartCustomenthaltenund denOnTimer-Handlerverwenden. Zuvor wurden im Strategietester alle Indikatoren bedingungslos berechnet, wenn ein beliebiger Tick kam (auch von einem anderen Symbol). Diese Innovation hat die Prüfung und Optimierung erheblich beschleunigt.

Um die Berechnung der Indikatoren bei jedem Tick zu erzwingen, fügen Sie die #property tester_everytick_calculate in das Programm ein.

Indikatoren, die von den früheren Versionen des Compilers kompiliert wurden, werden wie bisher berechnet - bei jedem Ticken.
 

Es ist auch immer empfehlenswert, wenn Sie mit einem anderen Zeitrahmen arbeiten - dann müssen Sie einmal pro Minute die OHLC aus diesem Zeitrahmen holen (jede CopyXXXXXX-Funktion).

Daraus ergibt sich, dass es bei der Arbeit mit einem fremden Zeitrahmen nicht notwendig ist, iXXXXXX-Atavismen zu verwenden, sondern CopyXXXXXX-Funktionen zu nutzen.

 
Vladimir Karputov:

Es ist auch immer empfehlenswert, wenn Sie mit einem anderen Zeitrahmen arbeiten - dann müssen Sie einmal pro Minute die OHLC aus diesem Zeitrahmen holen (jede CopyXXXXXX-Funktion).

Daraus ergibt sich, dass man bei der Arbeit mit einem anderen Zeitrahmen nicht die iXXXXXX-Atavismen, sondern die CopyXXXXXX-Funktionen verwenden muss.

Das ist nicht schlimm!

Warum dann:iHigh(Symbol(),TF,i);

P.S. Alles funktioniert in mt4 ohne Probleme seit den ersten Tagen seiner Existenz, warum nicht das Gleiche in mt5 tun, so dass es keine Tamburine sein? Wenn es in mt4 funktioniert - dann ist es auch möglich, es in mt5 zum Laufen zu bringen
 
Vitaly Muzichenko:

Nicht ernsthaft!

Warum dann:iHigh(Symbol(),TF,i);

P.S. In mt4 funktioniert alles ohne Probleme seit den ersten Tagen seiner Existenz, warum nicht das Gleiche in mt5 tun, so dass es keine Tamburine sein? Wenn es in mt4 funktioniert - bedeutet dies, dass es möglich ist, es auch in mt5 funktionieren zu lassen

Außerdem wurde immer empfohlen, wenn Sie mit einem anderen Zeitrahmen arbeiten, die OHLC aus diesem Zeitrahmen einmal pro Minute zu ermitteln (jede CopyXXXX-Funktion). Dies war schon immer der Fall.

 
double high_k = NormalizeDouble(iHigh(Symbol(),TimeFrames, k),DigitsM);
double low_k = NormalizeDouble(iLow(Symbol(),TimeFrames, k),DigitsM);
double open_k = NormalizeDouble(iOpen(Symbol(),TimeFrames, k),DigitsM);
double close_k = NormalizeDouble(iClose(Symbol(),TimeFrames, k),DigitsM);

Versuchen Sie, Angebote zu aktualisieren, bevor Sie dies über RefreshRates tun.

 
Dmitry Fedorchenko:

Versuchen Sie vorher, die Angebote über RefreshRates zu aktualisieren.

"RefreshRates" ist eine nicht existierende Funktion.

 
Vladimir Karputov:

"RefreshRates" ist eine nicht existierende Funktion.

Ich bin dabei
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinforefreshrates

Es gab ein ähnliches Problem nur in EA, es hat mir geholfen.

 
Farkhat Guzairov:
Die MQL4-Version dieses Indikators funktioniert seit mehr als 2 Jahren und es wurden keine derartigen Probleme/Fehler gefunden.

CopyXXX wird Ihnen nicht helfen. Dies ist ein MT5-Fehler, der mit Build 30 begann und seit Build 44 nicht mehr behoben wurde. Lesen Sie die letzten 5-6 Seiten vonhttps://www.mql5.com/ru/forum/285631/page29 und Sie werden nicht allein sein.

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
  • 2018.11.13
  • www.mql5.com
26 октября 2018 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Farkhat Guzairov:

Guten Tag!

Ich bin gerade dabei, bereits geschriebene Indikatoren von MQL4 auf MQL5 zu übertragen. Ich habe nicht viel herumgetanzt und alles scheint in Ordnung zu sein, aber....

Irgendwann hören die Indikatordaten auf, sich zu aktualisieren. Ich konnte nicht genau herausfinden, wo der Fehler lag, und nur durch Zufall habe ich bemerkt, dass iClose/iOpen usw. aufhören, sich zu aktualisieren, d. h. sie geben denselben Wert zurück.

Das Komische ist, dass selbst wenn ich den Quellcode neu kompiliere, der Indikator nicht korrekt aktualisiert wird, aber ich sehe, dass er Funktionen ausführt:

Erst wenn Sie die Eigenschaften des Indikators öffnen und ihn über "Ok" schließen, werden die Daten aktualisiert und korrekt angezeigt, aber bis zu einem gewissen Punkt kann das jederzeit passieren (aber zu 100%). In diesem Fall hat der Indikator am 14.11.2018 um 00:00 Uhr aufgehört, Daten zu aktualisieren, im Allgemeinen geschieht dies nach einiger Zeit regelmäßig.

Zuvor wurde ein weiterer Fehler aufgedeckt: Die Funktion iBars(Symbol(),TimeFrames)/Bars(Symbol(),TimeFrames) liefert den Wert Null. Glücklicherweise handelt es sich nicht um einen ständigen Fehler, aber er tritt trotzdem auf und wir müssen ihn kontrollieren.

Es stellt sich heraus, dass MQ MQL4 nicht mehr unterstützt. Das ist toll, aber MQL5 wird solche Fehler haben.

Wie lässt sich also das oben genannte Problem lösen?

1) Messen Sie die Laufzeit einer OnTick/OnCalculate-Berechnung in Mikrosekunden und geben Sie sie im Protokoll aus.

Auf diese Weise können Sie sehen, wie viel Zeit Sie für die Tickberechnung aufwenden. Schätzen Sie dann, wie viele Ticks Sie bei dieser Geschwindigkeit pro Sekunde berechnen können. Sie werden wahrscheinlich nicht mehr als ein Dutzend Zecken finden, und Sie werden mehr Zecken pro Sekunde bekommen.


2) Messen Sie die Zeit jedes OnCalculate bei Indikatoren, die an Charts/Zeitrahmen gebunden sind, aus denen Sie Daten extrahieren.

Wahrscheinlich gibt es eine ähnliche Situation. Aufgrund der langsamen Berechnungen wartet das Terminal, bis das berechnete Symbol:Zeitfenster freigeschaltet ist. Es sind die langsamen Indikatoren, vor allem bei einer tiefen Geschichte, die dazu führen, dass die Auszahlungen der Charts anderer Leute eingefroren werden.


Bei der Entwicklung von Indikatoren sollten Sie Leistungsfragen und wirtschaftliche Neuberechnungen an die erste Stelle setzen. Andernfalls werden Sie alles um sich herum töten.

 
Renat Fatkhullin:

Es sind die Bremsindikatoren, vor allem in der tiefen Geschichte, die das Einfrieren der Karten anderer Leute verursachen.

Dann sagen Sie mir, warum mir das Einfrieren passiert? Ich habe ein Einfrieren der Ausgaben in OnTick vor der Funktion der Abfrage von Indikatoren. D.h. die Aktualisierung der CopyTime durch M1 wirkt als Auslöser, der die andere Verarbeitung in OnTick startet, aber vor der CopyTime gibt es keine Funktionen oder Abfrage von Indikatoren.

Und warum gab es vor Build 30 keine derartigen Probleme und alles funktionierte seit Oktober 2017 einwandfrei?