Поиск статьи

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Oreshkin
6016
Alexey Oreshkin  

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

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

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

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

Alexander Ivanov
17050
Alexander Ivanov  

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

Не так давно разработчики языка 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
    6032
    transcendreamer  
    Вероятно чекисты или масоны потребовали удалить статью потому что там был грааль...
    Stanislav Korotky
    25587
    Stanislav Korotky  
    transcendreamer:
    Вероятно чекисты или масоны потребовали удалить статью потому что там был грааль...

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

    Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий