Diskussion zum Artikel "Verbessern Sie Ihre Handelscharts mit interaktiven GUI's in MQL5 (Teil III): Ein einfaches, bewegliches Handels-GUI"

 

Neuer Artikel Verbessern Sie Ihre Handelscharts mit interaktiven GUI's in MQL5 (Teil III): Ein einfaches, bewegliches Handels-GUI :

Begleiten Sie uns in Teil III der Serie „Verbessern Sie Ihre Handelscharts mit interaktiven GUIs in MQL5“, wenn wir die Integration interaktiver GUIs in bewegliche Handels-Dashboards in MQL5 untersuchen. Dieser Artikel baut auf den Grundlagen von Teil I und II auf und leitet die Leser an, statische Handels-Dashboards in dynamische, bewegliche Dashboards umzuwandeln.

Hallo und herzlich willkommen zu Teil 3 unserer Serie „Verbessern Sie Ihre Handelscharts mit interaktiven GUI's in MQL5“.

Bevor wir uns auf neues Terrain begeben, lassen Sie uns kurz rekapitulieren, was wir in Teil I und II behandelt haben:

1. In Teil I haben wir mit dem Konzept der Chartereignisse begonnen und darauf aufbauend zwei einfache bewegliche Dashboards auf demselben Chart erstellt.

2. Für Teil II sind wir noch einen Schritt weiter gegangen. Wir haben Klassen in einer .mqh-Datei verwendet, um unseren Code effizienter und vielseitiger zu gestalten, damit er in umfassende EAs/Indikatoren integriert werden kann.


Und nun sind wir bereit für Teil III! In diesem Teil werden wir uns darauf konzentrieren, unsere Dashboards zu verbessern, indem wir GUIs in sie integrieren. Denn ohne grafische Nutzeroberflächen erfüllen Dashboards nicht den ihnen zugedachten Zweck.

Autor: Kailash Bai Mina

 

Hallo Kalish,


Interessanter Ansatz und herzlichen Glückwunsch zum Abschluss Ihrer Serie. Die OnEvent-Codierung ist das, was alles möglich macht! Da Ihr erster Artikel mich begeistert hat, habe ich meine eigene Version des beweglichen Panels entwickelt. Es ist eine Basisklasse, die von einzelnen Klassen für jeden Paneltyp geerbt wird.Zweitens hatte ich bereits eine Steuerelement-Header-Datei erstellt, die auf den Beispielen in der MQL-Hilfedatei basierte, und entschied mich, diese zu verwenden, anstatt eine Textklasse für die Vererbung zu erstellen, was gut funktionierte. Ich plane, zwei weitere Methoden für die GUI-Klasse zu erstellen, Save und Initialize. Save wird eine CSV-Datei lesen und aktualisieren und die Startpositionen und -daten festlegen. Initialize wird die CSV-Datei lesen und die Startpositionen festlegen.

Zu Ihrer Kontrolle füge ich einen Screenshot meiner aktuellen EA-Überschriften und zwei Panels bei: Das erste ist die Active Orders, die ich verwenden werde, und das Sample ist die Basisversion, die als Vorlage für weitere Panels dient.


Viel Glück bei Ihren zukünftigen Unternehmungen, ich werde Sie beobachten.


Cape Coddah

 

Der Artikel war wirklich gut. Gut didaktisch und erklärt. Hat mir gefallen. 😁👍

 
CapeCoddah Steuerelement-Header-Datei erstellt, die auf den Beispielen in der MQL-Hilfedatei basierte, und entschied mich, diese zu verwenden, anstatt eine Textklasse für die Vererbung zu erstellen, was gut funktionierte. Ich plane, zwei weitere Methoden für die GUI-Klasse zu erstellen, Save und Initialize. Save wird eine CSV-Datei lesen und aktualisieren und die Startpositionen und -daten festlegen. Initialize wird die CSV-Datei lesen und die Startpositionen festlegen.

Zu Ihrer Kontrolle füge ich einen Screenshot meiner aktuellen EA-Überschriften und zwei Panels bei. Das erste ist die Active Orders, die ich verwenden werde, und das Sample ist die Basisversion, die als Vorlage für weitere Panels dient.


Viel Glück bei Ihren zukünftigen Bemühungen, ich werde Sie beobachten.


Cape Coddah

Ich freue mich, dass Sie von meinen Artikeln profitieren.

Sie haben mich tatsächlich motiviert, diesen Teil 3 zu schreiben, sonst hätte es aus Mangel an Motivation noch länger gedauert.

Vielen Dank dafür.

Ich wünsche Ihnen auch viel Glück für Ihre zukünftigen Unternehmungen.

 
Daniel Jose #:

Der Artikel war wirklich gut. Gut didaktisch und erklärt. Hat mir gefallen. 😁👍

