![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Siehe Programmeigenschaften (#property):
tester_indicator
string
Имя пользовательского индикатора в формате "имя_индикатора.ex5". Необходимые для тестирования индикаторы определяются автоматически из вызова функций iCustom(), если соответствующий параметр задан константной строкой. Для остальных случаев (использование функции IndicatorCreate() или использование неконстантной строки в параметре, задающем имя индикатора) необходимо данное свойство
tester_file
string
Имя файла для тестера с указанием расширения, заключенное в двойные кавычки (как константная строка). Указанный файл будет передан тестеру в работу. Входные файлы для тестирования, если необходимы, должны указываться всегда
tester_library
string
Имя библиотеки с расширением, заключенное в двойные кавычки. Библиотека может быть как с расширением dll, так и с расширением ex5. Необходимые для тестирования библиотеки определяются автоматически. Однако, если какая-либо библиотека используется пользовательским индикатором, то необходимо использовать данное свойство
Siehe Programmeigenschaften (#property):
Auf dem Tick-Chart (in der Marktübersicht) des XAUUSD-Demokontos gibt es einen ständigen Reset.
Auch:
Öffnen Sie "Details" und fahren Sie mit der Maus über die leere Stelle
Auf dem Tick-Chart (in der Marktübersicht) des XAUUSD-Demokontos gibt es einen ständigen Reset.
Auch:
Öffnen Sie "Details" und fahren Sie mit der Maus über die leere Stelle
Ich bin mir nicht ganz sicher, was "permanentes Zurücksetzen" bedeutet.
Welches Betriebssystem, welches Betriebssystem und welche Terminalkapazität?
Lernen Sie, denn es heißt in der Schrift der Dokumentation - Technische Indikatoren:
Das bedeutet, dass beim ersten Start des Indikators (wenn zum ersten Mal zu einem neuen Zeitrahmen gewechselt wird ) die Indikatorwerte noch nicht berechnet wurden, daher prev_calculated=0. Wenn Sie zu diesem Zeitrahmen zurückkehren , wird der Indikator nicht neu erstellt, da sein Handle noch aktiv ist. Daher ist prev_calculated!=0Ich wollte Sie schon beim Wort nehmen, aber ich habe es mir anders überlegt. Die Ergebnisse, die ich erhalten habe, sagen fast aus, dass nicht immer alles so glatt läuft, es gibt einige Ausnahmen... aber ich verstehe immer noch nicht, ob sie, diese Ausnahmen, mit den Griffen zusammenhängen oder ob es sich um ein anderes Hindernis handelt.
"Hinweis: Wenn die Funktion OnCalculate einen Nullwert zurückgibt, werden die Indikatorwerte nicht im DataWindow des Client-Terminals angezeigt. "Ich möchte Ihnen versichern, dass es viel schlimmer ist, wenn es mir gelingt, die Ergebnisse in meinem Kopf richtig mit den Unterlagen zu verknüpfen und die daraus resultierende Wirkung selbst zu interpretieren. Nicht nur die Indikatorwerte werden nicht angezeigt - der gesamte Indikator funktioniert nicht mehr, die Befehlswarteschlange friert ein und man kann nicht auf die Verarbeitung der nächsten Befehle warten. Genau das habe ich in einigen meiner früheren Beiträge bereits angedeutet.
Wie bereits erwähnt, enthält der Code eine Vielzahl von Kopien... ...die kein Handle beinhalten (d.h. alles außer CopyBuffer). Wenn das Ergebnis des Kopierens <= 0 ist, erhalten wir return(0), woraufhin"der Indikator nicht mehr funktioniert" und der Indikator eine vollständige Lähmung erhält.
Ich möchte Sie daran erinnern, dass das anfängliche Nicht-Zeichnen mit der damit verbundenen Lähmung im fensterlosen Modus des Terminals erfolgt (d. h. entweder am Wochenende oder offline). Betrachten Sie es nicht als unwichtig, denn niemand möchte an Wochenenden seine Indikatoren debuggen, unnötige Gesten machen, Zeitrahmen durchlaufen und künstlich - manuell - die erste Zeichnung auslösen. Und es geht nicht nur um die Fehlersuche.
Ehrlich gesagt, hatte ich nicht genug Verstand, um die freundlicherweise zur Verfügung gestellten Links mit Beispielen aus der Dokumentation zu verknüpfen, wo es darum geht, den Referenzzähler zu einem bereits existierenden Handle zu erhöhen (sowie mit anderen gegebenen Antworten), um das bestehende Problem zu lösen. Ich glaube nicht, dass es von dort aus weiter wächst.
Versuchen Sie, den beigefügten Code unter den folgenden Bedingungen zu reproduzieren: Der voreingestellte Zeitrahmen im Code ist D1, der aktuelle Zeitrahmen im Terminal ist D1, das Terminal ist im Offline-Modus. Wenn der Indikator an das Diagramm mit dem angegebenen aktuellen Zeitrahmen angehängt ist, werden die Ergebnisse der Protokollierung sofort auf der Registerkarte Experten angezeigt.
Entladen Sie nun das Terminal vollständig, starten Sie es neu und wechseln Sie zu einem anderen Zeitrahmen als D1 . Setzen Sie den Indikator - er wird sich nicht ändern, bis Sie zu einem anderen Zeitrahmen (nicht unbedingt D1) wechseln.
Aufgrund dieser unangenehmen Eigenschaft verschwindet eine gute Idee zusammen mit dem übernommenen Indikator.
Ich bin sicher, dass die Entwickler Erklärungen für dieses Verhalten des Indikators finden können, aber es ist unfair, wenn die Daten des in seinem Handle definierten TF-Masters perfekt angezeigt werden, wenn ein Benutzer sich in diesem Zeitrahmen befindet, aber wenn er sich in einem anderen befindet, muss er unnötige Bewegungen machen. Ich bin für die Gleichheit der Zeitrahmen bei der Verwendung von Griffen von externen Indikatoren, die anderen TFs sind nicht schuldig an etwas.
P.S.: Also... Warten Sie. Ich habe es noch einmal überprüft - es stellt sich heraus, dass CopyHigh diese Lähmung nicht einmal beeinflusst. Jetzt verstehe ich überhaupt nichts mehr. Mein ganzer Verdacht fiel plötzlich auf einen Griff in OnInit...
P.P.S.: Zweites Code-Beispiel hinzugefügt - auch wenn es nicht antwortet.
Die Grenze des Problems ist gefunden.
Kommentieren Sie es aus:
- und das Problem verschwindet, aber dann ist es ein klarer Hinweis auf eine gelegentliche falsche Pufferbindung über SetIndexBuffer . Dies deutet bereits darauf hin, dass die Verwendung vonSetIndexBuffer aufgegeben und die Größe des überwachten Puffers manuell geändert werden muss .
Außerdem zeigt das angehängte Beispiel offensichtlich die Unfähigkeit von BarsCalculated(handle ), die Werte des aufgerufenen Indikators auf jeder aktuellen TFrechtzeitig zu berechnen, es sei denn, sie stimmt mit einer voreingestellten überein, oder die prinzipielle Unwilligkeit, überhaupt etwas zu berechnen (höchstwahrscheinlich diese Variante). In diesem Fall wird der Wert <=0 sein, return(0) und stop als Ergebnis.
Es ist nicht ganz klar, was "permanentes Zurücksetzen" bedeutet.
Welches OS, welches OS und Terminal-Bit?
W7 und MT5 64 Bit.
Beispiel:
XAUUSD setzt immer auf den Anfang zurück (XAGUSD ist ein Vergleich)
Finden Sie die Grenze des Problems.
Kommentieren Sie es aus:
- und das Problem wird verschwinden, aber dann wird es ein klarer Hinweis auf gelegentliche falsche Pufferbindung über SetIndexBuffer sein. Dies deutet bereits darauf hin, dass die Verwendung von SetIndexBuffer aufgegeben und die Größe des überwachten Puffers manuell geändert werden muss .
Außerdem zeigt das beigefügte Beispiel, dass BarsCalculated(handle) nicht in der Lage ist, den Wert des aufgerufenen Indikators für eine beliebige aktuelle TF zu berechnen, es sei denn, er stimmt mit einem voreingestellten Wert überein. In diesem Fall wird der Wert <=0 sein, return(0) und stop als Ergebnis.
Für das erste Beispiel (das zweite habe ich mir nicht angesehen) hat der Paralich-Indikator eine Funktion
Stellen Sie sich also vor, Ihr Indikator befindet sich auf D1 und Sie versuchen, Daten aus dem H1-Zeitrahmen in seinen Indikatorpuffer zu kopieren. Die Anzahl der Elemente wird nicht übereinstimmen. Ich glaube, genau hier liegt Ihr Problem - es gibt keine Prüfung vor dem Kopieren der Daten.
Beispiele für Indikatoren, die Daten aus anderen Zeitrahmen verwenden, finden Sie in der Hilfe zu jedem technischen Indikator. Zum Beispiel https://www.mql5.com/ru/docs/indicators/iama:
Versuchen Sie, den beigefügten Code unter den folgenden Bedingungen zu reproduzieren: Der voreingestellte Zeitrahmen im Code ist D1, der aktuelle Zeitrahmen im Terminal ist D1, das Terminal ist im Offline-Modus. Wenn ein Indikator an ein Diagramm mit dem angegebenen aktuellen Zeitrahmen angehängt wird, werden die Ergebnisse der Protokollierung sofort auf der Registerkarte Experten angezeigt.
Stellen Sie sich also vor, Ihr Indikator befindet sich auf D1 und Sie versuchen, Daten aus dem H1-Zeitrahmen in seinen Indikatorpuffer zu kopieren. Die Anzahl der Elemente wird nicht übereinstimmen. Ich glaube, genau hier liegt Ihr Problem - es gibt keine Prüfung vor dem Kopieren der Daten.
Zunächst einmal werde ich klären: sind nicht die Fälle von Array Überlauf beim Kopieren von Werten über Copy...-Funktionen verursacht einen Überlauf Fehler"Array out of range" in Experten des Client-Terminals? Ich erinnere mich, dass solche Meldungen manchmal nach einer erfolgreichen Kompilierung erzeugt werden, während der Indikator arbeitet, aber ich kann es nicht genau sagen. Ich denke, es liegt nicht an der Copy...-Funktion, sondern an einem Verweis auf einen nicht existierenden Index oder etwas Ähnlichem.
Zweitens möchte ich Ihnen versichern, dass Ihre Hypothese über das Fehlen einer Kontrolle nicht ganz richtig ist. Sie kann nur über falsch erzeugte if-else-Filter sprechen, nicht aber über deren völliges Fehlen. Ich bin schon mehr als ein Dutzend Mal darüber gestolpert. Kürzlich habe ich hier oder in "Dummies" eine Frage über die Analogie von rates_total für Zeitrahmen gestellt, die sich von den aktuellen unterscheiden, aber ich habe von niemandem eine Antwort erhalten. Das Problem ist, dass rates_total einer der Parameter für den aktuellen Zeitrahmen ist, und es ist absolut nutzlos für mich, weil ich mit einer Menge anderer Zeitrahmen arbeite, und wenn ich zufällig einen der voreingestellten verwende, verwende ich immer noch universal calculated=BarsCalculated(handle) für Berechnungen anstelle von rates_total. Vielleicht mache ich einen großen Fehler, aber ich sehe den Nutzen von rates_total für diese Aufgabe nicht.
Drittens kann ich seit langem erreichen, dass ich, wenn ich mich in einer hohen TF befinde, erfolgreich Werte von niedrigeren TFs kopieren und umverteilen kann und umgekehrt. Die Beispiele, die ich vor ein paar Tagen genannt habe, sind minimal, aber erschöpfend, es ist alles da. Es gibt zwei Arten von Diskrepanzen zwischen den Mengen zweier verschiedener TFs: Unterdeckung und Überschuss. Der erste Fall ist nicht schlimm, aber ich werde den zweiten auf Überlauf prüfen und versuchen, ihn zu begrenzen, falls etwas nicht stimmt. Es kommt aber auch zum Stillstand, wenn die aus einem anderen Zeitrahmen kopierten Balken kleiner sind als die Anzahl der Balken im aktuellen Zeitrahmen.
Viertens wurde der Indikator bereits eine Woche lang getestet und verifiziert, er zeigt keine offensichtlichen Fehler (weder bei der Kompilierung noch während des Betriebs), es gibt nur einige implizite Probleme, von denen eines das anfängliche Nicht-Zeichnen von Balken in bestimmten TFs und die starke Zunahme der Berechnungszeit auf M1 ist, wenn man wieder darauf umschaltet (beim ersten Mal wird alles innerhalb von 2-3 Sekunden berechnet). Der Indikator scheint bei Berechnungen zu ersticken (Avalanche-Speicherleck?) Ich habe die Anzahl der kopierten Elemente mit CopyBuffer - auf 200 anstelle des gesamten Verlaufs begrenzt, aber es hat die Situation nicht geändert. Ich habe festgestellt, dass offline auf M1 und überall sonst die Berechnung immer schnell ist, wie zum ersten Mal, online ändert sich die Situation dramatisch (wahrscheinlich ist das Problem in diesem Filter, der etwas auf jedem Tick überspringt, obwohl es nicht sein sollte, weil die Häufigkeit der Neuzeichnung hängt von der Neuzeichnung eines neuen Null-Balken und kann nicht früher als die jüngste voreingestellte TF in einem der Griffe sein). Kleine, aber unangenehme Probleme: der kleinste Versuch, das Diagramm mit dem Mausrad zu scrollen, dematerialisiert alle Fraktale und wir müssen warten, bis sie neu berechnet und gezeichnet werden (obwohl keine neuen Balken eingetroffen sind, scheint es nichts neu zu berechnen).