Поиск статьи

 

раньше была статья: Как торговать на внешней бирже криптовалют через MetaTrader 5:
куда она делась знает кто? Может на форуме появился запрет на данную тему или какое другое ограничение? Если у кого есть сохранённая версия, скиньте плиз с исходниками.

Благодарю заранее.

 
Могу скинуть в личку. И есть альтернативный подход.
 
Stanislav Korotky:
Могу скинуть в личку. И есть альтернативный подход.

Буду рад.
Альтернативный сейчас тоже посмотрю. Благодарю.

 

Вот та статья. Но исходников нет.

Не так давно разработчики языка MQL5 представили его обновленный функционал, в котором появилась возможность создания пользовательских символов и графиков. Широкая трейдерская общественность еще не успела оценить мощь этого нововведения, но даже легкий и ненавязчивый брейншторм показывает, какие огромные возможности скрывают в себе кастомные символы. В совокупности с другими средствами MQL они позволят реализовать множество самых смелых и интересных идей.

Теперь MetaTrader 5 — не просто терминал, взаимодействующий только с одним ДЦ. Сегодня это самодостаточная аналитическая платформа, которая может подключаться по API к различным биржам, визуализировать ценовые движения и торговые потоки. Небольшой набор новых функций превращает терминал в открытую систему, которая может полностью отвязаться от ограниченного набора торговых инструментов. На мой взгляд, кастомные инструменты могут стать еще и сильным аналитическим инструментом. 

Подкрепим всё вышесказанное и проиллюстрируем новые возможности языка на примере очень модной сегодня темы — криптовалют. Думаю, выбранная иллюстрация дополнительно усилит интерес сообщества к кастомным символам.

Кому будет полезна статья:

  • трейдерам, торгующим на криптобиржах;
  • инвесторам, знающим MetaTrader 5 и портфельные инвестиции;
  • программистам-фрилансерам, которые смогут предложить своим заказчикам упрощение (читай "удешевление") реализации их задач в области криптоторговли;
  • и всем, кто следит за новыми возможностями MetaTrader 5 и языка MQL5.

Для начала нам нужно выбрать криптобиржу, которая предоставляет веб-API.

При подготовке моей прошлой работы я использовал площадку BTC-e, которая сейчас уже неактуальна. Поэтому я решил заменить её на альтернативную — . Возможности их API достаточные для того, чтоб сделать приличную демонстрацию и нового, и уже существовавшего MQL-функционала, в том числе: загрузку баров, поток цен, стакан заявок, просмотр текущих ордеров и позиций счёта, истории ордеров и сделок.

Итак, будем придерживаться следующего плана статьи.

  1. Описываем все структуры данных, которые возвращаются по веб-запросам.
  2. Создаём классы подключения к бирже, которые реализуют WebRequest к их точкам доступа.
  3. Создаем эксперт, который будет получать бары и обновлять цены криптосимвола в MetaTrader 5.
  4. Создаем скрипты и эксперта, работающего с ордерами и позициями.

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.

Этот код я решил реализовать в виде эксперта с управлением позициями с чарта. Создание панели не входило в наши основные цели, но это будет удобная альтернатива набору скриптов. Общий вид работы эксперта показан на скриншоте ниже:

Что делает эксперт:

  • показывает отложенные ордера и позиции в таблице и линиями на чарте;
  • модифицирует цену ордера при перемещении линии;
  • удаляет отложенный ордер;

  • закрывает позицию;
  • устанавливает отложенный Limit ордер при помещении новой горизонтальной линии на график.

    В глобальном смысле вся обработка и вызовы API будут сосредоточены в OnChartEvent.

    • По событию OBJECT_CREATE отлавливаем создание новых линий на чарте и создаем новый лимитный ордер.
    • По событию OBJECT_DRAG отлавливаем перемещение "наших" линий и модифицируем отложенный ордер.
    • По событию OBJECT_CLICK отлавливаем клик на управляющих кнопках и делаем обновление таблиц, или закрытие позиции, или удаление ордера.

    Код событийных функций эксперта выглядит следующим образом:

    Полный код вы найдете в файле BFxTrading.mq5. На короткой анимации ниже можете наблюдать то, что получилось в результате:

    Вы сделали это!

    Итак, арсенал инструментов пополнен новыми возможностями. MetaTrader 5 стал платформой для внешней биржевой площадки. Если у вас есть опыт работы с кастомными символами и интеграции с внешними биржами с помощью веб-запросов — приглашаю к дискуссии в комментариях.


  •  
    Вероятно чекисты или масоны потребовали удалить статью потому что там был грааль...
     
    transcendreamer:
    Вероятно чекисты или масоны потребовали удалить статью потому что там был грааль...

    Аналогичных граалей на GitHub - завались. Одно отличие, что этот был на MQL.