Как в советнике при срабатывании TakeProfit, закрыть все работающие и снять все отложенные ордера. - страница 3

 

Один из вариантов - это выставлять ТП по 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); // Небольшая пауза перед повтором

         }

      }

   }

}




выглядит в журнале вот так:

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