Fragen zum MQL5-Assistenten und zur Standardbibliothek der Handelsklassen - Seite 11

 
Reshetov:

Drei Fragen:

  1. Wie kann man erreichen, dass das Signalmodul nur bei Eröffnungskursen und nicht bei jedem Tick funktioniert?
  2. Wie erhalte ich die Abstimmungswerte des Signalmoduls im Modul zur Positionsbestimmung? Sie müssen sich an einem bereits berechneten Signal orientieren und nicht ein weiteres Signalmodul erfinden, dem Sie folgen können.
  3. Wie erhält man die Abstimmungswerte des Alarmmoduls im Geld- und Risikomanagementmodul? Sie müssen die Volumina entsprechend den bereits berechneten Handelssignalen öffnen und nicht ein weiteres Signalmodul für die Volumenberechnung zusammenstellen.

Theoretisch können wir den EA natürlich auch mit dem Assistenten erstellen und dann all diese Funktionen manuell in den Code einfügen. Es ist jedoch wünschenswert, dass all dies in Form von Standardmethoden implementiert wurde, d. h. für Dummies, die den Assistenten verwenden möchten, damit sie nicht in den Code einsteigen und ihn bearbeiten müssen, wenn sie z. B. ein Signalmodul durch ein anderes ersetzen möchten.

Sie beantworten alle Ihre eigenen Fragen: "... den EA mit Hilfe eines Assistenten erstellen, und dann ... manuell ...". Es gibt noch keine anderen Optionen. Der Assistent wird höchstwahrscheinlich in naher Zukunft nicht entwickelt werden. Die Klassen der Standardbibliothek sind kein Dogma, sondern ein Versuch, eine Reihe von (meiner Meinung nach) typischen Lösungen anzubieten. Vererben (zur Verwendung im Assistenten), Überladen von Methoden, Hinzufügen eigener Methoden. Und Sie werden "glücklich" sein...
 
uncleVic:
Sie haben alle Ihre Fragen selbst beantwortet: "... ...den EA mit Hilfe eines Assistenten erstellen und dann... manuell ...". Es gibt noch keine anderen Optionen. Der Assistent wird höchstwahrscheinlich in naher Zukunft nicht entwickelt werden.

Es ist schade, dass ein so gutes Vorhaben in einer entfernten Ecke aufgegeben wird.

Wäre es auf den neuesten Stand gebracht worden, hätte man viel tun können, d.h. wir hätten fertige Module erstellen können, aus denen Dummies und andere Benutzer verschiedene fertige EAs zusammenstellen können, ohne sich durch Codes arbeiten zu müssen. Aber in diesem Fall entsteht das gleiche Chaos wie beim algorithmischen mql4, d.h. man nimmt einen Algorithmus, steigt in den Code ein und verwendet ihn manuell. Auch hier wird das OOP-Prinzip verletzt. Wenn Sie zum Beispiel ein Modul durch ein anderes ersetzen wollen, müssen Sie wieder in den Code einsteigen und alles von Hand ändern. Man bekommt eine Menge Unsinn, denn nur durch die Codes zu "kriechen", um wenigstens zu verstehen, wo und was zu ändern ist, würde eine Menge Zeit kosten.

Das war ein guter Anfang. Schade. Ich habe gerade gestern ein Signalmodul erstellt, aber ich bin immer noch verwirrt, wie ich den gesamten EA zum Laufen bringen kann, ohne jedes Mal in den Quellcode zu gehen. Ich habe das Modul gerade eingefügt, Positionsmanagement, Geldmanagement und Risikomanagement hinzugefügt, und alles funktioniert. Aber nein, es wird nicht funktionieren. Wenn ein Benutzer einen EA mit Hilfe des Assistenten erstellt, wird er nicht funktionieren. Er wird eine ganze Reihe von Anweisungen schreiben müssen, wo er im Code suchen und was er ändern muss. Ganz zu schweigen davon, dass ich mich mit all dem noch selbst auseinandersetzen muss, bevor ich eine Anleitung schreibe.

Es bleibt den Nutzern also nichts anderes übrig, als mql5, OpenCL usw. zu erlernen, um mit dem Autotrading umzugehen. Andernfalls werden sie kein Glück haben.

Nun, da dieses Projekt aufgegeben wurde, werde ich nun in eine andere Richtung denken.

 
Reshetov:

Es ist schade, dass ein so gutes Vorhaben in der Versenkung verschwunden ist.

Hoffen wir, dass es nicht aufgegeben, sondern auf Eis gelegt wird. Ich selbst habe viele interessante Gedanken über die Entwicklung des Meisters. Aber...
 
uncleVic:
Hoffen wir, dass es nicht aufgegeben, sondern verschoben wird. Ich habe selbst eine Menge interessanter Gedanken zur Entwicklung des Zauberers. Aber...

Die Hoffnung stirbt zuletzt (c) Sprichwort

Für die erste Frage, nämlich wie man das Signalmodul mit Eröffnungskursen testen kann und mit Ticks handelt, habe ich eine Lösung gefunden, so dass ich nicht in den Codes wühlen muss, und sogar besser als die allgemein akzeptierte.

Ich habe noch nicht herausgefunden, wie ich die Anzeigen des Signalmoduls in den Modulen Positionsmanagement und Aktien- und Risikomanagement lesen kann. Ich habe den Quellcode durchsucht und mich umgesehen. Das Signalmodul erhält seine Ergebnisse über die Methode direction(), d.h. ich brauche nur eine Instanz eben dieser Modulklasse in den Modulen Positionsmanagement und Kapital- und Risikomanagement anzusprechen und eben diese Methode aufzurufen, um ihre Werte zu lesen. Wie dies ohne Änderung des Codes geschehen kann, ist noch nicht klar.

 
Reshetov:

Die Hoffnung stirbt zuletzt (c) Sprichwort

Für die erste Frage, nämlich wie man das Signalmodul mit Eröffnungskursen testen kann und mit Ticks handelt, habe ich eine Lösung gefunden, so dass ich nicht in die Codes gehen muss, und sogar besser als die allgemein akzeptierte Lösung.

Und ich kann nicht herausfinden, wie ich die Werte des Signalmoduls in den Modulen Positionsmanagement und Aktien- und Risikomanagement ablesen kann, ohne die Codes zu suchen. Ich habe den Quellcode durchsucht und mich umgesehen. Das Signalmodul erhält seine Ergebnisse über die Methode direction(), d.h. ich brauche nur eine Instanz eben dieser Modulklasse in den Modulen Positionsmanagement und Aktien- und Risikomanagement anzusprechen und eben diese Methode aufzurufen, um ihre Werte zu lesen. Wie dies ohne Änderung des Codes geschehen kann, ist noch nicht klar.

Ohne Änderung der Codes wird es wahrscheinlich nicht funktionieren.

 
uncleVic:

Die Codes nicht zu ändern, wird wahrscheinlich nicht funktionieren.

Noch ist nicht alles verloren. Sie können Klassen erstellen, die von CExpert, CExpertMoneu und CExpertTrailing geerbt wurden, und ihnen die erforderlichen Methoden hinzufügen, um auf eine Instanz der Signalmodulklasse zuzugreifen. Aber auch hier gibt es ein Problem, denn der Assistent schreibt in den erstellten EA #include <Expert\Expert.mqh> und nicht dessen Nachkomme.

Darüber müssen wir noch nachdenken.

Hätten die Entwickler gleich geahnt, dass ein Signalmodul für alle anderen Module als Hauptmodul verwendet werden kann und zusätzliche Signale (wie in dieser Version des Assistenten) zu den Modulen Positionsunterstützung und Aktien- und Risikomanagement hinzugefügt werden können, wären die Codes einfacher gewesen. Aber in unserem Fall erfordert jedes Modul die Angabe zusätzlicher Bedingungen für Signale und somit zusätzliche externe Einstellungen, was zu einem solchen Ungetüm mit einer Vielzahl von zu optimierenden Parametern führt. Ganz zu schweigen davon, dass die Signale eines Moduls miteinander in Konflikt geraten können, d.h. ein Signalmodul kann eine Position eröffnen und ein dazugehöriges Modul sie beim nächsten Tick schließen, wenn die Ein- und Ausstiegsbedingungen des Marktes widersprüchlich sind.

 
Reshetov:

Noch ist nicht alles verloren. Schließlich können Sie Klassen erstellen, die von CExpert, CExpertMoneu und CExpertTrailing geerbt wurden, und ihnen die erforderlichen Methoden für den Zugriff auf eine Instanz der Signalmodulklasse hinzufügen. Aber auch hier gibt es ein Problem, denn der Assistent schreibt in den erstellten EA #include <Expert\Expert.mqh> und nicht dessen Nachkomme.

Darüber müssen wir noch nachdenken.

Hätten die Entwickler gleich geahnt, dass ein Signalmodul für alle anderen Module als Hauptmodul verwendet werden kann und zusätzliche Signale (wie in dieser Version des Assistenten) zu den Modulen Positionsunterstützung und Aktien- und Risikomanagement hinzugefügt werden können, wären die Codes einfacher gewesen. Aber in unserem Fall erfordert jedes Modul die Angabe zusätzlicher Bedingungen für Signale und somit zusätzliche externe Einstellungen, was zu einem solchen Ungetüm mit einer Vielzahl von zu optimierenden Parametern führt. Ganz zu schweigen von der Tatsache, dass die Signale eines Moduls miteinander in Konflikt geraten können, d.h. ein Signalmodul kann eine Position eröffnen und ein dazugehöriges Modul kann sie beim nächsten Tick schließen, wenn sich die Ein- und Ausstiegsbedingungen des Marktes widersprechen.



So ist es konzipiert. Der Assistent erstellt den "Fisch" des EA. Weiter:

  • Der Austausch der Aufnahme ist kein Problem;
  • das Hauptsignal wird absichtlich außerhalb erzeugt (zur Vereinfachung der Substitution);
  • einige Ints hinzufügen und Methodenaufrufe setzen?
 
uncleVic:

So war es auch gedacht. Der Meister schafft den "Fisch" des Beraters. Nächste:

  • Der Austausch der Inline ist kein Problem;
  • das Hauptsignal wird absichtlich außerhalb erzeugt (zur Erleichterung der Ersetzung);
  • einige Eingaben und Methodenaufrufe hinzufügen?


Das ist das Hässliche daran, Dinge wie:

  1. Der Zugang zu den Methoden der Klassen von Modulen, die in das Handelssystem einbezogen sind, wird sogar für das Lesen verweigert, was die Möglichkeit, ihre Arbeit zu koordinieren, völlig ausschließt.
  2. Signalmodule können leicht mit Modulen zur Positionsbestimmung kollidieren, da sie unterschiedliche Signale haben, und daher kann eine Inkompatibilität nicht ausgeschlossen werden.
  3. Verschiedene Signale in Modulen, und daher haben sie alle getrennte Einstellungen, was dazu führt, dass es nicht nur ein paar, sondern viele Eingangseinstellungen für einen EA gibt. Je mehr verschiedene Einstellungen, desto höher ist die Wahrscheinlichkeit, dass sie zur Geschichte passen.
  4. Nach dem Einsatz des Assistenten ist es manchmal notwendig, die Quellen durchzugehen, um die Probleme zu beheben. Für den Endbenutzer, der mit der Programmierung nicht vertraut ist, ist es überhaupt nicht geeignet, da er Plug-and-Play benötigt. Solche Verwirrungen schaffen auch Probleme für einen Programmierer, denn es ist viel einfacher, mit eigenem Code zu arbeiten als mit Code, der mit einem Assistenten gestapelt wurde. Eine weitere Schwierigkeit besteht darin, dass Klassen vererbt werden, d. h. die Ursache für Missverständnisse ist selten auf der Ebene der Nachkommen zu finden, sondern man muss tiefer in die Elternklassen hineinschauen.

Wir wollten das Beste. Es stellt sich heraus, dass es dasselbe ist wie immer (c) Tschernomyrdin

Im Allgemeinen können die meisten Missverständnisse behoben werden, aber dies muss auf der Ebene der übergeordneten Stammklasse geschehen, und dann können die behobenen Klassen durch Plattform-Updates verteilt werden. D.h. Sie müssen den Zugriff auf die Methode Direction() des Signalmoduls von den Modulen Positionsunterstützung und Aktien- und Risikomanagement aus öffnen. Denn wenn einzelne Modulentwickler den Quellcode der übergeordneten Klassen bearbeiten, wird der daraus resultierende inkompatible Quellcode nicht kompatibel sein und die erstellten Module werden auf anderen Computern nicht funktionieren. Wenn Entwickler von Modulen Elternklassen mit überschriebenen Methoden erstellen, wird die Inkompatibilität immer noch auf der Master-Ebene liegen, weil letztere ihre eigenen Inludes schreibt, und folglich müssen die Endbenutzer erneut Anweisungen schreiben, und sie werden kaum in die Quellen einsteigen wollen, und wenn sie es doch tun, dann in einem einzigen Symbol oder irgendwo anders, usw...

 
Reshetov:

Das ist das Problem, denn es gibt Dinge, die von Anfang an nicht bedacht wurden:

  1. Der Zugang zu den Methoden der Klassen von Modulen, die in das Handelssystem einbezogen sind, wird sogar für das Lesen verweigert, was die Möglichkeit, ihre Arbeit zu koordinieren, völlig ausschließt.
  2. Die Signalmodule können leicht mit den Modulen für die Positionsbestimmung in Konflikt geraten, da sie unterschiedliche Signale haben und daher eine Inkompatibilität nicht ausgeschlossen werden kann.
  3. Unterschiedliche Signale in den Modulen, und daher haben sie alle separate Einstellungen, was dazu führt, dass es nicht nur ein paar, sondern viele Eingangseinstellungen für den EA gibt. Je mehr verschiedene Einstellungen, desto höher ist die Wahrscheinlichkeit, dass sie zur Geschichte passen.
  4. Nach dem Einsatz des Assistenten ist es manchmal notwendig, die Quellen durchzugehen, um die Probleme zu beheben. Für den Endanwender, der mit der Programmierung nicht vertraut ist, ist es überhaupt nicht geeignet, da er Plug-and-Play benötigt. Für Programmierer sind solche Verwirrungen ebenfalls problematisch, da es viel einfacher ist, ihren eigenen Code zu verstehen als den eines Assistenten. Eine weitere Schwierigkeit besteht darin, dass Klassen vererbt werden, d. h. die Ursache für Missverständnisse kann selten auf der Ebene der Nachkommen gefunden werden, sondern man muss tiefer in die Elternklassen schauen.

Wir wollten das Beste. Es stellt sich heraus, dass es dasselbe ist wie immer (c) Tschernomyrdin

Im Allgemeinen können die meisten Missverständnisse behoben werden, aber es ist wünschenswert, dies auf der Ebene der übergeordneten Wurzelklasse zu tun und dann die korrigierten Klassen durch Updates zu verteilen. Denn wenn der Quellcode der übergeordneten Klassen von den Modulentwicklern korrigiert wird, wird der daraus resultierende inkompatible Quellcode inkompatibel sein und die erstellten Module werden auf anderen Computern nicht funktionieren. Wenn der Entwickler übergeordnete Klassen mit überschriebenen Methoden erstellt, dann ist die Inkompatibilität bereits auf Masterebene gegeben, weil er seine eigenen Einschlüsse schreibt und daher wiederum Anweisungen an die Endbenutzer schreiben muss, und es ist unwahrscheinlich, dass sie in den Quellcode eindringen wollen, und wenn sie eindringen, dann mit einem Fehler in einem einzelnen Zeichen oder irgendwo anders, und so weiter und so fort.

Geben Sie uns Ihre konkreten Vorschläge. Wir werden sie berücksichtigen.
 
uncleVic:
Wir möchten Ihnen einige Vorschläge unterbreiten. Wir werden sie überprüfen.

Bislang gibt es nur eine einzige Lösung für die oben genannten Nachteile:

Offener Zugang zum Lesen der von der Methode Direction() des Signalmoduls zurückgegebenen Werte aus den Modulen Positionsmanagement und Kapital- und Risikomanagement.

Fügen Sie eine weitere Methode hinzu, z. B. identifier double getMainSingnal(), die eine Instanz der Signalmodulklasse aufruft und das Ergebnis der Methode Direction() des Signalmoduls zurückgibt. Da dieser Informationsaustausch im Nur-Lese-Modus erfolgt, wird die Sicherheit in keiner Weise beeinträchtigt.

Zu diesem Zweck

  1. Weisen Sie einige Felder in den Klassen CExpertMoney und CExpertTrailing zu, um eine Instanz von CExpertSignal, d.h. dem Hauptmodul der Signale, zu speichern.
  2. Eine Instanz von CExpertSignal, d. h. das Signalmodul, sollte bei der Initialisierung von Instanzen dieser Module an die Module Positionsmanagement und Kapital- und Risikomanagement übergeben und in den angegebenen Feldern in Schritt 1 gespeichert werden. Bevor wir dies tun, sollten wir natürlich auch prüfen (sicherstellen), dass es bereits eine Instanz der Signalmodulklasse gibt, d. h. dass sie erstellt wurde.
  3. Erstellen Sie in den Klassen CExpertMoney und CExpertTrailing zusätzliche Methoden mit dem Bezeichner double getMainSingnal(), die sich an eine Instanz der Klasse signals module wenden, die in den entsprechenden Feldern dieser Klassen gespeichert ist, und das Ergebnis der Methode signals module Direction() zurückgeben.

P.S. Die Klasse CExpert hat einen Verweis auf eine Instanz der Klasse Signalmodul.

CExpertSignal    *m_signal;                   // trading signals object
Sie müssen analoge Felder für die Klassen CExpertMoney und CExpertTrailing erstellen und ihnen bei der Initialisierung den gleichen Wert aus dem oben genannten Feld in die Klasse CExpert übergeben