Diskussion zum Artikel "Berechnung mathematischer Ausdrücke (Teil 1). Ein Parser mit rekursivem Abstieg"

MetaQuotes
Moderator
225234
MetaQuotes  

Neuer Artikel Berechnung mathematischer Ausdrücke (Teil 1). Ein Parser mit rekursivem Abstieg :

Der Artikel behandelt die Grundprinzipien der Analyse und Berechnung mathematischer Ausdrücke. Wir werden Parser mit rekursivem Abstieg implementieren, die im Interpreter- und beschleunigtem Berechnungsmodus arbeiten und auf einem vorgefertigten Syntaxbaum basieren.

Bei der Automatisierung von Handelsaufgaben kann es erforderlich sein, die Flexibilität von Berechnungsalgorithmen in ihrer Ausführungsphase zu gewährleisten. Bei der Feinabstimmung von Programmen, die in einem geschlossenen (kompilierten) Modus verteilt sind, können wir beispielsweise die Auswahl des Zielfunktionstyps aus einer Vielzahl von möglichen Kombinationen implementieren. Dies kann insbesondere bei der Optimierung eines Expert Advisors oder bei der schnellen Evaluierung eines Indikatorprototyps nützlich sein. Zusätzlich zur Änderung der Parameter im Dialogfeld können die Nutzer auch die Berechnungsformel ändern. In diesem Fall müssen wir den arithmetischen Ausdruck aus seiner textuellen Darstellung berechnen, ohne den MQL-Programmcode zu ändern.

Diese Aufgabe kann durch die Verwendung verschiedener Parser gelöst werden, die eine Formelinterpretation im laufenden Betrieb, ihre "Kompilierung" in einen Syntaxbaum, die Erzeugung des sogenannten Bytecodes (Folge von Rechenanweisungen) und seine weitere Ausführung zur Berechnung des Ergebnisses ermöglichen. In diesem Artikel werden wir verschiedene Arten von Parsern und Ausdrucksberechnungsmethoden betrachten.

Formulierung des Problems

In diesem Artikel ist ein arithmetischer Ausdruck eine einzeilige Folge von Datenelementen und Operatoren, die die relevanten Aktionen beschreiben. Datenelemente sind Zahlen und benannte Variablen. Variablenwerte können von außen gesetzt und bearbeitet werden, d.h. nicht im Ausdruck, sondern unter Verwendung spezieller Parser-Attribute. Mit anderen Worten, es gibt keinen Zuweisungsoperator ('=') zur Speicherung von Zwischenergebnissen. Unten finden Sie eine Liste der unterstützten Operatoren, die in der Reihenfolge der Berechnungspriorität angezeigt werden:

  • !, - , + — unäre logische Negation, Minus und Plus
  • () — Gruppierung mit Klammern
  • *, /, % — Multiplikation, Division und Modulo-Division
  • +, - — Addition und Subtraktion
  • >, <, >=, <= — größer, kleiner Vergleiche
  • ==, != — gleich oder ungleich
  • &&, || — logische UND und ODER (bitte beachten Sie, dass die Priorität gleiche ist, daher sollten Klammern verwendet werden)
  • ?: — ternäre Bedingung, mit der Sie Berechnungen nach Bedingungen verzweigen können

Wir werden auch die Verwendung von mathematischen MQL-Standardfunktionen in Ausdrücken erlauben, die insgesamt 25 sind. Eine davon ist die Potenzfunktion für das Potenzieren. Aus diesem Grund enthält die Liste der Operatoren keinen Exponentenoperator ('^'). Darüber hinaus unterstützt der Operator '^' nur eine ganzzahlige Potenz, während die Funktion keine solchen Einschränkungen hat. Es gibt ein weiteres spezifisches Merkmal, das '^' von den anderen betrachteten Operatoren unterscheidet.

Autor: Stanislav Korotky