Обсуждение статьи "Вычисление математических выражений (Часть 1). Парсеры рекурсивного спуска"

 

Опубликована статья Вычисление математических выражений (Часть 1). Парсеры рекурсивного спуска:

В статье рассматриваются базовые принципы разбора и вычисления математических выражений, реализованы парсеры рекурсивного спуска, работающие в режимах интерпретатора и быстрых расчетов на основе предварительно построенного синтаксического дерева.

При автоматизации торговых задач иногда требуется обеспечить гибкость вычислительных алгоритмов на стадии их выполнения. Так, например, для тонкой настройки программ, распространяемых в закрытом (откомпилированном) виде, можно организовать подбор вида целевой функции из широкого набора возможных комбинаций. В частности, при оптимизации эксперта или быстрой оценке прототипа индикатора. Тогда в диалоге свойств пользователю доступно изменение не только параметров, но и расчетной формулы. В этих случаях требуется вычислить арифметическое выражение по его текстовому представлению без изменения MQL-кода программы.

Для решения этой задачи применяются парсеры различных типов, позволяющие выполнять интерпретацию формул на лету, их "компиляцию" в синтаксическое дерево, генерацию так называемого байт-кода (последовательности вычислительных инструкций), и его последующее исполнение для расчета результата. В данной статье мы рассмотрим несколько типов парсеров и способов вычисления выражений.

Постановка задачи

Под арифметическим выражением будем понимать однострочную последовательность элементов данных и операторов, описывающих действия над ними. Элементами данных у нас будут числа и именованные переменные. Значения переменных можно будет назначать и менять извне, то есть не в выражении, а с помощью специальных атрибутов парсера. Иными словами, оператор присваивания ('=') для сохранения промежуточных результатов не предусмотрен. Список поддерживаемых операторов в порядке их приоритета в вычислениях таков:

  • !, - , + — унарное логическое отрицание, минус и плюс
  • () — группировка с помощью скобок
  • *, /, % — умножение, деление и деление по модулю
  • +, - — сложение и вычитание
  • >, <, >=, <= — сравнение больше-меньше
  • ==, != — сравнение равно-не равно
  • &&, || — логическое И и ИЛИ (внимание, приоритет одинаков, нужны скобки)
  • ?: — тернарный условный оператор, позволяющий ветвить вычисления по условиям

Кроме того, разрешим использовать в выражениях стандартные математические функции MQL, всего их — 25. Среди них, в частности, имеется и функция pow для возведения в степень. По этой причине в списке операторов отсутствует оператор возведения в степень ('^'). Кроме того, оператор '^' позволяет возводить только в целую степень, а функция таких ограничений не имеет. Есть и еще один нюанс, отличающий оператор '^' от остальных рассмотренных.

Автор: Stanislav Korotky

 

Добавить к математическим функциям еще некоторые MQL-функции и можно делать критерий Оптимизации в виде input string.


Либо задавать название файла с исходником функции OnTester. Парсер-интерпретатор будет вычислять.

Причина обращения: