English Русский 中文 日本語 Português
preview
Die visuelle Programmiersprache DRAKON - Kommunikationswerkzeug für MQL-Entwickler und Kunden

Die visuelle Programmiersprache DRAKON - Kommunikationswerkzeug für MQL-Entwickler und Kunden

MetaTrader 5Beispiele | 12 Februar 2024, 15:09
174 0
Oleh Fedorov
Oleh Fedorov

Einführung

Die Sprache DRAKON wurde gemeinsam von der Föderalen Raumfahrtagentur (Academician Pilyugin Center, Moskau) und der Russischen Akademie der Wissenschaften (Keldysh Institute of Applied Mathematics, Moskau) entwickelt und basiert auf den Erfahrungen, die bei der Arbeit am Buran-Projekt gesammelt wurden.

V. D. Parondschanow

Vor einiger Zeit setzte dann Glasnost in der UdSSR ein und machte die bis dahin geheime Sprache DRAKON (wörtlich: Freundliche, russische Algorithmussprache, die für Klarheit sorgt) einer breiten Öffentlichkeit zugänglich. Derzeit ist der Hauptverbreiter dieser Sprache V. D. Parondzhanov. Er hat eine Website eingerichtet, die dieser Sprache gewidmet ist, und nimmt darüber hinaus an Workshops teil und schreibt Bücher. Seinem Engagement ist es zu verdanken, dass DRAKON heute von Chemikern und Ärzten verwendet wird.

Andere Enthusiasten begannen mit der Entwicklung von Übersetzern aus dieser Sprache in weiter verbreitete Programmiersprachen wie C, C++, TCL/TK, Java, JavaScript usw. In Wirklichkeit ist die Liste noch viel länger. Falls erforderlich, kann sie erweitert werden, da alle mir bekannten Editoren leicht lesbare Dateien erzeugen (einfacher Text - *.csv, *.xml; Datenbanken - SQLight...). Viele dieser Programme verfügen über offenen Quellcode für die Regeln der Übersetzung in andere algorithmische Sprachen.

Im Gegensatz zu vielen anderen heutigen Programmiersprachen ist DRAKON nicht „symbolisch“, sondern grafisch. Alle Algorithmen werden buchstäblich mit speziellen Symbolen auf den Bildschirm gezeichnet. Diese Icons werden nach intuitiven Regeln über Algorithmen kombiniert. Die resultierenden Diagramme sind so einfach und verständlich, dass sie auch von Nicht-Programmierern verstanden werden können. Dann können diese Diagramme mit einem Klick in funktionierende Programme umgewandelt werden...

Erinnern wir uns an das Konzept eines Algorithmus.

Ein Algorithmus ist eine klare und verständliche Beschreibung, die den Ausführenden durch bestimmte Prozesse zur Lösung einer bestimmten Aufgabe führt.

Es mag bessere Definitionen geben, aber ich werde mich an diese halten.

Nach dieser Definition ist ein Algorithmus eine Methode zur Lösung eines Problems mit Hilfe der Bemühungen eines Ausführenden. Im Idealfall sollte ein fertiger Algorithmus auch für jemand anderen (oder etwas anderes) verständlich sein.

Angenommen, ich habe einen Algorithmus für einen extrem profitablen EA erstellt, der mit einem komplexen, sinusförmigen Martingal handelt. Das Signal ändert sich in Abhängigkeit von der Länge der Kerze, die ein exponentieller Bruchteil des Wochentages vom aktuellen Tag ist, und der Phase der vorherigen Bildung von 10 Spitzen. Ziemlich einfach, oder? Nein??? Na ja, aber ich habe doch alles erklärt!!!

Wenn Sie ein Entwickler sind, was soll ich dann tun, damit Sie es verstehen? Wahrscheinlich sollte ich ein Diagramm zeichnen, damit Sie verstehen können, was in Bezug auf die Kodierung zu tun ist. Nachdem das Diagramm fertig ist, kann es als gewöhnliche Anforderungsspezifikation unterzeichnet werden. Jetzt sind Sie bereit, es in Code umzuwandeln...

So sieht eine Zeichnung im DRAKON-Format aus.

Wenn Sie Programmierer sind und dieses Diagramm selbst gezeichnet haben, dann reicht es oft aus, ein paar Tasten zu drücken, um daraus einen funktionsfähigen Code zu erhalten oder zumindest ein zuverlässiges Gerüst zu erstellen, das dann mit einer Reihe von Autokorrekturen angepasst werden kann.

Wenn Sie ein Kunde sind, wird es für Sie viel einfacher sein, dem Programmierer zu erklären, was Sie wollen, indem Sie ein Diagramm zeigen, das klar beschreibt, was in bestimmten Fällen zu tun ist.

Wenn sich beispielsweise zwei MAs kreuzen, brauchen wir uns nur das Signal zu merken und in dem Moment zu handeln, in dem der Kurs vom „Junior"-Durchschnitt abprallt, spätestens aber um 19:00 Uhr Ortszeit.

Natürlich kann man das alles mit Worten beschreiben.

Sie können aber auch ein Diagramm zeichnen, in dem Sie dem Computer (oder genauer gesagt dem abstrakten Darsteller) einfache Fragen stellen wie: „Liegt der Strom über 19?“ oder „Haben sich die Durchschnittswerte gekreuzt?“ und beschreiben Sie, was zu tun ist, wenn die Antwort „ja“ lautet, und was zu tun ist, wenn die Antwort „nein“ lautet.

Dies wird die technische Arbeit der Programmierer nicht erleichtern, aber zumindest werden sie Ihre Gedanken besser verstehen, und die Wahrscheinlichkeit, dass sie in den ersten Versionen Fehler machen, ist geringer. Diese Fehler müssen schließlich korrigiert werden, was zusätzliche Zeit (und/oder Geld) erfordern kann.

