Моделирование рынка (Часть 18): Первые шаги на SQL (I)
Введение
В предыдущей статье «Моделирование рынка (часть 17)»: Sockets (XI), мы завершили демонстрацию реализации, которая позволяет обмениваться информацией между MetaTrader 5 и Excel. Хотя мы не углублялись в то, как заставить Excel управлять MetaTrader 5, так как при этом необходимо действовать с должной осторожностью. Поскольку это полностью зависит от того, что каждый думает или планирует делать, мы оставили несколько ссылок в конце статьи, чтобы вы могли составить представление о том, как это сделать.
Неважно, какую программу SQL мы будем использовать: MySQL, SQL Server, SQLite, OpenSQL или другую. У всех есть что-то общее, а этот общий элемент — язык SQL. Даже если мы не собираемся использовать WorkBench, можно манипулировать или работать с базой данных непосредственно в MetaEditor или через MQL5 для выполнения действий в MetaTrader 5, но для этого вам понадобятся знания SQL. Существует множество книг, посвященных данной теме, а также различные учебные пособия, доступные в Интернете. Всё, что нужно, это понять некоторые концепции и научиться использовать свой язык программирования для общения с SQL.
Однако есть и некоторые ограничения, о которых следует знать, прежде чем начинать использовать SQL. Для того, чтобы изучать SQL, надо хотя бы уметь создавать базу данных. Это отправная точка, которую надо усвоить и понять, дорогие читатели.
Начало работы с базами данных
Есть несколько очень простых способов использования SQL. Первый из них — ввести команды непосредственно в командной строке. Второй — использовать WorkBench или аналогичную программу, например MetaEditor. Третий способ заключается в добавлении SQL-команд в программу, написанную на MQL5. При запуске данной программы в MetaTrader 5 происходит доступ к базе данных. Наконец, существует ещё один базовый способ, который заключается в использовании сокетов для связи с сервером SQL. Все эти базовые способы широко доступны во всех системах баз данных, использующих SQL. Таким образом, всё, что будет показано и объяснено, можно будет использовать в любой совместимой системе. Не думайте, что нельзя сделать то или иное. Если вы используете чистый и нативный SQL, то у вас получится это сделать.
Но есть один момент, на который следует обратить внимание. Любая программа, использующая SQL, будь то OpenSQL, MySQL, SQLite, SQL Server или другая, может иметь команды, предназначенные специально для этой программы. Если используются эти команды, мы не сможем выполнять те же действия в другой программе SQL.
Ещё одно замечание: на первых порах всё будет делаться с помощью WorkBench от MySQL. Причину объясним позже.
Учитывая все эти предупреждения, давайте рассмотрим самую простую команду: создание пустой базы данных. Сразу отметим, что абсолютно бесполезно создавать любой файл и менять его расширение на .DB, так как система не распознает его как базу данных. Для этого необходимо использовать команду, по сути очень простую. Но прежде, чем рассматривать какие-либо команды, давайте посмотрим на кое-что еще.
Очень часто (и это почти считается хорошей практикой в программировании SQL) используются зарезервированные слова в верхнем регистре. Однако для SQL это не имеет никакого значения. Если на момент написания кода, вы забыли ввести команды заглавными буквами, то не беспокойтесь: вам просто нужно будет использовать точку, показанную на изображении ниже. Это преобразует весь код или зарезервированные слова SQL в верхний регистр.

Первые команды в SQL
Теперь мы действительно можем приступить к рассмотрению команд. Первая команда, которую мы должны выучить, это CREATE DATABASE. На изображении ниже можно увидеть, как это выглядит на самом деле.

Текст, выделенный синим цветом и жирным шрифтом, представляет собой код SQL, а текст, выделенный черным цветом, — название базы данных. Это первая команда, которую нужно будет использовать. После ввода данной команды мы сможем щелкнуть одну из иконок молнии, которые отображаются над кодом. Каждая из этих молний работает по-своему. Поскольку мы только начинаем, давайте нажмем на ту, которая находится в крайнем левом углу. И ещё полезно попытаться понять, для чего нужна каждая из них и как они работают, так как это очень поможет, особенно при отладке скрипта. Расскажем об этом скоро. Теперь, прошу внимания. Если вы хотите создать базу данных непосредственно в MetaEditor с помощью SQL, вам нужно будет поступить иным способом. В данном случае необходимо выбрать опцию, показанную на изображении ниже.

При этом MetaEditor попросит указать расположение и имя файла базы данных, которая будет создана. Это довольно просто. Мы также можем создать файл базы данных, используя код, написанный на MQL5. Но об этом поговорим позже, так как лучше иметь больше материала, чтобы действительно создавать вещи напрямую с помощью MQL5 или другого языка, который будем использовать для работы с SQL. Однако, если мы используем сокеты в коде MQL5 и подключаемся к серверу SQL, то можно отправить команду, отображаемую в WorkBench, и получим тот же результат. То есть создание базы данных.
Но это тема для другого разговора. Пока что давайте поступим самым простым и прямым способом: с помощью MetaEditor, WorkBench или даже командной строки. Но в командной строке вы действительно должны понимать, как будут отображаться элементы. Однако, это всего лишь вопрос привыкания к командной строке.
Но, поскольку цель данной статьи — максимальная ясность, мы будем использовать только MetaEditor и WorkBench.
Итак, выполнив все действия в MetaEditor, в конце мы получим результат, похожий на изображение ниже. Как видно, в данном случае мы изменили названия баз данных, чтобы отличить их от баз данных WorkBench.

На данном этапе MetaEditor будет готов к дальнейшей работе. Однако, что касается WorkBench, мы пока не можем перейти к следующему шагу. Сначала нам нужно сделать несколько дополнительных шагов. Чтобы понять, что нужно сделать, щелкните по выделенному пункту на изображении ниже после выполнения команды скрипта.

Использование любого из этих двух пунктов даст одинаковый результат. Теперь посмотрите на изображение ниже: файл, который будет использоваться в качестве базы данных, уже создан. Но прошу заметить, что он не выбран для приема новых SQL-команд.

Перед выполнением каких-либо действий в базе данных необходимо выбрать её. Один из способов сделать это — использовать команду SQL. Данная команда называется «USE». Ниже можно увидеть это.

Теперь мы должны учитывать одну важную деталь в использовании WorkBench. Если использовать командную строку для выполнения действий, в данный момент нужно будет ввести только содержимое строки 02. И можно будет перейти к следующему шагу. Однако в WorkBench процесс немного отличается. Прошу заметить, что мы выделили две иконки с изображением молнии. Теперь посмотрим, как это работает. Когда мы создаем скрипт для SQL, мы часто пишем несколько команд. Мы используем скрипт для документирования. Однако при использовании скрипта необходимо учитывать ещё несколько моментов. Первый: если скрипт выполняется в один этап, у нас не будет проблем. Но, если мы собираемся постепенно выполнять один и тот же скрипт, у нас возникнут проблемы, если мы попытаемся запустить его с самого начала. Поэтому многие люди бросают изучение SQL, так как не могут справиться с возникающими проблемами.
Ладно. Мы хотим, чтобы была выполнена строка 02. Для этого у нас есть три альтернативы. Первый вариант — выбрать строку 02 и нажать выделенную кнопку слева. Второй вариант — поместить текстовый курсор на строку 02 и нажать выделенную кнопку справа. Обратите внимание, что рядом с ней есть значок курсора. Таким образом, выполняется только строка, в которой находится курсор.
И есть ещё и третий вариант. Это используется в основном, когда необходимо принудительно запустить выполнение кода с самого начала, даже если он уже частично выполнен. Для этого нужно создать тест здесь, в SQL. Если код пытается выполниться с самого начала, в строке 01 произойдет ошибка. Как это возможно? Причина в том, что SQL попытается повторно создать файл базы данных. И данная попытка завершится неудачей, потому что файл уже существует. Таким образом, остальная часть кода не будет выполняться. Можно попробовать это, нажав на значок слева, не выбирая ни одной строки.
Поскольку часто мы можем работать со скриптом, в котором база данных уже существует, но мы хотим что-то в ней изменить, то внесение изменений в сам скрипт означает, что удаление базы данных является альтернативой, от которой следует отказаться. Чтобы решить данную проблему, мы можем закомментировать строку 01, добавив двойной дефис, как показано на изображении ниже, или сделать что-то немного другое.

Как видно на предыдущем изображении, существует два способа комментирования кода SQL. Первый вариант можно увидеть на изображении: строка 01 теперь понимается как комментарий. Этот способ полезен, когда нужно прокомментировать одну строку. Однако можно комментировать несколько строк одновременно. Для этого достаточно использовать тот же способ, что и в MQL5, то есть слэш и звездочку.
Хорошо, но хотя предыдущее решение и является возможным, на самом деле оно не работает, когда код SQL длинный и содержит много частей, которые могут дать сбой, потому что они уже существуют в базе данных. Поэтому нам нужно более элегантное решение. Данное решение можно увидеть на изображении ниже.

Обратите внимание, что в строке 01 у нас другая команда. Однако эта команда гарантирует, что скрипт будет выполняться правильно и ожидаемым образом. Это связано с тем, что если файл базы данных не существует, тогда он будет создан. Но, если он уже существует, то SQL не будет рассматривать это как ошибку, поскольку мы проверяем, существует ли файл или нет. Такой вид конструкции с командой IF довольно распространен в SQL, особенно в скриптах, которые будут использоваться (даже повторно) в течение срока службы базы данных. По окончании выполнения мы получим результат из изображения. То есть наш файл базы данных будет выбран для получения новых инструкций.
Можно увидеть, что всё очень просто и практично. Всё, что нам нужно, это понять, что делает каждая инструкция или команда. Не тратьте время на запоминание команд и их комбинаций. Просто надо понять, что делает каждая из них, и использовать их по мере необходимости. Итак, с этого момента мы находимся на том же уровне, который был достигнут внутри MetaEditor. Таким образом, следующая команда, которую мы рассмотрим, может быть использована как в MetaEditor, так и в WorkBench. Эта команда немного сложнее тех, которые мы видели до этого момента. Но помните, что знания накапливаются, а не рассеиваются.
Создание таблицы
Данная команда для создания таблицы — одна из тех, которые будем использовать чаще всего, особенно на этапе обучения. Её цель — создать таблицу, которая затем будет получать данные с помощью другой команды. Однако, в отличие от предыдущих команд, с этого момента мы столкнемся с некоторыми сложностями, которые поначалу могут вызвать затруднения. Но нет повода для беспокойства: всё дело в привычке и изучении, и в конечном итоге вы поймете, как использовать эту команду.
Вся проблема заключается в одной причине. Теперь нужно будет заранее продумать, как будут моделироваться данные, которые будут помещены в таблицу до её создания. Данная часть, без сомнения, является самой сложной на начальном этапе изучения SQL. Причина заключается именно в том, что нужно будет иметь представление о том, что будем делать, прежде чем приступать к реализации. Абсолютно бесполезно планировать тысячу вещей и не запланировать должным образом тип данных, которые будут помещены в таблицу. В отличии от правильного выбора типа данных, порядок, в котором будут размещены данные, не имеет большого значения. Если выбрать неправильный тип, в конечном итоге будет создана таблица, которая впоследствии станет непригодной для новых данных.
Однако, если мы попытаемся создать что-то слишком общее, в итоге потратим гораздо больше ресурсов и места, чем необходимо. Поэтому я предлагаю сначала изучить доступные типы данных. Советую сделать это до того, как пытаться разрабатывать базы данных для конкретных целей. В конце данной статьи я оставлю несколько ссылок, чтобы вы знали, с чего начать.
Начните с этого, пусть даже в качестве отправной точки. Вам следует поискать дополнительную информацию по этому вопросу. К счастью, есть много людей, готовых подробно объяснить каждый из типов. Так что не ждите, пока вам подскажут решение.
Для упрощения и только в целях демонстрации команды предположим следующий сценарий: мы хотим создать и вести историю котировок некоторых символов B3 (Бразильская фондовая биржа). Самый простой способ сделать это так, как показано ниже, а именно с использованием WorkBench.

Хотя наш SQL-код занимает много строк для создания таблицы, надо понимать, что на самом деле это будет всего одна строка. Результат отображается в области схем WorkBench. Но, несмотря на то, что данная таблица была создана и может принимать значения, в некоторых случаях она не подходит. Причину объясним позже. Но перед тем, как узнать причину, давайте посмотрим, как создается такая же таблица в MetaEditor. Это можно увидеть на изображении ниже.

