Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 919
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
Ihre Indikatorberechnung erfolgt von Anfang bis Ende (von den jüngsten historischen Daten bis zu den jüngsten aktuellen Daten). Dies ist ein Hinweis auf eine Indexierung wie bei Zeitreihen. Die Arrays müssen also entsprechend indiziert werden, was bei Ihnen der Fall ist.
Was ist daran falsch?
Es funktioniert alles das gleiche wie meine Portierung in MQL5 von MQL4, aber ich sehe, dass der Code wegenArraySetAsSeries() hässlich ist, das ist, warum ich fragte
hier sind beide Codes
Bringen Sie mir bei, wie man diesen Indikator für MT5 schreibt! - Mein Code ist nicht schön, Punkt! )))
ZSZ nicht erinnern, wie man Indikatoren für MT5 zu schreiben, setzte sich hin und schrieb es in 40 Minuten mit Hilfe, aber das Ergebnis ... imho, nicht so gut ((!
Ja, alles funktioniert genau wie mein Port in MQL5 von MQL4, aber ich sehe, dass der Code wegenArraySetAsSeries() hässlich ist, so fragte ich
hier sind beide Codes
Bringen Sie mir bei, wie man diesen Indikator für MT5 schreibt! - Mein Code ist nicht schön, Punkt! )))
Wenn Sie die Schleife umkehren, müssen Sie unbedingt die Arrays Zeitreihen machen, da sonst die Indizierung der Puffer in der Schleife nicht mit der Indizierung der erforderlichen Daten übereinstimmt - der Schleifenindex im Array der Indikatorpuffer wird vom Anfang zum Ende gehen, während in open[], high[], low[], close[] und anderen - vom Ende zum Anfang. Oder Sie können die Schleife umkehren, um ihre Indizierung der Arrays open[], high[], low[], close[] und den Rest mit der Indizierung der Puffer abzugleichen, was komplizierter ist.
Wenn Sie eine Allegorie brauchen, um das zu verdeutlichen, hier ist eine Allegorie für Sie:
Du stehst an den Bahngleisen und siehst zwei Züge. Sie gehen entweder in eine Richtung - beide von links nach rechts (ArraySetAsSeries(array,true) - erster Zug und eine Schleife vom Grenzwert bis 0 - zweiter Zug),
Oder sie gehen aufeinander zu - (ArraySetAsSeries(array,false) - von rechts nach links - erster Zug, und die Schleife von Limit bis 0 - von links nach rechts - zweiter Zug)
Und, ja: Ich habe mir den Code nicht angesehen - ich möchte ihn nicht herunterladen, speichern (es gibt bereits eine Menge unnötigen Code aus dem Forum), miteinander vergleichen...
Es wäre einfacher, sie in Codes in die Nachricht zu packen - einen und einen zweiten - dann wäre sofort sichtbar, was zu was.
Oder man dreht die Schleife um, damit sie mit der Indizierung der Arrays open[], high[], low[], close[] und dem Rest übereinstimmt, was schwieriger ist.
Ich habe es heute die ganze Nacht rückgängig gemacht, meine Geduld ist am Ende (((
Soweit ich das Problem verstehe:
- In MT5 werden die Arrays, die den Indikatorpuffern zugewiesen sind, standardmäßig von links nach rechts indiziert;
- in MT5 Zeitreihen werdenopen[], high[], low[], close[], die von OnCalculate() verfügbar sind, immer von rechts nach links indiziert übergeben
- d.h. auf der Grundlage der Schritte 1 und 2, um den Indikator vom Ende der Historie bis zum Null-Bar zu berechnen
a) oder die Indizierung der Puffer-Arrays neu zuordnen
b) oder eine Schleife zu bilden, in der die Elemente der Matrix von links nach rechts und in einer weiteren Schleife von rechts nach links neu berechnet werden:
D.h.,es gibt keine schöne Lösung für meine Frage? Option a) - in meinen Quellen ist implementiert, Option b) - ich sehe keinen Sinn darin, zusätzliche Berechnungen durchzuführen
Quellen:
MT5:
MT4:
Ich habe heute die ganze Nacht geblättert, aber meine Geduld ist am Ende (((
soweit ich das Problem verstehe:
- In MT5 werden die Arrays, die den Indikatorpuffern zugewiesen sind, standardmäßig von links nach rechts indiziert;
- in MT5-Zeitreihen werdenopen[], high[], low[], close[], die von OnCalculate() verfügbar sind, immer von rechts nach links indiziert übergeben
- d.h. auf der Grundlage der Schritte 1 und 2, um den Indikator vom Ende der Historie bis zum Null-Bar zu berechnen
a) oder die Indizierung der Puffer-Arrays neu zuordnen
b) oder eine Schleife zu bilden, in der die Elemente der Matrix von links nach rechts und in einer weiteren Schleife von rechts nach links neu berechnet werden:
D.h., es gibtkeine schöne Lösung für meine Frage? Variante a) - in meinen Quellen ist implementiert, Variante b) - ich sehe keinen Sinn darin, zusätzliche Berechnungen durchzuführen
Alle Arrays werden von rechts nach links indiziert. Um die Schleife von links nach rechts vollständig einzuhalten (und zwar von links nach rechts - vom Limit bis 0), müssen Sie alle verwendeten Arrays auf die erforderliche Indizierung setzen : Puffer in OnInit(), verwendete Timeserver - in OnCalculate().
Oder Sie führen den Zyklus von 0 bis zum Limit durch, was bei der Portierung von mql4 auf mql5 nicht immer einfach ist.
Daher ist die Option ArraySetAsSeries() in diesem Fall besser geeignet.
Alle Arrays werden von rechts nach links indiziert. Um die Schleife von links nach rechts vollständig einzuhalten (und zwar von links nach rechts von Limit bis 0), müssen Sie alle verwendeten Arrays auf die erforderliche Indizierung setzen : Puffer in OnInit(), verwendete Timeserver - in OnCalculate().
Oder man muss den Zyklus von 0 bis zum Grenzwert durchlaufen, was nicht immer einfach ist, wenn mql4 auf mql5 portiert wird.
Deshalb funktioniert in diesem Fall die Methode ArraySetAsSeries() besser.
Entfernen Sie alleArraySetAsSeries() aus Ihrem Code(am Anfang von Init() und OnCalculate() in den ersten Zeilen), und beheben Sie die Schleife:
for(i=0;i<limit;i++)
Theoretisch müsste alles zusammenpassen, aber nein, die Diagramme sind unterschiedlich ausgefallen - das ist es, was ich nicht begreifen kann!
Sehen Sie, ich habe alleArraySetAsSeries() aus meinem Code entfernt(oben in Init() und in OnCalculate() in den ersten Zeilen) und die Schleife behoben:
for(i=0;i<limit;i++)
Theoretisch sollte alles zusammenpassen, aber nein, die Karten sind unterschiedlich ausgefallen, und das ist es, was ich nicht begreifen kann!
Ich sage Ihnen, es ist viel komplizierter als das. Sie müssen die Logik ändern. Es reicht nicht aus, die Schleife zu invertieren.
Hier ein kleines Beispiel: Im Code gibt es
Buf_NTLine1[i+1])
Wo wird der Index i+1 hingehen, wenn die Arrays unterschiedlich indiziert sind?
Und davon gibt es eine ganze Menge. IHighest() - Start und Nummer. Wo beginnt sie bei einer Indexierung und wo bei einer anderen?
Und so weiter ...
und davon gibt es eine ganze Menge. IHighest() - Beginn und Anzahl der... Wo beginnt sie bei der einen Indizierung und wo bei der anderen?
oh mann! das ist richtig! gut gemacht!!! ja, das ist der schwierige teil!!!
Ja... eine Menge Unterschiede im MT5, eine Menge Kontrollen und alle möglichen Vorsichtsmaßnahmen für den Programmierer...
Als ich es vor nicht allzu langer Zeit sah, hatte ich eine Nachricht, dass in MT5 nicht immer alleskorrekt inInit() initialisiert wird, es sieht so aus, als obInit() auch dann beendet werden kann, wenn die Timeframes nicht bereit sind.
Ich sah einen Fehler gestern: wenn dieser Indikator in MT5 Zeitrahmen wechselt, manchmal Indikator Puffer kann nicht leer sein - es scheint, die alten Werte bleiben, wenn nicht einen bestimmten Wert für jedes Element in der Indikator-Array in OnCalculate() zuweisen, habe ich versucht, ArrayInitialize(arr, 0.0) inInit()- es funktioniert auch, dann nicht...
soweit ich es richtig verstanden habe:
- In MT5 werden bei der Initialisierung inInit() die Indikatorpuffer nicht automatisch initialisiert? (in MT4 kann ich mich nicht erinnern, dass etwas in den Puffern geblieben ist)
- in MT5 inInit() die Größen der Puffer-Arrays unbekannt sein können, wenn die Historie nicht geladen ist, weshalbArrayInitialize(arr, 0.0) die Puffer auch nicht immer korrekt initialisiert?
Verdammt! Das ist richtig! Gut gemacht!!! Ja, so macht das Spaß!!!
Ja... Es gibt viele Unterschiede im MT5, der Programmierer hat eine Menge Kontrollen und alle Arten von Vorsichtsmaßnahmen...
Als ich diese Nachricht vor einiger Zeit sah, schien es, dass in MT5 nicht immer alleskorrekt inInit() initialisiert wird, es scheint, dassInit() auch dann beendet werden kann, wenn die Timeframes nicht bereit sind.
Ich sah einen Fehler gestern: wenn dieser Indikator in MT5 Zeitrahmen wechselt, manchmal Indikator Puffer kann nicht leer sein - es scheint, die alten Werte bleiben, wenn nicht einen bestimmten Wert für jedes Element in der Indikator-Array in OnCalculate() zuweisen, habe ich versucht, ArrayInitialize(arr, 0.0) inInit()- es funktioniert auch, dann nicht...
soweit ich es richtig verstanden habe:
- In MT5 werden bei der Initialisierung inInit() die Indikatorpuffer nicht automatisch initialisiert? (in MT4 kann ich mich nicht erinnern, dass etwas in den Puffern geblieben ist)
- in MT5 inInit() die Größen der Puffer-Arrays unbekannt sein können, wenn die Historie nicht geladen ist, weshalbArrayInitialize(arr, 0.0) die Puffer auch nicht immer korrekt initialisiert?
Ich bin nicht wirklich in die Logik des Ganzen eingestiegen.
Ich bin nicht wirklich in die Logik des Ganzen eingestiegen.
Das ist der richtige Weg: Setzen Sie die Einstiegspunkte nicht auf den Höchst- oder Mindestpreis, sondern besser auf den Eröffnungskurs.
Und die Linien sollten entfernt werden - wozu sind sie auf dem Diagramm? Und sei es nur, um ihnen das Handwerk zu legen?
Deklaration ohne Typ
Wenn ich eine Include-Datei kompiliere, tritt kein Fehler auf. Wenn ich die Hauptprogrammdatei kompiliere, in die ich diese Include-Datei einfüge, gibt es eine Deklaration ohne Typfehler. Es sieht das in der Include-Datei deklarierte Objekt nicht protected CSomeClass *object. Die Include-Datei enthält die Anweisung #include "SomeClass.mqh". Und in der Hauptdatei wird ein Objekt der Klasse der eingeschlossenen Datei erstellt und eine der Methoden aufgerufen.