Im Allgemeinen sind DRAKON-Diagramme sowohl für Programmierer als auch für Kunden von Vorteil, die mit der Programmierung nicht vertraut sind, aber ein sehr gutes Verständnis davon haben, wie genau ihre EAs funktionieren sollen.

Um es einfach auszudrücken:

  • Die Sprache ist so aufgebaut, dass sie wirklich zum Nachdenken anregt. Wenn ich einen Algorithmus in Form eines Diagramms sehe, ist es für mich viel einfacher, die Beziehungen zwischen den Teilen in den Modulen sowie zwischen den Modulen selbst zu verstehen, Fehler zu finden und Lösungen zu verwenden, die ohne ein Diagramm nicht offensichtlich erscheinen würden.
  • DRAKON hilft, den Kunden besser zu verstehen.
  • Es ist einfacher, meine Vorschläge an den Kunden weiterzugeben, falls es welche gibt.
  • Für den Kunden ist es einfacher, meine Fehler zu kritisieren.
  • Wenn der Kunde ein DRAKON-Diagramm gezeichnet hat, kann es in den Code übertragen werden und die Anforderungsspezifikation kann als abgeschlossen betrachtet werden. Das ist viel einfacher, als sich mit Fragen und Problemen zu befassen, die während der Kodierung selbst auftreten. Es mag einige Funktionen geben, die für den Kunden offensichtlich sind, aber nicht für den Entwickler. Das Diagramm beseitigt mögliche Missverständnisse.

Für mich ist die Grafik in den Algorithmen ein unverzichtbares Kommunikationsinstrument. Wenn zwei Menschen an einem Ergebnis interessiert sind und einen Dialog führen, ist es besser, wenn sie die gleiche Sprache sprechen. Die Sprache der DRAKON-Diagramme ist universell für Spezialisten in jedem Wissensgebiet, wenn man sie einmal verstanden hat.


Grundlegende Entwicklungsumgebungen in DRAKON

Bei der Vorbereitung dieses Artikels habe ich vor allem drei Instrumente verwendet.

  • Erstens haben wir Drakonhub. Dies ist ein Online-Editor, mit dem alle Arten von DRAKON-Diagrammen gezeichnet werden können. Er hat eine sehr bequeme Schnittstelle, exportiert aber keine Diagramme in Code. Es gibt auch ein eigenes Projekt für Programmierer - Aber es funktioniert nur mit JavaScript (zumindest nach dem, was ich finden konnte)... Außerdem scheint die Anzahl der Diagramme, die Nicht-Programmierern zur Verfügung stehen, viel geringer zu sein als bei Drakonhub. Im Allgemeinen ist es perfekt für Kunden und normal für Entwickler, wenn sie z.B. die Typisierung von Variablen nach der Generierung manuell implementieren wollen... Es gibt russische, englische und norwegische Schnittstellen.
  • Außerdem gibt es Fabula (Download-Link). Das Programm ist kostenlos und verfügt über eine russische und eine englische Nutzeroberfläche sowie eine Offline-Anwendung für Windows (die QT-Bibliothek wird zwar verwendet, ist aber Closed Source). Die Schnittstelle ist für mich nahezu perfekt. Die Daten werden in XML gepackt mit einem Zip-Archivierer gespeichert (das bedeutet, dass Sie ein XSLT schreiben und Ihre Programme bei Bedarf direkt übertragen können). Es können Algorithmen verfolgt werden, die für Präsentationen oder die Erstellung eines Pseudocodes verwendet werden können. Ein Pseudocode wiederum kann durch eine Reihe von Autokorrekturen in ein vollständig funktionierendes Programm verwandelt werden... Die meisten Diagramme in diesem Artikel werden mit Fabula erstellt.
  • Drittens haben wir den DRAKON Editor. Seine Schnittstelle ist etwas weniger komfortabel, da die Symbole manuell platziert werden müssen. Außerdem fehlen einige Symbole, und einige Beschriftungen sind nicht optimal umgesetzt. Andererseits kann ich Diagramme ohne viel Vorarbeit in meinen MQL5-Code umwandeln. Außerdem kann es einige Schlüsselwörter hervorheben. Außerdem ist es in TCL/TK geschrieben, was bedeutet, dass es plattformübergreifend ist und daher natürlich unter Linux läuft, ohne Wine. Der Hauptvorteil dieses Editors ist die Unterstützung zahlreicher Programmiersprachen. DRAKON Diagramme können leicht in C++, Java, JavaScript, D, TCL, Go und eine Reihe anderer Sprachen konvertiert werden. Es ist also eine sehr nützliche Sache für Programmierer, wenn Sie DRAKON mögen. Allerdings sieht der erzeugte Code nicht immer schön aus. Auch die Methoden zur Vorbereitung von Dateien sind nicht offensichtlich. Sie müssen die Dokumentation lesen. Aber wenn man es einmal herausgefunden hat, funktioniert es ganz gut. Die Nutzeroberfläche ist in Russisch und Englisch.
  • Außerdem gibt es die Schnittstelle IS Drakon. Der größte Nachteil für mich ist, dass es sich um ein kostenpflichtiges Produkt handelt. Ich habe mich nicht eingehend mit der Schnittstelle befasst. Er erschien mir ähnlich wie der DRAKON Editor, aber ich konnte bei der Beobachtung keine besonderen Vorteile feststellen.

Wie ich bereits erwähnt habe, werden die meisten Diagramme hier mit Fabula erstellt. Seine Diagramme scheinen mir die schönsten zu sein, ohne dass eine komplexe Vorbereitung erforderlich ist.

Wenn ein Code aus dem Diagramm generiert wird, werde ich dies im DRAKON Editor tun.


Grundlegende Sprachbefehle

Die Sprache DRAKON wurde auf der Grundlage von Flussdiagrammen entwickelt, die den Programmierern zu dieser Zeit gut bekannt waren. Daher entsprechen die wichtigsten Sprachelemente im Allgemeinen den GOST-Normen (All-Union State) für Blockdiagramme. Aber die Hauptstärke dieser Entwicklung liegt in den Regeln für die Platzierung dieser Elemente auf der Ebene.

Das erste funktionale Element der Sprache sind „Icons". Ein Symbol ist ein spezielles grafisches Symbol, das eine Aktion, eine Bedingung oder einen Vorgang eines Algorithmus definiert.

Bild
Name (Alternativen sind in Klammern angegeben)
Beschreibung
Anfang
Start
Startpunkt des Programms. An dieser Stelle beginnt die Ausführung des Algorithmus.
Ende
Ende
Abschluss des Programms. Die Ausführung des Algorithmus endet hier.
Aktion
Aktion (Prozess)
Ein regelmäßiger Block von Aktionen. Sie enthält Befehle, die der Reihe nach ausgeführt werden.
Problem
Problem (Zustand, Lösung)
Das Problem-Symbol wird verwendet, um eine Bedingung zu überprüfen. Ist die Bedingung erfüllt, folgt das Programm einer Verzweigung, andernfalls folgt es einer anderen.
Auswahl
Auswahl (Parsing)
Die Auswahl ist ein Verteilungsknoten für mehrere Optionen. Das Programm führt je nach den in Auswahl definierten Bedingungen unterschiedliche Aktionen aus. Anders als bei Problemen kann es mehr als zwei Optionen geben.
Option
Option
Das Option-Symbol stellt eine Bedingung oder einen Ausführungszweig dar, der mit dem Auswahl-Symbol in der DRAKON-Sprache verbunden ist. Sie definiert, welche Aktionen ausgeführt werden sollen, wenn eine bestimmte Bedingung in einem Auswahlblock erfüllt ist.
Name der Niederlassung
Name des Zweigs
Das Symbol Verzweigungsname beschreibt den Namen eines bestimmten Fragments in einem bestimmten Modul, eine bestimmte Stufe des Algorithmus oder den Zustand des Programms.
Adresse
Adresse
Die Adresse gibt an, wohin nach der Ausführung der Verzweigung verzweigt werden soll.
Einfügen
Einfügen
Einfügen wird verwendet, um ein anderes Diagramm oder einen anderen Block von Aktionen in den aktuellen Algorithmus einzufügen. Dies ermöglicht eine dichtere und logischere Anordnung und Strukturierung des Codes.
Regal
Regal
Das Regalsymbol kann mehrere Werte haben.
Wert Oben Unten
Auftrag an den Ausführenden Ausführender. Zum Beispiel ein Buchhalter. Auftrag. Beispiel: Drucken einer Rechnung
Senden einer Nachricht vom Absender an den Empfänger Absender und Empfänger. Zum Beispiel einen Browser und einen Anwendungsserver. Nachricht, wie z. B. die Aufforderung „Mit Facebook anmelden".
Ausführen einer Aktion an einem Objekt Schlüsselsatz mit einer Aktion Das Objekt, an dem die Aktion ausgeführt werden soll.
Einer Variablen einen Wert zuweisen Variabel Wert
Manchmal wird auch das „Dreifachregal“ verwendet. Autor
Parameter
Parameter

Die Parameter enthalten die Eingabedaten für den Algorithmus.

Um zum Beispiel eine Route zu erstellen, müssen wir den Start- und den Zielpunkt kennen.

Einige Programme erlauben die Trennung von Eingabe- und Ausgabeparametern. Dann befinden sich die Eingänge auf der linken Seite und die Ausgangsparameter auf der rechten Seite.

Beginn der „For"-Schleife
Beginn der FOR-Schleife
Das Symbol wird normalerweise zusammen mit dem folgenden Symbol verwendet. Die Wiederholung einer Handlung in einer bekannten (berechenbaren) Anzahl von Malen.

Wenn wir zum Beispiel von 1 bis 10 zählen oder alle Elemente in einem Array durchgehen müssen...
Ende der „For"-Schleife
Ende der „For"-Schleife
Das Symbol wird in der Regel zusammen mit dem vorherigen Symbol verwendet. Die Wiederholung einer Handlung in einer bekannten (berechenbaren) Anzahl von Malen.
Ausgabe
Ausgabe:
Das Ausgabesymbol stellt den Punkt dar, an dem die Daten oder Ergebnisse eines Programms an den Nutzer, einen anderen Teil des Programms oder externe Geräte übertragen werden.

Der obere Teil enthält ein Schlüsselwort oder eine Schlüsselphrase. Normalerweise steht dort ein Verb.

Der untere Teil enthält ein Objekt oder eine beschreibende Information.


  Eingabe  Eingabe Eingabe bezeichnet die Stelle, an der das Programm auf Eingaben von einem Nutzer, einem anderen Programm oder externen Quellen wartet. Genau wie eine Eingabe enthält sie einen oberen und einen unteren Teil.
  Pause  Pause Pause gibt den Zeitpunkt an, an dem das Programm bis zu einem bestimmten Ereignis oder Zeitpunkt angehalten wird.
  Timer  Timer Der Timer wird zur Steuerung von Zeitintervallen und zur Planung von Aktionen verwendet. Wird oft zusammen mit dem Symbol Zeit verwendet.
  Zeit  Zeit Zeit visualisiert Vorgänge im Zusammenhang mit der Zeit und ihrer Abrechnung. Es ermöglicht dem Programm, Zeitintervalle und Ereignisse zu verfolgen.
  Paralleles Verfahren Paralleles Verfahren

Ein paralleler Prozess steuert die Ausführung einer Aufgabe, die gleichzeitig mit dem Hauptprogramm läuft.
Der obere Teil kann Start, Haltepunkt, Stopp oder Neustart enthalten.

Der Parallelprozess läuft im Hintergrund und sein Algorithmus ist in einem anderen DRAKON-Diagramm definiert. Der Hauptprozess läuft weiter, ohne auf den Abschluss der parallelen Aufgabe zu warten. Die Kommunikation mit einem parallelen Prozess kann über die Symbole Input und Output hergestellt werden.

 
  Kommentar zur Hauptleitung Kommentar zur Hauptleitung Der Kommentar zur Hauptlinie trägt zur Verdeutlichung des Diagramms bei. Sie hat keinen Einfluss auf den Programmablauf, ermöglicht es aber, ein unklares Fragment zu klären.
  Rechter Kommentar Linker Kommentar Kommentare rechts und links.
Mit den Kommentarsymbolen rechts und links können Sie jede Aktion kommentieren, und zwar genau dort, wo sie stattfindet. In der Regel werden die Variablen und Parameter erläutert.
  Beschriftung Bildunterschrift
Beschriftungssymbole werden meist anstelle von rechten und linken Kommentaren verwendet, wenn Sie einen Teil des Algorithmus erklären müssen. Es wird nur selten in Algorithmen verwendet, die in Programme umgewandelt werden. Häufiger ist dies ein Weg, um die Aufmerksamkeit in Algorithmen zu erregen, die in menschlicher Sprache geschrieben sind (z. B. für Ärzte), oder wenn Kunden ihre Beschreibungen mit Hilfe einiger hervorgehobener Punkte verdeutlichen wollen.
  Parallele Prozesse Parallele Prozesse
Das Symbol für parallele Prozesse wird verwendet, um mehrere Aufgaben oder Prozesse zu starten, die gleichzeitig laufen. Jeder der Pfeile in diesem Symbol kann ein anderes Thema oder eine andere Aufgabe darstellen.
  Schleifenpfeil Schleifenpfeil
Die Pfeile stehen für sich wiederholende Ereignisse, bei denen die genaue Anzahl der Wiederholungen unbekannt ist.

Zum Beispiel prüfen, ob das Wasser im Wasserkocher kocht, bis es kocht.
  Silhouettenpfeil Silhouettenpfeil
Er wird nur an einer Stelle im Diagramm verwendet: um die Fortsetzung einer Handlung und den Übergang zum nächsten Zweig der Silhouette anzuzeigen (siehe unten).

Manchmal werden auch andere Symbole verwendet, z. B. ein „einfacher Eingang“ (sieht aus wie der obere Teil des Symbols Ausgang) oder ein abgerundetes Rechteck. Bei einigen Programmen können nicht alle Symbole verwendet werden. Im Allgemeinen bietet die Tabelle jedoch eine fast vollständige Liste der Fragmente, aus denen Diagramme aufgebaut sind.


Erstellung einfacher visueller Diagramme („Primitive")

DRAKON Sprachdiagramme sind nach bestimmten Gesetzen aufgebaut.

Wie bereits erwähnt, sind die wichtigsten Bausteine des Diagramms Icons. Damit sie jedoch richtig interagieren können, brauchen sie Kommunikationswege.

Kommunikationslinien können horizontal oder vertikal verlaufen, ABER:

Die Aktionen finden nur vertikal statt.

Horizontale Verbindungen werden nur bei der Auswahl einer von mehreren Optionen oder bei einigen anderen Hilfsaktionen angezeigt. Wenn es keine Hilfsaktionen wie die Eingabe von Parametern in eine Funktion oder Kommentare für einen bestimmten Algorithmus gibt, wird der gesamte Algorithmus auf einen einzigen vertikalen „Spieß“ gesetzt.

Wir müssen zum Beispiel die Summe von zwei Zahlen ermitteln. Wir erhalten beide Zahlen vom Nutzer und geben die Daten z. B. mit der Funktion printf oder Print auf der Konsole aus. Wie würde ein Diagramm in der DRAKON-Sprache aussehen? Nun, das wäre ziemlich einfach:

Summe von zwei Zahlen

Abbildung 1. Algorithmus für die Summe von zwei Zahlen

Wenn wir diesen Code programmieren wollen, brauchen wir höchstwahrscheinlich eine Funktion, und diese muss Parameter akzeptieren (Hilfsaktion). Dann werden wir es so zeichnen:

Summe (als Funktion)

Abbildung 2. Summierung als Funktion.

Der Code, den das Programm gemäß meinem Diagramm erzeugt:

double Summ(double a, double b) {
        // item 6
        return (a+b);
    }

Die erste Regel lautet also: Die Hauptrichtung des DRAKON-Diagramms ist von oben nach unten. Das heißt, wenn der Algorithmus linear ausgeführt wird, wird sein Primitiv immer vertikal gezeichnet, und er muss von oben nach unten ausgeführt werden. Daher braucht das Diagramm keine Pfeile. Ohne sie ist alles klar.

Was aber, wenn wir Verzweigungen brauchen? Was ist, wenn einige Aktionen nur unter bestimmten Bedingungen stattfinden? Wenn Sie beispielsweise nur auf der Grundlage des Schnittpunkts der gleitenden Durchschnitte in einen Handel einsteigen möchten, wird dies mit Hilfe des Frage-Symbols bestimmt:

Einstieg in den Handel durch Kreuzen der Durchschnitte

Abbildung 3. Algorithmus für den Einstieg in einen Handel durch Kreuzen gleitender Durchschnitte

Jedes Bedingungssymbol hat immer zwei Ausgänge: einen von unten und einen von rechts. Mit anderen Worten: Alle Aktionen im Algorithmus erfolgen immer von oben nach unten und von links nach rechts. Pfeile werden nicht mehr benötigt. Wenn wir einen Algorithmus testen, folgen wir einfach den Linien, bis wir das Ende erreichen.

Manchmal muss eine Entscheidung nicht nur auf der Grundlage von zwei, sondern von drei oder mehr Optionen getroffen werden. Angenommen, ein Nutzer hat eine bestimmte Taste gedrückt. Je nachdem, welche Taste der Nutzer gedrückt hat, sollte das Programm bestimmte Aktionen ausführen. Natürlich können wir dies auch mit Hilfe von gewöhnlichen Fragen zeichnen, aber das Diagramm wird sich als umständlich erweisen.

Ein Auswahlkonstrukt ist in diesem Fall viel besser geeignet.

Handhabung von Tastatureingaben

Abbildung 4. Handhabung von Tastenanschlägen

Beachten Sie, dass das letzte Optionssymbol leer bleibt. In MQL entspricht diese Option dem Standardoperator. Die Standardaktion wird ausgeführt, wenn keine andere Option geeignet ist.

Anhand dieses Beispiels kann man eine weitere DRAKON-Regel nachvollziehen: Alle vertikalen Verzweigungen verlaufen von links nach rechts, und je weiter rechts die Option liegt, desto schlechter ist sie. Die Option ganz links wird manchmal als „königlicher Weg“ oder „glücklicher Weg“ bezeichnet.

Wenn die Optionen gleichwertig sind, werden sie einfach nach einem bestimmten Kriterium angeordnet. Ich habe sie zum Beispiel nach den Buchstaben der Knöpfe in alphabetischer Reihenfolge geordnet.

Manchmal ist es notwendig, an den Anfang eines Blocks zu gehen, ohne das Ende des Programms zu erreichen. Dies sind DO-WHILE-Schleifen.

Warteschleife (DO WHILE)

Abbildung 5. Warten Sie auf ein Signal, bis es erscheint. Die Aktion „Warten auf Signal“ wird unter allen Umständen mindestens einmal ausgeführt.

Dieselbe Schleife kann auch so umgeschrieben werden, dass sie zunächst die Bedingung prüft und erst dann bestimmte Aktionen ausführt.

DO-WHILE-Schleife

Abbildung 6. Warten auf ein Signal, bis es erscheint. Die Aktion „Warten auf ein Signal“ darf nie ausgeführt werden, wenn das Signal bereits eingetroffen ist.

In jedem Fall ist der Pfeil hier bereits ein notwendiges Element. Ohne sie ist das Diagramm viel schwieriger zu lesen.

Es gibt noch eine weitere wichtige Regel für Schleifen. Die Schleife kann eine beliebige Anzahl von Ausgängen haben, aber es darf nur einen Eingang geben. Mit anderen Worten, wir können einen Pfeil nicht von einer beliebigen Stelle im Programm zu einer beliebigen Stelle in der Schleife ziehen. Wir müssen immer wieder an den Anfang zurückkehren.


DRAKON Silhouetten-Diagramm

Da DRAKON eine visuelle Sprache ist, ist es wichtig, dass die Diagramme leicht zu lesen sind. Um dies zu erreichen, ist es besser, wenn das gesamte Diagramm vollständig auf dem Bildschirm (oder dem Blatt) abgebildet wird.

Diese Forderung ist nicht immer realisierbar, aber wir müssen sie anstreben. Eine andere Art der Platzierung von Sprachsymbolen namens Silhouette kann dabei helfen.

Eine Silhouette ist einfach eine Möglichkeit, eine komplexe Funktion in ihre Bestandteile, in Ausführungsphasen, zu zerlegen, sie aber gleichzeitig als ein einziges Ganzes zu belassen.

So könnte zum Beispiel die Tick-Verarbeitung in einem Standard-EA aussehen, der in Form eines Scherenschnitts geschrieben ist.

Silhouette

Abbildung 7. Silhouette ist die zweite Hauptdiagrammkonfiguration in der DRAKON-Sprache

An der Spitze eines jeden Zweigs steht sein konventioneller Name in der menschlichen Sprache. Darunter befindet sich die Übergangsadresse - wohin der Befehlsfluss nach Abschluss dieser Verzweigung umgeleitet werden soll. In der Regel erfolgt der Übergang in einen benachbarten Zweig, aber es gibt Zeiten, in denen man woanders hingehen muss.

Befindet sich der Übergang weiter rechts, wird einfach der Name des Zweigs angegeben.

Erfolgt der Übergang zum Anfang desselben Zweiges oder zu einem Zweig auf der linken Seite, werden die Markierungen für den Anfang und das Ende der entsprechenden Zweige mit einem schwarzen Dreieck gekennzeichnet:

Schleife in einem Zweig

Abbildung 8. Schleife in einer Zweigsilhouette

Wenn Sie eine solche Schleife verwenden müssen, stellen Sie sicher, dass Sie eine Ausstiegsbedingung haben, die das Programm zu einer anderen Zweig führt. Andernfalls könnte die Schleife endlos werden.

Ich versuche, solche Schleifen in meinen Diagrammen zu vermeiden. Bei den Problemen, die ich löse, kann ich in 95,4 % der Fälle ohne sie aus kommen...

Die Silhouette ist in der Tat ein Zustandsdiagramm. Normalerweise verstehen Redakteure jede Verzweigung genau so - als bestimmte Zustände des Prozesses zu einem bestimmten Zeitpunkt und interpretieren die Silhouette als Endlosschleife mit einer Auswahl von Zuständen unter Verwendung des darin enthaltenen Switch-Case-Operators. Aus diesem Grund brauchen wir Kennzeichnungen am Ein- und Ausgang: Das Programm muss wissen, wohin es wechseln soll, und der Nutzer muss sehen können, welches Fragment gerade aktiv ist.

Der Zugang zum Zweig ist nur über den Beginn des Zweigs möglich. Das Verlassen des letzten Zweigs erfolgt über das Icon „Ende".


Einige Nuancen der DRAKON-Diagramme

Ich hoffe, Sie haben bemerkt, dass sich die Linien in keinem der obigen Diagramme überschneiden, es sei denn, es besteht eine Verbindung. Dies ist ein grundlegender Punkt, der für mehr Klarheit in den Diagrammen sorgt. Es sollte keine Kreuzungen geben. Eine Zusammenführung oder Verschiebung von Pfaden kann nur durch Markierungen erfolgen. Wenn es eine Schnittmenge gibt, können wir diesen Weg wählen, um eine Lösung zu finden.

In Abbildung 7 ist der Zweig zum Hinzufügen zusätzlicher Positionen (dritter von links) etwas ungenau. Die Abbildung sollte so wenig parallele Linien wie möglich enthalten. Diese Regel schafft auch mehr Klarheit. Zu meinem Bedauern weiß Fabula nicht, wie man Verzweigungen richtig zeichnet. Dies ist zwar kein Fehler, aber eine ungenaue Interpretation.

Die Ausnahme von der Regel „Entweder nach unten oder nach rechts bewegen“ ist die unterste Zeile des Diagramms, die die Silhouetten-„Spieße“ zu einem Ganzen verbindet. Er kehrt immer zum Anfang des Prozesses zurück, um einen neuen Zustand zu wählen. Wir bewegen uns also von rechts nach links, in Richtung des Pfeils.

Im Prinzip erlauben es fast alle Programme, mehrere Diagramme auf einem Blatt zu erstellen. Manchmal kann dies gerechtfertigt sein.

Wenn die Diagramme klein und meist vertikal sind (und die Silhouetten sehr kompakt gestaltet werden können)... Und es gibt genügend Abstand zwischen den Diagrammen (oder sie sind gut mit Farbe markiert, oder noch besser - mit zusätzlichen Grenzen)... Wenn alle diese Bedingungen erfüllt sind, kann die Klarheit der Diagramme in Kombination erhöht werden.

Wenn Ihre Diagramme auf Papier ausgedruckt werden sollen, ist es sinnvoll, sie so kompakt wie möglich anzuordnen und dabei die Empfehlungen im vorigen Absatz zu befolgen.

In allen anderen Fällen ist es jedoch besser, jedes Diagramm in einem separaten Raum unterzubringen. Vor allem, wenn große „Silhouetten“ darunter sind oder diese Diagramme für den Druck auf Papier in Schwarz-Weiß bestimmt sind. Meistens geht es bei DRAKON eher um Klarheit als um Kompaktheit. Die Visualisierung reduziert den mentalen Aufwand und ermöglicht es, diesen Aufwand auf die Entwicklung effektiver Lösungen zu lenken.


Importieren von Diagrammen von DRAGON nach MQL

Wenn ich einen guten und umfangreichen Algorithmus mit grafischen Symbolen zusammenstelle, möchte ich den Aufwand für die Umwandlung von Diagrammen in Code möglichst gering halten.

In der Regel verwende ich für diese Zwecke den DRAKON Editor.

Nachdem Sie den Editor geöffnet haben, müssen Sie als erstes eine Datei erstellen (oder eine bestehende Datei öffnen).

DrakonEditor - Dialog zur Dateierstellung

Abbildung 9. DRAKON Editor - Dialog zur Dateierstellung

DRAKON Editor (DE) arbeitet mit Autosave: alle Änderungen am Bildschirm werden sofort in einer Datei gespeichert.

Achten Sie auf den rot hervorgehobenen Text über den SMART-Bearbeitungsmodus...

Wir werden die Diagramme in Java konvertieren. Dies ist die einfachste Option, wenn Sie keinen speziellen Parser für MQL schreiben wollen (ich will das jedenfalls nicht). Die Struktur der Java-Dateien ist so nah wie möglich an der Struktur von MQL5-Programmen, sodass die generierten Dateien mit minimalen Änderungen kompiliert werden.

In der oberen linken Ecke des Hauptfensters des Programms befindet sich eine Schaltfläche zum Öffnen der Dateibeschreibung und des Menüs „Datei", in dem Sie auch diesen Punkt finden:

Menü der Dateieigenschaften und Schaltfläche

Abbildung 10. DRAKON Editor - Menü der Dateieigenschaften und Schaltfläche

Die Dateibeschreibung ist funktional!!!

Zusätzlich zu den allgemeinen Erklärungen können wir zwei Abschnitte einfügen, die vollständig in das vorgefertigte Programm übernommen werden. Auch wenn es noch nichts gibt, werden diese Abschnitte sehr einfach aussehen:

===header===

===class===
class Main {

Nach „===class===" genügt es, „class Main {" hinzuzufügen. Beachten Sie, dass es hier eine geschweifte Klammer gibt. Die zweite wird vom Editor bei der Erstellung installiert.

Es kann nur eine Klasse in der Datei enthalten sein.

Alles, was nach der Zeichenkette „===header===" eingefügt wird, wird von DE direkt in Ihre Datei eingefügt. Wenn Sie also ein Programm vollständig in der Sprache DRAKON schreiben, sollten Sie alle globalen Variablen, #include-Anweisungen, Beschreibungen von Strukturen und Aufzählungen usw. in diesem Abschnitt unterbringen.

Alles, was vor dem Abschnitt „===header===" steht, wird ignoriert. Hier können wir wirklich beliebige Textbeschreibungen einfügen.

Wenn Sie einen einfachen Indikator schreiben, sollten „class Main {" und eine schließende geschweifte Klammer aus der endgültigen Datei entfernt werden.

Wenn Sie verstehen, wie OOP funktioniert, können Sie die Klassenbeschreibung direkt im gleichen Header verwenden, wie üblich, ohne die Implementierung von Funktionen. Die Funktionen werden in den Diagrammen implementiert. Denken Sie einfach daran, dass Java eine Klasse hat, während MQL Funktionen hat, die im globalen Bereich arbeiten.

Ich möchte demonstrieren, wie man einen einfachen NR4-Indikator erstellt, der eine Kerze markiert, wenn ihre Größe kleiner ist als die Größe der anderen Kerzen vor ihr. Die Anzahl der „großen“ Kerzen wird in den Eingaben angegeben. Das Auftreten einer solchen Kerze deutet oft auf die Wahrscheinlichkeit einer bevorstehenden starken Bewegung hin.

Hier ist mein Beschreibungscode:

===header===
//+------------------------------------------------------------------+
//|                                                          NR4.mq5 |
//|                                       Oleg Fedorov (aka certain) |
//|                                   mailto:coder.fedorov@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Oleg Fedorov (aka certain)"
#property link      "mailto:coder.fedorov@gmail.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot NRBars
#property indicator_label1  "NRBarsUp"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  0
//--- plot NRBars
#property indicator_label2  "NRBarsDn"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  0
//--- input variables
input int NRPeriod=4;

//--- indicator buffers
double         NRBarsBufferUp[];
double         NRBarsBufferDn[];

===class===
class Main {

Schließen Sie die Dateibeschreibung.

Nun müssen wir dem Editor mitteilen, dass unsere Datei in Java konvertiert werden soll.

Gehen Sie auf „Datei“ -> „Dateieigenschaften" und wählen Sie Java in der obersten Zeile des neuen Dialogfensters.

Auswahl der Sprache, in die das Diagramm konvertiert werden soll

Abbildung 11. Auswahl der Sprache, in die das Diagramm konvertiert werden soll

Die Einrichtung ist abgeschlossen. Jetzt können wir mit der Programmierung des Algorithmus beginnen.

Wir können jeden beliebigen Text in Icons schreiben, aber in diesem Fall wird jedes Icon ein Codefragment enthalten, das in die endgültige Datei aufgenommen wird. Wenn es sich um eine Demonstration für einen Kunden handelt, reicht es aus, einfach Kommentare in menschlicher Sprache zu schreiben, aber wenn Sie kompilierten Code in Diagrammen speichern wollen, schreiben Sie ausreichend detailliert, was passieren soll... Für mich ist es der zweite Fall.

Das Symbol für „Einfügen“ in DE funktioniert während der Kompilierung nicht, daher müssen wir das Symbol „Aktion“ verwenden.

Jede Funktion muss ihr eigenes Diagramm haben.

DE verlangt dies ausdrücklich (andere Editoren sind da „loyaler"). Hier können Sie nicht mehrere Diagramme erstellen, ohne mehrere Diagrammelemente über eine Schaltfläche in der Symbolleiste oder durch Drücken der Tastenkombination Strg+N zu erstellen.

In meinem Fall gibt es nur zwei Funktionen: OnInit und OnCalculate. Hier sind sie:

OnInit

Abbildung 12. Die Funktion OnInit

OnCalculate

Abbildung 13. Die Funktion OnCalculate

Wenn die Bildtexte zu klein sind, laden und installieren Sie den DRAKON Editor (auf der Website finden Sie eine ausführliche Anleitung und alle Abhängigkeiten sind beschrieben). Öffnen Sie dann die Datei mit den unten angehängten Diagrammen.

Wandeln Sie das Diagramm in einen kompilierten Code um(DRAKON -> Code generieren). Wenn das Diagramm Fehler enthält (z.B. eine Linie erreicht eine andere Linie oder ein Symbol nicht), warnt DE Sie in der unteren Leiste davor. Wenn es keine Fehler gibt, wird eine Datei mit der Erweiterung *.java im Projektordner angezeigt.

Speichern Sie es in Ihrem Indikatorenverzeichnis, ändern Sie die Erweiterung in *.mq5, entfernen Sie gegebenenfalls die Klassenbeschreibung, kompilieren Sie und führen Sie es aus...

Hier ist der Inhalt meiner Datei vor dem Entfernen unnötiger Elemente:

// Autogenerated with DRAKON Editor 1.31
//+------------------------------------------------------------------+
//|                                                          NR4.mq5 |
//|                                       Oleg Fedorov (aka certain) |
//|                                   mailto:coder.fedorov@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Oleg Fedorov (aka certain)"
#property link      "mailto:coder.fedorov@gmail.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot NRBars
#property indicator_label1  "NRBarsUp"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  0
//--- plot NRBars
#property indicator_label2  "NRBarsDn"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  0
//--- input variables
input int NRPeriod=4;

//--- indicator buffers
double         NRBarsBufferUp[];
double         NRBarsBufferDn[];

class Main {

    int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) {
        // item 15
        int i,j, limit;
        // item 16
        if (rates_total < NRPeriod) {
            // item 19
            return 0;
        } else {
            // item 20
            if (prev_calculated < NRPeriod) {
                // item 23
                limit = NRPeriod;
                // item 24
                ArrayInitialize(NRBarsBufferUp, EMPTY_VALUE); 
                ArrayInitialize(NRBarsBufferDn, EMPTY_VALUE);
            } else {
                // item 25
                limit = rates_total - NRPeriod;
            }
            // item 310001
            i = limit;
            while (true) {
                // item 310002
                if (i<rates_total-1) {
                    
                } else {
                    break;
                }
                // item 340001
                j=1;
                while (true) {
                    // item 340002
                    if (j<NRPeriod) {
                        
                    } else {
                        break;
                    }
                    // item 36
                    if (high[i]-low[i]>high[i-j]-low[i-j]) {
                        // item 39
                        break;
                    } else {
                        
                    }
                    // item 340003
                    j++;
                }
                // item 40
                if (j==NRPeriod) {
                    // item 43
                    NRBarsBufferUp[i]=high[i];
                    NRBarsBufferDn[i]=low[i];
                } else {
                    
                }
                // item 310003
                i++;
            }
        }
        // item 48
        return(rates_total);
    }

    int OnInit() {
        // item 11
        //--- indicator buffers mapping
        SetIndexBuffer(0,NRBarsBufferUp,INDICATOR_DATA);
        SetIndexBuffer(1,NRBarsBufferDn,INDICATOR_DATA);
        // item 12
        //--- setting a code from the Wingdings charset as the property of PLOT_ARROW
           PlotIndexSetInteger(0,PLOT_ARROW,218);
           PlotIndexSetInteger(1,PLOT_ARROW,217);
        // item 13
        //---
           IndicatorSetString(INDICATOR_SHORTNAME,"NR4 ("+IntegerToString(NRPeriod)+")");
        // item 14
        //---
           return(INIT_SUCCEEDED);
    }
}

Ich möchte Sie noch einmal daran erinnern: Damit dieser einfache Indikator funktioniert, müssen Sie den gelb markierten Text oben und unten entfernen. Hier habe ich absichtlich keinen Styler verwendet, damit die Leser genau einschätzen können, wie diese Datei von der DE-Automatisierung formatiert werden würde.

Das Lesen dieses Codes ist schwieriger, als wenn ich ihn von Hand geschrieben hätte, aber er funktioniert. Aber wir müssen es nicht lesen, wir sollten uns die Diagramme ansehen ;-)


Schlussfolgerung

Wenn Sie ein Entwickler sind und Ihnen DRAKON gefallen hat, können Sie auch eines der oben erwähnten Werkzeuge zur Diagrammerstellung verwenden. Ich empfehle Ihnen, jeden der aufgeführten Editoren selbst zu testen und sich eine eigene Meinung darüber zu bilden, was für Sie persönlich besser ist. In der Tat sind sie alle relativ einfach.

Wenn Sie Ihre Arbeit mit den Kunden ordnen wollen, geben Sie ihnen einen Link zu Dragon.Tech or drakonhub, erklären Sie ihnen kurz, wie man ein Projekt in menschlicher Sprache erstellt und wie die Symbole zueinander in Beziehung stehen, und sagen Sie ihnen, dass es in Ordnung ist, zu beschreiben, was sie in Worten sehen wollen. Das Wichtigste ist, eine klare Struktur zu haben.

Wenn Sie als Kunde an diesem Punkt angelangt sind, dann wissen Sie bereits, was zu tun ist ;-)

Es gibt viele Themen, die hinter den Kulissen bleiben: die Verwendung von DRAGON in interaktiven Präsentationen, Möglichkeiten, Informationen (nicht nur Computerprogramme) zu ordnen, um sie sich leichter einzuprägen, Kritik an der DRAKON-Sprache und an allen grafischen Sprachen usw.

Wenn Sie interessiert sind, schreiben Sie mir eine private Nachricht oder hinterlassen Sie einen Kommentar zu diesem Artikel. Ich bin offen für Diskussionen. Sie können auch V.D. besuchen. Parondzhanovs Website. Dort können Sie noch viel mehr finden...

Ich hoffe, dass ich das Interesse an diesem Ansatz wecken konnte und dass zumindest ein paar Leute, die diesen Artikel lesen, dieses wunderbare Instrument bei ihrer Arbeit einsetzen werden.

Wenn jemand Quellcodes für andere in diesem Artikel beschriebene Algorithmen benötigt, kontaktieren Sie mich bitte und ich werde sie Ihnen zusenden.

Beilage. Das Archiv enthält die DRAKON Editor Projektdatei, die den im vorherigen Abschnitt beschriebenen Indikatoralgorithmus enthält. Diese Datei ermöglicht die Erstellung eines vollständig funktionsfähigen Codes für den NR4-Indikator.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/13324

Beigefügte Dateien |
FullIndicator.zip (3.28 KB)
Entwurfsmuster in der Softwareentwicklung und MQL5 (Teil I): Erzeugungsmuster Entwurfsmuster in der Softwareentwicklung und MQL5 (Teil I): Erzeugungsmuster
Es gibt Methoden, mit denen sich viele Probleme lösen lassen, die sich ständig wiederholen. Wenn Sie einmal verstanden haben, wie man diese Methoden anwendet, kann es sehr hilfreich sein, Ihre Software effektiv zu erstellen und das Konzept von DRY (Do not Repeat Yourself) anzuwenden. In diesem Zusammenhang eignet sich das Thema Entwurfsmuster sehr gut, da es sich um Muster handelt, die Lösungen für gut beschriebene und wiederkehrende Probleme bieten.
Der Handel von Paaren Der Handel von Paaren
In diesem Artikel werden wir uns mit dem Handel von Paaren befassen, d. h. mit den Grundsätzen und den Aussichten für seine praktische Anwendung. Wir werden auch versuchen, dafür eine Handelsstrategie zu entwickeln.
Datenwissenschaft und maschinelles Lernen (Teil 15): SVM, ein Muss im Werkzeugkasten jedes Händlers Datenwissenschaft und maschinelles Lernen (Teil 15): SVM, ein Muss im Werkzeugkasten jedes Händlers
Entdecken Sie die unverzichtbare Rolle von Support Vector Machines (SVM) bei der Gestaltung der Zukunft des Handels. Dieser umfassende Leitfaden zeigt auf, wie SVM Ihre Handelsstrategien verbessern, die Entscheidungsfindung optimieren und neue Chancen auf den Finanzmärkten erschließen kann. Tauchen Sie ein in die Welt der SVM mit realen Anwendungen, Schritt-für-Schritt-Tutorials und Expertenwissen. Rüsten Sie sich mit dem unverzichtbaren Werkzeug aus, das Ihnen helfen kann, die Komplexität des modernen Handels zu bewältigen. Verbessern Sie das Spiel Ihres Handels mit SVM - ein Muss für den Werkzeugkasten eines jeden Händlers.
Entwicklung eines MQTT-Clients für MetaTrader 5: ein TDD-Ansatz - Teil 2 Entwicklung eines MQTT-Clients für MetaTrader 5: ein TDD-Ansatz - Teil 2
Dieser Artikel ist Teil einer Serie, die unsere Entwicklungsschritte für einen nativen MQL5-Client für das MQTT-Protokoll beschreibt. In diesem Teil beschreiben wir unsere Code-Organisation, die ersten Header-Dateien und Klassen, und wie wir unsere Tests schreiben. Dieser Artikel enthält auch kurze Hinweise auf die Praxis der testgetriebenen Entwicklung und wie wir sie in diesem Projekt anwenden.