Торговля на финансовых рынках становится всё более популярной, и Алготрейдинг играет в этом процессе значительную роль. В этой статье мы рассмотрим простую разработку скрипта для MetaTrader 4, который закроет все открытые позиции и удалит все отложенные ордера.
Скрипт будет написан на популярном языке программирования MQL4, который зарекомендовал себя как простой и надёжный инструмент для разработки торговых приложений на финансовых рынках.
Важно учесть, что если на счете работает торговый робот, после отработки скрипта он может снова открыть новые рыночные позиции или установить отложенные ордера, если условия для этого все еще есть.
Перейдём к созданию скрипта
Сначала запрограммируем необходимость собрать информацию о текущем окружении, то есть количестве ордеров и рыночных позиций на текущем торговом счёте. Для этого используется функция OrderTotal(), которая возвращает общее количество ордеров и позиций на указанном торговом счёте.
Код:
// === Общее количество Ордеров и позиций по всем финансовым инструментам
int total = OrdersTotal();
Затем мы начинаем перебирать все позиции и ордера на торговом счёте и рассматриваем каждый из них, получая его финансовый инструмент. Это позволит нам в дальнейшем запросить цену закрытия ордера и определить, по какому курсу можно закрыть позицию.
Код:
// === Перебор позиций и ордеров
for(int i = total — 1; i >= 0; i—)
// === Разбор ордера или позиции на элементы
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
// === Обновление данных
RefreshRates();
// === Обновление цен по финансовому инструменту, на котором открыт ордер
double ask = SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK);
double bid = SymbolInfoDouble(OrderSymbol(), SYMBOL_BID);
}
Далее мы пытаемся закрыть ордер. Возможно, брокер отправит нам реквоту, произойдёт обрыв связи или потеря интернет-пакета, и а итоге позиция не закроется с первой попытки. Поэтому мы выделяем пять попыток на закрытие, и в случае успеха прекращаем попытки. Для этого используем функция OrderClose(), которой мы передаём выбранный номер ордера (ордер закрывается по своему тикету) и он закрывается полным объёмом, с которым был открыт.
Код:
// === Счетчик попыток закрытия или удаления
int k = 0;
// === Пытаемся закрыть РЫНОЧНЫЕ позиции
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
do
{
// === Закрываем позицию
if(!OrderClose(OrderTicket(), OrderLots(), OrderType() == OP_BUY ? bid : ask, 0, clrRed))
{
// === В случае ошибки выведем комментарий в журнал эксперты
Print(«Error N», GetLastError());
// === задержим выполнение скрипта на 1 секунду
Sleep(1000);
}
else
// === в случае успеха остановим попытки закрытия РЫНОЧНОЙ позиции
break;
}
while(k++ < 5 && !IsStopped());
Затем мы удаляем отложенные ордера. К счастью, для этого достаточно только тикета. Мы также используем несколько попыток, так как возможны разрывы в интернет-соединении или отсутствие связи с торговым сервером.
Код:
// === Пытаемся удалить ОТЛОЖЕННЫЕ ордера
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP || OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT)
do
{
// === Удаляем ордер
if(!OrderDelete(OrderTicket(), clrRed))
{
// === В случае ошибки выведем комментарий в журнал эксперты
Print(«Error N», GetLastError());
// === задержим выполнение скрипта на 1 секунду
Sleep(1000);
}
else
// === в случае успеха остановим попытки удаления ОТЛОЖЕННОГО ордера
break;
}
while(k++ < 5 && !IsStopped());
Последним этапом разработки нашего скрипта будет проверка успешности его работы. Если после выполнения скрипта у нас остались открытые позиции или отложенные ордера, значит в процессе произошёл сбой. В противном случае всё хорошо.
Код:
// === Проверим результат работы скрипта
if(OrdersTotal() == 0)
Print(«Success»);
else
Print(«Failed»);
Соберём все части кода в единый скрипт
Код:
#property strict
// ================================================================= //
void OnStart()
{
// === Общее количество Ордеров и позиций по всем финансовым инструментам
int total = OrdersTotal();
// === Перебор позиций и ордеров
for(int i = total — 1; i >= 0; i—)
// === Разбор ордера или позиции на элементы
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
// === Обновление данных
RefreshRates();
// === Обновление цен по финансовому инструменту на котором открыт ордер или позиция
double ask = SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK);
double bid = SymbolInfoDouble(OrderSymbol(), SYMBOL_BID);
// === Счетчик попыток закрытия или удаления
int k = 0;
// === Пытаемся закрыть РЫНОЧНЫЕ позиции
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
do
{
// === Закрываем позицию
if(!OrderClose(OrderTicket(), OrderLots(), OrderType() == OP_BUY ? bid : ask, 0, clrRed))
{
// === В случае ошибки выведем комментарий в журнал эксперты
Print(«Error N», GetLastError());
// === задержим выполнение скрипта на 1 секунду
Sleep(1000);
}
else
// === в случае успеха остановим попытки закрытия РЫНОЧНОЙ позиции
break;
}
while(k++ < 5 && !IsStopped());
// === Пытаемся удалить ОТЛОЖЕННЫЕ ордера
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP || OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT)
do
{
// === Удаляем ордер
if(!OrderDelete(OrderTicket(), clrRed))
{
// === В случае ошибки выведем комментарий в журнал эксперты
Print(«Error N», GetLastError());
// === задержим выполнение скрипта на 1 секунду
Sleep(1000);
}
else
// === в случае успеха остановим попытки удаления ОТЛОЖЕННОГО ордера
break;
}
while(k++ < 5 && !IsStopped());
}
// === Проверим результат работы скрипта
if(OrdersTotal() == 0)
Print(«Success»);
else
Print(«Failed»);
}
// =================================================================== //
Если вы хотите увидеть наглядно процесс создания скрипта, посмотрите видео, представленное ниже:
![]() | Получайте подарки за сделки от брокера NPBFXТоргуйте и получайте дополнительную выгоду: от новейшего смартфона до премиум автомобиля! |
![]() | Кешбэк реальными деньгами до 60% со сделки!Больше сделок - больше реального кэша на торговый счет! NPBFX - c нами зарабатывают с 1996 года |