Если Вы уже выполнили Подготовку терминала MetaTrader 5, Настройку счета Binance, Подключение к потоку котировок и Установку утилиты Trade Manager, можно приступать к адаптации кода своего советника для торговли на бирже Binance.
Этот вариант подойдет, если у Вас есть торговый советник с исходным кодом, и Вы хотите торговать с его помощью на бирже Binance. Вам понадобятся минимальные знания программирования, или помощь человека, который писал Вам советника (если он был написан на заказ).
Также не забывайте, что у Вас есть возможность копировать сделки с демо-счета или торговать с помощью бесплатного советника CommunityPower EA.
Переход на MT4Orders
Библиотека BinanceTradeConnector, предназначенная для связи с Trade Manager-ом, проектировалась для подключения к советникам, которые написаны в MT4-стиле (используют библиотеку MT4Orders от fasaber). На мой взгляд, это удобно и позволяет учесть множество нюансов, связанных с торговлей в МТ5.
Если Ваш советник написан “на чистом MQL5” или использует стандартную библиотеку для отправки торговых приказов, перед подключением к BinanceTradeConnector переведите его на рельсы MT4Orders. Это не сложно — просто замените все торговые функции на старые добрые OrderXXX-функции из MQL4.
В результате, Ваш советник должен торговать точно так же, как раньше. Обязательно убедитесь в этом с помощью тестера и демо-счета.
Загрузка файлов библиотеки
Когда Ваш советник будет готов, загрузите архив BinanceTradeConnector.zip, и распакуйте его в директорию MQL5 того терминала, где Вы ведете разработку (Файл — Открыть каталог данных).
Подключение к советнику
После сохранения библиотек, откройте файл своего советника и приступайте к добавлению необходимого кода.
1. В самом начале, перед блоком input-параметров, добавьте переопределение функции OrderCalcMargin и включите необходимые библиотеки (MT4Orders уже должна быть подключена):
#define OrderCalcMargin BinanceTradeManager.GetMargin #include <fxsaber\MT4Orders.mqh> #include <Binance\BinanceTradeConnector.mqh>
2. В самом начале функции OnInit инициализируйте библиотеку:
int OnInit() { if ( !BinanceConnector.Init() ) return(INIT_FAILED);
Обратите внимание, что при любой ошибке инициализации (например, при отсутствии запущенного Trade Manager) советник будет удален с графика.
Вы можете изменить это поведение, но тогда позаботьтесь о том, чтобы библиотека была инициализирована перед использованием.
3. В конце функции OnDeinit добавьте строку деинициализации библиотеки:
void OnDeinit(const int reason) { ... BinanceConnector.Deinit( reason ); }
4. В начале функции OnTick вызовите метод для обновления рыночной информации:
void OnTick() { BinanceConnector.Tick(); ...
5. Везде в коде, где вычисляется размер лота для открытия или закрытия сделки, добавьте вызов BinanceConnector.CorrectLotSize() для нормализации с учетом текущей цены инструмента:
double lot = your_lot_calc_function(); lot = BinanceConnector.CorrectLotSize( lot ); OrderSend( _Symbol, OP_BUY, lot, Ask, 100, 0.0, 0.0, "crypro", 12345 );
Если советник торгует отложенными ордерами, используйте перегрузку функции с указанием цены ордера:
double op = Ask - 100*_Point; double lot = BinanceConnector.CorrectLotSize( _Symbol, InputFixedLot, op ); OrderSend( _Symbol, OP_BUYLIMIT, lot, op, 100, 0.0, 0.0, "crypro", 12345 );
6. В конце функции OnTick добавьте вызов метода CheckForChanges для синхронизации торгового окружения с биржей:
... BinanceConnector.CheckForChanges(); }
7. Если у Вашего советника есть GUI (панель, кнопки), или другие события, которые могут привести к торговым операциям (клик мышкой, таймер, перемещение линии, или любое другое), добавьте вызов метода CheckForChanges сразу после обработчика этого события. Например, вот так выглядит код функции OnChartEvent моего советника, который позволяет открывать позиции с помощью кнопок на графике:
void OnChartEvent ( const int id, const long &lparam, const double &dparam, const string &sparam ) { GUI.ChartEvent( id, lparam, dparam, sparam ); BinanceConnector.CheckForChanges(); }
Правило простое: после любого OrderSend нужно как можно быстрее вызвать CheckForChanges, это даст команду на синхронизацию с биржей.
Поздравляю! На этом работа с кодом завершена!
Внутренняя структура и ограничения
Подключая к советнику BinanceTradeConnector.mqh, Вы виртуализируете все торговое окружение с помощью библиотеки Virtual от fxsaber. То есть, советник начинает торговать виртуально.
При любом изменении в торговом окружении, оно отправляется Trade Manager-у, который, в свою очередь, сводит все полученные данные и синхронизирует их с торговым окружением Вашего аккаунта на бирже Binance. Это позволяет торговать несколькими советниками на одном инструменте, включая разнонаправленные сделки, отложенные ордера и СЛ/ТП. Кроме того, это позволяет подключать библиотеку несколькими строками кода, не меняя существующий код советника.
Но отсюда проистекают и главные ограничение библиотеки — моновалютность и изолированность от других советников. Вы не можете торговать сразу несколькими монетами из одного советника (OrderSend для “неродного” инструмента отработает неправильно), как и не можете увидеть позиции и ордера других советников, торгующих на счете.
Я надеюсь преодолеть оба этих ограничения в будущем, но сроки назвать в данный момент не готов.
Следующим важным ограничением является отсутствие синхронизации отложенных ордеров (все приказы отправляются в виде маркет-ордеров, в том числе отложки, СЛ и ТП — при срабатывании). Это упущение будет исправлено в ближайшее время, я прекрасно понимаю важность лимитных ордеров при торговле криптой.
Следующая недоработка — ограниченная информация о состоянии счета.
В данный момент каждый советник видит свой Баланс (а значит и маржу, свободная маржу, и другие показатели счета). Учитывайте это, если у вас немного средств на счете — если один советник торгует прибыльно, а второй убыточно, в сумме у них баланс не меняется, но у убыточного могут закончиться средства на открытие новых позиций. Или элементарно будет отличаться лот, если он рассчитывается на основании баланса или свободной маржи.
Используйте параметр Custom account balance для установки любого стартового виртуального баланса каждому советнику. Синхронизация информации о счете между советниками запланирована на ближайшее будущее.
Использование виртуальной торговли добавляет еще одно неудобство: если закрыть чарт с советником, у которого есть открытые сделки, они так и останутся открытыми. TradeManager будет учитывать их при синхронизации, и, даже если закрыть их на сайте биржи, TradeManager моментально их восстановит.
Это не проблема, если у вашего советника есть свой GUI, позволяющий закрыть сделки вручную, но такой GUI есть далеко не в каждом советнике. Кроме того, виртуальное окружение сохраняется с привязкой к уникальному Id графика, и если случайно закрыть чарт и попробовать запустить советника на новом графике, он не увидит предыдущее виртуальное окружение (даже если указать ему тот же Magic number).
Если Вы попали в такую ситуацию:
- остановите Trade Manager (или закройте терминал),
- откройте Файл — Каталог данных, перейдите в “\MQL5\Files\BinanceTradeManager\”,
- удалите файл, соответствующий нужному виртуальному окружению (например “ETHBUSD.bnf_128968168864101582.virt”, определять “нужное” придется эмпирическим путем 😜),
- после этого снова запустите Trade Manager, он “забудет” удаленное виртуальное окружение, и сразу закроет повисшую позицию.
Естественно, Вы всегда можете просто остановить Trade Manager-а и закрыть позицию на бирже вручную. Но этот вариант подойдет, только если вы не планируете продолжать пользоваться Trade Manager-ом.
Если Вы знаете о других особенностях, которые я забыл упомянуть, напишите мне об этом, и я обновлю статью.