Обсуждение статьи "Использование Экономического календаря MQL5 для фильтрации новостей (Часть 2): Временное удаление и восстановление стоп-уровней во время выхода новостей"

 

Опубликована статья Использование Экономического календаря MQL5 для фильтрации новостей (Часть 2): Временное удаление и восстановление стоп-уровней во время выхода новостей:

Во второй части новостной фильтр расширяется для защиты открытых позиций во время новостных событий. Вместо закрытия сделок уровни стоп-лосса и тейк-профита временно снимаются и надежно сохраняются в памяти. После окончания новостного окна стоп-уровни восстанавливаются детерминированно и при необходимости корректируются, если цена уже пересекла исходные уровни. При этом соблюдаются правила брокера о минимальной дистанции. В результате получается механизм, который сохраняет исходную логику и структуру сделки, не вмешиваясь в логику открытия сделок, и оставляет управление за советником даже в период волатильности.

Цель части 2 четко определена: убрать уровни стоп-лосса и тейк-профита на время ограниченного новостного окна и безопасно восстановить их после его окончания.

Этот подход не пытается интерпретировать направление реакции рынка на новости. Он лишь снижает риск преждевременного срабатывания стопов, вызванного аномальными рыночными условиями.

Принципы восстановления стоп-уровней

Логика восстановления детерминирована:

  • если цена не пересекла сохраненный исходный уровень стоп-лосса или тейк-профита, соответствующий уровень восстанавливается точно на исходном значении;
  • если цена уже пересекла исходный уровень стоп-лосса, стоп-лосс восстанавливается на ближайшем допустимом уровне непосредственно перед текущей ценой.

Та же логика применяется к уровням тейк-профита.

Это обеспечивает:

  • отсутствие некорректной установки стоп-уровней;
  • отсутствие отказов брокера из-за того, что цена уже прошла соответствующие уровни;
  • отсутствие восстановления логически невозможных значений;
  • сохранение исходной структуры сделки во всех технически возможных случаях.

Механизм по-прежнему работает по четко заданным правилам.


Автор: Solomon Anietie Sunday

 

Как я планирую использовать эти функции:

Я планирую использовать часть 1 статьи «Предотвращение открытия новых сделок или закрытия открытых позиций в период ограничения торговли из-за новостей» — во всех своих советниках, запущенных на счетах проп-фирм.

Однако части 2 и 3 — удаление SL/TP, а затем их восстановление до и после периода ограничений на торговлю из-за новостей — я планирую использовать в отдельном советнике. Поскольку этот код проходит по всем открытым позициям на счетах, у меня может быть открыто более одного графика, и мне не нужно запускать его больше раз, чем необходимо. Я вручную перенастрою выбор символов на «USD, GBP, EUR», так как это единственные новости из «красной папки», которые, как я знаю по опыту, мне уже приходится фильтровать (у вас это будет по-другому).

Поэтому внес однострочное изменение в функцию RestoreStops().

Функция SuspendStops() не требовала изменений.

Судя по всему, мне не придется ничего менять в Части 3, так как мне нужны только: номер тикета, SL и TP.

Большое спасибо @Solomon Anietie Sunday

Я протестирую это в реальном режиме на демо-счете!

// I won't need this if statement, in the 2nd EA, as the 2nd EA only modifies trades, 
// only need this is statement in the first EA (that opens trades)

if(!CanOpenNewTrade(_Symbol))
    return;
 
//+------------------------------------------------------------------+
//| Восстановление остановок после новостей (редактированная версия статьи для оригинала)      |
//+------------------------------------------------------------------+
bool RestoreStops(ulong ticket, double sl, double tp)
{
    if (!PositionSelectByTicket(ticket))
      return(false);
    string   symbol= PositionGetString(POSITION_SYMBOL);  // заменили исходную переменную «_Symbol» на «symbol»
    ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
    double price = (type == POSITION_TYPE_BUY) ?
        SymbolInfoDouble(symbol, SYMBOL_BID) :  //например, «_Symbol» теперь называется symbol
        SymbolInfoDouble(symbol, SYMBOL_ASK);
        
    double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
    
    double minStopDist = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL) * point;

    // Проверка безопасности: если цена пробила сохраненные уровни SL/TP, скорректируйте их до допустимых значений
    if(type == POSITION_TYPE_BUY)
    {
        if(sl != 0 && price <= sl)
            sl = price - minStopDist;
        if(tp != 0 && price >= tp)
            tp = price + minStopDist;
    }
    else // ПРОДАЖА
    {
        if(sl != 0 && price >= sl)
            sl = price + minStopDist;
        if(tp != 0 && price <= tp)
            tp = price - minStopDist;
    }

    // Полное восстановление остановок 
    if(trade.PositionModify(ticket, sl, tp))
    {
        PrintFormat("Restored SL/TP for #%I64u | SL=%.5f, TP=%.5f", ticket, sl, tp);
        return true;
    }
    else
    {
        PrintFormat("Failed to restore SL/TP for #%I64u | Error=%d", ticket, GetLastError());
        return false;
    }
}
Discussing the article: "Using the MQL5 Economic Calendar for News Filtering (Part 1): Implementing Pre- and Post-News Windows in MQL5"
Discussing the article: "Using the MQL5 Economic Calendar for News Filtering (Part 1): Implementing Pre- and Post-News Windows in MQL5"
  • 2026.02.18
  • www.mql5.com
Check out the new article: Using the MQL5 Economic Calendar for News Filtering (Part 1): Implementing Pre- and Post-News Windows in MQL5...
 
Да! Это очень эффективный подход. Вы также можете использовать «магическое число» для блокировки определённых советников. Однако сосредоточение внимания на трёх основных инструментах, которыми вы торгуете, особенно на тех, что характеризуются наибольшей волатильностью, может стать надёжным способом защиты вашего портфеля в целом.
Решение, описанное в этой серии статей, при правильном внедрении может стать очень гибким и настраиваемым.
Тестирование можно проводить на исторических данных (бэктест), но это непросто и требует определённых усилий. Я постараюсь предоставить соответствующую информацию в следующей статье для тех, кто хочет проводить бэктестирование с учётом новостных событий.

Не за что, Филип. Я всегда готов обсудить с вами любые вопросы, связанные с алгоритмической торговлей.

Отвечаю с небольшим опозданием, иногда бываю занят... извините.