Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
RegularExpressions на MQL5 для работы с регулярными выражениями - библиотека для MetaTrader 5
- Опубликовал:
- MetaQuotes
- Просмотров:
- 3774
- Рейтинг:
- Опубликован:
- 2016.05.20 13:30
- Обновлен:
- 2022.10.27 14:07
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Реальный автор:
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:
- Как и в версии под .Net, в данной библиотеке реализовано хранилище (статическая кэш-память) регулярных выражений. Все неявно созданные регулярные выражения (экземпляры класса Regex) заносятся в это хранилище. Данный подход ускоряет работу скриптов, так отпадает необходимость заново строить регулярные выражения, если его шаблон совпадает с одним из уже имеющихся. По умолчанию размер хранилища равен 15. Метод Regex::CacheSize() возвращает или задаёт максимальное количество записей в текущей статической кэш-памяти скомпилированных регулярных выражений.
- Вторая особенность при работе с регулярными выражениями на MQL5 непосредственно вытекает из первой. И заключается она в том, что вышеупомянутое хранилище необходимо чистить. Для этого необходимо вызвать статическую функцию Regex::ClearCache(). Данную функцию рекомендуется вызвать только после того, как вы закончили работу с регулярными выражениями, иначе велика вероятность удалить нужные указатели.
- В отличие от .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();
- Как видно из примера выше, синтаксис языка 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_SignСемафорный сигнальный индикатор с использованием ассиметричного стохастического осциллятора в виде цветного облака.
Индикатор CCI_Woodies с возможностью изменения таймфрейма индикатора во входных параметрах.
Exp_CCI_WoodiesЭксперт Exp_Directed_Movement построен на основе изменения цвета индикатора CCI_Woodies.