English
preview
Возможности Мастера MQL5, которые вам нужно знать (Часть 91): Использование списков с пропусками и сети Хопфилда в пользовательском классе трейлинга

Возможности Мастера MQL5, которые вам нужно знать (Часть 91): Использование списков с пропусками и сети Хопфилда в пользовательском классе трейлинга

MetaTrader 5Торговые системы |
60 0
Stephen Njuki
Stephen Njuki

Введение

В предыдущей статье серии о Мастере MQL5 была создана надежная система распределения капитала, использующая дерево Фенвика и одномерную CNN. Оптимизация объема позиции с учетом волатильности – важный аспект торговли, однако не менее важно защищать прибыль на реальном рынке. При использовании стандартных линейных трейлинг-стопов трейдеры могут столкнуться с задержками исполнения. Во время резких событий, которые в последние годы происходят чаще и становятся менее предсказуемыми, ценовое движение редко бывает непрерывным.

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

Таким образом, статья расширяет инструментарий серии о Мастере MQL5 и предлагает новый подход. Будет протестирован список с пропусками для вероятностного перехода через ценовые разрывы, дополненный сетью Хопфилда с ассоциативной памятью для фильтрации рыночного шума на втором этапе проверки.


Проблема

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

Перебор линейного массива для поиска следующего допустимого узла трейлинга на каждом новом баре может создать небольшую, но накапливающуюся задержку. Когда советник одновременно работает с десятками волатильных валютных пар, сложность O(n) может стать ограничением в плане производительности. Задержки – лишь симптом более серьезной проблемы: уязвимости к ценовым разрывам.

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

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

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


Списки с пропусками

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

Нижний слой содержит все точки данных набора. Следующие слои действуют как экспресс-слои, содержащие все более разреженное случайное подмножество нижележащего слоя. В стандартном линейном массиве, который MT5 использует по умолчанию, поиск корректных точек выхода через разрыв в 50 пунктов требует последовательного перебора. Как отмечалось выше, это дает сложность O(n) и может стать существенной тратой вычислительных ресурсов в критические моменты рынка.

Однако список с пропусками начинает поиск с верхнего и наиболее разреженного слоя структуры. Он также пропускает большие части набора данных, пока не пройдет искомую позицию. После этого он переходит на более детальный уровень и уточняет поиск, достигая сложности O(log n). Как эти операции можно применить в инструменте управления рисками на языке MQL5? Чтобы ответить на этот вопрос, необходимо переосмыслить ценовое движение.

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

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

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


Сети Хопфилда и ассоциативная память

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

Необходимо постоянно определять, является ли текущее ценовое движение продолжением структурного тренда или локальным рыночным шумом. В данном случае прогнозная CNN была бы неуместна; вместо нее можно рассмотреть сеть Хопфилда. Сеть Хопфилда, предложенная в 1982 году, представляет собой однослойную рекуррентную искусственную нейронную сеть, работающую как память с адресацией по содержанию, то есть ассоциативная память. Человеческая память может быть сильно ассоциативной. Если человек смотрит на сильно размытую или частично заслоненную фотографию, мозг может мгновенно восстановить недостающие данные, связывая визуальные фрагменты с четкой памятью об объекте.

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

Интеграция сети Хопфилда добавляет в советник нейронный фильтр. Эта сеть сопоставляет локальное зашумленное состояние рынка с более широким моментумом. Математически сеть отвечает на вопрос: "Несмотря на недавние движения, сохраняет ли общая структура признаки стабильного рынка или целостного тренда?" Математическим механизмом ассоциативной сходимости служит энергетическая функция сети E, определяемая следующим образом:

f1

Где:

  • Wij – веса связей между нейронами;
  • S – двоичное состояние нейронов (восходящий либо нисходящий моментум).

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

    В пользовательском классе трейлинга энергетическая функция становится окончательным фильтром – математической системой вето. Сеть не используется для вычисления следующего уровня стоп-лосса: для пространственного расчета применяется вероятностный список с пропусками. Вместо этого перед тем, как список с пропусками выполнит очередной скачок и завершит шаг поиска, команда должна пройти через фильтр Хопфилда. Для этого задается параметр HopThreshold. Если рассчитанная сетью энергия ниже этого порога, подтверждается структурная стабильность и уровень трейлинг-стопа может быть скорректирован. Однако если уровень энергии превышает порог, что указывает на хаотичное пилообразное движение или шум, сеть блокирует это действие. В этом случае трейлинг-стоп остается на месте, чтобы не реагировать на шум до стабилизации сети.


    Реализация на MQL5

    Цель этого цикла статей – переход от теории к применимому коду MQL5. Поэтому логика структурируется для интеграции с базовым классом CExpertTrailing. Благодаря этому алгоритм можно собрать в советник с помощью Мастера MQL5.

    Инициализация

    Сначала объявляются макросы Мастера MQL5. Это необходимо, чтобы механизм сборки Мастера MQL5 мог распознать входные параметры: SkipLevels, SkipMode и UseHopfield. Эти параметры задают соответственно максимальную высоту вероятностных переходов, алгоритм итерации и предел энергетического вето.

    Матрица памяти Хопфилда задается следующим образом:

    //+------------------------------------------------------------------+
    //| Initialization: Set up Hopfield Weights                          |
    //+------------------------------------------------------------------+
    bool CTrailingSkipHopfield::InitIndicators(CIndicators *indicators)
      {
       if(!CExpertTrailing::InitIndicators(indicators))
          return false;
    //--- Initialize Hopfield Weights with a basic stable memory pattern
       ArrayInitialize(m_state, 1.0);
       for(int i = 0; i < 3; i++)
         {
          for(int j = 0; j < 3; j++)
            {
             if(i == j)
                m_weights[i][j] = 0.0; // No self-connections
             else
                m_weights[i][j] = 0.5;       // Simple associative pull
            }
         }
       return true;
      }

    В приведенной выше функции инициализации массив состояний из 3 нейронов получает значение 1.0, задающее бычью базовую память. Матрица весов m_weights заполняется значением 0.5 для всех перекрестных связей. В настоящей сети Хопфилда нейрон не может соединяться сам с собой, поэтому элементы диагонали, где i == j, обнуляются до 0.0. Эта симметричная матрица весов создает ассоциативную связь, переводя скользящий ценовой моментум в стабильное состояние.

    Логика Хопфилда

    Перед использованием списка с пропусками для расчета уровня стоп-лосса советник должен обновить сеть Хопфилда последним состоянием рынка. Функция MQL5 для этого приведена ниже:
    //+------------------------------------------------------------------+
    //| Hopfield Update: Shift states based on price momentum            |
    //+------------------------------------------------------------------+
    void CTrailingSkipHopfield::UpdateHopfield(double price)
      {
       if(m_last_price == 0.0)
         {
          m_last_price = price;
          return;
         }
    //--- Determine input momentum: 1.0 (Up) or -1.0 (Down)
       double input_state = (price >= m_last_price) ? 1.0 : -1.0;
       m_last_price = price;
    //--- Shift state array (rolling window)
       m_state[2] = m_state[1];
       m_state[1] = m_state[0];
       m_state[0] = input_state;
      }

    Эта функция работает как скользящее окно моментума. Текущая переменная price сравнивается с m_last_price. Если на тике цена выросла, входное состояние равно 1.0; если упала – -1.0. После этого массив m_state сдвигается: самое старое состояние вытесняется, а новое состояние моментума помещается в m_state[0]. Затем с помощью приведенной ниже функции определяется стабильность нового состояния:

    //+------------------------------------------------------------------+
    //| Hopfield Energy Calculation                                      |
    //+------------------------------------------------------------------+
    double CTrailingSkipHopfield::GetHopfieldEnergy()
      {
       double energy = 0.0;
    //--- E = -0.5 * sum(W_ij * S_i * S_j)
       for(int i = 0; i < 3; i++)
         {
          for(int j = 0; j < 3; j++)
            {
             energy += m_weights[i][j] * m_state[i] * m_state[j];
            }
         }
       return -0.5 * energy;
      }
    Эта функция напрямую реализует следующую формулу:

    f1_1

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

    Режимы списка с пропусками

    После разрешения сети Хопфилда советник оценивает цену с помощью одного из четырех режимов списка с пропусками. Они выбираются оператором switch, управляемым параметром m_skip_mode.
    //+------------------------------------------------------------------+
    //| Skip List Mode 1: Deterministic Linear Search (Base Level)       |
    //+------------------------------------------------------------------+
    double CTrailingSkipHopfield::SkipSearchLinear(double price)
      {
    //--- Evaluates price linearly without jumping gaps
       return price;
      }

    Это базовый вариант. Он имитирует стандартную логику трейлинга, обрабатывая точную локальную цену и не переходя через разрывы. При итеративном использовании, особенно для нескольких символов, этот режим вычислительно затратен и имеет сложность O(n). Этот режим служит основным ориентиром для оценки эффективности более высоких режимов.

    Далее рассмотрим режим поиска с пропуском, реализованный следующим образом:

    //+------------------------------------------------------------------+
    //| Skip List Mode 2: Gap Search (Jumps fixed levels)                |
    //+------------------------------------------------------------------+
    double CTrailingSkipHopfield::SkipSearchGap(double price)
      {
    //--- Subtracts a fixed gap buffer based on defined skip levels
       double gap_buffer = (m_skip_levels * 2) * m_symbol.Point();
       return price - gap_buffer;
      }

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

    //+------------------------------------------------------------------+
    //| Skip List Mode 3: Probabilistic Search (Coin flip skips)         |
    //+------------------------------------------------------------------+
    double CTrailingSkipHopfield::SkipSearchProbabilistic(double price)
      {
    //--- Simulates standard Skip List probability (typically P=0.5)
       int current_level = 1;
       while(current_level < m_skip_levels && (MathRand() % 2 == 0))
         {
          current_level++;
         }
       double prob_buffer = current_level * 5 * m_symbol.Point();
       return price - prob_buffer;
      }

    Для списка с пропусками эта функция работает со сложностью O(log n). Конструкция MathRand()%2 == 0 используется для имитации равновероятного подбрасывания монеты. Если выпадает орел, алгоритм динамически переводит поиск на более высокий уровень волатильности. Процесс повторяется до ограничения входного параметра m_skip_levels, после чего буфер трейлинга масштабируется по окончательному значению current_level. Благодаря этому при высокой волатильности стоп-лосс может переходить на более дальние уровни. Последний режим – гибридный подход, реализованный следующим образом:

    //+------------------------------------------------------------------+
    //| Skip List Mode 4: Hybrid Search (Max gap bypass)                 |
    //+------------------------------------------------------------------+
    double CTrailingSkipHopfield::SkipSearchHybrid(double price)
      {
    //--- Forces search to the highest skip level immediately for high volatility
       double max_buffer = (m_skip_levels * 10) * m_symbol.Point();
       return price - max_buffer;
      }

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

    //+------------------------------------------------------------------+
    //| Check Long: Skip List -> Hopfield -> Execution                   |
    //+------------------------------------------------------------------+
    bool CTrailingSkipHopfield::CheckTrailingStopLong(CPositionInfo *position, double &sl, double &tp)
      {
       if(position == NULL)
          return false;
       double price = m_symbol.Bid();
    //--- 1. Neural Network Filter (Hopfield)
       if(m_use_hopfield)
         {
          UpdateHopfield(price);
          //--- If energy is higher than threshold, pattern is unstable; do not trail
          if(GetHopfieldEnergy() > m_hop_threshold)
             return false;
         }
    //--- 2. Skip List Algorithm (Select Mode)
       double base_price = price;
       switch(m_skip_mode)
         {
          case 1:
             base_price = SkipSearchLinear(price);
             break;
          case 2:
             base_price = SkipSearchGap(price);
             break;
          case 3:
             base_price = SkipSearchProbabilistic(price);
             break;
          case 4:
             base_price = SkipSearchHybrid(price);
             break;
          default:
             base_price = SkipSearchLinear(price);
             break;
         }
    //--- 3. Trailing Execution
       double new_sl = base_price - (m_symbol.StopsLevel() * m_symbol.Point());
       double current_sl = position.StopLoss();
       if(new_sl > current_sl || current_sl == 0.0)
         {
          sl = NormalizeDouble(new_sl, m_symbol.Digits());
          return true;
         }
       return false;
      }
    
    //+------------------------------------------------------------------+
    //| Check Short: Skip List -> Hopfield -> Execution                  |
    //+------------------------------------------------------------------+
    bool CTrailingSkipHopfield::CheckTrailingStopShort(CPositionInfo *position, double &sl, double &tp)
      {
       if(position == NULL)
          return false;
       double price = m_symbol.Ask();
    //--- 1. Neural Network Filter (Hopfield)
       if(m_use_hopfield)
         {
          UpdateHopfield(price);
          if(GetHopfieldEnergy() > m_hop_threshold)
             return false;
         }
    //--- 2. Skip List Algorithm (Select Mode)
       double base_price = price;
       switch(m_skip_mode)
         {
          case 1:
             base_price = SkipSearchLinear(price);
             break;
          case 2:
             base_price = SkipSearchGap(price);
             break;
          case 3:
             base_price = SkipSearchProbabilistic(price);
             break;
          case 4:
             base_price = SkipSearchHybrid(price);
             break;
          default:
             base_price = SkipSearchLinear(price);
             break;
         }
    //--- 3. Trailing Execution
       double new_sl = base_price + (m_symbol.StopsLevel() * m_symbol.Point());
       double current_sl = position.StopLoss();
       if(new_sl < current_sl || current_sl == 0.0)
         {
          sl = NormalizeDouble(new_sl, m_symbol.Digits());
          return true;
         }
       return false;
      }

    Эти две функции активируют нейронное вето. Если m_use_hopfield равно true, советник вычисляет энергию. Если значение энергии превышает m_hop_threshold, функция возвращает false. Это означает, что рынок слишком зашумлен, чтобы считать недавние колебания цены достаточным основанием для корректировки стоп-лосса. Если энергия стабильна, функция переходит к оператору switch, выполняет выбранный режим списка с пропусками и вычисляет новый стоп-лосс new_sl. Новый уровень задается относительно StopsLevel() символа и фактически изменяет позицию. Сочетание этих двух методов информатики – алгоритма и нейронной сети – позволяет перейти от реактивных линейных трейлинг-стопов к сбалансированному проактивному механизму защиты.


    Анализ производительности

    Для проверки преимуществ CTrailingSkipHopfield проведено тщательное тестирование на исторических данных в Тестере стратегий. Тестирование GBPJPY проводилось с оптимизацией за 2025 год и форвардным тестированием с 01.01.2026 по 01.05.2026. Помимо оценки общей эффективности класса трейлинга в защите прибыли позиции, необходимо определить вклад алгоритма Skip и сети Хопфилда в эту синергию. Поэтому проводятся два теста: в первом используется только вероятностный алгоритм списка с пропусками, а во втором – полностью интегрированная гибридная система, где сеть Хопфилда служит нейронным фильтром. Результаты первого запуска приведены ниже:

    r1

    В первом запуске после оптимизации нейронная сеть была отключена: параметру m_use_hopfield присвоено значение false, чтобы изолировать производительность базовой алгоритмической логики. Входные параметры этого форвардного теста прилагаются в файле r1.set. В приложенных параметрах видно, что порог для закрытия позиции Signal_ThresholdClose установлен на сравнительно высокое значение 57, а порог отклонения индикатора Envelopes – на широкое значение 0.485. Это можно считать необходимой уступкой из-за отсутствия нейросетевого фильтра шума. Поэтому советнику пришлось дать входному сигналу больше пространства для колебаний, чтобы он не слишком часто выбивал советник из логики входа в шумном рынке.

    Первые результаты форвардного тестирования показывают заметное структурное преимущество перед стандартными линейными трейлинг-стопами. Благодаря динамическому смещению стопов к более высоким уровням волатильности и оптимизации параметра m_skip_mode до 3 советник смог успешно обрабатывать макроэкономические ценовые разрывы. Во время быстро развивающихся резких событий со значительными ценовыми разрывами можно сказать, что алгоритм изящно обходил эти "пустоты" ликвидности в ситуациях, где линейные стопы легко сработали бы. Такая пространственная защита дала чистую прибыль 1 586,39 доллара США при просадке 18,63%. Однако без ассоциативной памяти алгоритм оставался в основном реактивным и лишь частично решал проблему, сформулированную ранее. Он по-прежнему был чувствителен к локальным колебаниям и иногда выполнял слишком агрессивный трейлинг, что приводило к преждевременному закрытию позиций.

    Во втором форвардном тесте после оптимизации была добавлена нейронная сеть:

    r2

    Как и ожидалось, во втором форвардном тесте после оптимизации использовалась гибридная система, в которой параметру m_use_hopfield присвоено значение true. При включенном нейронном фильтре использовались более агрессивные параметры входа. В приложенных параметрах второго запуска из файла r2.set видно, что порог закрытия Signal_ThresholdClose существенно снижен с 57 в первом запуске до 13. Кроме того, входной параметр Signal_Envelopes_Deviation ужесточен с 0.485 до 0.100.

    Сеть Хопфилда непрерывно оценивает ассоциативную энергию ценового моментума, поэтому советнику больше не нужно полагаться на искусственно расширенные настройки технических индикаторов для защиты от рыночного шума. Когда рынок становится хаотичным, функция энергии E поднимается выше HopThreshold, и сеть накладывает вето на любые действия трейлинга. Эффект заметен сразу. Хотя общая прибыль снизилась, просадка средств счета сократилась до 6,79%. В первом запуске просадка 18% составила 2 376,88 доллара США, почти вдвое превысив чистую прибыль 1 500 долларов США. Напротив, теперь просадка составляет всего 820 долларов США, что меньше трети итоговой чистой прибыли.


    Основные выводы

    Трейдерам, автоматизирующим стратегии с применением этих алгоритмов в реальных условиях, необходимо учесть ряд технических нюансов:

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

    • Ловушка детерминированного тестирования на исторических данных. При разработке вероятностных алгоритмов, например списка с пропусками, не следует полагаться на функцию MQL5 MathRand(). Это обычно приводит к серьезной проблеме: невоспроизводимым результатам тестирования и непредсказуемой производительности. Практическое решение – создать внутри класса собственный генератор псевдослучайных чисел (ГПСЧ), детерминированно инициализируемый временной меткой текущего бара.

    • Модульность Мастера MQL5. Главное преимущество объединения этих идей из информатики в рамках CExpertTrailing заключается в модульности. Эту логику больше не нужно жестко кодировать: ее можно сочетать с различными сигналами входа и методами управления капиталом.


    Заключение

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

    имя описание
    wz_91.mq5 Советник, собранный Мастером MQL5
    TrailingSkipHopfield.mqh Пользовательский класс трейлинга, используемый Мастером MQL5 при сборке советника
    r1.set Входные параметры запуска только с алгоритмом
    r2.set Входные параметры для алгоритма и нейронной сети

    Тестирование GBPJPY проводилось с 01.01.2025 по 01.05.2026 на таймфрейме H4, а сигнал входа основывался на встроенных классах Envelopes и RSI.

    Перевод с английского произведен MetaQuotes Ltd.
    Оригинальная статья: https://www.mql5.com/en/articles/22609

    Прикрепленные файлы |
    r1.set (2.3 KB)
    r2.set (2.29 KB)
    wz_91.mq5 (8.94 KB)
    Изучение стандартной библиотеки MQL5 (Часть 10): Канал полиномиальной регрессии Изучение стандартной библиотеки MQL5 (Часть 10): Канал полиномиальной регрессии
    Сегодня мы рассмотрим еще одну составляющую ALGLIB и задействуем её математический потенциал, чтобы создать индикатор на основе полиномиальной регрессии (Polynomial Regression Channel). К концу этой статьи вы получите практические знания о разработке индикаторов с использованием стандартной библиотеки MQL5, а также полностью функциональный, математически обоснованный исходный код индикатора.
    Изучение стандартной библиотеки MQL5 (Часть 9): Использование ALGLIB для фильтрации избыточного числа сигналов пересечения скользящих средних Изучение стандартной библиотеки MQL5 (Часть 9): Использование ALGLIB для фильтрации избыточного числа сигналов пересечения скользящих средних
    Во время боковых движений цены трейдеры сталкиваются с избыточными сигналами от множественных пересечений скользящих средних. Сегодня мы обсудим, как ALGLIB предварительно обрабатывает исходные данные о ценах для формирования отфильтрованных сигнальных серий пересечений, которые также могут генерировать оповещения при их возникновении. Давайте разберёмся, как можно использовать математическую библиотеку в программах на MQL5.
    Создание торговых систем с искусственным интеллектом на MQL5 (Часть 1): Реализация обработки JSON для API ИИ Создание торговых систем с искусственным интеллектом на MQL5 (Часть 1): Реализация обработки JSON для API ИИ
    В этой статье разрабатывается модуль разбора JSON на языке MQL5 для обмена данными при интеграции с API ИИ. Основное внимание уделяется классу JsonValue для обработки JSON-структур. Реализуются методы сериализации и десериализации JSON-данных с поддержкой различных типов данных, таких как строки, числа и объекты. Это необходимо для взаимодействия с ИИ-сервисами, такими как ChatGPT, и служит основой для будущих торговых систем на базе ИИ, обеспечивая точную обработку данных.
    Возможности Мастера MQL5, которые вам нужно знать (Часть 90): Управление капиталом на основе дерева Фенвика и одномерной CNN в MQL5 Возможности Мастера MQL5, которые вам нужно знать (Часть 90): Управление капиталом на основе дерева Фенвика и одномерной CNN в MQL5
    В этой статье реализуется дерево Фенвика, или двоичное индексное дерево, для управления капиталом с учетом объема в советнике, собранном Мастером MQL5. Накопленный объем структурируется со сложностью O(log n), после чего применяются четыре режима масштабирования: линейный, консервативный, агрессивный и возврат к среднему. При необходимости эти режимы дополнительно фильтруются легковесной одномерной CNN. Практические тесты сравнивают алгоритм без фильтра и подход с фильтрацией CNN, демонстрируя адаптивное определение размера лота и контроль риска при различной топологии объема.