Es war mir ein Vergnügen. Vielen Dank für Ihre Zeit.

 

Hallo Kailash,

ich hoffe, du beobachtest diesen Artikel, da ich nicht weiß, wie man privaten Text schreibt.

Wie auch immer, ich habe deine Konzepte wirklich in eine viel bessere Art der Organisation eines EA integriert. Hier ist ein Screenshot meiner alten Version und einer, die dein bewegliches Panel-Konzept mit deinen Konzepten aus Teil 2 mit mehreren Childs verwendet. Obwohl es noch in der vorläufigen Entwicklungsphase ist, wird es mir erlauben, mehr relevante Daten während des Modelltests anzuzeigen.

Im Moment habe ich für jedes Panel eine eigene Kindklasse, einschließlich des Controllers.

clsGUI  GUI;
clsAO   AO;
clsBOB  BOB;
clsCTL  CTL;
clsXO   XO;
clsATR  ATR;
clsRSI  RSI;
clsMM   MM;
clsTS   TS;

//clsAO Guis[egElements];
//clsGui GuiS[egElements];
//Objekt Guis[egElements];

Dieser Ansatz ist zwar angemessen, führt aber zu vielen separaten Funktionen, um verschiedene Aufgaben in den EA-Panels zu erledigen. Ein besserer Ansatz wäre, ein Array der Child-Klassen zu haben und es als Parameter in den reduzierten Funktionsaufrufen zu verwenden. Ich habe die ersten beiden Ansätze ausprobiert, aber ich kann die Elemente des Arrays nicht in die entsprechende Child-Klasse umwandeln, um ihre eindeutigen öffentlichen Funktionen aufzurufen.Ich hatte begrenzten Erfolg beim Zugriff auf öffentliche Variablen, indem ich eine Wrapper-Klasse mit der Objektdeklaration verwendete. Dieser Ansatz scheint die Klassendefinition der Elemente des Parameterelements zu verwenden und nicht die Klassendefinition des Arrays

int Wrapper(object &theobject){

return(theobject.aninteger):

}

int i=Wrapper(Guis[5]);

dieser Ansatz funktioniert nicht für Guis[5].Create_Controls(......);

Der einzige Ansatz, den ich gesehen habe, der funktioniert, ist die Verwendung von c_array, um ein Array von Objektzeigern zu erstellen und sie dem Array hinzuzufügen. und dann den Zugriff durch eine Funktion, die die c_array AT(location) Funktion aufruft, um den Arrayzeiger einem lokalen Zeiger des lokal deklarierten Objekts zuzuweisen, um lokal auf die untergeordneten Variablen zuzugreifen.

Wissen Sie oder jemand anderes, wie dieses Problem zu lösen ist, oder können Sie auf MQL-Artikel oder Dokumentationen verweisen, die sich mit einem Array von untergeordneten Klassen befassen, anstatt mit einem Array einer Klasse?

Vielen Dank und ich freue mich schon auf Ihre nächsten Artikel

CapeCoddah

 

Ein gutes Beispiel für die Verwendung von OOP um der OOP willen.

Es stellte sich heraus, dass es umständlich und nicht bequem ist (IMHO). Aber es funktioniert, was schon mal gut ist :)


Man sollte OBJPROP_ZORDER hinzufügen, sonst werden hin und wieder Knöpfe gedrückt.

void Button::Create(string name, int xDis = 0, int yDis = 0, int xSize = 0, int ySize = 0)
  {
   ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis);
   ObjectSetInteger(0, name, OBJPROP_XSIZE, xSize);
   ObjectSetInteger(0, name, OBJPROP_YSIZE, ySize);
   ObjectSetInteger(0, name, OBJPROP_ZORDER, 1);
   _name = name;
  }
//+------------------------------------------------------------------+
 
Alexander Slavskii #:
Aber es funktioniert, und das ist gut so :)

Danke für die Anregung.

 
Aleksandr Slavskii Verwendung von OOP um der OOP willen.

Es erwies sich als umständlich und unpraktisch (IMHO). Aber es funktioniert, was schon gut ist :)


Sie müssen OBJPROP_ZORDER hinzufügen, sonst werden hin und wieder Tasten gedrückt.

Das ist überhaupt nicht OOP. Das sind Terminalmethoden, die in Klassen verpackt sind.

Wenn ein Programmierer eine andere GUI erstellen möchte (schickes http, über WebSocket, wie in anderen Artikeln beschrieben), wird er nichts tun können. Er wird einfach den gesamten Code aus dem Artikel wegwerfen und einen neuen schreiben.

Um den visuellen Teil radikal zu ändern, aber mit dem gleichen ObjectCreate(xx) - müssen Sie alles neu schreiben.

Oder wie kann man die GUI deaktivieren, damit sie keine CPU auf VDS-ka beansprucht.

Wo bleibt die Wiederverwendbarkeit? Warum ist GUI mit anderem Code durchsetzt... Wir können nicht einmal über Stile sprechen, zumindest nicht über Farben.

Mit den Bibliotheken aus dem Artikel ist der Code eines typischen EA kürzer geworden... Aber nein, dafür wurde er nicht geschrieben :-)

 
Maxim Kuznetsov #:

esist überhaupt nicht OOP. Das sind Terminalmethoden, die in Klassen verpackt sind.

Wenn ein Programmierer eine andere grafische Benutzeroberfläche erstellen möchte (schickes http, über WebSocket, das in anderen Artikeln behandelt wird), wird er nichts tun können. Er wird einfach den ganzen Code aus dem Artikel wegwerfen und einen neuen schreiben.

Um den visuellen Teil radikal zu ändern, aber mit demselben ObjectCreate(xx) - müssen Sie immer noch alles neu schreiben.

oder wie man die GUI deaktivieren kann, so dass sie keine CPU auf VDS-ka beansprucht

Wo bleibt die Wiederverwendbarkeit? Warum ist GUI mit anderem Code durchsetzt... Wir können nicht einmal über Stile sprechen, zumindest nicht über Farben.

Mit den Bibliotheken aus dem Artikel ist der Code eines typischen EA kürzer geworden... Aber nein, dafür wurde er nicht geschrieben :-)

Nun, ich denke, es ist nicht ganz richtig, hier über Farben zu diskutieren.

Aber die Tatsache, dass die Kauf- und Verkaufsbuttons in umgekehrter Reihenfolge angeordnet sind, kann den Benutzer in die Irre führen.


Es ist nicht klar, warum die GUI ausgeschaltet werden sollte , wenn es sich um ein Panel für den manuellen Handel handelt. Wenn es sich jedoch nicht um ein Handels-, sondern um ein Informationspanel handelt, dann ist es in der Tat besser, es zu deaktivieren.

Ich mag die Art und Weise, wie die Funktionen RectangleLabel::OnEvent und RectangleLabel::Add organisiert sind, es ist schön, klar und lesbar.

Ich habe dasselbe Prinzip in meinen Panels verwendet, aber mein Code war ein wenig dürr oder so. Im Allgemeinen war er nicht schön. Also beschloss ich, den Code aus dem Artikel für ein neues Panel zu verwenden.

Das Panel wurde schließlich fertig, aber ich habe mehr Zeit darauf verwendet, als wenn ich es von Grund auf neu geschrieben hätte.

Im Allgemeinen lautet das Fazit: Der Artikel ist interessant und nützlich, aber der Code im Artikel ist teilweise nicht durchdacht.

 
Aleksandr Slavskii #:

Nun, wenn es um Farben geht, halte ich es nicht für richtig, hier über Farben zu sprechen.

Aber die Tatsache, dass die Schaltflächen zum Kaufen und Verkaufen spiegelverkehrt angeordnet sind, kann den Benutzer in die Irre führen.


Es ist nicht klar, warum die grafische Benutzeroberfläche abgeschaltet werden sollte , wenn es sich um ein Panel für den manuellen Handel handelt. Wenn es sich jedoch nicht um ein Handels-, sondern um ein Informationspanel handelt, ist es besser, es zu deaktivieren.

Ich mag die Art und Weise, wie die Funktionen RectangleLabel::OnEvent und RectangleLabel::Add organisiert sind, sie sind schön, klar und lesbar.

Ich habe dasselbe Prinzip in meinen Panels verwendet, aber mein Code war ein wenig dürr oder so. Im Allgemeinen war er nicht schön. Also habe ich beschlossen, den Code aus dem Artikel für ein neues Panel zu verwenden.

Am Ende habe ich das Panel bekommen, aber ich habe mehr Zeit darauf verwendet, als wenn ich es von Grund auf neu geschrieben hätte.

Im Allgemeinen lautet die Schlussfolgerung: Der Artikel ist interessant und nützlich, aber der Code im Artikel ist teilweise nicht durchdacht.

Es gibt viele ausgefeilte Methoden mit schönen Pfeilen "wie man UI so implementiert, dass es nicht schmerzhaft wäre" :-) MVC und ähnliches. So kann dort das Frontend (win,gtk,qt,web) manchmal mit einer leichten Handbewegung geändert werden.

Nichts davon ist in MQL implementiert worden. Alles ist festgenagelt, schlimmer als TurboVision - auch wenn es Klassen von Adam gibt, aber es gibt dort Modelle.

Einzelne schreiben seit Jahren(!!!) über "easy and simple" und "simple interface", aber es ist genau dasselbe wie in diesem Artikel. Eine Menge Code, der nichts einfacher macht. Der einzige Effekt ist ein Bonus für das Konto des Autors.