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
Statische Variable, so ist sie für alle Instanzen ohne Vererbung gleich.
Ich habe es überprüft, und ja, es war einfacher als das!
2019.08.29 15:14:09.847 tst__ EURUSD,M15: initialisiert
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: B::Bru
2019.08.29 15:14:09.847 tst__ EURUSD,M15: MyTerminalInfoString
Ich sehe, dass die Variable Language nur einmal initialisiert wurde, d.h. dies ist eine einfachere Lösung
Ich danke Ihnen!
Bitte sagen Sie mir, worin der Unterschied besteht?
Ein Objekt oder einen Zeiger auf diese Weiseerstellen
von der klassischen Schöpfung
Der Unterschied besteht darin, dass Sie im ersten Fall denCClass-Klassenbezeichner in C++ nicht angeben müssen.
Ich habe meine Klasse skizziert, die Felder einmal mit konstanten Werten initialisieren soll, und es scheint wie vorgesehen zu funktionieren:
Ich mag 2 Dinge nicht:
1. ich wiederhole den Aufruf von SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - weil die Reihenfolge der Initialisierung nicht festgelegt ist, d.h. es ist nicht sicher, dass VolumeSTEP zuerst initialisiert wird und erst dannGetDigitsInVolumeStep() aufgerufen wird
2. ich möchte die statische Methode static int GetDigitsInVolumeStep() loswerden - ich habe ein Video auf youtube gesehen, in dem gesagt wird, dass man in reinem OOP keine statischen Methoden verwenden sollte, und jetzt kämpfe ich gegen Windmühlen
der Link zum Video, es ist im Wesentlichen das gleichehttps://youtu.be/lfdAwl3-X_c undhttps://youtu.be/zME4SOCHT0I
Wie kann ich diese 2 Punkte, die mir nicht gefallen, anders formulieren?
1. ich wiederhole den Aufruf von SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) - weil die Reihenfolge der Initialisierung nicht festgelegt ist, d. h. es ist nicht sicher, dass zuerst VolumeSTEP initialisiert wird und erst dann GetDigitsInVolumeStep() aufgerufen wird
1. Haben Sie Angst, dass die Reihenfolge der Statikinitialisierung undefiniert ist? Eigentlich nicht, denn die Pluszeichen werden in der Reihenfolge der Definition im Code initialisiert. Also keine Panik, erst VolumeSTEP und dann VolumeDIGITS.
1. Sie befürchten also, dass die Reihenfolge der Initialisierung der Statik undefiniert ist? Eigentlich ist es nicht so, in pluses Initialisierung ist in der Reihenfolge der Definition im Code. Also keine Panik, erst VolumeSTEP und dann VolumeDIGITS.
Ja, nicht, dass ich Angst hätte, sagen wir, ich bin geschützt, ich glaube, dass der Code zumindest eine gewisse Garantie gegen Änderungen im Kompilierungsverhalten haben sollte - im Allgemeinen JA
ZS: Hier im Allgemeinen, warum das Thema für die einmal am Tag apaed - ich will sehen, wie realistisch, um etwas wie in der Video-Autor Egor sagt, während ich bezweifle, dass wir etwas effektiv zu bekommen - jetzt bin ich mit statischen Methoden, und mit der Initialisierung sind bereits einige Zweifel erschienen
1. Befürchten Sie, dass die Reihenfolge der Initialisierung der Statik undefiniert ist? Eigentlich nicht, denn die Pluszeichen werden in der Reihenfolge der Definition im Code initialisiert. Also keine Panik, erst VolumeSTEP und dann VolumeDIGITS.
Auch bei MQL.
https://www.mql5.com/ru/docs/basis/oop/staticmembers
Ja, nicht, dass ich Angst hätte, sagen wir, ich bin geschützt, ich glaube, dass der Code zumindest eine gewisse Garantie gegen Änderungen im Kompilierungsverhalten haben sollte - im Allgemeinen JA
ZS: hier im Allgemeinen, warum das Thema zum ersten Mal einen Tag - ich will sehen, wie realistisch, um etwas wie in dem Video Autor Egor sagt, während ich bezweifle, dass wir etwas effektiv zu bekommen - jetzt bin ich mit statischen Methoden, und mit der Initialisierung sind bereits einige Zweifel erschienen
Um es auf diese Weise zu verwenden:
Und in einem Code wie diesem:
Verwenden Sie wie folgt:
Und im Code wie folgt:
Ups, ein kleiner Irrtum, das ist es, was ich tun kann
Ich möchte im Allgemeinen Folgendes erreichen:
1. die Klasse CDeal ist eigenständig, sie öffnet/schließt/steuert ihre Reihenfolge durch eine Strategie - die Strategien werden aufgezählt, so dass der Optimierer durch die Mischung der Strategien blättern kann
2. nach Schritt 1 brauche ich nirgendwo anders die Terminal-Umgebungsvariablen SYMBOL_VOLUME_MAX, SYMBOL_VOLUME_MIN,SYMBOL_VOLUME_STEP und die Anzahl der Zeichen in SYMBOL_VOLUME_STEP - sie ändern sich nicht während des MQL-Programmbetriebs
3. ausgehend von den Punkten 1 und 2 kann ich die Methoden zum Öffnen/Schließen/Handeln von Aufträgen und die Auftragseigenschaften selbst in einer Klasse CDeal kapseln - ich werde all dies nirgendwo verwenden? - d.h. ich kann sie alle in einer Klasse verwenden
pp 1-3 alles ist lösbar, aber... OK, jetzt hast du mir mit der Statik geholfen, lass es so sein, denn es gibt eine Hilfe, zumindest eine Möglichkeit, meine Entscheidung zu rechtfertigen, jetzt ist der Code wie folgt
Ich habe 3 Instanzen von Cdeal erstellt und es im Protokoll gefunden:
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: initialisiert
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::CdealVolumeMAX = 100000.0 , VolumeMIN = 0.01 , VolumeSTEP = 0.01 , VolumeDIGITS = 2
2019.08.29 21:53:53.613 AnyGrid_v1.00 EURUSD,M30: Cdeal::GetDigitsInVolumeStep
Bis jetzt hat alles wie geplant funktioniert!
D.h., jetzt gibt es keine Abschnitte mit wiederholtem Code (Aufrufe) - es ist ein effizienter Code, aber wie kommt man weg von der Verwendung der statischen Funktion static int Cdeal::GetDigitsInVolumeStep() - im Video glaubt der Autor, dass es möglich ist, OOP-Code ohne statische Funktionen zu schreiben, ich sehe, dass es nicht nur unbequem ist, sondern dass es nicht immer möglich ist, alles zu verwenden, über Get- und Set-Methoden - wahrscheinlich werde ich ohne sie auskommen, ich werde später sehen
Die Option des statischen Feldes hat einen großen Nachteil. Sie können keine unterschiedlichen Werte für dieses Feld in verschiedenen Instanzen der Klasse haben.
Ja, danke, das weiß ich, der Zweck ist nur, einen effizienten Code ohne unnötige Variablen und unnötige Verwendung von Speicher zu erhalten
Ich habe die Frage immer noch nicht gelöst:Wie kann man vermeiden, die statische Funktion static int Cdeal::GetDigitsInVolumeStep()
Hier ist ein Überblick über meine Klasse, die Felder einmal mit konstanten Werten initialisieren sollte, scheint es zu funktionieren wie beabsichtigt: