Буду рад.
Альтернативный сейчас тоже посмотрю. Благодарю.
Вот та статья. Но исходников нет.
Не так давно разработчики языка MQL5 представили его обновленный функционал, в котором появилась возможность создания пользовательских символов и графиков. Широкая трейдерская общественность еще не успела оценить мощь этого нововведения, но даже легкий и ненавязчивый брейншторм показывает, какие огромные возможности скрывают в себе кастомные символы. В совокупности с другими средствами MQL они позволят реализовать множество самых смелых и интересных идей.
Теперь MetaTrader 5 — не просто терминал, взаимодействующий только с одним ДЦ. Сегодня это самодостаточная аналитическая платформа, которая может подключаться по API к различным биржам, визуализировать ценовые движения и торговые потоки. Небольшой набор новых функций превращает терминал в открытую систему, которая может полностью отвязаться от ограниченного набора торговых инструментов. На мой взгляд, кастомные инструменты могут стать еще и сильным аналитическим инструментом.
Подкрепим всё вышесказанное и проиллюстрируем новые возможности языка на примере очень модной сегодня темы — криптовалют. Думаю, выбранная иллюстрация дополнительно усилит интерес сообщества к кастомным символам.
Кому будет полезна статья:
- трейдерам, торгующим на криптобиржах;
- инвесторам, знающим MetaTrader 5 и портфельные инвестиции;
- программистам-фрилансерам, которые смогут предложить своим заказчикам упрощение (читай "удешевление") реализации их задач в области криптоторговли;
- и всем, кто следит за новыми возможностями MetaTrader 5 и языка MQL5.
Для начала нам нужно выбрать криптобиржу, которая предоставляет веб-API.
При подготовке моей прошлой работы я использовал площадку BTC-e, которая сейчас уже неактуальна. Поэтому я решил заменить её на альтернативную — . Возможности их API достаточные для того, чтоб сделать приличную демонстрацию и нового, и уже существовавшего MQL-функционала, в том числе: загрузку баров, поток цен, стакан заявок, просмотр текущих ордеров и позиций счёта, истории ордеров и сделок.
Итак, будем придерживаться следующего плана статьи.
- Описываем все структуры данных, которые возвращаются по веб-запросам.
- Создаём классы подключения к бирже, которые реализуют WebRequest к их точкам доступа.
- Создаем эксперт, который будет получать бары и обновлять цены криптосимвола в MetaTrader 5.
- Создаем скрипты и эксперта, работающего с ордерами и позициями.
1. API-структуры данных биржи
BITFINEX, как и некоторые другие криптобиржи, имеет две точки доступа.
- Первая точка доступа (а точнее, набор и формат запросов) выдает ценовые данные биржи — бары, тики, стакан заявок. Данные обобщенные и анонимные, поэтому запрашиваются без каких-либо подписей и авторизации.
- Вторая точка доступа выдает данные по вашему счету — состояние счета, данные об открытых позициях, отложенных ордерах, истории сделок. Эти данные приватны, поэтому в заголовке запроса необходимо отправлять подпись данных SHA384-HMAC ключом API, который вы получаете в своём личном кабинете биржи. Это гарантия того, что запрос делаете именно вы, а не злоумышленник под вашим именем.
Обе точки доступа работают по стилю REST (примечание: в статье не рассматриваются WebSocket), с форматом JSON. Это удобно как для чтения данных, так и для написания API.
Биржа имеет две версии протокола. Вторая версия на сегодняшний день находится в бета-режиме. Причин ее появления две. Во-первых, появился новый функционал (запрос баров, работа с уведомлениями, мэджики ордеров и т.д.). Вторая причина тоже явно прослеживается в формате JSON структур — это экономия трафика. Предлагаю сравнить, как выглядит ответ на запрос Ticker (текущие данные символа) в первой и второй версиях протокола:
Version 1
Version 2Как видите, вторая версия ушла от именования полей, но сделала их положение жестко закрепленным, то есть перешла от объектов к массивам. В данной статье я покажу примеры для обеих версий API рассматриваемой площадки.
Итак, сначала разберемся, какие запросы и структуры открытой точки доступа мы будем использовать для каждой версии протокола.
Для версии № 1:
Для версии № 2:
Для начала поясню, как сделаны все структуры на примере запроса SymbolDetails. Остальные структуры данных вы можете увидеть в файле BFxDefine.mqh. В будущем, если вам понадобятся другие запросы API, не вошедшие в реализацию статьи, вы сможете сделать их по аналогии.
Как это выглядит в документации
Как это выглядит в BFxDefine.mqhИз документации видно, что запрос возвращает массив объектов. Поэтому я создал две структуры. Первая — bfxSymbolDetails — парсит и хранит данные одного объекта массива. Вторая — bfxSymbolsDetails —- хранит полученный массив объектов bfxSymbolDetails и непосредственно используется в веб-запросе. То есть формат соответствия JSON <-> MQL несложный, зеркальный и распространяется на всю документацию.
Для работы с API биржи у нас будет два класса с общим родителем CBFx, задача которого — только инкапсулировать общие поля-данные и общую функцию веб-запроса.
У класса CBFx два наследника:
Итак, подготовительные работы по работе с API биржи мы провели, теперь займемся его имплементацией в терминал MetaTrader 5.
2. CustomSymbol
Что же мы имеем на данный момент с кастомными символами? Практически полную идентичность работы как с обычными символами. И это — при том, что всё управление заключается в минимуме функций.
Цель нашей работы — создать символ биржи, загрузить историю баров и делать регулярные "вбросы" цены. Поэтому очевидно, что нам понадобятся следующие MQL-функции:
К большому сожалению, WebRequest нельзя вызывать из индикатора. Поэтому создадим советника, который будет регулярно запрашивать бары символа и текущие цены, а затем обновлять их в MetaTrader 5.
Схема взаимодействия биржи и MetaTrader 5 следующая:
- Проверяем наличие символа в MetaTrader 5
- Если символ не найден, то -> Запрашиваем указанного символа.
- Создаем символ и заполняем его свойства
- Проверяем М1 историю.
- Стартуем таймер
По сути, это и есть весь рабочий цикл.
Чтобы получить чуть больше рабочих примеров, немного усложним работу. Для этого сделаем запрос и отображение стакана заявок (OrderBook) и ленты сделок (TradesHist). Ленту сделок выведем в комментарий на чарт, а стакан отобразим в виде отрезков на соответствующих уровнях цен.
Реализация публичного API находится в классе CBFxPublic.
Для объяснения работы его функций рассмотрим CandleHist.
Описание в документации:
Общий вид запроса: https://api.bitfinex.com/v2/candles/trade::TimeFrame::Symbol/Section
Ответ на запрос:
MQL-реализация CandleHist:
Функция CandleHist формирует GET-запрос. Поскольку нас интересуют минутные бары, то строка запроса в итоге примет вид https://api.bitfinex.com/v2/candles/trade:1m:tXXXXXX/hist. В ответе получаем 1000 последних баров из истории.
Кульминацией всех манипуляций с этими API-запросами будет несложный эксперт, задачей которого будет построение баров и передвижение цены на графике.
В первый раз обязательно запустите его в debug-режиме и по шагам пройдите все вызовы. Проверьте, что возвращает API, как парсятся ответы и выводятся данные.
Что же сделал эксперт в MetaTrader 5?
После выполнения функции OnInit создается символ BTCUSD.bfx в разделе BITFINEX:
Далее по таймеру начинается процесс подгрузки последнего бара и тиков:
Как видим, все свелось к схеме:
То есть, работа с публичным API несложная. Вы можете реализовать для своих потребностей и другие его функции.
На момент написания статьи к выпуску готовилось обновление MQL5, в которое входит работа с символами по свойству SYMBOL_FORMULA. Эта новая функция позволит легко создавать новые кросс-курсы в простых математических выражениях.
3. Всё для автоматизации
В этой части вы увидите, как выполнять запросы к приватному API биржи, чтоб работать с ордерами и позициями. Функции работы с этой точкой доступа вынесены в отдельный класс CBFxTrade.
Запросы сделаны в полной аналогии с классом CBFxPublic. Единственная сложность для новичка, на мой взгляд, — это заполнение заголовков запроса. В отличие от публичного API, здесь в заголовок нужно передавать хэш тела запроса SHA384-HMAC, подписанный секретным ключом. Причем в API версии №1 запрос надо было дополнительно переводить в Base64.
Согласно документации, порядок создания подписаного хэша выглядит так:
- создать тело запроса в json формате => body
- перекодировать body в Base64 => bodyBase64
- вычислить хеш bodyBase64 с секретным ключом => signature
- отправить bodyBase64 и signature в заголовке запроса
Получение bodyBase64 выполняет стандартная функция MQL CryptEncode с параметром CRYPT_BASE64. Для нахождения signature воспользуемся приложенным к статье классом SHA384.
В итоге функция запроса к приватному API по версии №1 будет выглядеть так:
Запрос в приватном API версии № 2 происходит практически в таком же порядке, но без Base64 и с другими именами заголовков.
Отдельно хочу сказать про параметр Nonce. Он не требовался в публичном API, и здесь его назначение простое — указать, что мы посылаем новый запрос, который биржа еще не обрабатывала. Nonce — это простой инкрементный счетчик, значение которого должно быть всегда больше предыдущего в каждом веб-запросе.
В случае, если вы ошибочно отправили Nonce, равный или менее предыдущего значения, то API вернет ошибку 10100 — Nonce is too small. К сожалению, API не присылает ожидаемое значение (на других биржах это есть). Поэтому чтобы с первого раза сделать сброс на правильное значение, проще всего присваивать ему текущее время, и далее снова инкрементировать в последующих веб-запросах.
Какие запросы приватной точки доступа мы будем использовать:
// состояние торговли:
// торговля:
// уведомления:
Пример 1. Получаем информацию о позициях и ордерах счета
Так как мы стремимся автоматизировать торговлю по максимуму, то очень важно видеть, что сейчас происходит в позициях и активных ордерах. Делается это с помощью API-запросов:
Как видим, запросы несложные. Отправка параметра, да и то единственного — интересующего нас тикета ордера — требуется только в Order Status.
Самое простое, что я попытался сделать для демонстрации — вывести на чарт в виде таблиц полученные данные. Работу с графическими объектами я подробно описывать не буду, поскольку это тривиальная задача, решение которой не входит в цели этой статьи. В псевдокоде получение и отображение списка выглядит следующим образом:
В этом же стиле делаем запросы для остальных массивов — bfxt.Positions и bfxt.ActiveOrders.
Результат выполнения скрипта:
Теперь в вашем распоряжении есть вся информация по ордерам и позициям, и ваш эксперт может принимать решения согласно своей торговой логики.
Пример 2. Работаем с Уведомлениями
Немного отвлечемся от торговли и рассмотрим пример, который будет полезен нам для теста приватного API. С помощью механизма отправки уведомлений можно, не опасаясь за финансы, "пощупать" отправку запросов на создание и удаление объектов. Уведомления можно использовать, например, вместо непосредственной торговли. Биржа будет слать оповещение на ПК или мобильное приложение, и это даст вам сигнал к действию.
API предлагает три запроса:
Каждый из них я уже реализовал в виде скриптов. Все они находятся в архиве, приложенном к статье. Рассмотрим для примера создание Уведомления — Alert Set. Согласно документации, для запроса требуется передать символ и цену. Чтоб не запрашивать эти параметры у юзера, символ будет браться с самого чарта, а цена — с места, на котором на график был наброшен скрипт.
Мы видим, что после всех уточняющих вопросов в MessageBox и подготовки данных нам остается лишь отправить запрос на биржу bfxt.AlertSet. Если отправка прошла успешно, мы получим новый созданный объект bfxAlert.
В MetaTrader 5 есть отличная, на 100% рабочая альтернатива вышеописанному способу отправки уведомлений:
Обратите внимание: встроенная в MetaTrader 5 система уведомлений позволяет озвучивать алерты не только локально в терминале, но и отправлять их на почту, в файл или пуш на мобильный терминал! То есть, торговая платформа фактически предлагает гораздо больше полезных функций и настроек, чем вышеописанная биржевая возможность.
Пример 3. Работа с ордерами и позициями
Мы, наконец, подошли к последнему и главному примеру — к торговым операциям на бирже напрямую из MetaTrader 5.
Этот код я решил реализовать в виде эксперта с управлением позициями с чарта. Создание панели не входило в наши основные цели, но это будет удобная альтернатива набору скриптов. Общий вид работы эксперта показан на скриншоте ниже:
Что делает эксперт:
- показывает отложенные ордера и позиции в таблице и линиями на чарте;
- модифицирует цену ордера при перемещении линии;
- удаляет отложенный ордер;
В глобальном смысле вся обработка и вызовы API будут сосредоточены в OnChartEvent.
- По событию OBJECT_CREATE отлавливаем создание новых линий на чарте и создаем новый лимитный ордер.
- По событию OBJECT_DRAG отлавливаем перемещение "наших" линий и модифицируем отложенный ордер.
- По событию OBJECT_CLICK отлавливаем клик на управляющих кнопках и делаем обновление таблиц, или закрытие позиции, или удаление ордера.
Код событийных функций эксперта выглядит следующим образом:
Полный код вы найдете в файле BFxTrading.mq5. На короткой анимации ниже можете наблюдать то, что получилось в результате:
Вы сделали это!
Итак, арсенал инструментов пополнен новыми возможностями. MetaTrader 5 стал платформой для внешней биржевой площадки. Если у вас есть опыт работы с кастомными символами и интеграции с внешними биржами с помощью веб-запросов — приглашаю к дискуссии в комментариях.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
раньше была статья: Как торговать на внешней бирже криптовалют через MetaTrader 5:
куда она делась знает кто? Может на форуме появился запрет на данную тему или какое другое ограничение? Если у кого есть сохранённая версия, скиньте плиз с исходниками.
Благодарю заранее.