База данных SQLite

Относительно недавно, по меркам долгой истории развития платформы, в MetaTrader 5 была встроена "родная" поддержка базы данных SQLite. Это — легкая, но полнофункциональная система управления базами данных (СУБД). Традиционно, подобные системы ориентированы на обработку таблиц данных, где хранятся однотипные записи с общим набором атрибутов, причем между записями разных типов (т.е. таблиц) могут быть установлены различные соответствия (связи или "реляции"), в связи с чем такие базы еще называют реляционными. Мы уже рассматривали примеры таких связей между структурами экономического календаря, но база календаря хранится внутри терминала, а функции данного раздела позволят создавать произвольные базы из MQL-программ.

Специализация СУБД на указанных структурах данных позволяет оптимизировать — ускорить и упростить — многие востребованные операции: сортировку, поиск, фильтрацию, суммирование или вычисление других агрегатных функций для больших объемов данных.

Однако у этой медали есть и другая сторона: для программирования СУБД требуется свой собственный язык SQL (Structured Query Language), и знания чистого MQL5 будет недостаточно. В отличие от MQL5, который относится к императивным языкам (использующим операторы-указания, что, как, в какой последовательности делать), SQL является декларативным — он описывает исходные данные и желаемый результат, без указания, как и в какой последовательности производить вычисления. Суть алгоритма на SQL описывается в виде SQL-запросов. Запрос — это аналог отдельного оператора MQL5, формируемый в виде строки по особому синтаксису.

Вместо программирования сложных циклов и сравнений достаточно вызвать функции SQLite (например, DatabaseExecute или DatabasePrepare), передавая им SQL-запросы. Для получения результатов запроса в готовую структуру MQL5 можно использовать функцию DatabaseReadBind — это позволит прочитать сразу все поля записи (структуры) за один вызов.

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

  • получение торговой истории и котировок,
  • сохранение результатов оптимизации и тестирования,
  • подготовка и обмен данными с другими пакетами анализа,
  • анализ данных экономического календаря,
  • хранение настроек и состояния MQL5-программ.

Кроме того, в SQL-запросах можно использовать широкий набор общеупотребительных, статистических и математических функций. Причем выражения с их участием можно вычислять даже без создания таблицы.

Особенностью SQLite является то, что эта СУБД не требует отдельного приложения, настройки и администрирования, нетребовательна к ресурсам, поддерживает большинство команд популярного стандарта SQL92. Дополнительное удобство, что вся база данных находится в единственном файле на жестком диске на компьютере пользователя, и её можно легко переносить или создавать резервные копии. Однако для ускорения операций чтения, записи и модификации базу данных можно открывать/создавать и в оперативной памяти с флагом DATABASE_OPEN_MEMORY, правда при этом такая база будет доступна только данной конкретной программе и не может использоваться для совместной работы нескольких программ.

Важно отметить, что относительная простота SQLite по сравнению с полнофункциональными СУБД, обуславливает некоторые ограничения. В частности, SQLite не имеет выделенного процесса (системного сервиса или приложения), который бы предоставлял централизованный доступ к API управления базами и таблицами, из-за чего параллельный, разделяемый доступ к одной и той же базе (файлу) из разных процессов не гарантируется самой СУБД. Так, если потребуется одновременное чтение и запись в базу из агентов оптимизации, выполняющих экземпляры одного и того же эксперта, потребуется самостоятельно написать в нем код для синхронизации доступа (иначе, записываемые и считываемые данные окажутся в противоречивом состоянии: ведь порядок записи, модификации, удаления, чтения из параллельных несинхронизированных процессов случаен). Более того, попытки одновременного изменения базы могут приводить к получению MQL-программой ошибок "база данных занята" (и запрошенная операция при этом не выполняется). Единственный сценарий, не требующий синхронизации параллельных операций с SQLite, — это, когда задействованы только операции чтения.

Мы представим лишь основы SQL в объеме необходимом для начала прикладного применения. Полное описание синтаксиса и принципов работы SQL выходит за рамки этой книги. Изучите документацию на сайте SQLite. Вместе с тем, учтите, что MQL5 и MetaEditor поддерживают ограниченное подмножество команд и синтаксических конструкций SQL.

В редактор MetaEditor, в состав Мастера MQL, встроена опция создания базы данных, которая сразу предлагает сформировать и первую таблицу, определив список ее полей. Также для работы с базами данных в Навигаторе предусмотрена отдельная вкладка.  

Воспользовавшись Мастером или контекстным меню Навигатора, вы можете создать пустую базу данных (файл на диске, по умолчанию, в каталоге MQL5/Files) одного из нескольких поддерживаемых форматов (*.db, *.sql, *.sqlite и других). Кроме того, в контекстном меню можно импортировать базу целиком из sql-файла или отдельные таблицы из csv-файлов.

Существующую или созданную базу легко открыть через то же меню. После этого ее таблицы появятся в Навигаторе, а в правой, основной области окна выводится панель с инструментами для отладки SQL-запросов и таблица с результатами. Например, двойной щелчок мышью на названии таблицы осуществляет быстрый запрос всех полей записей, что соответствует оператору "SELECT * FROM 'table'", который отображается в поле ввода вверху.

Просмотр базы данных SQLite в MetaEditor

Просмотр базы данных SQLite в MetaEditor

Вы можете отредактировать запрос и нажать кнопку Выполнить для его активации. Потенциальные ошибки в синтаксисе SQL выводятся в журнал.

Подробнее о Мастере, импорте/экспорте баз данных и интерактивной работе с ними см. документацию MetaEditor.