Як створити торгового робота для Московської біржі MOEX на MetaTrader5

Багато трейдерів на Московській біржі хотіли б автоматизувати свої торгові алгоритми, але не знають, з чого почати. Адже давно є опрацьовані рішення, які максимально полегшують перші кроки в алготрейдингу.

Торгувати на біржі за допомогою роботів – це просто

Мова MQL5 спочатку підтримує всі торгові можливості платформи MetaTrader 5 — у ньому безліч торгових функцій для роботи з ордерами, позиціями та запитами. При цьому немає значення, на якому ринку ви торгуєте - ф'ючерси, акції, опціони і т.д.

MetaTrader 5 пропонує 6 типів торгових операцій

Існує кілька основних типів торгових операцій, які можуть знадобитися в торговому роботі:

  1. купівля/продаж за поточною ціною,
  2. встановлення відкладеного ордера на купівлю/продаж за деякою умовою,
  3. модифікація/видалення відкладеного ордера,
  4. закриття/нарощування/скорочення/переворот позиції.

Всі ці операції реалізуються за допомогою функції OrderSend(), існує також асинхронний варіант цієї функції - OrderSendAsync(). Все різноманіття торгових операцій описується структурою MqlTradeRequest, що містить опис торговельного запиту. Тому єдині труднощі з торговими операціями можуть полягати лише у правильному заповненні структури MqlTradeRequest та обробці результату виконання запиту.

Відповідно до правил вашої торгової системи, ви можете здійснити купівлю або продаж за ціною ринку (BUY або SELL), а можете помістити відкладений ордер на здійснення купівлі/продажу на деякій відстані від поточної ціни ринку:

  • BUY STOP, SELL STOP — купівля або продаж при пробитті вказаного рівня (гірше за поточну ціну);
  • BUY LIMIT, SELL LIMIT — купівля або продаж задосягненні зазначеного рівня (краще за поточну ціну);
  • BUY STOP LIMIT, SELL STOP LIMIT - встановлення ордера BUY LIMIT або SELL LIMIT при досягненні вказаної ціни.

Типи цих стандартних ордерів відповідають переліку ENUM_ORDER_TYPE.

Крім того, вам може знадобитися модифікувати або видалити відкладений ордер, це також робиться за допомогою функцій OrderSend()/OrderSendAsync(). Зміна відкритої позицій теж не становить складності, оскільки відбувається в результаті здійснення тих же торгових операцій.

У цій статті ми покажемо не тільки, як легко і просто програмувати покупки та продажі в MQL5, але також підкажемо, як працювати з торговим рахунком та властивостями символів. У цьому нам допоможуть торгові класи стандартної бібліотеки.

Робота з торговим рахунком

Насамперед при запуску торгового робота у справу необхідно отримати інформацію про торговий рахунок, на якому він торгуватиме.

Для роботи з рахунком є ​​клас CAccountInfo, який і розроблявся з цією метою. Додамо до нашого коду підключення файлу AccountInfo.mqh і оголосимо змінну цього класуaccount :

Як видно з наведеного коду, за допомогою змінноїaccount функції OnInit() можна отримати багато корисної інформації. Ви можете додати цей код до свого експерта і вам буде набагато простіше розбирати логи під час аналізу його роботи.

Результат запуску скрипта показано на зображенні.

московської

Отримання властивостей фінансового інструменту

Інформацію про рахунок ми отримали, але для здійснення торгових операцій потрібно знати ще властивості активу, яким ми збираємося торгувати. Для цього призначено ще один зручний клас CSymbolInfo з великою кількістю методів. Ми наведемо у прикладі тількиневелику їхню частину.

І малюнку показані властивості символу Si-6.16 з секції термінового ринку Московської біржі (FORTS). Тепер ви готові перейти безпосередньо до торгівлі.

біржі

Програмування торгових операцій

Для надсилання торгових наказів у мові MQL5 існує дві функції — OrderSend() та OrderSendAsync(). Насправді це дві реалізації однієї функції. Якщо OrderSend() відправляє торговий запит і чекає на результат його виконання, то асинхронна OrderSendAsync() просто вистрілює запит і дозволяє працювати програмі далі, не чекаючи відповіді торгового сервера. Таким чином, торгувати в MQL5 дійсно просто, достатньо використовувати лише одну функцію для всіх торгових операцій

Обидві функції отримують як перший параметр структуру MqlTradeRequest, яка містить понад десяток полів. Склад потрібних полів залежить від типу торгової операції, тому не всі поля потрібно заповнювати. У разі неправильного значення або відсутності обов'язкового поля, запит не пройде перевірку в самому терміналі і просто не буде відправлений на сервер. При цьому 5 цих полів вимагають вказівки коректного значення з зумовлених перерахувань.

Така велика кількість полів торговельного запиту викликана необхідністю описати безліч властивостей ордера, які можуть змінюватися в залежності від політики виконання, часу закінчення та деяких інших параметрів. Вам не доведеться заучувати всі ці тонкощі, просто використовуйте готовий клас CTrade. Ось так приблизно може виглядати використання цього класу у вашому торговому роботі:

Для торгівлі на біржі зазвичай використовується режим виконання ORDER_FILLING_RETURN. Довідка говорить:

Цей режим використовується лише в режимах «Виконання по ринку» та «Біржовевиконання»: для ринкових (ORDER_TYPE_BUY та ORDER_TYPE_SELL), лімітних та стоп-лімітних ордерів (ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY_STOP_LIMIT та ORDER_TYPE У разі часткового виконання ринковий чи лімітний ордер із залишковим обсягом не знімається, а продовжує діяти.

Для ордерів ORDER_TYPE_BUY_STOP_LIMIT та ORDER_TYPE_SELL_STOP_LIMIT при активації буде створено відповідний лімітний ордер ORDER_TYPE_BUY_LIMIT/ORDER_TYPE_SELL_LIMIT з типом виконання ORDER_FILLING_RETUR.

Ну а тепер настав час подивитися, як CTrade допомагає у торгових операціях.

Купівля/продаж за поточною ціною

За промовчанням, якщо ім'я інструмента не вказано, CTrade буде використовувати ім'я символу, на якому він запущений. Це дуже зручно для найпростіших стратегій. Для робота, який торгує відразу на кількох інструментах, вам необхідно кожного разу явно вказувати символ, яким буде проводитися торгова операція.

Нагадаємо, MagicNumber та допустиме прослизання ми задали при ініціалізації екземпляра CTrade, тому вони не потрібні. Хоча їх також можна ставити безпосередньо перед кожною торговою операцією, якщо це необхідно.

Виставлення лімітного ордера

Для надсилання лімітного ордера використовується відповідний метод класу BuyLimit() або SellLimit(). Більшість випадків може підійти укорочений варіант, коли вказуються лише вартість відкриття і обсяг. Ціна відкриття для BuyLimit повинна бути нижчою за поточну ціну, а для SellLimit має бути вищою. Тобто ці ордери використовуються для входу на ринок за найкращою ціною, наприклад, у стратегіях з розрахунком на відскок від рівня підтримки. При цьому використовується той символ, на якому запущено експерта:

У другому варіантінеобхідно правильно вказати рівні SL та TP. Не забувайте, що для покупок рівень Take Profit повинен бути вищим за ціну відкриття, а рівень Stop Loss — нижчим від ціни відкриття. Для ордерів SellLimit все навпаки. Ви легко можете дізнатися про свою помилку при тестуванні експерта на історичних даних, клас CTrade автоматично виводить у таких випадках повідомлення (якщо ви самі не викликали функцію LogLevel).

Виставлення стопового ордера

Для надсилання стопового ордера використовуються аналогічні методи BuyStop() та SellStop(). Ціна відкриття для Buy Stop має бути вищою за поточну ціну, а для SellStop має бути нижчою. Стопові ордери використовуються у стратегіях, що входять на прорив певного рівня опору, а також для обмеження збитків. Простий варіант:

І докладніше, коли потрібно вказати максимум параметрів для відкладеного ордера BuyStop:

Для відправки ордера SellStop застосовується відповідний метод класу CTrade, головне правильно вказувати ціни.

Робота з позицією

Ви можете замість використання методів Buy() та Sell() користуватися методами для відкриття позиції. Щоправда, у цьому випадку доведеться вказати більше деталей:

Для закриття позиції достатньо вказати ім'я інструменту, решту класу CTrade зробить сам.

У відкритій позиції можна змінювати рівні StopLoss та TakeProfit. Це робиться за допомогою методу ModifyPosition().

Модифікація та удалення ордера

Для зміни параметрів відкладеного ордера у класі CTrade передбачено метод OrderModify(), якому необхідно передати всі необхідні параметри.

Вам необхідно отримати тикет ордера, який необхідно змінити, та в залежності від його типу вказати правильні рівні StopLoss та TakeProfit. Крім того,нова ціна відкриття має бути також коректною по відношенню до поточної ціни.

Для видалення відкладеного ордера достатньо знати його тикет:

У класі також є універсальний метод OrderOpen(), який може виставляти відкладені ордери будь-якого типу. На відміну від спеціалізованих методів BuyLimit, BuyStop, SellLimit та SellStop він вимагає вказувати більше обов'язкових параметрів. Можливо, комусь він здасться зручнішим.

Що ще подивитись у торгових класах

У цій статті ми показали прості прийоми для програмування торгових операцій з купівлі та продажу, а також роботу з відкладеними ордерами. Але в розділі Торгові класи є ще кілька зручних помічників для розробників роботів на MQL5:

  • COrderInfo - для роботи з ордерами;
  • CHistoryOrderInfo - для роботи з відпрацьованими ордерами, що потрапили до історії торгівлі;
  • CPositionInfo - для роботи з позиціями;
  • CDealInfo - для роботи з угодами;
  • CTerminalInfo — для отримання інформації про термінал.

За допомогою цих класів ви можете зосередитись тільки на торговій стороні вашої стратегії, звівши всі технічні питання до мінімуму. Крім того, клас CTrade можна використовувати для вивчення торгових запитів, наприклад під налагодженням. І згодом ви можете створити на його основі власні класи, в яких реалізуєте необхідну вам логіку щодо опрацювання результатів виконання торгового запиту.

Почніть свій шлях до алготрейдингу з простих скриптів

Запропоновані в статті способи розробки торгових роботів на MQL5 призначені в першу чергу новачкам, хоча багато досвідчених розробників також можуть знайти для себе щось нове і корисне.