Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1332
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
Ich habe mich durch die Dokumentation und das Forum gewühlt ...
Wie macht man Variablen vom Zeigertyp global [im Beispiel var], wenn sie in OnInit() von string erstellt werden:
und die Anzahl der Objekte und Konstruktorparameter sind im Voraus unbekannt und werden in OnInit() berechnet ?
Das ist ganz einfach.
Hallo
mt5 hat eine Fadenkreuztaste
Wenn Sie die Taste auf dem Diagramm drücken, wird angezeigt, wie viele Balken, wie viele Pips und Prozent
Helfen Sie mir, diesen Wert korrekt zu berechnen, damit ich ihn an meinen Roboter binden kann.
Dankeschön
Gibt es die neue Anwaltsklasse bereits?
Und wie genau sehen die Eingabeparameter aus?
Die Klasse ist entlehnt aus:https://www.mql5.com/ru/code/768, kleinere Änderungen vorgenommen
Sie soll wie folgt angewendet werden:
Einfach.
Danke für die Antwort)
Zuerst habe ich das getan.
Das Objekt wird also zweimal erstellt, zuerst leer und dann, wie es sein sollte, durch einen Konstruktor mit Parametern.
Aber ... In diesem Fall gibt der Compiler eine Warnung in der Zeile in OnInit() aus:
Deklaration von 'var1' blendet globale Variable aus -> in der Zeile in OnInit()
siehe vorherige Deklaration von 'var1'.
Eine lokale Variable verbirgt also eine globale Variable ... Was passiert also?
Welche Variable wird dann von einer anderen Funktion, z.B. OnTick(), gesehen? Die globale Variable ist =NULL, die lokale Variable ist korrekt initialisiert, kann aber von einer anderen Funktion nicht gesehen werden ...
Die Klasse ist entlehnt aus:https://www.mql5.com/ru/code/768, mit kleinen Änderungen
Es soll wie folgt angewendet werden:
Extrahieren Sie alle Teilstrings aus den Eingabeparametern und verwenden Sie diese, um die Namen der Symbole und die entsprechenden Zeitrahmen zu erstellen.
Erstellen Sie dann neue Balkenobjekte aus diesen Listen und platzieren Sie den Zeiger auf jedes zu erstellende Objekt - "New Bar" - in CArrayObj, das global deklariert ist.
Als Nächstes erhält er in der OnTimer()-Schleife einen Zeiger auf das nächste Objekt in der Liste und sucht nach einem neuen Balken. Wenn es kein neues Objekt gibt, müssen Sie zum nächsten gehen, wenn es eines gibt, müssen Sie tun, was Sie tun müssen, wenn sich ein neuer Balken öffnet.
Der Timer sollte nach Ihren Bedürfnissen eingestellt werden - Millisekunde, Sekunde, Minute - im Allgemeinen mit der Frequenz, die Sie für ausreichend halten, um auf einen neuen Balken auf einem nicht aktuellen Symbol zu reagieren.
Danke für die Antwort)
Zuerst habe ich das getan.
Das Objekt wird also zweimal erstellt, zuerst leer und dann, wie es sein sollte, durch einen Konstruktor mit Parametern.
Aber ... In diesem Fall gibt der Compiler eine Warnung in der Zeile in OnInit() aus:
Deklaration von 'var1' blendet globale Variable aus -> in der Zeile in OnInit()
siehe vorherige Deklaration von 'var1'.
Eine lokale Variable verbirgt also eine globale Variable ... Was passiert also?
Welche Variable wird dann von einer anderen Funktion, z.B. OnTick(), gesehen? Die globale Variable ist =NULL und die lokale Variable ist korrekt initialisiert, kann aber von einer anderen Funktion nicht gesehen werden.
Sehen Sie genau hin. Das ist nicht das, was Sie getan haben.
Aus den Eingabeparametern müssen alle Teilstrings extrahiert werden, aus denen die Namen der Symbole und die entsprechenden Zeitrahmen zusammengestellt werden müssen.
Erstellen Sie dann neue Balkenobjekte aus diesen Listen und setzen Sie einen Zeiger auf jedes neue Objekt in CArrayObj, das auf globaler Ebene deklariert ist.
Als Nächstes erhält er in der OnTimer()-Schleife einen Zeiger auf das nächste Objekt in der Liste und sucht nach einem neuen Balken. Wenn es kein neues Objekt gibt, müssen Sie zum nächsten gehen, wenn es eines gibt, müssen Sie tun, was Sie tun müssen, wenn sich ein neuer Balken öffnet.
Erstellen Sie einen Timer nach Ihren Bedürfnissen - Millisekunde, Sekunde, Minute - im Allgemeinen mit der Frequenz, die Sie für ausreichend halten, um auf einen neuen Balken auf einem nicht aktuellen Symbol zu reagieren.
Dies ist, was ich tat, aber ArrObj.At(0) ruft nicht dieKlasse Mitglied Funktionen...
Schauen Sie genauer hin. Das ist nicht das, was Sie getan haben.
Bereits bemerkt)
Die Lösung besteht also darin, global leere Objekte zu deklarieren....
Und wenn man vorher nicht weiß, wie viele es sein werden? Einfach "mit Reserve" deklarieren ? :)
P.S. Ich habe diese Art der Deklaration von Objekten nicht in der integrierten Hilfe gefunden
CObj* var1 = NULL;
Bereits bemerkt)
Die Lösung besteht also darin, global leere Objekte zu deklarieren....
Und wenn man vorher nicht weiß, wie viele es sein werden? Erklären Sie sie einfach als "unter Vorbehalt" :)
InCArrayObj einfügen.
Die FunktionArrObj.At(0) gibt einen Zeiger auf eine Basisklasse zurück, die nichts über die Mitglieder der abgeleiteten Klasse weiß.
Um auf sie zu verweisen, müssen Sie lediglich eine Typumwandlung vornehmen.
CIsNewBar* newBar = (CIsNewBar*)ArrayObj.At(0); newBar.method( parameter );
InCArrayObj einfügen.
Die FunktionArrObj.At(0) gibt einen Zeiger auf die Basisklasse zurück, die nichts über die Mitglieder der abgeleiteten Klasse weiß.
Führen Sie einfach eine Typumwandlung durch, um auf sie zu verweisen.
Danke für die Antwort, du bist gar nicht böse)
Jetzt ist alles klar)
UPD
So funktioniert die Konstruktion auch
CIsNewBar* newBar = ArrayObj.At(0); newBar.method( parameter )