Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

RegularExpressions на MQL5 для работы с регулярными выражениями - библиотека для MetaTrader 5

Опубликовал:
MetaQuotes
Просмотров:
3774
Рейтинг:
(40)
Опубликован:
2016.05.20 13:30
Обновлен:
2022.10.27 14:07
\MQL5\Experts\RegExpressions Demo\ \MQL5\Include\Internal\ \MQL5\Include\Internal\Generic\ \MQL5\Include\Internal\TimeSpan\ \MQL5\Include\RegularExpressions\
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Реальный автор:

Microsoft Corporation. Исходные коды взяты из .Net Framework 4.6.1

Примечание: Библиотека работает на MetaTrader 5 build 1285 и выше.

Для работы нужно распаковать архив в папку каталог_данных_терминала.
Коды библиотеки размещаются в папке: <каталог_данных_терминала>\MQL5\Include\RegularExpressions\
Примеры тестовых скриптов размещаются в папке: <каталог_данных_терминала>MQL5\Experts\Examples\Tests.mq5

RegularExpressions для MQL5 - реализация обработчика регулярных выражений .NET Framework 4.6.1.

Регулярные выражения предоставляют формальный язык для быстрой и гибкой обработки текста. Каждое регулярное выражение является шаблоном(маской), для которого обработчик регулярных выражений пытается найти совпадения в исходном текстом. Шаблон состоит из односимвольных или многосимвольных литералов, операторов или конструкций.

Для реализации обработчика регулярных выражений в .NET Framework используется традиционная NFA-машина (NonDeterministic Finite-state Automaton – недетерминированные конечные автоматы), которая  выполняет поиск с возвратом для регулярных выражений. Аналогичные обработчик регулярных выражений использовались в Perl, Python, Emacs и Tcl. Использование NFA-машины отличает его от более быстрых, но и менее функциональных DFA-машин (детерминированный конечный автомат), предназначенных только для регулярных выражений и используемых в awk, egrep или lex.

Обработчик регулярных выражений .NET Framework имеет в себе основные функции NFA-машины, а также полный набор структурных элементов, позволяющий управлять процессом поиска с возвратом. Используя данные структуры программист имеет возможность для существенного ускорения поиска или для выбора предпочтительных расширений.

Основные возможности обработчика регулярных выражений .NET Framework:

    Ленивые кванторы: ??, *?, +?, {n,m}?.
    Положительный поиск: (?=subexpression).
    Отрицательный поиск: (?!subexpression).
    Условная оценка: (?(expression)yes|no) and (?(name)yes"> no ) и (?(name)yes|no) ).
    Сбалансированные определения групп: (?<name1-name2> subexpression).
    Не возвращающаяся ("жадная") часть выражения: (?>subexpression).
    Поиск совпадений справа налево. Для этого в метод сопоставления статических экземпляров или в сам конструктор класса Regex передаем параметер RegexOptions::RightToLeft.
    Положительный и отрицательный поиск назад: (?<=subexpression) для положительного поиска назад и (?<!subexpression) для отрицательного поиска назад.

С данной библиотекой все эти возможности будут доступны средствами языка MQL5.


Здесь представлен перевод RegularExpressions c .Net Framework 4.6.1.

Для работы с библиотекой необходимо подключить к вашему коду файл Regex.mqh из директории \MQL5\Include\RegularExpressions\.

Также вместе с библиотекой прилагается несколько демонстрационных примеров, одновременно выполняющих роль тест-кейсов. Все примеры взяты с официального сайта Microsoft Corporation, они наглядно показывают основные отличия от регулярных выражений на C# и особенности использования их на MQL5.

Подробнее о пакетах портированной библиотеки RegularExpressions MQL5:

Пакеты
Описание
CharUnicodeInfo.mqh
Заархивированный txt для определения Unicode-категорий для всех символов (включая и нелатинские символы).
RegexCapture.mqh
Представляет результаты одной успешной записи части выражения.
RegexCaptureCollection.mqh
Представляет набор записей, сделанных одной группой записи.
RegexGroup.mqh
Представляет результаты отдельной группы записи.
RegexGroupCollections.mqhВозвращает набор записанных групп в одном сопоставлении.
RegexMatch.mqhПредставляет результаты из отдельного совпадения регулярного выражения.
RegexMatchCollection.mqhПредставляет набор успешных совпадений, обнаруженных путем итеративного применения шаблона регулярного выражения к входной строке.
Regex.mqhПредставляет неизменяемое регулярное выражение.
RegexOptions.mqh Предоставляет перечисленные значения для использования при задании параметров регулярных выражений.

Параметры регулярных выражений из файла RegexOptions.mqh:

Параметр
Описание
None
Параметры не установлены.
IgnoreCase
Регистр при поиске совпадений не учитывается.
MultilineУказывает многострочный режим.
ExplicitCaptureНе захватывать неименованные группы. Единственные допустимые выделения — это явно именованные или нумерованные группы в формате (?<имя> часть выражения).
SinglelineУказывает однострочный режим.
IgnorePatternWhitespaceУстраняет из шаблона разделительные символы без escape-последовательности и включает комментарии, помеченные символом "#".
RightToLeftУказывает, что поиск будет выполнен в направлении справа налево, а не слева направо.
DebugУказывает, что программа работает под отладчиком.
ECMAScriptВключает ECMAScript-совместимое поведение для выражения. Это значение может быть использовано только вместе со значениями IgnoreCase и Multiline.


Особенности работы с RegularExpressions для MQL5:

  1. Как и в версии под .Net, в данной библиотеке реализовано хранилище (статическая кэш-память) регулярных выражений. Все неявно созданные регулярные выражения (экземпляры класса Regex) заносятся в это хранилище. Данный подход ускоряет работу скриптов, так отпадает необходимость заново строить регулярные выражения, если его шаблон совпадает с одним из уже имеющихся. По умолчанию размер хранилища равен 15. Метод Regex::CacheSize() возвращает или задаёт максимальное количество записей в текущей статической кэш-памяти скомпилированных регулярных выражений.
  2. Вторая особенность при работе с регулярными выражениями на MQL5 непосредственно вытекает из первой. И заключается она в том, что вышеупомянутое хранилище необходимо чистить. Для этого необходимо вызвать статическую функцию Regex::ClearCache(). Данную функцию рекомендуется вызвать только после того, как вы закончили работу с регулярными выражениями, иначе велика вероятность удалить нужные указатели.
  3. В отличие от .Net, в MQL5 не реализован цикл foreach, а следовательно, и работа с перечислениями будет отличаться. Пример:
    //--- Код на C#
    Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b", RegexOptions.IgnoreCase);   
    string text = "The the quick brown fox  fox jumped over the lazy dog dog.";
    MatchCollection matches = rx.Matches(text);
    foreach (Match match in matches) 
      {
       //--- обработка
      }
    
    //--- Код на MQL5
    Regex *rx = new Regex("\\b(?<word>\\w+)\\s+(\\k<word>)\\b", RegexOptions::IgnoreCase);        
    string text = "The the quick brown fox  fox jumped over the lazy dog dog.";
    MatchCollection *matches = rx.Matches(text);
    IEnumerator<Match*> *en = matches.GetEnumerator();
    while(en.MoveNext()) 
      {
       Match *match = en.Current();
       //--- обработка
      }
    delete rx;
    delete matches;
    delete en;
    Regex::ClearCache();
  4. Как видно из примера выше, синтаксис языка C# позволяет ставить перед строками символ '@' для игнорирования всех знаков форматирования в ней. В MQL5 такой подход не предусмотрен, поэтому все управляющие символы в шаблоне регулярных выражений нужно прописывать явно.


Пример работы с RegularExpressions для MQL5:

В качестве примера работы регулярных выражений рассмотрим их применение для разбора торговой истории, скачанной из терминала в виде html-файла.

Для этого создадим эксперта с одним входным параметром типа string, который будет являться именем нашего файла в песочнице:


Данный документ содержит две основные таблицы: "Ордера" и "Сделки". 

Создадим регулярное выражение для разбора файла:

Regex *rgx=new Regex("(>)([^<>]*)(<)");

Рассмотрим данное регулярное выражение:

(>)
Поиск символа '>'
(^[<>]*)
Любой символ, кроме '>' и '<', повторяющийся ноль или более раз
(<)
Поиск символа '<'

Далее построчно читаем файл и получаем все совпадения, соответствующие этому регулярному выражению:

string str=FileReadString(m_handel);
MatchCollection *matches=rgx.Matches(str);

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

Для таблицы "Ордера":

if(matches.Count()==23)
  {
   string in[11];
   for(int i=0,j=1; i<11; i++,j+=2)
     {
      in[i]=StringSubstr(matches[j].Value(),1,StringLen(matches[j].Value())-2);
     }
   m_list1.Add(new OrderRecord(in));
  }

Мы удостоверились что количество совпадений равно 23, а следовательно, мы имеем дело с записью из таблицы "Ордера". Создаем массив строк как начальное представление нашей записи. Организуем проход по всем нечётным совпадениям, получаем значения этих совпадений, используя метод matches[j][.Value(), и обрезаем у совпадений первый и последний символ, соответствующие символам '>' и '<'. Каждое отформатированное совпадение заносим в заранее объявленный массив in. Далее создаём новый экземпляр класса OrderRecord(in), который представляет одну запись таблицы "Ордера", и добавляем его в список m_list1. Этот список и будет интерпретировать таблицу "Ордера".

Аналогично будет обрабатываться таблица "Сделки":

if(matches.Count()==27)
  {
   string in[13];
   for(int i=0,j=1; i<13; i++,j+=2)
     {
      in[i]=StringSubstr(matches[j].Value(),1,StringLen(matches[j].Value())-2);
     }
   m_list2.Add(new DealRecord(in));
  }

Здесь m_list2 — список указателей на класс DealRecord, он в свою очередь представляет таблицу "Сделки".

Оба этих списка являются членами класса TradeHistory. Данный класс является представлением всего нашего исходного html-файла. Кроме того, он позволяет накладывать простые фильтры на таблицы "Ордеров" и  "Сделок" при помощи методов: FindAllOrders(const int columnIndex,const T value) и FindAllDeals(const int columnIndex,const T value).

Создадим в нашем эксперте простой графический интерфейс для демонстрации данных возможностей:


При работе с данной формой мы выбираем интересующую нас таблицу, выбираем столбец и значение в нем, по которому будет фильтроваться таблица. Нажимаем кнопку Find и отфильтрованная таблица будет отображена ниже, вместе с некоторой статистикой по ней. Кнопка Save сохраняет текущую отображенную таблицу в csv-файл. Сохранный файл будет располагаться также в песочнице и иметь имя Result.csv.

Для более подробного ознакомления с библиотекой RegularExpressions для MQL5 и её возможностями создан эксперт Tests.mqh. В нем реализовано больше количество примеров использования регулярных выражений, затрагивающие весь основной функционал библиотеки.

AsymmetricStochNR_Cloud AsymmetricStochNR_Cloud

Ассиметричный стохастический осциллятор в виде цветного облака.

AsymmetricStochNR_Sign AsymmetricStochNR_Sign

Семафорный сигнальный индикатор с использованием ассиметричного стохастического осциллятора в виде цветного облака.

CCI_Woodies_HTF CCI_Woodies_HTF

Индикатор CCI_Woodies с возможностью изменения таймфрейма индикатора во входных параметрах.

Exp_CCI_Woodies Exp_CCI_Woodies

Эксперт Exp_Directed_Movement построен на основе изменения цвета индикатора CCI_Woodies.