Как да създадете робот за търговия за Московската борса MOEX на MetaTrader5
Много търговци на Московската борса биха искали да автоматизират своите алгоритми за търговия, но не знаят откъде да започнат. Но отдавна има добре разработени решения, които правят първите стъпки в алгоритмичната търговия възможно най-лесни.
Търговията на борсата с помощта на роботи е лесна
Езикът MQL5 поддържа всички възможности за търговия на платформата MetaTrader 5 — има много функции за търговия за работа с поръчки, позиции и заявки за търговия. Няма значение на какъв пазар търгувате – фючърси, акции, опции и т.н.
MetaTrader 5 предлага 6 вида търговски операции
Има няколко основни типа търговски операции, които може да са ви необходими в търговския робот:
- покупка/продажба на текущата цена,
- поставяне на чакаща поръчка за покупка/продажба при определено условие,
- промяна/изтриване на чакаща поръчка,
- затваряне / изграждане / намаляване / обръщане на позиция.
Всички тези операции се изпълняват с помощта на функцията OrderSend(), има и асинхронна версия на тази функция - OrderSendAsync(). Цялото разнообразие от търговски операции се описва от структурата MqlTradeRequest, която съдържа описание на търговска заявка. Следователно единствените трудности при търговските операции могат да бъдат само правилното попълване на структурата на MqlTradeRequest и обработката на резултата от заявката.
В съответствие с правилата на вашата търговска система можете да купувате или продавате на пазарна цена (КУПУВАТЕ или ПРОДАВАТЕ) или можете да поставите отложена поръчка за покупка/продажба на известно разстояние от текущата пазарна цена:
- 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_SELL_STOP_LIMIT). В случай на частично изпълнение, пазарната или лимитирана поръчка с оставащия обем не се отменя, а остава валидна.
За поръчки ORDER_TYPE_BUY_STOP_LIMIT и ORDER_TYPE_SELL_STOP_LIMIT при активиране ще бъде създадена съответната лимитирана поръчка ORDER_TYPE_BUY_LIMIT/ORDER_TYPE_SELL_LIMIT с тип на изпълнение ORDER_FILLING_RETURN.
Е, сега е време да видим как 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 са предназначени предимно за начинаещи, въпреки че много опитни разработчици също могат да намерят нещо ново и полезно за себе си.