Как в советнике при срабатывании TakeProfit, закрыть все работающие и снять все отложенные ордера. - страница 3
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Один из вариантов - это выставлять ТП по Equity, при достижении которого все ордера закрываются и вычищаются.
Но этот вариант прост для применения в общей прибыли по депо, в других случаях проще отслеживать время закрытия последнего ордера в истории.
Если время закрытия (по ТП), скажем, больше времени открытия текущего бара, закрыть и вычистить все. (Без фильтрации ордеров по символу и мейджику, валютная пара и советник не имеют значения ). Поставить запрет отслежтвания до открытия следующего бара (если ордера выставляются потоком). Вместо времени открытия бара можно использовать любой другой временной ключ.
Вот готовый код советника. Проверяет на каждом тике, без привязки к временной метке. Компилируйте. Для работы по всем символам в MT4 советник должен быть запущен хотя бы на одном графике.
//+------------------------------------------------------------------+
//| Global Killer.mq4 |
//| Copyright 2026, Victor Golovkov |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Victor Golovkov"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
int lastHistoryCount = 0;
const int MAX_RETRIES = 5; // Максимальное количество попыток для каждого ордера
int OnInit() {
// Запоминаем текущее состояние истории, чтобы не реагировать на старое
lastHistoryCount = OrdersHistoryTotal();
return(INIT_SUCCEEDED);
}
void OnTick() {
int currentHistoryCount = OrdersHistoryTotal();
if(currentHistoryCount > lastHistoryCount) {
// Проверяем самый свежий ордер в истории
if(OrderSelect(currentHistoryCount - 1, SELECT_BY_POS, MODE_HISTORY)) {
// Условие срабатывания: метка [tp] в комментарии или совпадение цен
if(StringFind(OrderComment(), "[tp]") >= 0 ||
(OrderTakeProfit() > 0 && MathAbs(OrderClosePrice() - OrderTakeProfit()) < Point * 2)) {
Print("Сработал Тейк-Профит на ордере #", OrderTicket(), ". Закрываем всё!");
CloseAndDeleteEverything();
}
}
lastHistoryCount = currentHistoryCount;
}
}
void CloseAndDeleteEverything() {
bool res;
// Перебираем все активные ордера (с конца списка к началу)
for(int i = OrdersTotal() - 1; i >= 0; i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
int ticket = OrderTicket();
double lots = OrderLots();
int type = OrderType();
for(int retry = 0; retry < MAX_RETRIES; retry++) {
RefreshRates(); // Обновляем Bid/Ask перед каждой попыткой
if(type <= OP_SELL) {
double closePrice = (type == OP_BUY) ? MarketInfo(OrderSymbol(), MODE_BID) : MarketInfo(OrderSymbol(), MODE_ASK);
res = OrderClose(ticket, lots, closePrice, 10, clrRed);
} else {
res = OrderDelete(ticket, clrOrange);
}
if(res) {
Print("Ордер #", ticket, " успешно удален/закрыт.");
break; // Выход из цикла попыток при успехе
} else {
int error = GetLastError();
Print("Ошибка при обработке #", ticket, " (попытка ", retry+1, "): ", error);
// Если ошибка критическая (нет денег или неверные параметры) - не повторяем
if(error == 4051 || error == 4108) break;
Sleep(500); // Небольшая пауза перед повтором
}
}
}
}

В журнале пишет от имени советника и тайм-фрейма на окне какого графика он прикреплён. Но выщищает все ордера по всем инструментам.выглядит в журнале вот так: