Fragen zu OOP in MQL5 - Seite 29

 
Dmitry Fedoseev:

Ja, das ist eine weitere Frage, die immer wieder auftaucht und auf die es keine klare Antwort gibt. Wenn Sie Ihre eigene Klasse erben müssen - was ist besser, sie zu erben oder eine neue erweiterte Version Ihrer Klasse zu schreiben.

Es hängt alles von der allgemeinen Vorstellung ab, was Sie letztendlich wollen, imho

wenn Sie die Klasse an anderer Stelle verwenden wollen, müssen Sie sie ohne Vererbung vervollständigen

in meinem Beispiel kann die CError-Klasse GetLastError(), unset mit einer Beschreibung und den Wert (int) des Fehlers zurückgeben. Ich plane, es überall zu verwenden, sowieso gibt es nur einen Konstruktor, der die Sprache in einer statischen Variable und den Fall, der den Fehlertext zurückgibt definiert

Aber es gibt noch eine andere nützliche Methode - bool ServerDisable(); - sie definiert die Verfügbarkeit des Servers (Multiplattform MT4/МТ5-Code), eine sehr gute Funktion, sie scheint an anderer Stelle im Code benötigt zu werden, aber ich dachte, dass ich sie trotzdem für Handelsoperationen verwenden werde - ich habe sie in die COrder-Klasse eingebaut

.....

und wenn ich es zum Nachziehen verwenden möchte? .... - viel Raum für Phantasie, aber letztendlich wird es als Objekt in COrder verwendet - wo sonst könnte es verwendet werden?


imho sieht alles umständlich aus, es ist einfacher, die Service-Funktionsbibliothek mit dem Linker einzubinden, und der Compiler wird die unbenutzten Teile nicht von selbst in die ausführbare Datei einbinden

die ganze Klasse wäre recht kompakt im prozeduralen Stil, ich habe ein Beispiel für eine Funktion zum Öffnen einer Bestellung gezeigt, die in statischen Konstanten das Bestellvolumen speichern kannhttps://www.mql5.com/ru/forum/85652/page17#comment_12805083

 
Dmitry Fedoseev:

Ist es wirklich wichtig, die Grenzen einzuhalten? Wenn es wichtig ist, sich in Grenzen zu halten, können Sie auch Funktionen schreiben.

Ich habe im Zusammenhang mit Ihrer Aussage geantwortet, dass Sie sich, wenn Sie keine Klassen verwenden, mit unbequemen Aufrufsignaturen herumschlagen müssen. Ich habe gezeigt, dass Sie sich nicht darum kümmern müssen.

 
Alexey Navoykov:
Was hindert Sie daran, dem Konstruktor einen Symbolnamen zu übergeben, um die Klasse flexibel und vielseitig einsetzbar zu machen? Sie ziehen die Möglichkeit des Portfoliohandels grundsätzlich nicht in Betracht?

alles in Betracht ziehen,

Aber bisher habe ich mich an die Forschung gehalten - jetzt bin ich fast bereit, 1000 und 1 Wege des MM zu erforschen und alle Arten von Tricks mit Ordnungssystemen )))

Aber ich denke immer noch, dass es am Ende nicht zu flexibel wäre, ich habe oben schon 2 mal geschrieben, dass ein prozeduraler Stil + kleine Klassen mit gut abgestimmten Funktionen der Auftragsabwicklung besser wäre.

ich werde jetzt erst einmal dazu übergehen, meine Ideen zu testen, und dann werde ich sehen, was ich oft im Code ändere und was ich unangetastet lasse

 
Igor Makanu:

.....

Was ist, wenn ich es zum Nachziehen verwenden möchte? .... Hier ist mehr Raum für Phantasie, aber letztendlich wird es immer noch als Objekt in der COrder verwendet - wo sonst könnte es verwendet werden?


Nachlaufende Balken sind separat, da sie nichts mit der Hauptlogik zu tun haben. Es kann sein, dass sie gar nicht existieren.

***

Nachlaufende Balken und andere ähnliche Unterstützungsfunktionen sollten als Abkömmlinge einer Klasse angelegt werden, und ihre Instanzen sollten in einem Array erstellt werden. Wenn eine Funktion aktiviert ist, wird dem Array eine Instanz hinzugefügt und ausgeführt. Wenn alle Funktionen deaktiviert sind, ist das Array leer und unnötige ifs werden nicht ausgeführt. Sie können mindestens 100 Trailing Bars in den EA einfügen, ohne dass dies die Ausführungsgeschwindigkeit beeinträchtigt.

 
Alexey Navoykov:
So wird das nicht gemacht. Sie müssen zumindest sowohl Bid() als auch Ask() aufrufen. Ihr Code sieht aus wie eine Variable, die den Anschein erweckt, dass ihr Wert unverändert bleibt, obwohl das in Wirklichkeit nicht der Fall ist.

ach, es war schon immer auf diese Weise getan, in MT4 ist es immer noch Bid und Ask und keine Launen des Schöpfers zu ruinieren diese einfache Nutzung und immer aktuelle Preise ;)

fxsaber:

Ich habe das folgende Schema, bei dem ich keine Probleme hatte.

  1. Ich schreibe TC nur für Tester. Keine Protokolle, Fehlerbehandlungen und andere Dinge. Der Code ist sehr prägnant, verständlich und kann geändert werden, wenn dies durch OOP geschieht (was aber nicht entscheidend ist). Ich habe das Beispiel bereits in KB veröffentlicht. Der Bonus ist die schnelle Optimierung.
  2. Die Hauptsache ist, dass sie für den Prüfer und in unabhängigen Blöcken verfügbar sind. Die Erzeugung von Handelssignalen - ein Block. Signalhandel - ein weiterer Block.
  3. Die Überweisung auf das echte Konto erfolgt immer in mehreren Zügen. Der TS wird in einer virtuellen Umgebung platziert, ohne dass der Code geändert wird. Wenn mehrere TS in einer Umgebung oder jeder TS in einer eigenen Umgebung platziert werden kann, dann ist das OOP besonders praktisch. Dann nehmen wir einen Kopierer (der Markt ist voll davon, also sind die Leute gut in Kopierlogik), der einfach Geschäfte/Aufträge aus der virtuellen Umgebung in die reale kopiert.
  4. Mit diesem Schema ist das Schreiben von TS schnell und einfach. Die Übertragung auf Real (was wirklich selten vorkommt) erfolgt immer einheitlich, schnell und klar.

Reden wir über diesen Code?https://www.mql5.com/ru/code/22770

wirklich wie die Umsetzung. wirklich gut für Tester und Optimierer, ich werde es wahrscheinlich als Basis verwenden, der Code ist kurz und lesbar, um ehrlich zu sein bin ich überrascht, Ihren Code zu lesen, Sie haben viel mehr anspruchsvolle Stil des Schreibens, ich in der Regel Plug and Play, ich weiß, ich kann nicht verstehen, die Logik

 
Igor Makanu:

ach, es war schon immer so, in MT4 bleibt es Bid und Ask und kein Schöpfer Launen zerstören diese einfache Nutzung und immer aktuelle Preise ;)

Aber ihre Werte sind innerhalb der aktuellen Ereignisverarbeitung unveränderlich (es sei denn, Sie rufen RefreshRates zwangsweise auf). Sie sind also Variablen, keine Funktionen. Und Ihre Funktionen sehen wie Variablen aus

 

Geben Sie FPs eine echte Aufgabe der Verwaltung und Verarbeitung von Arrays von Hunderten von Megabytes oder Gigabytes von Daten und alle ihre Märchen Nachricht Modell (Daten sind unveränderlich) wird zur Hölle gehen.

Das sind Theoretiker, die gerade noch rechtzeitig aus den Aufgaben der realen Welt ausbrechen und in ihrem fiktiven Universum senden können :) Telekom-Geschichten sind dämliche Datenpässe.

Die einzige Möglichkeit, die Komplexität zu bekämpfen, besteht darin, sie in Objekte zu packen.
 
Alexey Navoykov:

Aber ihre Werte bleiben innerhalb der aktuellen Ereignisverarbeitung unverändert (es sei denn, Sie rufen RefreshRates zwangsweise auf). Es handelt sich also um Variablen, nicht um Funktionen. Und Ihre Funktionen sehen aus wie Variablen

Ich weiß nicht einmal, wie ich das in Ihrem Beispiel diskutierte Problem erklären soll, ich werde versuchen, es menschlich zu erklären - für mich, als jemand, der den ersten Pentium-90 PC hatte, schmerzt es zu sehen, dass, um eine bequeme Verwendung zu erhalten, ein zusätzlicher Funktionsaufruf, der impliziert, dass Werte von Registern auf den Stack gelegt werden, hinzugefügt wird... und ...los geht's.

Ich weiß, dass jetzt alles wiederholt auf Prozessorebene zwischengespeichert wird, und ich vermute, dass die Compiler-Entwickler den "Funktionsaufruf von Funktionsaufruf" effizienter gestalten werden.

dann sollte Ihr Beispiel wie folgt aussehen:

#define  Ask(dummy) SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define  Bid(dummy) SymbolInfoDouble(_Symbol,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask());
   Print("Bid = ",Bid());
  }

Oder so:

#define  Ask(symbol_) SymbolInfoDouble(symbol_,SYMBOL_ASK)
#define  Bid(symbol_) SymbolInfoDouble(symbol_,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask(_Symbol));
   Print("Bid = ",Bid(_Symbol));
  }
 
Dmitry Fedoseev:

Vasiliy, dieser Artikel wäre sehr nützlich für dich - um dich nicht zu quälen, indem du OOP um der OOP willen ausquetschst.

Ich habe eine Idee für einen funktionalen Rahmen für MT. Dort wird es fast kein OOP geben. Nur Funktionen, "Monaden" und andere Pseudo-FP-Funktionalität. Ich schreibe alles in Anführungszeichen, da es unmöglich ist, ein vollwertiges FP in MQL zu erstellen.

 
Dmitry Fedoseev:

Kommentare sind überflüssig.

ihr mögt euch nicht so sehr, oder vielleicht ist es das Gegenteil von 2 Schwulen, die einen Ausweg für sich selbst suchen)

Ich mochte übrigens Ihre Artikel, die Experten sind lahm, schwach, aber ich mag ihn genauso,

und ich bin nicht schwul.