Возможности Мастера MQL5, которые вам нужно знать (Часть 98): Использование сигма-точечного фильтра Калмана и капсульной сети в пользовательском классе сигналов
Введение
В этой продолжающейся серии рассматриваются продвинутые пользовательские классы для Мастера MQL5 и постепенно формируется инструментарий для различных рыночных условий и ситуаций. Создаются различные типы классов для управления капиталом, трейлинг-стопов и сигналов входа. В этой серии уже были рассмотрены первые два типа классов, поэтому теперь мы снова уделим внимание сигналам и их новой реализации.
В статьях о пользовательских сигналах ранее основное внимание уделялось высокоскоростному выполнению: побитовая векторизация сочеталась с перцептронными классификаторами для рынков с четко выраженными бинарными пороговыми состояниями. Затем рассматривался алгоритм индексирования B-Tree в сочетании с байесовскими сетями. Цель состояла в менее детерминированном подходе к работе в условиях большей неопределенности. Недавно рассматривался алгоритм системы непересекающихся множеств, объединенный с глубокими сетями доверия. Этот подход предназначался для трейдеров, анализирующих рыночные режимы дискретно и стремящихся выявлять изменения волатильности.
В целом в серии чередуются детерминированные модели и модели, основанные на вероятности либо предназначенные для анализа рынка в условиях большей неопределенности. В каждом подходе используется новая пара "алгоритм – сеть".
В этой статье после классификации режимов на основе детерминизма рассматривается оценка состояния в реальном времени. Представляется пользовательский класс сигналов на основе сигма-точечного Калмана (UKF), объединенного с капсульной нейронной сетью. Это расширяет набор средств для прототипирования и разработки торговых систем в MetaTrader, но, как и другие решения серии, не является панацеей. Эта модель предназначена для того, чтобы добавить в арсенал торговые сетапы, работающие за счет устранения рыночного шума, без проблем запаздывания, характерных для многих индикаторов, например скользящей средней.
Целевые рыночные условия
Чтобы лучше понять, в каких условиях этот пользовательский сигнал наиболее эффективен, его следует сопоставить с ранее рассмотренными моделями. Если рассмотреть сети, ранее использовавшиеся с пользовательскими сигналами, то перцептрон особенно хорошо проявлял себя в задачах с четкими порогами, байесовская нейронная сеть требовала повторяемости исторических паттернов, а DBN – отдельных диапазонов волатильности. При высокочастотной торговле экзотическими валютными кросс-парами или криптовалютами на малых таймфреймах рыночные режимы редко меняются четко, а паттерны редко повторяются в точности. Вместо этого целевая, или "истинная", цена часто скрыта за неравномерным локальным рыночным шумом.
Поэтому этот пользовательский сигнал предназначен для работы на рынках средней структуры, но с выраженным шумом, в которых количественный трейдер стремится извлечь выгоду. Если торговый стиль основан на ситуациях, в которых индикаторы, особенно MA, подвержены пилообразным колебаниям или задержка может привести к пропуску точек входа, эта модель может существенно упростить работу.
Точнее, сочетание UKF и CapsNet позволяет отказаться от сглаживания цены, сосредоточившись на оценке скрытого состояния UKF. Мы рассматриваем необработанную цену как зашумленное наблюдение более точного нелинейного тренда. Капсульная сеть (CapsNet) дополнительно используется для решения иной задачи по сравнению с ранее применявшимися сетями. Вместо поиска скрытых категориальных связей CapsNet выполняет роль строгого модуля валидации пространственных соотношений. Это обеспечивает согласованность логики, формируемой UKF, с текущими границами волатильности, определяемыми ATR, и темпом моментума, определяемым RSI. Эта модель может быть полезна трейдерам, стремящимся избежать запаздывания при входе в рынок и нуждающимся в фильтрах внутридневного шума. Ее также можно использовать для уточнения входов по долгосрочным сигналам или сигналам старших таймфреймов.
Описание модели
Архитектура класса CSignalUKFCapsNet становится понятнее, если представить модель не как монолитный блок принятия решений, а как двухэтапный процесс. Объединяются математический оцениватель, отвечающий за вопрос "что" происходит с движением рынка, и модуль валидации, отвечающий за вопрос "как" это соотносится с рыночной структурой. Таким образом, как и обычно, используются два механизма: механизм 1 и механизм 2.
Механизм 1 – сигма-точечный фильтр Калмана
В качестве метафоры представим подводную лодку, пытающуюся пройти через мелководный скалистый залив. Если вода на поверхности хаотична из-за волн и течений, определить фактическое положение судна трудно. Базовая радиолокационная система, подобно индикатору скользящей средней, будет реагировать на отражения от волн. В результате получается зашумленная, колеблющаяся оценка положения, которая в любой момент времени неизбежно запаздывает относительно фактической позиции подводной лодки.
Сигма-точечный фильтр Калмана, напротив, действует как усовершенствованная гидролокационная система. Вместо простого усреднения предыдущих положений он поддерживает внутреннюю модель состояния подводной лодки, которое здесь соответствует "скрытому" состоянию цены. Это означает, что даже при искажении данных датчика шумом волн UKF прогнозирует наиболее вероятную траекторию движения "подводной лодки".
С математической точки зрения скрытое состояние цены обозначается как x_k и изменяется во времени. Особенность UKF состоит в использовании сигма-точечного преобразования для распространения среднего значения и ковариации через нелинейные функции. Этот переход состояния определяется следующим образом:
![]()
Где:
- x_{k|k-1} — это предсказанная (априорная) оценка скрытого состояния цены на шаге времени k с учетом информации до шага k-1;
- f() – нелинейная модель, или функция, перехода состояния, применяемая к предыдущему состоянию;
- x_{k-1} – оценка предыдущего скрытого состояния на временном шаге k-1;
- w_{k-1} – шум процесса, или неопределенность, связанная с переходом на временном шаге k-1.
Механизм 2 – капсульная сеть
Таким образом, UKF определяет траекторию, а капсульная сеть (CapsNet) обеспечивает ее структурное подтверждение. Обычная нейронная сеть может обнаружить сигнал на покупку, поскольку RSI растет, но при этом не учесть пространственную иерархию. Иными словами, она не определяет, соответствует ли текущий моментум направлению более широкого тренда или является коррекцией.
Капсулы – это группы нейронов, представляющие свойства определенного объекта в рыночной среде. В данном случае CapsNet определяет "конфигурацию" рынка. Эту "конфигурацию" можно описать как соотношение между ценой, состоянием UKF и RSI. CapsNet использует нелинейную функцию сжатия, которая сжимает короткие векторы, соответствующие сигналам с низкой уверенностью, почти до нуля. Длинные векторы и согласованные состояния с высокой уверенностью, напротив, сохраняются. Эта функция сжатия задается следующей формулой:

Где:
- v_j – итоговый сжатый выходной вектор капсулы j, длина которого представляет вероятность существования объекта или признака;
- s_j – суммарный входной вектор, подаваемый в капсулу j; он часто представляет алгоритмическую гипотезу или пространственные признаки;
- ||s_j|| – норма, то есть величина или длина, входного вектора s_j;
- (||s_j||^2)/(1 + ||s_j||^2) выступает нелинейным скаляром, сжимающим короткие векторы почти до нуля, а длинные – до значения, немного меньшего единицы;
- \frac{s_j}{||s_j||} представляет единичный вектор s_j, сохраняющий направленную ориентацию исходного сигнала.
Эта формула выполняет роль фильтра. Когда сеть активна и алгоритм предлагает сделку, CapsNet выполняет это преобразование. Если пространственные характеристики рынка, то есть его "конфигурация", не согласуются с направлением, предложенным алгоритмом, сеть подавляет сигнал. Это предотвращает вход советника в сделку в зашумленной среде, структура которой не соответствует условиям сигнала. Последовательное объединение этих двух механизмов формирует модель, которая не только реагирует на цену, но и оценивает скрытое состояние, а также проверяет его пространственную согласованность до принятия торгового решения.
Реализация на MQL5
После рассмотрения формальных определений и базовой теории можно перейти к реализации этого решения в стандартной библиотеке MetaTrader 5. В предыдущей реализации пользовательского сигнала система непересекающихся множеств (DSU) использовалась для классификации исторических данных по рыночным режимам. В текущей реализации цель несколько иная. Необходим потиковый фильтр, работающий в реальном времени.
Для этого сигма-точечный фильтр Калмана (UKF) и капсульная сеть (CapsNet) включаются в пользовательский класс, наследуемый от базового класса CExpertSignal. Это наследование обеспечивает тесную интеграцию настраиваемой количественной модели с другими классами Мастера MQL5, работающими с индикаторами, ценовыми данными и иной рыночной информацией по символу. При создании пользовательских классов для Мастера MQL5 такое наследование практически обязательно, поскольку оно дает доступ к модулям управления капиталом, трейлинг-стопам и сигналам входа.
Интерфейс класса
//+------------------------------------------------------------------+ //| Class CSignalUKFCapsNet. | //| Purpose: Generator of trade signals based on Unscented Kalman | //| Filter hidden state, 4 algorithms, and a CapsNet filter.| //| Is derived from the CExpertSignal class. | //+------------------------------------------------------------------+ class CSignalUKFCapsNet : public CExpertSignal { protected: //--- Indicator instances CiATR m_atr; CiRSI m_rsi; //--- Adjusted parameters int m_ukf_mode; // UKF Algorithm Iteration Mode bool m_use_capsnet; // Toggle for Capsule Network int m_period_atr; // Period for ATR int m_period_rsi; // Period for RSI //--- UKF State Memory double m_ukf_state[10]; // Array keeping the recent hidden states //--- "Weights" of market models (0-100) int m_pattern_0; public: CSignalUKFCapsNet(void); ~CSignalUKFCapsNet(void); //--- Methods for setting adjustable parameters via Wizard void UKFMode(int value) { m_ukf_mode = value; } void UseCapsNet(bool value) { m_use_capsnet = value; } void PeriodATR(int value) { m_period_atr = value; } void PeriodRSI(int value) { m_period_rsi = value; } void Pattern_0(int value) { m_pattern_0 = value; } //--- Initialization and Validation virtual bool ValidationSettings(void); virtual bool InitIndicators(CIndicators *indicators); //--- Main signal conditions virtual int LongCondition(void); virtual int ShortCondition(void);
В приведенном выше интерфейсе определено несколько ключевых параметров. m_use_capsnet – логический переключатель, который обеспечивает гибкость: можно использовать либо только UKF, либо связку UKF и CapsNet. Эта возможность переключения используется при тестировании, чтобы оценить качество прогнозирования UKF отдельно и в сочетании с CapsNet. Теоретически это позволяет проверить, является ли шум ценового движения для тестируемого символа и временного интервала только структурным или имеет более сложную природу, при которой CapsNet становится критически важной. Другой ключевой входной параметр, объявленный в интерфейсе выше, – m_ukf_mode. Это целочисленный параметр, который, как и в последних статьях, принимает значения от 1 до 4 и определяет режим работы алгоритма.
Ни общий код, ни доступные во встроенной библиотеке MQL5 индикаторы не ограничивают число режимов четырьмя – это лишь выбранное нами для краткости число, при этом его достаточно для представления основных принципов алгоритма. Теперь рассмотрим индикаторы, используемые в паре UKF-CapsNet.
Почему ATR и RSI
В предыдущей статье о пользовательском классе сигналов в глубокую сеть доверия передавался широкий набор стандартных данных для выявления скрытых категориальных связей. В данном случае нейронной сети требуется более строгий набор входных данных с малой размерностью. UKF формирует базовую оценку состояния, но без надлежащего контекста от нее мало пользы. Необходимо определить: как цена взаимодействует с этой базовой оценкой? Для ответа на этот вопрос выбраны следующие индикаторы:
- Средний истинный диапазон (ATR). В контексте UKF ATR выступает в роли косвенного показателя. Он сообщает модели текущие границы рыночной неопределенности. Если цена отклоняется от скрытого состояния UKF, ATR определяет, является ли это отклонение значимым статистическим пробоем или лишь колебанием зашумленного рынка.
- Индекс относительной силы (RSI). RSI выступает показателем скорости моментума. Он отслеживает внутреннюю силу ценового движения относительно скрытого состояния UKF.
Ограничение входных данных состоянием UKF, ATR и RSI позволяет избежать "проклятия размерности". Эта проблема обычно осложняет работу нейронных сетей в реальном времени на этапе инференса. CapsNet получает именно те данные, которые необходимы для определения "конфигурации" рынка. Это сводится к трем компонентам: положению (State), границам (ATR) и скорости (RSI).
Шаг 1. Оценка скрытого состояния цены
Полноценный сигма-точечный фильтр Калмана требует многократного обращения матриц, вычисления сигма-точек и нелинейных преобразований. Непрерывное выполнение этих расчетов на каждом новом ценовом баре в MQL5 может перегрузить Тестер стратегий при оптимизации. Но даже без настройки входных параметров при реальной торговле неизбежны частые задержки выполнения программы. Поэтому формируется эффективная и математически обоснованная оценка нелинейного состояния.
//+------------------------------------------------------------------+ //| Unscented Kalman Filter: State Estimation | //+------------------------------------------------------------------+ void CSignalUKFCapsNet::EstimateUKFState(int idx) { //--- Simulating non-linear state transition estimation: x_{k|k-1} = f(x_{k-1}) + w_{k-1} //--- Serves as the mathematical "hidden price state" devoid of standard moving average lag double alpha = 0.2; m_ukf_state[0] = Close(idx + 9); for(int i = 1; i < 10; i++) { m_ukf_state[i] = alpha * Close(idx + 9 - i) + (1.0 - alpha) * m_ukf_state[i - 1]; } }
Рассмотрим приведенный выше код. Функция EstimateUKFState использует текущий индекс бара idx. Вместо простого усреднения за последние N периодов функция строит нелинейный рекурсивный массив проекций m_ukf_state. В приведенном выше блоке кода выполняются следующие действия:
- анализируются девять предыдущих ценовых баров (idx + 9) для определения начальной границы состояния;
- параметру alpha присваивается значение 0,2 – эта переменная выступает приближением коэффициента Калмана и определяет, какой вес придается необработанным зашумленным текущим наблюдениям по сравнению с ранее сформированным состоянием.
Шаг 2. Четыре алгоритмических режима
После определения скрытого состояния алгоритм должен интерпретировать ценовое движение. Поскольку ни одна логика или реализация не подходит для всех зашумленных условий, класс CSignalUKFCapsNet позволяет настраивать варианты работы с помощью параметра m_ukf_mode. Рассмотрим каждый из четырех доступных режимов.
Режим 1. Пробой на фоне расширения волатильности
//+------------------------------------------------------------------+ //| Mode 1: Volatility Breakout (ATR Expand + RSI Momentum) | //+------------------------------------------------------------------+ double CSignalUKFCapsNet::ModeVolatilityBreakout(int idx) { double price = Close(idx); double ukf_current = m_ukf_state[9]; // Latest hidden state bool atr_rising = m_atr.Main(idx) > m_atr.Main(idx + 1); double rsi_val = m_rsi.Main(idx); //--- Breakout through hidden state on high volatility if(atr_rising && price > ukf_current && rsi_val > 55.0) return 1.0; if(atr_rising && price < ukf_current && rsi_val < 45.0) return -1.0; return 0.0; }
Первый режим предназначен для входов, использующих внезапные резкие расширения ценового диапазона. Приведенная выше функция выполняет две основные задачи:
- Объявляется логическая переменная atr_rising. Она позволяет сравнить текущее значение ATR с предыдущими барами (idx + 1). Эта логическая переменная подтверждает, активно ли увеличивается ковариация шума процесса.
- Основная логика функции проверяет, пробивает ли необработанная цена price базовый уровень ukf_current, очищенный от шума, имеет ли atr_rising значение true и превышает ли моментум rsi_val свое среднее значение. Совместное выполнение условий подтверждает пробой. Возвращаемые значения: 1,0 для покупок и -1,0 для продаж.
Режим 2. Возврат к среднему
//+------------------------------------------------------------------+ //| Mode 2: Mean Reversion (Price Stretched vs Hidden State) | //+------------------------------------------------------------------+ double CSignalUKFCapsNet::ModeMeanReversion(int idx) { double price = Close(idx); double ukf_current = m_ukf_state[9]; double deviation = MathAbs(price - ukf_current); double atr_val = m_atr.Main(idx); double rsi_val = m_rsi.Main(idx); //--- Reverting exhausted moves back to the UKF hidden baseline if(deviation > (atr_val * 1.5)) { if(price < ukf_current && rsi_val < 30.0) return 1.0; // Oversold, Revert Up if(price > ukf_current && rsi_val > 70.0) return -1.0; // Overbought, Revert Down } return 0.0; }
Код режима 2 можно сопоставить с поведением кластеризации моделей DSU, рассмотренных в предыдущих статьях. В текущей модели ищется упругий возврат цены. Этот режим включает три основных этапа.
- Объявляется переменная deviation типа double, определяемая следующим выражением: MathAbs(price - ukf_current) – это показатель того, насколько зашумленная цена отклонилась от расчетного состояния.
- Проверяется, превышает ли отклонение от скрытого состояния текущий истинный диапазон более чем в 1,5 раза. Если да, это означает, что цена чрезмерно отклонилась от расчетного состояния.
- Наконец, если цена чрезмерно отклонилась от расчетного состояния, а RSI находится в зоне истощения – ниже 30 или выше 70, – алгоритм предполагает скорое возвращение к среднему, то есть к ukf_current или базовому уровню.
Режим 3. Следование за трендом
//+------------------------------------------------------------------+ //| Mode 3: Trend Following (Aligned State & Clean Momentum) | //+------------------------------------------------------------------+ double CSignalUKFCapsNet::ModeTrendFollowing(int idx) { double price = Close(idx); double ukf_current = m_ukf_state[9]; double rsi_val = m_rsi.Main(idx); //--- Cruising smoothly along the UKF trend line if(price > ukf_current && rsi_val > 50.0 && rsi_val < 70.0) return 1.0; if(price < ukf_current && rsi_val < 50.0 && rsi_val > 30.0) return -1.0; return 0.0; }
Этот режим может быть наиболее консервативным, поскольку, вероятно, подходит для устойчивого внутридневного движения. Используемая здесь логика требует, чтобы цена оставалась по нужную сторону относительно состояния ukf_current. Важно также ограничение по RSI. Проверка порогов 70 и 30 относительно нейтральной отметки позволяет убедиться, что моментум направлен в нужную сторону, но еще не находится в зоне разворота или экстремума. Это важно, поскольку состояние UKF весьма чувствительно. Когда моментум становится чрезмерно сильным, риск зашумленной коррекции экспоненциально возрастает, что может нарушить траекторию состояния. В этом режиме предпочтение отдается чистому устойчивому моментуму, а не потенциально исчерпанным параболическим движениям.
Режим 4. Сжатие в консолидации
//+------------------------------------------------------------------+ //| Mode 4: Consolidation Squeeze (Anticipating Breakout) | //+------------------------------------------------------------------+ double CSignalUKFCapsNet::ModeConsolidation(int idx) { double atr_current = m_atr.Main(idx); double atr_prev = m_atr.Main(idx + 5); double rsi_val = m_rsi.Main(idx); double price = Close(idx); double ukf_current = m_ukf_state[9]; //--- ATR crash implies a squeeze, preparing to explode if(atr_current < (atr_prev * 0.7)) { if(price > ukf_current && rsi_val > 50.0) return 1.0; // Anticipate UP if(price < ukf_current && rsi_val < 50.0) return -1.0; // Anticipate DOWN } return 0.0; }
Последний режим предназначен для зашумленных условий и частично основан на предположении, что длительные спокойные периоды предшествуют экстремальной волатильности. Реализация включает три основных этапа:
- Сначала анализируются 5 предыдущих баров для определения базового показателя волатильности. Это значение ATR, полученное 5 баров назад.
- Затем проверяется, снизилась ли текущая волатильность, измеренная ATR, как минимум на 30%. Это может указывать на сжатие рынка.
- Наконец, алгоритм проверяет пространственное соотношение, или "конфигурацию", значений price, ukf_current (состояния) и rsi_val, чтобы спрогнозировать выход из сжатия.
Шаг 3. Проверка капсульной сети
На этом этапе модель, состоящая только из алгоритма, формирует выходные значения +1,0, -1,0 или 0,0. В обычном торговом сетапе это значение передавалось бы непосредственно в модуль исполнения ордеров. Однако на зашумленных рынках такие сигналы иногда могут вводить в заблуждение. Сигнал пробоя, сформированный алгоритмом, может соответствовать всем математическим критериям, но не иметь пространственной иерархии, необходимой для продолжения движения.
Именно поэтому капсульная сеть может быть полезна. В этой реализации на MQL5 моделируется прямой проход базовой CapsNet с использованием нелинейной функции сжатия, определяющей вероятность на основе векторов.
//+------------------------------------------------------------------+ //| Capsule Network: Simulated Squashing & Spatial Routing | //+------------------------------------------------------------------+ double CSignalUKFCapsNet::CapsNetForwardPass(double algo_signal, int idx) { //--- Note: Represents CapsNet activation. //--- Vector length indicates probability (squashing function). //--- Formula: v_j = (||s_j||^2 / (1 + ||s_j||^2)) * (s_j / ||s_j||) double norm = MathAbs(algo_signal); if(norm == 0.0) return 0.0; double squash = (norm * norm) / (1.0 + norm * norm); double output = squash * (algo_signal / norm); // Retains directional sign (+/-) //--- Simulated network hierarchy layer matching indicators as features double rsi_val = m_rsi.Main(idx); if(algo_signal > 0.0 && rsi_val > 50.0) output += 0.2; // Spatial features align with Long if(algo_signal < 0.0 && rsi_val < 50.0) output -= 0.2; // Spatial features align with Short return output; }
Разберем приведенное выше математическое описание, реализованное в коде. Сначала извлекается величина прогноза алгоритма. Затем это значение сжимается с использованием прямой реализации функции активации CapsNet. В отличие от типичных сигмоидных функций, возвращающих скалярное значение от 0 до 1, функция сжатия уменьшает короткие векторы, соответствующие слабым и поэтому зашумленным сигналам, почти до нуля. При этом векторы большой величины, соответствующие сильным и четким сигналам, преобразуются в значения, немного меньшие 1. Переменная output определяется с повторным учетом направления вектора, чтобы различать сигналы Long и Short. Наконец, выполняется пространственная проверка. CapsNet проверяет внутренние компоненты "конфигурации" рынка, чтобы убедиться в правильности их взаимного расположения. Если алгоритм предлагает длинную сделку, но RSI ниже 50, эти пространственные признаки не согласуются между собой. В этом случае CapsNet не увеличивает выходное значение. Однако при их согласованности длина вектора увеличивается на 0,2.
Таким фильтром выступает сеть CapsNet: она получает исходную гипотезу алгоритма, сжимает ее для подавления шума от сигналов с низкой уверенностью и проверяет ее пространственную согласованность со структурой моментума.
Шаг 4. Выполнение общей логики
Последний шаг – объединение двух механизмов в системе MQL5 с использованием переопределенных функций условий Long и Short.
//+------------------------------------------------------------------+ //| Long Condition Evaluation | //+------------------------------------------------------------------+ int CSignalUKFCapsNet::LongCondition(void) { int result = 0; int idx = StartIndex(); double algo_val = 0.0; //--- 1. Compute Hidden State EstimateUKFState(idx); //--- 2. Apply chosen UKF iteration switch(m_ukf_mode) { case 1: algo_val = ModeVolatilityBreakout(idx); break; case 2: algo_val = ModeMeanReversion(idx); break; case 3: algo_val = ModeTrendFollowing(idx); break; case 4: algo_val = ModeConsolidation(idx); break; default: algo_val = ModeVolatilityBreakout(idx); break; } //--- 3. Two Modes Output Resolution (Algo Only vs CapsNet Enabled) if(m_use_capsnet) { double capsnet_score = CapsNetForwardPass(algo_val, idx); //--- CapsNet validates the algorithmic intention if(capsnet_score > 0.3 && algo_val > 0.0) result = m_pattern_0; } else { //--- Standalone algorithm check if(algo_val > 0.0) result = m_pattern_0; } return(result); }
Логика работы этих типичных переопределенных функций является последовательной и строго структурированной. Сначала выполняется инициализация состояния. Для этого немедленно вызывается EstimateUKFState(idx), задающая систему отсчета. Затем выполняется генерация гипотез. Для этого используется оператор switch, динамически направляющий выполнение в соответствии с выбранными пользователем рыночными условиями и, следовательно, режимом работы. Результатом является значение algo_val. После этого выполняется переход к точке ветвления. На этом этапе начинают взаимодействовать два механизма. Если параметр m_use_capsnet имеет значение false, код переходит к блоку else.
По сути, модель работает как автономный оцениватель UKF без CapsNet. Если значение algo_val положительно, при проверке покупок ему присваивается встроенный вес паттерна m_pattern_0. В функции ShortCondition применяется обратная логика. Если m_use_capsnet имеет значение true, algo_val передается в сеть через функцию CapsNetForwardPass. Входная гипотеза алгоритма должна пройти функцию сжатия и получить векторную вероятность выше 0,3, чтобы считаться валидной.
Если оценка CapsNet достаточно высока, функция LongCondition возвращает базовому классу CExpertSignal вес сигнала в диапазоне от 0 до 100. Это должно инициировать открытие советником длинной позиции. Аналогичная архитектура используется и в функции ShortCondition. Такая структура кода не только помогает трейдеру лучше учитывать внутридневной шум для более точных входов и выходов, но и повышает объяснимость модели, что критически важно при отладке логики и ее дальнейшем совершенствовании.
Анализ результатов оптимизации
Для проверки эффективности класса CSignalUKFCapsNet и других разрабатываемых пользовательских классов с двумя механизмами в Тестере стратегий MetaTrader 5 были проведены два стресс-теста. Эти тестовые прогоны были проведены на внутридневном таймфрейме H2 по символу GBPJPY за период с 1.01.2025 по 1.05.2026. Период с 1.01.2026 по 1.05.2026 отводится для форвард-тестирования, а весь 2025 год используется для настройки параметров. В первом запуске используется только алгоритм UKF, а во втором – алгоритм UKF и сеть CapsNet.
Запуск 1. Автономный режим

В первом запуске капсульная сеть отключается: UseCapsNet = false. Алгоритм UKF способен отслеживать цену без запаздывания, часто свойственного традиционным индикаторам, таким как скользящая средняя. При определении отклонений оптимизатор выбрал ATR с периодом 93 и RSI с периодом 6. Результаты при использовании только UKF действительно демонстрируют высокую эффективность. В период форвард-тестирования исходный алгоритм продемонстрировал достаточно высокую точность: было совершено 14 сделок с долей прибыльных сделок 100%. В результате была получена чистая прибыль в размере 1 050 долларов. Однако столь высокая точность была достигнута не без издержек. Просадка средств счета составила 1 250 долларов, то есть превысила чистую прибыль. Хотя в течение тестового периода каждая сделка возвращалась к среднему и закрывалась с прибылью, в процессе развития сделок наблюдались значительные неблагоприятные отклонения цены.
Запуск 2. Гибридный режим

Во втором запуске был включен пространственный фильтр: Signal_UKF_CapsNet_UseCapsNet = true. Так же, как и в автономном тесте, была проведена оптимизация с последующим форвард-тестированием. Поскольку для работы CapsNet необходимы четкие структурные границы, оптимизатор MetaTrader 5 незначительно скорректировал параметры. Период ATR был увеличен до 111, тогда как период RSI остался равен 6. На первый взгляд результат выглядит разочаровывающим, поскольку форвард-тестирование не принесло прибыли. Однако при более детальном рассмотрении видно, что итоговый результат по сути определила всего одна убыточная сделка. Доля прибыльных сделок оставалась исключительно высокой – более 90%. Поскольку в тестировании не используется защита стоп-лоссом, это указывает на одно из направлений возможного улучшения модели.
Заключение
В этой статье выполнен переход от дискретной кластеризации режимов в моделях DSU и DBN к моделям непрерывной фильтрации шума, основанным на сигма-точечном фильтре Калмана в сочетании с капсульной сетью. Цель состояла в оценке скрытого состояния цены и использовании нейронной сети для его пространственной проверки. Тем не менее результаты Тестера стратегий не могут считаться окончательными из-за ограниченного тестового периода и тестирования только по одному символу. Они служат необходимым предостережением для количественного трейдера. Повышение сложности не всегда означает рост альфы.
Важно, что тесты в Тестере стратегий проводились без стоп-лосса. Строго говоря, эти отчеты тестирования включены в статью, чтобы продемонстрировать пригодность советника, собранного Мастером MQL5, в качестве модели, а не в качестве готовой к развертыванию торговой системы. С учетом этой оговорки следует помнить, что нейронные сети не являются панацеей, и данный подход по-прежнему можно улучшать в самых разных аспектах перед развертыванием. Хотя алгоритм и сеть можно дополнительно настраивать, предпочтительным направлением будет проведение большего числа тестов с системным использованием стоп-лосса.
| Имя | Описание |
|---|---|
| wz_98.mq5 | Советник, собранный Мастером MQL5 |
| SignalUKFCapsNet.mqh | Пользовательский класс сигналов, необходимый для сборки в Мастере MQL5 |
| r1.set | Входные параметры для первого прогона |
| r2.set | Входные параметры для второго прогона |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/23112
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Разработка инструментария для анализа Price Action (Часть 72): Создание индикатора заполнения гэпов на MQL5
Моделирование рынка: В единстве — сила (III)
Разработка индикатора Volume Bubble на MQL5 с использованием стандартного отклонения
От начального до среднего уровня: Перегрузка операторов (IV)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования