Strukturregeln. Lernen, wie man Programme strukturiert, Erforschung von Möglichkeiten, Fehlern, Lösungen usw. - Seite 7

 
Urain:

Ich schlage vor, die grundlegenden Entwurfsmuster festzulegen:

1. Funktionell

2. Objektmodell

3. Ereignisgesteuert .

...

eintippen

4. Komponente

--

Im Allgemeinen kann jedes Programm (auch das, das Sie vorhaben) aus verschiedenen Blickwinkeln betrachtet werden. // es ist verständlich.

Bei der ersten Analyse eines Projekts versuche ich, mindestens 4 Aspekte zu berücksichtigen:

1. Strukturell: Physische und logische Organisation von Programmcode und Programmkomponenten.

2. Funktional (nicht zu verwechseln mit dem funktionalen Ansatz in der Entwicklung): Welche Aufgaben löst das Programm (welches Produkt erzeugt es), wozu dient es, welchen Output soll es erzeugen usw.

3. Kommunikation: Welche Art von Benutzeroberfläche sollte das Programm haben, mit welchen Programmen kommuniziert es und wie, Kommunikationsprotokolle usw...

4. Management: Wie wird die Software verwaltet, welche Einstellungen müssen vorgenommen werden, welche Freiheitsgrade gibt es usw.

Alle Aspekte sind untrennbar miteinander verbunden, aber die Betrachtung aus diesen verschiedenen Blickwinkeln (und einigen weiteren) ermöglicht es Ihnen, wichtige Feinheiten nicht zu übersehen und in der Anfangsphase nicht etwas Wichtiges mit weitreichenden Folgen zu übersehen... )

 
MetaDriver:

...Generell kann jedes Programm (auch ein konzipiertes) aus verschiedenen Blickwinkeln betrachtet werden. // das ist verständlich...

Ich bin absolut einverstanden. Es ist ein allgemeiner philosophischer Grundsatz - ein Phänomen aus verschiedenen Blickwinkeln zu untersuchen...

Und ich versuche, die Frage "Was soll ein Programm tun und was nicht?" zu Beginn der Entwicklung zu beantworten. Der erste Teil der Frage fällt in das System (hier MTS), der zweite Teil nicht, er liegt außerhalb.

Imho ist es unabhängig vom Entwurfsmodell sehr wichtig, eine Hierarchie der Modellelemente zu haben. Die deduktive Methode - "vom Allgemeinen zum Besonderen" - funktioniert dann gut, indem sie das Modell in seine Haupt- und Bausteine zerlegt.

 
MetaDriver:

Um Ideen auszutauschen / voneinander zu lernen, schlage ich vor, ein mehr oder weniger praktisches Problem zu nehmen und es gemeinsam umzustrukturieren.

Skizzieren Sie zum Beispiel zumindest die Grundstruktur (oder genauer gesagt, Varianten solcher Strukturen) für ein solches Problem:

Es gibt einen so geschriebenen Expert Advisor (z.B. zum Testen einer Handelsidee). Nehmen wir an, dass die Idee im Strategy Tester (beim Kunden) vielversprechende Ergebnisse zeigt. Jetzt müssen wir den Expert Advisor umschreiben, um ihn entwicklungsfreundlicher zu machen, und insbesondere, um ihn mit einer grafischen Benutzeroberfläche zu versehen.

Es ist wünschenswert, entweder das Panel umschaltbar zu machen (zur Optimierung im Tester), oder die gesamte "nicht-grafische" Realisierung des EA in eine steckbare Datei (.mqh) zu verschieben, die dann ohne Änderungen an die grafische Oberfläche angeschlossen werden kann (um die Unterschiede in der Bedienung von "Tester"- und "grafischer" Version auszuschließen).

Ich würde gerne die Überlegungen zur Strukturierung eines solchen Projekts, insbesondere zur Umsetzung des ereignisgesteuerten Steuerungsmodells in einem solchen Projekt, hören und lesen. Angenommen, die doppelte Implementierung (Tester + Panel) ist eine strikte Vorgabe des Kunden (d. h. das Projekt muss auf beliebige Weise durchgeführt werden, Sie können nur die Art der Implementierung wählen).

Sollen wir die Aufgabe versuchen?

Ich denke, es ist offensichtlich, dass das Expert Advisor Control Panel und der Expert Advisor zwei völlig unterschiedliche Module in einem Programm sind. Daher müssen sie so getrennt werden, dass jeder Teil unabhängig vom anderen ist. Das bedeutet, dass Sie, wenn Sie einen Teil eines Expert Advisors ändern (z. B. die Logik der Auftragserteilung), nicht die Logik des Panels ändern müssen und umgekehrt (Änderung der Schnittstelle des Panels - keine Notwendigkeit, die Logik des Expert Advisors zu ändern). Das erste, was einem in den Sinn kommt, ist die Schaffung einer einheitlichen Schnittstelle, über die das Panel und der Expert Advisor kommunizieren können. Aber leider haben die Macher von MQL5 die Möglichkeit, horizontale Links zu erstellen, nicht in Betracht gezogen, und daher wird die Beschreibung der Schnittstelle zwischen ihnen mit Hilfe von MQL5 nicht funktionieren. Dann bleibt der Weg der vertikalen Integration. Ein Expert Advisor muss von einer Basisklasse geerbt werden, die ihrerseits Methoden und Daten enthält, die für die Interaktion mit dem Panel ausreichen. Das bedeutet, dass jeder EA, der von der Basisklasse geerbt wurde, auch in der Lage sein wird, das Panel anzuzeigen und mit ihm zu interagieren. Die Implementierung von Methoden, die für die Interaktion mit dem Panel verantwortlich sind, darf nicht an Nachkommen delegiert werden, sondern muss hinter den Kulissen der Basisklasse erfolgen, d. h. die Meldung "Nachkomme! Wenn Sie mit dem Panel interagieren wollen, müssen Sie diese und jene meiner Methoden mit diesen und jenen Parametern aufrufen" funktioniert überhaupt nicht. Idealerweise sollte jeder abgeleitete Expert Advisor, der von der Basisklasse erbt, einfach auf bequeme Weise handeln, und seine Aktionen werden automatisch in diesem Panel angezeigt.

Wie man eine universelle Basisklasse organisiert, ist ein anderes interessantes Thema. Mehrere Jahre Praxis in dieser Angelegenheit haben mich schließlich zu meinem universellen Schema geführt. Sie hat sich als transparent und universell erwiesen. Wenn Sie daran interessiert sind, kann ich Ihnen das grundlegende Flussdiagramm zur Verfügung stellen (ha ha, Flussdiagramme zu zeichnen ist schließlich eine sehr nützliche Tätigkeit). Aber auf jeden Fall hat jeder seine eigene Art und Weise, und eine gute Lösung für den einen ist nicht die gute Lösung für den anderen.

 
C-4:

Bei Interesse kann ich Ihnen einen Schaltplan zur Verfügung stellen (haha, Blockdiagramme zu zeichnen ist doch eine nützliche Tätigkeit).

 
sergeev:
Endlich etwas aufgeräumt.... )
 
C-4:

Das erste, was einem in den Sinn kommt, ist die Schaffung einer einheitlichen Schnittstelle, über die das Panel und der EA Daten austauschen können. 2.

Leider haben die Macher von MQL5 keine Möglichkeiten zur Erstellung horizontaler Verknüpfungen vorgesehen, so dass es unmöglich ist, die Schnittstelle zwischen ihnen mit MQL5-Tools zu beschreiben.

1. unzweideutig.

2. Was ist mit benutzerdefinierten Ereignissen? Sie sind recht horizontal und universell.

3. dann bleibt der Weg der vertikalen Integration. Ein Expert Advisor muss von einer Basisklasse geerbt werden, die ihrerseits Methoden und Daten enthält, die für die Interaktion mit dem Panel ausreichen. Das bedeutet, dass jeder Expert Advisor, der von der Basisklasse geerbt wird, auch die Fähigkeit erhält, das Panel anzuzeigen und mit ihm zu interagieren. Die Implementierung von Methoden, die für die Interaktion mit dem Panel verantwortlich sind, darf nicht an Nachkommen delegiert werden, sondern muss hinter den Kulissen der Basisklasse erfolgen, d. h. die Meldung "Nachkomme! Wenn Sie mit dem Panel interagieren wollen, müssen Sie diese und jene meiner Methoden mit diesen und jenen Parametern aufrufen" funktioniert überhaupt nicht. Idealerweise sollte jeder abgeleitete Expert Advisor, der von einer Basisklasse geerbt wurde, einfach auf eine bequeme Art und Weise handeln, während seine Aktionen automatisch auf diesem Panel angezeigt werden würden.

Da ich mit Punkt 2 nicht einverstanden bin, kann ich mich mit dieser Variante noch nicht anfreunden.

--

Ich habe eine Alternative, die ich sehr attraktiv finde (Variante mit "abschaltbarem" Panel). Machen Sie das Panel in Form eines Indikators. Wenn Ihr Expert Advisor im Strategy Tester ist, lädt er das Panel einfach nicht. Der zusätzliche Bonus besteht darin, dass das Panel in einem anderen Thread läuft und somit mehr Ressourcen für den Expert Advisor zur Verfügung stehen.

Was die Vielseitigkeit des Panels betrifft, so sehe ich keine größeren Hindernisse, wenn das Panel über eine Ini-Datei vollständig konfigurierbar ist. Mit anderen Worten: Sie können dort absolut alle Daten vorgeben, die für die Erstellung eines beliebigen Panels benötigt werden, und zwar aus einem begrenzten Satz von visuellen Komponenten und Ereigniscodes, die sie bei der Interaktion mit einem Benutzer erzeugen sollen.

Wie man eine universelle Basis-Handelsklasse gestaltet, ist ein eigenes interessantes Thema. Mehrere Jahre der Beschäftigung mit diesem Thema haben mich schließlich zu meinem Universalschema geführt. Sie erwies sich als transparent und universell. Wenn Sie daran interessiert sind, kann ich Ihnen das grundlegende Blockdiagramm zeigen.....

Kommen Sie, ich bin sogar sehr daran interessiert. Und praktisch kann es nützlich sein.
 
MetaDriver:

1. unzweideutig.

Nahr Warum? Eine übermäßige Universalisierung ist genauso schlimm wie eine verfrühte Optimierung.

Und das Binden von Blöcken eines Moduls über Ereignisse... ...ist langsam und umständlich.

 
MetaDriver:

Kommen Sie, das interessiert mich wirklich, und es könnte in der Praxis nützlich sein.

Der blaue Rahmen ist die Entitäten der Basisklasse. Der rote Rahmen ist die Entität der abgeleiteten Klasse. Sie können sehen, dass die Basisklasse die Definition ihrer Logik in vier Methoden auf den Nachkommen überträgt. Auf diese Weise wird die Beschreibung einer beliebigen Strategie auf die Beschreibung von nur vier Situationen reduziert:

1. Wenn alle Regeln für die Eröffnung einer Long-Position erfüllt sind, wird die Long-Position mit der Methode InitBuy() eröffnet

2. Wenn alle Regeln für die Schließung der Long-Position erfüllt sind - wird die Long-Position mit der Methode SupportBuy() geschlossen

3. wenn alle Regeln für die Eröffnung einer Short-Position erfüllt sind - dann wird die Short-Position mit der Methode InitSell() eröffnet

4. Wenn alle Regeln für das Schließen der Short-Position erfüllt sind, wird die Short-Position mit der Methode SupportSell() geschlossen.

Nach dieser Logik wird die Strategieumkehr nicht in einer Methode beschrieben (z. B. close long open short), sondern in zwei Methoden, die nicht voneinander abhängig sind. Es stellt sich heraus, dass dieser Ansatz sehr praktisch ist, da er uns zum Beispiel erlaubt, den Verkauf zu verbieten oder Positionen mit einem Klick zwangsweise zu schließen, nachdem einige allgemeine Bedingungen, die in einer Basisklasse beschrieben werden können, erfüllt sind.

In einigen Fällen verfügt eine Strategie über allgemeine Daten sowohl für Verkäufe als auch für Käufe, die beim Eintreten eines bestimmten Ereignisses, z. B. der Ankunft eines neuen Riegels, neu berechnet werden sollten. In solchen Fällen ist es möglich, dass eine Strategie ihre eigenen Verarbeitungsmethoden auf die Ereignisse abonniert. Es ist nicht möglich, mit diesen Methoden Positionen zu eröffnen, aber es ist möglich, verschiedene Berechnungen durchzuführen.

Ein weiterer interessanter Punkt ist der Umgang mit offenen Positionen. Die Basisklasse speichert eine separate Liste von Long- und Short-Positionen. Wenn ein neues Ereignis eintritt (z.B. OnTick), beginnt die Klasse, alle offenen Positionen aufzulisten und bietet an, jede dieser Positionen einzeln mit den Methoden SupportBuy SupportSell zu bearbeiten. Diese Methoden können nur die Position schließen, die ihnen von der Basisklasse gerade angeboten wird. Alle anderen Positionen sind schreibgeschützt. Die Basisklasse schreibt ihren Nachkommen also vor, dass sie sich im Moment nur auf eine einzige Position konzentrieren dürfen. Als ich diese Idee testete, stellte sich heraus, dass die Logik selbst des komplexesten Expert Advisors viel einfacher ist. Darüber hinaus wird der Begriff des Hedging automatisch unterstützt, da der Expert Advisor Informationen über seine Long- und Short-Positionen speichert.
 
TheXpert: ... Die Umsetzung des Handelsteils hängt von der Strategie ab, so dass es im Rahmen einer hypothetischen Strategie nichts zu diskutieren gibt. Die Umsetzung der Strategie hängt merkwürdigerweise auch von der Strategie ab :)
MetaDriver: ... Der gesamte Handelsteil ist in Form einer Klasse (CMarketDriver) geschrieben, die Orderplatzierung, Positionsverfolgung, Requotes und andere handelsbezogene Dinge vollständig implementiert. Für alle Symbole auf einmal. Der Strategieteil gibt nur die empfohlenen Marktpositionen für die Symbole ein, d.h. er füllt ein Array von Strukturen im Format {string Instrument; double Position} und fordert die Synchronisierung mit dem Server an: MD.Synchronize(PositionArray). Das ist alles. Derzeit wird nur mit Marktaufträgen gehandelt , aber eine Version, die mit innerhalb des Spreads festgelegten Limits handelt (um die Handelskosten zu senken), ist in Vorbereitung. Für den Handel werden keine Takeprofits/Stopps verwendet, aber der MarketDriver kann bei längerem Verbindungsverlust zum Server Schutzstopps setzen (Stop-Parameter werden einmalig in den Treibereinstellungen festgelegt). Übrigens eine sehr gelungene, nahezu problemlose strukturelle Lösung. Zum Testen strategischer Ideen im Tester - keine Probleme mit dem Handel, die ganze Aufmerksamkeit kann der Strategie gewidmet werden - der gesamte Handel ist längst debugged und im Handelstreiber gekapselt.

Sobald man anfängt, die Ausführung einer Strategie in Limit-Aufträge zu übersetzen, wird man eine Menge Fragen bekommen, irgendwie:

  • die Auswirkung Ihrer Limiter auf den Preis, der in Ihren Strategieteil (Analysator/Prognostiker/Gehirn) eingeht.
  • Synchronisierung für eine Mehrwährungsstrategie
  • Anhaltende Abwesenheit von Ausführung in einem Trendhandel (Schleppnetz? wenn ja, wie, oder spucken und dem Markt folgen)
  • Teilweise Ausführung
  • ...

Dann muss eine Rückkopplung zwischen dem "Executor" und dem "Analyzer" implementiert werden, und darüber hinaus sollten die Parameter dieser nicht idealen Bewegung irgendwie in das mathematische Modell des Analyzers eingebaut werden

MetaDriver: ... Um strategische Ideen im Tester zu überprüfen, ein Lied - keine Probleme mit dem Handel ...

Ja, für Begrenzer ist es wirklich ein Lied.
 
GaryKa:

Wenn Sie beginnen, die Ausführung in der Strategie gründlich auf Limitaufträge umzustellen

Dies ist nur ein Beispiel für das, worüber ich gesprochen habe - der Handelsteil hängt von der Strategie ab.