Как видите, команда точно такая же, поэтому и результат будет таким же. Практически все команды, которые можно выполнить в WorkBench, можно также выполнить в MetaEditor, и они будут работать. Но прошу заметить, что я сказал «практически все команды», а не «все команды будут выполнены». Существует команда, о которой будет рассказано вкратце, и которую можно выполнить в SQL, но не через MetaEditor. Однако давайте не будем торопиться.
Сначала разберемся, почему таблица, которую мы создали, не подходит для определенных сценариев. Первая причина заключается в самой модели. Как это возможно? Разве она не должна отображать стоимость котировки? Да, но, возможно, вы что-то поняли не так. Мы хотим получить значение котировки, но также хотим сохранить историю этой котировки, а данная модель не решает проблему. Ведь нам гарантируется только сама котировка. Даже если мы попытаемся создать историю, этой модели будет недостаточно.
Нам нужно больше информации. Например, дата или время, в зависимости от конкретного случая. Предположим, что нам нужна только цена закрытия дня. Каждый день мы будем вносить новые данные в таблицу. Следовательно, тот же код, который мы видели ранее, необходимо будет изменить.
Возможно, вы задаетесь вопросом: «Почему это не было сделано с самого начала? Зачем делать это сейчас, когда таблица уже создана?» Так и было задумано, чтобы показать, как добавлять новые столбцы в таблицу. Как мы уже упоминали, порядок создания объектов не имеет значения. SQL позаботится о том, чтобы они были правильно сохранены в базе данных. Но, возвращаясь к команде, которую необходимо выполнить, она именно та, которая показана в анимации ниже.

Если мы выполним эту же команду из строки 08 в MetaEditor, то получим тот же результат, что и на изображении: создание нового столбца, который будет содержать данные, связанные с датой получения котировки. Это можно увидеть ниже:

После выполнения вышеуказанных действий выполним приведенную ниже команду, чтобы получить тот же результат в WorkBench.

Что касается значений, которые будут введены в эти поля, и способы их подготовки, то это будет темой для другого разговора. Дело в том, что вставка новых значений или удаление значений из базы данных — это операции, которые необходимо выполнять с определенной осторожностью. Поверьте: вам не захочется вносить много изменений в базу данных, удаляя или добавляя что-либо. Если не действовать по плану, в конечном итоге база данных станет непригодной для использования в долгосрочной перспективе. Идеальным вариантом является добавление или удаление элементов по тщательному плану и использование базы данных в основном для запросов.
Сначала думать, потом действовать
В статье неоднократно упоминается, что, хотя эта простая база данных работает, она не является идеальной. Это связано с тем, что в зависимости от наших планов по её использованию, она может быть лучше оптимизирована с точки зрения использования пространства. Но можно подумать: «почему я должен беспокоиться о пространстве? Если начинает не хватать места, то я куплю новый диск». Это один из вариантов, но проблема не решится. Проблема заключается в том, как используется база данных или как она была спроектирована.
То, что я здесь скажу, является лишь небольшим представлением о настоящей сущности проблемы. Если у вас есть более обширный опыт использования баз данных, то вы поймете, что этот вопрос гораздо глубже. Фактически, существуют курсы, специально ориентированные на людей, которые хотят стать профессионалами в этой области. Но мы не будем вдаваться в подробности, поскольку этот вопрос гораздо шире, чем я мог бы осветить в одной-двух статьях.
Я хочу показать вам, что бесполезно изучать только программирование SQL или полистать какой-нибудь учебник по базам данных, а затем говорить, что умеешь с ними работать. Такие утверждения можно делать только после многих лет работы в данной отрасли. И, тем не менее, вряд ли вы встретите кого-то, кто утверждает это с полной уверенностью.
Причина проста: базы данных представляют собой достаточно обширную нишу, многие аспекты которой уже изучены. И каждый случай индивидуален. На самом деле, универсального решения не существует.
Давайте теперь проанализируем одну из проблем этого простого восьмистрочного скрипта, который создает базу данных для хранения истории котировок символов, торгуемых на B3 (Бразильская фондовая биржа). Первая проблема заключается в том, что в поле, где мы можем сохранить цену, можно вводить только значения в диапазоне от 0,00 до 999,99. То есть некоторые символы не могут быть сохранены в данной таблице. Это связано с тем, что значение котировок этих символов отличается от ожидаемой в таблице. Можно решить эту проблему, добавив ещё одну колонку, чтобы закрыть эти пробелы. Однако это привело бы к тому, что одна из двух колонок, будь то колонка кода или создаваемая колонка, занимала бы ненужное место в базе данных.
Вторая проблема заключается в том, что значение записи, в которой хранится дата котировки, использует формат ISO 8601, тогда какое значение это имеет для базы данных? Чтобы ответить на данный вопрос, сначала нужно ответить на другой: с какого момента и до какого момента мы будем добавлять котировки в таблицу? В зависимости от ответа, можно использовать другой формат. Таким образом, мы займем меньше места и улучшим общую производительность базы данных.
Чтобы понять это, представьте, что в году 365 дней, но биржа работает не каждый день. Но давайте предположим, что торги ведутся каждый день. Таким образом, если используем значение, например SmallInt, которое в данном случае является знаковым значением, мы можем считать от 0 до 32767. Это позволило бы охватить в общей сложности чуть более 89 лет. Если бы мы использовали тот же тип данных, но без знака, то есть от 0 до 65535, мы могли бы охватить в общей сложности чуть более 179 лет. И всё же мы будем использовать только два байта вместо всех байтов, которые использует формат ISO 8601. Просто представьте себе, какое количество данных составила бы разница между 179 годами ежедневных котировок.
Третья проблема аналогична предыдущей. Она также влияет на стоимость в байтах, но на этот раз поле записи отличается. В данном случае речь идет о названии символа. Данная проблема ещё более сложна, чем предыдущая. Причина в том, что время от времени некоторые символы меняют свои названия. Однако, если мы считаем, что изменение названия символа не означает, что компания, которую он представляет, изменит свое поведение, и тогда изменение названия символа не приведет к изменению его истории.
Хорошо. Независимо от рынка, количество торгуемых символов будет ограниченным. Среди этих символов только некоторые могут привлечь наше внимание настолько, что мы захотим получить историю котировок. Тогда зачем использовать 6 байт, если для представления символа можно использовать 1 байт? Это связано с тем, что этот 1 байт позволит нам отобразить 255 символов.
Теперь вернёмся к предыдущей проблеме. Только подумайте, сколько байтов будет сэкономлено в долгосрочной перспективе. И это не считая того, что, если символ меняет название, для введения нового названия потребуется изменить только одну запись в базе данных, а не всю историю котировок.
Заключительные идеи
В сегодняшней статье мы постарались показать, как создать простую и понятную базу данных самым простым и доступным способом. Мы показали, что практически все команды, которые можно использовать в WorkBench, можно также использовать в MetaEditor для получения тех же результатов. Однако есть одна инструкция, которую нельзя использовать в MetaEditor. Она не была продемонстрирована в данной статье, так же как и способ ввода данных и выполнения запросов в базе данных.
Но, поскольку данная тема очень обширна, я вам предлагаю изучить её с помощью интернет-исследований, какого-нибудь курса или книг по данной тематике. В любом случае, здесь мы покажем ещё несколько команд, чтобы у нас был минимальный набор материалов для использования SQL в MQL5. В следующей статье мы рассмотрим SQL немного подробнее.
Ссылки:
| Файл | Описание |
|---|---|
| Experts\Expert Advisor.mq5 | Демонстрирует взаимодействие между Chart Trade и советником (для взаимодействия требуется Mouse Study). |
| Indicators\Chart Trade.mq5 | Создает окно для настройки отправляемого ордера (для взаимодействия требуется Mouse Study). |
| Indicators\Market Replay.mq5 | Создайте элементы управления для взаимодействия с сервисом репликации/моделирования (для взаимодействия требуется Mouse Study). |
| Indicators\Mouse Study.mq5 | Обеспечивает взаимодействие между графическими элементами управления и пользователем (необходимо как для работы системы репликации, так и на реальном рынке). |
| Services\Market Replay.mq5 | Создает и поддерживает сервис репликации/моделирования рынка (основной файл всей системы). |
| Code VS C++\Servidor.cpp | Создает и поддерживает серверный сокет, разработанный на C++ (версия Mini Chat) |
| Код на Python Server.py | Создание и поддержка сокета Python для связи между MetaTrader 5 и Excel. |
| Indicators\Mini Chat.mq5 | Позволяет реализовать мини-чат через индикатор (для работы требуется использование сервера) |
| Experts\Mini Chat.mq5 | Позволяет реализовать мини-чат с помощью советника (для работы требуется сервер). |
| Scripts\SQLite.mq5 | Демонстрация использования скрипта SQL с помощью MQL5 |
| Files\Script 01.sql | Демонстрирует создание простой таблицы с внешним ключом. |
| Files\Script 02.sql | Показывает добавление значений в таблицу |
Перевод с португальского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/pt/articles/12926
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Возможности Мастера MQL5, которые вам нужно знать (Часть 65): Использование паттернов FrAMA и индекса силы
Индикатор CandleCode: Формализация свечных моделей в MQL5
Моделирование рынка (Часть 17): Сокеты (XI)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования