Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 850

 
Artyom Trishkin:
Korrigieren Sie den Kurvenindikator. Eine Linie kann nur bei vollständiger Neuberechnung gezeichnet werden, was durch einen Befehl im Kontextmenü geschieht.
Alexey Viktorov:

Es gibt auch eine in mql4.

Ich danke Ihnen.

 
Ich habe es mit einer Krücke herausgeholt). Ich wollte, dass der Indikator nach dem manuellen Ziehen der vertikalen Linie aktualisiert wird, wofür er die Zeit benötigt. Ich habe die Ereignisfunktion des Ziehens eines Objekts verwendet und darin die Funktion des Wechsels von TF mit Rückkehr zum Ausgangswert eingefügt. Aber aus irgendeinem Grund verzögert sich die Aktualisierung um mehrere Sekunden. Die Funktion der TF-Umschaltung funktioniert so langsam, das verstehe ich nicht.
 
khorosh:
Hat es mit einer Krücke geschafft). Ich musste den Indikator nach dem manuellen Ziehen einer vertikalen Linie aktualisieren, wofür er sich die Zeit nimmt. Ich habe die Funktion des Ziehens eines Objekts verwendet und die Funktion des Wechselns von TF mit einer Rückkehr zum ursprünglichen Objekt hinzugefügt. Aber aus irgendeinem Grund verzögert sich die Aktualisierung um mehrere Sekunden. Die Funktion der TF-Umschaltung ist zu langsam, ich verstehe sie nicht.

Diese Funktion ist asynchron. Sie gibt nur das Ergebnis des Befehls in der Ereigniswarteschlange zurück.

Um sofort zu aktualisieren, müssen Sie den Befehl ChartRedraw() nach dem Befehl Chart Switch ausführen

Das ist natürlich ein falscher Ansatz. Wenn Sie das Diagramm erst nach Abschluss der Linienverschiebung aktualisieren wollen, sollte die Schleife der Indikator-Neuberechnung nicht von OnCalculate(), sondern von ChartEvent() aufgerufen werden - die Verschiebung der Linie wird abgefangen - die Funktion der Indikator-Neuberechnung wird aufgerufen, die den gesamten Zyklus der Linien-Neuberechnung mit den neuen Daten durchlaufen wird (die Linie wird für einige Daten benötigt, nicht wahr?).

Oder der Indikator ist einfach nicht richtig gemacht und aktualisiert den Null-Balken nicht auf die aktuellen Daten, und Sie haben ihn gekickt?

 
ilyav:

Kann jemand helfen, EA-Code auf MT5 zu beheben?

Ich habe die Handbücher gelesen, aber beim Kompilieren komme ich nicht über 2 Lacke hinaus.

Deklaration von "xxxx" verdeckt globale Deklaration

и

möglicher Datenverlust aufgrund von Typumwandlung

Siehe beigefügten Tipp.

Ich habe einfach dummerweise die Namen der globalen Variablen korrigiert und die Typen übereinstimmen lassen.

Das sind 10.000.000, die Sie verlangen können - für die Überwindung Ihrer Faulheit.

Dateien:
 
Artyom Trishkin:

Ich habe einfach die Namen der globalen Variablen korrigiert und die Typen angepasst.

Du schuldest mir 10 000 000 für die Überwindung deiner Faulheit.

Ich danke Ihnen vielmals.

Ich schäme mich, zu zeigen, wie ich es repariert habe)

int CountTrades(long PositionID1)

 
Artyom Trishkin:

Diese Funktion ist asynchron. Sie gibt nur das Ergebnis des Befehls in der Ereigniswarteschlange zurück.

Um sofort zu aktualisieren, müssen Sie den Befehl ChartRedraw() nach dem Befehl zum Umschalten des Diagramms ausführen

Das ist natürlich ein falscher Ansatz. Wenn Sie das Diagramm erst nach Abschluss der Linienverschiebung aktualisieren müssen, sollte die Schleife der Indikator-Neuberechnung nicht aus OnCalculate(), sondern aus ChartEvent() aufgerufen werden - die Verschiebung der Linie wird abgefangen - die Funktion der Indikator-Neuberechnung wird aufgerufen, die den vollen Zyklus der Neuberechnung der Linie mit den neuen Daten durchführt (die Linie wird für einige Daten benötigt, nicht wahr?).

Oder vielleicht wurde der Indikator einfach falsch gemacht und er aktualisiert den Null-Balken nicht mit den aktuellen Daten und Sie haben es vermasselt?

Der Indikator zählt die letzten nicht berechneten Balken. Und nach dem Ziehen der Vertikalen sollte sie nach dem Lesen der neuen vertikalen Zeit vollständig neu berechnet werden. Ich habe hier darüber geschrieben und Screenshots hinzugefügt, die zeigen, wie es funktioniert.

Danke, ich werde versuchen, Ihre Idee umzusetzen. Ich bin im Allgemeinen nicht sehr gut mit Indikatoren, ich habe mich hauptsächlich mit Expert Advisors beschäftigt.

 
Artyom Trishkin:

Diese Funktion ist asynchron. Sie gibt nur das Ergebnis des Befehls in der Ereigniswarteschlange zurück.

Um sofort zu aktualisieren, müssen Sie den Befehl ChartRedraw() nach dem Befehl Chart Switch ausführen

Das ist natürlich ein falscher Ansatz. Wenn Sie das Diagramm erst nach Abschluss der Linienverschiebung aktualisieren möchten, sollte die Schleife der Indikator-Neuberechnung nicht von OnCalculate(), sondern von ChartEvent() aufgerufen werden - Verschiebung der Linie - Aufruf der Indikator-Neuberechnungsfunktion, die den gesamten Zyklus der Linien-Neuberechnung mit den neuen Daten durchläuft (die Linie wird für einige Daten benötigt, richtig?).

Oder vielleicht ist der Indikator nur nicht richtig gemacht und nicht aktualisieren die Null-Bar auf die aktuellen Daten, und Sie trat es?

Ich habe Ihren Rat befolgt. Alles hat perfekt funktioniert. Jetzt wird der Indikator sofort nach dem Ziehen komplett neu gezeichnet. Nochmals vielen Dank.

 
khorosh:

Ich habe Ihren Rat befolgt. Alles hat perfekt funktioniert. Jetzt wird der Indikator sofort nach dem Ziehen komplett neu gezeichnet. Nochmals vielen Dank.

Bitte sehr. Aber es sollte in OnCalculate() gezeichnet werden, oder nicht?

Wenn der Indikator auf das Diagramm gezogen wird, nimmt er keine Änderungen an der Linie wahr, aber er sollte die Linie zeichnen.

 
Artyom Trishkin:

Bitte sehr. Aber es sollte in OnCalculate() zeichnen, oder nicht?

Wenn Sie es auf ein Diagramm anwenden, ist es sich keiner Bewegung der Linie bewusst, aber es sollte die Linie zeichnen.

Wenn der Indikator an das Diagramm angehängt wird, wird in init() eine vertikale Linie erstellt, für die zunächst eine Zeit festgelegt wird, z. B. Time[10]. Ich habe den Code inOnChartEvent() und OnCalculate() dupliziert. Nur in OnChartEvent ich von allen Bars neu berechnet.

 
khorosh:

Bei der Installation des Indikators auf dem Chart in init() wird eine vertikale Linie erstellt, die zunächst auf eine bestimmte Zeit, z. B. Time[10], gesetzt wird. Ich habe den Code in OnChartEvent() und OnCalculate() dupliziert. Nur in OnChartEvent ich von allen Bars neu berechnet.

Wäre es nicht besser, z.B. die Funktion Refresh() mit den erforderlichen formalen Parametern zu erstellen und sie bei Bedarf aufzurufen?

Und übrigens, wenn Sie die rates_total im Indikator jenseits von OnCalculate() mit Bars() mit einem Datumsbereich abrufen, können Sie einen Hänger im Indikator erwischen:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Analog von iBarShift

Nikolai Semko, 2018.04.05 23:47

So weit diese Variante, aber ich möchte sie jetzt hinzufügen, um diesen Fehler der Bars-Funktion zu umgehen, über den ich bereits an servicedesk geschrieben habe.

Der Kern dieses Fehlers ist, dass wenn in der Funktion Bars sowohlstart_time als auchstop_time innerhalb eines Balkens liegen oder in der Zukunft (rechts vom Null-Balken), dann bleibt diese Funktion für mehr als 10 Sekunden hängen.

Vielleicht mache ich später eine richtige, schnellere, aber umständlichere Version.


Grund der Beschwerde: