Рецепты MQL5 - Озвучиваем торговые события в MetaTrader 5
В этой статье мы рассмотрим такие вопросы, как включение в файл эксперта звуковых файлов и, соответственно, озвучивание торговых событий. Включение файлов означает, что звуковые файлы будут находиться внутри эксперта, и если передать скомпилированную версию эксперта (*.ex5) другому пользователю, то не нужно будет передавать ему звуковые файлы и объяснять при этом, в какую папку их положить.
Процесс разработкиДля теста возьмем эксперта из предыдущей статьи Рецепты MQL5 - Сохраняем результаты оптимизации торгового эксперта по указанным критериям. Я убрал из него все, что не относится к текущей теме, чтобы было проще.
Чтобы озвучить торговое событие средствами MQL5 можно воспользоваться функциями Alert() и PlaySound(). Если использовать функцию Alert(), то будет воспроизводиться всегда один и тот же звук, при этом будет открываться окно с сообщением. Как это выглядит можно посмотреть в статье Рецепты MQL5 - Вывод информации на печать в разных режимах.
Звук для алерта можно установить в настройках терминала: Сервис -> Настройки или Ctrl+O. Далее в разделе События нужно установить флажок Разрешить звуковые оповещения о событиях и в выпадающем списке алертов выбрать подходящий звуковой файл.
Рис. 1 - Вкладка "События" в настройках терминала
Но для каждого события, которое воспроизводит пользовательская программа, есть возможность установить уникальный звук, и для этого нам понадобится функция PlaySound().
Прежде чем встраивать звуковые оповещения в торгового эксперта, сделаем эксперта для тестов. Сделаем так, чтобы при загрузке эксперта на графике открывалась звуковая панель. Звуковую панель соберем из графических объектов типа кнопка (OBJ_BUTTON). Каждой кнопке будет присвоен уникальный звук, который будет воспроизводиться при нажатии.
В интернете я нашел 25 разных звуковых файлов в формате *.wav (скачать их можно в конце статьи). Их нужно расположить в директории MetaTrader 5\MQL5\Files\Sounds. Для тренировки навыков работы со звуковыми файлами с помощью Мастера MQL5 создадим нового эксперта. В самом начале обозначим размер массива по количеству кнопок на звуковой панели (всего их будет 26).
Далее нужно указать директории и имена файлов, которые должны стать ресурсами эксперта. Это можно сделать с помощью директивы #resource. После директивы в двойных кавычках нужно указывать путь к файлу:
Теперь нужно создать три строковых массива, которые будут содержать пути к файлам ресурсов, имена графических объектов и отображаемый текст на графических объектах. Обратите внимание на два двоеточия в пути к файлам - специальный признак для обращения к ресурсу по имени.
Создадим функцию CreateButton(), которая будет создавать графический объект "Кнопка" на графике с указанными свойствами:
Чтобы было повеселей, цвет для каждой кнопки будет выбираться случайным образом. Для этого напишем простую функцию GetRandomColor():
Теперь, напишем функцию SetSoundPanel(), которая будет устанавливать звуковую панель на график:
Для удаления панели с графика будем использовать функции, представленные ниже:
Итак, при загрузке эксперта в функции OnInit() панель будет установлена на график, а при удалении эксперта в функции OnDeinit() панель будет удалена.
Осталось настроить взаимодействие с панелью, чтобы при нажатии на кнопки воспроизводились соответствующие им звуки. Чтобы не умереть со скуки сделаем еще так, чтобы при нажатии на одну из кнопок звуковой панели, цвета кнопок изменялись. Для этого нам понадобится функция ChangeColorsOnSoundPanel(), код которой представлен ниже:
И, наконец, в функции OnChartEvent() нужно разместить вот такой код:
В коде выше в выделенной строке видно, что в функцию PlaySound() с помощью пользовательской функции GetSoundPath() передается путь, откуда будет взят звуковой файл. Ниже можно ознакомиться с кодом функции GetSoundPath():
Теперь все готово. После набрасывания эксперта на график будет установлена звуковая панель (программу можно скачать в приложении к статье):
Рис. 2 - Звуковая панель на графике
Итак, принцип работы со звуковыми файлами теперь понятен. Теперь вернемся к нашему советнику из предыдущей статьи Рецепты MQL5 - Сохраняем результаты оптимизации торгового эксперта по указанным критериям и определимся со звуками, которые хотелось бы слышать в торговом эксперте. Создадим файл Resources.mqh и подключим его к основному файлу эксперта.
Выберем файлы для основных торговых событий.
Хочу еще отметить, что помимо звуковых файлов в качестве ресурсов можно хранить в эксперте изображения в формате *.bmp для создания интерфейса, текстовые файлы и даже индикаторы. Эксперты для MetaTrader 5 теперь считаются вполне полноценными приложениями: это очень удобно, когда можно передать всего лишь один файл вместо нескольких.
Двигаемся дальше. Во внешних параметрах нужно добавить параметр UseSound, чтобы была возможность отключить воспроизведение звуков:
В файле Include\Enums.mqh создадим перечисление ENUM_SOUNDS для звуков.
Эти идентификаторы понадобятся для пользовательской функции PlaySoundByID().
Во время торговых операций, которые совершает эксперт, звуковые эффекты можно воспроизводить, вызывая PlaySoundByID() из соответствующих торговых функций. Например, посмотрите, как это реализовано в функции OpenPosition():
В случае же, когда позиция закрывается по Stop Loss, Take Profit, вручную или любым другим способом, это событие нужно отслеживать в функции OnTrade(). Для этого напишем еще одну функцию SoundNotification(), в которой будут производиться необходимые проверки: если по текущему символу в истории сделок появилась новая сделка с идентификатором DEAL_ENTRY_OUT или DEAL_ENTRY_INOUT (полное/частичное закрытие позиции или разворот), то далее программа проверит, была ли закрыта эта сделка с прибылью или убытком, и воспроизведет соответствующий звук.
Функцию SoundNotification() нужно разместить в функциях OnInit() и OnTrade():
Также воспроизведение звука было добавлено в конец функции ModifyTrailingStop() при модификации защитного уровня.
ЗаключениеНа этом все. Все файлы для тестов можно скачать в приложении к статье. По теме звуков в терминале хочется также отметить одно интересное решение в Code Base CMIDI (автор Integer): с его помощью в MetaTrader 5 можно воспроизводить MIDI-файлы. Успехов!