Скрипт Close All Orders/Positions для MT4/MT5
Управление ордерами является одной из основных задач при работе с торговыми инструментами и торговыми советниками. В некоторых случаях, особенно при наличии триггера от какого-либо правила управления рисками, вам может потребоваться закрыть все открытые ордера. Здесь мы рассмотрим две функции — одну в MQL4-коде и одну в MQL5-коде — для этого, а также вы сможете скачать бесплатный скрипт Close All Orders для MT4, который позволяет автоматически закрывать все открытые ордера. Похожий скрипт под названием Close All Positions также доступен для торговой платформы MetaTrader 5.
Закрытие всех ордеров в MQL4
При написании советника все мы должны соблюдать меры безопасности, чтобы уберечься от больших потерь. Управление рисками является основополагающим элементом советника. Необходимо установить правила, чтобы советник мог закрывать все ордера при выполнении какого-либо условия.
Среди причин, которые могут привести к закрытию всех заказов, можно назвать следующие:
- Группа ордеров достигла уровня тейк-профит.
- Суммарная потеря открытых ордеров приводит к тому, что собственный капитал или маржа опускаются ниже определенного порога.
- Планируется выход новостного отчета, который может оказать сильное влияние на цены.
- Непредвиденное событие вызывает резкие изменения валютных курсов.
Это лишь некоторые ситуации, которые могут подтолкнуть вас к немедленному закрытию всех открытых ордеров. Этого можно добиться с помощью довольно простого кода на языке MQL4.
Вы, вероятно, уже ознакомились с нашим руководством по функции OrderClose, которая позволяет закрыть отдельный ордер. Ниже мы покажем, как использовать ее для закрытия всех ордеров с помощью пользовательской функции.
Следующая функция MQL4 Close All Orders позволяет одновременно закрыть все открытые ордера.
void CloseOrders() { int total = OrdersTotal(); // Вывести в терминал общее число ордеров. Print(total); // Начать цикл сканирования всех ордеров. // Цикл идет с конца, иначе можно пропустить ордера. for (int i = total - 1; i >= 0; i--) { // Если ордер нельзя выбрать, показать ошибку и закончить. if (OrderSelect(i, SELECT_BY_POS) == false) { Print("ERROR - Unable to select the order - ", GetLastError()); break; } // Переменная результата для проверки успешности операции. bool result = false; // Обновить обменные курсы перед закрытием ордера. RefreshRates(); // Цены Bid и Ask для символа из ордера. double BidPrice = MarketInfo(OrderSymbol(), MODE_BID); double AskPrice = MarketInfo(OrderSymbol(), MODE_ASK); // Закрытие ордера с использованием правильной цены в зависимости от типа. if (OrderType() == OP_BUY) { result = OrderClose(OrderTicket(), OrderLots(), BidPrice, Slippage); } else if (OrderType() == OP_SELL) { result = OrderClose(OrderTicket(), OrderLots(), AskPrice, Slippage); } // Если была ошибка, вывести ее. if (!result) Print("ERROR - Unable to close the order - ", OrderTicket(), " - Error ", GetLastError()); } }
Логика функции Close All Orders в MQL4
Логика функции заключается в следующем:
- С помощью цикла просканировать все ордера.
- Обновить цены.
- Если это ордер на покупку или продажу, закрыть его по правильной цене.
- Проверить, была ли операция успешной по каждому ордеру, и, в случае неудачи, сообщить об ошибке.
Возможные усовершенствования
Функция не очень сложна и может быть усовершенствована с помощью дополнительных фильтров. Например, можно применить следующие варианты:
- Закрывать только ордера в прибыли.
- Закрывать только ордера в убытке.
- Закрывать только ордера по конкретной паре.
- Закрывать только ордера с определенным магическим числом.
- Другие фильтры.
Приведенная выше функция используется во многих наших торговых советниках.
Скрипт Close All Orders
Если вы захотите закрыть все ордера в MT4, то вам придется делать это вручную, или использовать внешний инструмент.
К сожалению, MT4 не позволяет выделить все открытые ордера и закрыть их все сразу.
Но решение есть! Можно либо написать собственный скрипт, используя в качестве шаблона приведенную выше функцию, либо воспользоваться готовым инструментом.
Приведенный ниже скрипт может быть скопирован на вашу платформу MT4 и позволит вам закрывать все ордера всего парой щелчков мыши.
У него есть ряд входных параметров для настройки в соответствии с вашими предпочтениями:
В дополнение к параметрам фильтрации доступна возможность сортировки перед закрытием ордеров в определенном порядке. Это позволяет закрывать приоритетные ордера в первую очередь.
Еще одним нововведением является возможность указать задержку (в миллисекундах) между попытками закрытия, чтобы избежать перегрузки торгового сервера, так как некоторые Форекс-брокеры не разрешают такое поведение и могут заблокировать автоматическую торговлю на вашем счете.
Вы также можете изменять число попыток для закрытия одного ордера скриптом. Это позволяет надежно закрывать сделки даже в периоды высокой волатильности, когда комманда закрытия ордера может не исполниться из-за какой-либо ошибки.
Скачать скрипт Close All Orders для MT4
Close All Orders для МТ4Установка скрипта Close All Orders в MT4
Для установки скрипта следуйте приведенным ниже инструкциям:
- Загрузите файл скрипта.
- Откройте папку данных MetaTrader 4 (через Файл→Открыть папку с данными).
- Откройте папку MQL4.
- Скопируйте все папки из архива непосредственно в папку MQL4.
- Перезапустите MetaTrader 4 или обновите список скриптов, щелкнув правой кнопкой мыши по подокну Навигатор платформы, а затем нажмите Обновить.
Вы также можете ознакомиться с более подробной инструкцией по выполнению установки.
Убедитесь, что вы включили функцию Разрешить торговлю в реальном времени во вкладке Общее при исполнении данного скрипта, а также в меню платформы Инструмент→Опции→Советники. В противном случае скрипт не сможет закрыть ни один ордер.
Заготовленные входные параметры
Вы можете заранее ввести значения входных параметров в скрипте Close All Orders и сохранить его копию с другим именем файла, чтобы использовать преднастроенные скрипты когда угодно без необходимости тратить время на изменение входных параметров.
Таким образом, у вас под рукой будет несколько скриптов, которые вы сможете запускать (например, используя комбинацию клавиш) в зависимости от ситуации.
Например, давайте создадим версию для закрытия только убыточных сделок.
Для начала вам необходимо открыть файл CloseAllOrders.mq4 и найти там входной параметр OnlyInLoss:
Теперь измените его значение по умолчанию с false на true:
Есть смысл также убрать свойство show_inputs
в такой преднастроенной версии. Это предотвратит появление окна подтверждения при вызове скрипта:
Строку можно или закомментировать (поставив впереди две косые черты) или просто удалить:
Теперь можно сохранить файл под другим именем, чтобы отличать его от стандартного скрипта Close All Orders. Например, этот можно назвать CloseAllOrders_Losing.mq4:
Пришло время скомпилировать исходный код:
Теперь вы можете запускать новый скрипт как обычно в своей платформе МетаТрейдер 4 или же вы можете кликнуть по нему правой кнопкой мыши и задать горячую клавишу:
Теперь скрипт можно запускать мгновенно, чтобы закрывать ордера, отфильтрованные по вашим особым требованиям так быстро, насколько это возможно.
Похожий процесс можно повторить для создания скриптов, которые закрывают только ордера на покупку или продажу, скриптов для закрытия ордеров с заданным волшебным числом (magic number) и т.п.
Закрытие всех позиций в MQL5
Основа функции, которая бы закрывала все сделки в MetaTrader 5, не сильно отличается от ей подобной в MetaTrader 4. Основной разницей является то, что рыночные ордера называются позиции в MT5.
Такая функция закрытия позиций может быть использована в таких же ситуациях, как и функция закрытия ордеров в MetaTrader 4.
Следующий код MQL5 создан для закрытия всех существующих позиций за один запуск.
void ClosePositions() { Trade = new CTrade; // Объект CTrade для закрытия позиций. int total = PositionsTotal(); // Вывести в терминал общее число позиций. Print(total); // Начать цикл сканирования всех позиций. // Цикл идет с конца, иначе можно пропустить позиции. for (int i = total - 1; i >= 0; i--) { // Если позицию нельзя выбрать, показать ошибку и закончить. if (PositionGetSymbol(i) == "") { Print("ERROR - Unable to select the position - ", GetLastError()); break; } // Переменная результата для проверки успешности операции. bool result = Trade.PositionClose(PositionGetInteger(POSITION_TICKET), Slippage); // Если была ошибка, вывести ее. if (!result) Print("ERROR - Unable to close the position - ", PositionGetInteger(POSITION_TICKET), " - Error ", GetLastError()); } }
Логика функции Close All Positions в MQL5
Логика функции заключается в следующем:
- С помощью цикла просканировать все позиции.
- Закрыть позицию.
- Проверить, была ли операция успешной по каждой позиции, и, в случае неудачи, сообщить об ошибке.
Как видите, в MT5 она намного проще чем в MT4.
Возможные улучшения
Как и в случае функции закрытия на MQL4, эту тоже можно было бы улучшить, добавив разные варианты фильтров и сортировки.
Скрипт Close All Positions
В отличие от MT4, в МетаТрейдере 5 есть встроенная функция для массового закрытия позиций — Групповые операции. Однако, как видите, у нее есть свои ограничения:
Она может закрыть все позиции, все прибыльные позиции, все убыточные позиции, все позиции на покупку, все позиции на продажу, все позиции по текущему символу и все позиции по текущему направлению по текущему символу. Дополнительно, вы можете использовать метод закрытия встречной, чтобы закрыть текущую позицию, используя противоположные позиции по этому же символу (только для режима хеджирования).
Это неплохо по сравнению с тем, что предоставляет МТ4 в чистом виде, но это все еще можно значительно улучшить, как минимум добавив сортировку и недостающие фильтры.
Скрипт, предоставленный ниже, можно установить на платформу МТ5, что даст вам возможность закрывать позиции в соответствии со своими предпочтениями:
Как и в случае со скриптом выше для MT4, скрипт для MT5 позволяет фильтровать позиции, сортировать их, добавлять задержку и устанавливать число попыток, если закрытие не удается.
Скачать скрипт Close All Positions для MT5
Close All Positions для MT5Установка скрипта Close All Positions в MT5
To install the script, please follow the instructions below:
- Загрузите файл скрипта.
- Откройте папку данных MetaTrader 5 (через Файл→Открыть папку с данными).
- Откройте папку MQL5.
- Скопируйте все папки из архива непосредственно в папку MQL5.
- Перезапустите MetaTrader 5 или обновите список скриптов, щелкнув правой кнопкой мыши по подокну Навигатор платформы, а затем нажмите Обновить.
Вы также можете ознакомиться с более подробной инструкцией по выполнению установки.
Убедитесь, что вы включили функцию Разрешить алгоритмическую торговлю во вкладке Общее при исполнении данного скрипта, а также в меню платформы Инструмент→Опции→Советники. В противном случае скрипт не сможет закрыть ни одну позицию.
Заготовленные входные параметры
Точно так же как и с версией скрипта для MT4, есть смысл подготовить значения входных параметров и сохранить копию с новым именем файла для дальнейшего использования таких заготовленных скриптов без траты времени на входные параметры.
Вы можете подготовить несколько таких «скриптов-закрывашек» и запускать тот из них который лучше подходит к текущей ситуации на вашем торговом аккаунте.
Например, давайте сделаем версию для закрытия позиций с заданным комментарием, с сортировкой от самой прибыльной к самой убыточной, с двумя попытками на каждую и с задержкой в 0,1 секунды между попытками.
Для начала надо открыть файл CloseAllPositions.mq5 и найти там соответствующие входные параметры:
Теперь надо задать новые значения по умолчанию:
Таким образом, скрипт будет закрывать только позиции, в комментарии к которым указано «SuperEA». Это может быть полезным, когда вы работаете с разными экспертными советниками на одном счете и вам бы хотелось закрывать их позиции по отдельности.
Как и с версией для MT4, есть смысл убрать свойство script_show_inputs
из этой преднастроенной версии:
Вы можете или прямо удалить строку или закомментировать ее поставив две косые черты перед ней:
Вы можете теперь сохранить копию файл под другим именем. Например, этот можно назвать CloseAllPositions_Comment.mq5:
Теперь можно скомпилировать новый MQL5-скрипт:
Новый скрипт готов к использованию — вы можете запускать его или двойным щелчком в MetaTrader 5 или кликнув по нему правой кнопкой и настроив комбинацию клавиш для быстрого запуска:
Скрипт теперь можно быстро запускать, как только возникает необходимость закрыть позиции, отфильтрованные и отсортированные в соответствии с вашими требованиями.
Вы можете повторить этот процесс для создания других скриптов закрытия. Например, можно создать скрипт, который будет закрывать только позиции с заданным волшебным числом (magic number). Это может пригодиться для контроля за сделками какого-то конкретного экспертного советника.
Групповые операции MT5 и скрипт Close All Positions
Несмотря на то, что MetaTrader 5 предлагает свой вариант групповых операций, он не так универсален как специально написанный скрипт Close All Positions. Последний имеет следующие преимущества по сравнению с групповыми операциями MT5:
- Фильтр по комментариям.
- Фильтр по волшебному числу (magic number).
- Сортировка перед закрытием.
- Контроль за проскальзыванием.
- Повторные попытки при неудачном закрытии.
- Возможность добавить задержку между закрытиями.
- Скорость доступа — скрипт можно запускать с помощью комбинации клавиш или простым двойным щелчком мыши.
- Возможность дальнейшего развития — добавление подробного журналирования, например.
Заключение
Приведенный выше код объясняет работу скрипта закрытия ордеров и позиций на базовом примере. Наши бесплатные скрипты Close All Orders для MT4 и Close All Positions для MT5 представляют собой готовые инструменты для закрытия открытых сделок с фильтрацией и сортировкой, а также более продвинутый пример исходного кода MQL4 и MQL5 для изучения, модификации, модернизации и использования в других программах. С их помощью вы сможете легко создать свой собственный скрипт для закрытия ордеров или позиций в MetaTrader с использованием собственных условий и фильтров.
Если вы ищете брокера, с которым вы хотели бы использовать скрипт Close All Orders, вы можете просмотреть наш список Форекс-брокеров с МТ4. Если вы хотите использовать версию скрипта для MT5, Close All Positions, пожалуйста найдите себе брокера, который предлагает MetaTrader 5.
Обсуждение
У вас есть предложения или вопросы по данному скрипту? Вы всегда можете обсудить Close All Orders и Close All Positions с другими Форекс-трейдерами и программистами MQL4/MQL5 на нашем форуме.
Список изменений
1.01 — 2023-12-26
- Добавлена версия скрипта для MT5 — Close All Positions.
- Добавлен параметр для числа попыток закрытия каждой сделки.
- Добавлена возможность сортировки, чтобы закрывать сделки в заданном порядке.
- Изменено поведение скрипта так, чтобы отложенные ордера даже не обрабатывались.