Возможности Мастера MQL5, которые вам нужно знать (Часть 96): Использование вейвлетного порогового преобразования и сети LSTM в пользовательском классе управления капиталом
Введение
Мы продолжаем эту серию, посвященную различным идеям и торговым сетапам, которые можно исследовать и тестировать с помощью Мастера MQL5. В предыдущей статье об управлении капиталом пользовательский класс объединял алгоритм суффиксного автомата и сеть автокодировщика. Эта модель могла быть подходящим инструментом для трейдеров, работающих на консолидирующихся рынках, где историческая "ДНК цены" содержит повторяющиеся паттерны. Она, по-видимому, хорошо работала в таких условиях при наличии устойчивого ритма рынка. Возникает вопрос: что произойдет при смене режима. Для трейдеров, работающих на волатильных рынках, например на внутридневном рынке Форекс или криптовалютах, повторяющиеся надежные паттерны могут быть редкостью. Основная проблема состоит в том, что рынок ведет себя рвано и зашумленно, а высокочастотный шум часто маскируется под преобладающие тренды.
В этой статье осуществляется переход от распознавания паттернов к обработке сигналов. Вместо поиска крупных повторяющихся паттернов создается точный инструмент, лучше всего подходящий для зашумленных рыночных условий с выраженным моментумом. Этот инструмент создается как пользовательский класс управления капиталом, объединяющий алгоритм вейвлетного порогового преобразования (Wavelet Thresholding), адаптированный для удаления шума из логарифмических доходностей, и сеть долгой краткосрочной памяти (Long Short-Term Memory, LSTM). Как и в предыдущих статьях, используется подход с двумя механизмами, повышающий адаптивность расчета размера позиции по мере того, как мы избавляемся от шума и запаздывающих сигналов.
Целевой рынок и задачи
Предыдущая статья об управлении капиталом с помощью суффиксного автомата была ориентирована на рынки в диапазоне с паттернами "исторического эха". Важно подчеркнуть, что комбинация вейвлетного преобразования и LSTM-сети предназначена для трендовых рынков, особенно с высокой волатильностью. Можно утверждать, что этот подход особенно подходит для высоковолатильных рынков: внутридневного рынка Форекс, некоторых индексов с выраженным моментумом и крайне подвижных криптовалют. В таких условиях цена не отзывается эхом прошлых паттернов, а движется взрывным образом. Такие резкие движения приводят к еще одной серьезной проблеме – пилообразным колебаниям цены. Когда цена резко проходит через ключевой уровень, как определить, является ли это настоящим трендом или рыночным шумом? Этот вопрос уже поднимался в серии, однако комбинация вейвлет-алгоритма и LSTM-сети до сих пор не рассматривалась как возможное решение.
Расчет размера позиции на рынках с резкими колебаниями и высокой неопределенностью может быть сложной задачей. Если рассматривать каждый внезапный ценовой всплеск как действительный пробой по волатильности, это приведет к чрезмерному уменьшению размера позиции и посредственным результатам. Обратная ситуация еще хуже: ошибочное восприятие кажущегося умеренным роста цены как слабой волатильности может привести к потере средств на счете. Поэтому задача состоит в применении другого подхода к масштабированию риска, когда реальный рыночный сигнал скрыт в шуме.
Описание модели
При решении проблемы пилообразных колебаний не следует полагаться только на один источник сигналов или индикатор. Как и в предыдущих статьях, используется подход с двумя механизмами: один агрессивно очищает данные, а второй интерпретирует последовательность, оставшуюся после очистки.
Механизм 1 – вейвлетное пороговое преобразование (фильтр)
Этот алгоритм можно представить как высококачественные наушники с шумоподавлением. Эти "наушники" не изменяют основную музыку, то есть динамику цены, а устраняют фоновый шум, чтобы лучше слышать басовую линию, то есть ценовой тренд. Поэтому в данном случае вместо поиска повторяющейся исторической "ДНК цены" обрабатываются текущие необработанные хаотичные логарифмические доходности. Математическая основа этого алгоритма – дискретное преобразование вейвлета Хаара. Оно разлагает последовательность логарифмических доходностей x_0, x_1, …, x_n на две части: коэффициенты аппроксимации и коэффициенты детализации.
- Коэффициенты аппроксимации, которые могут представлять тренд, задаются формулой:

- Коэффициенты детализации, служащие приближенным показателем шума, определяются следующим образом:

После разложения к коэффициентам детализации применяется мягкое пороговое преобразование. Если абсолютное значение коэффициента детализации |d| ниже настроенного порога lambda, этому коэффициенту присваивается ноль. Если значение достигает порога или превышает его, оно уменьшается следующим образом:
d = sign(d)(|d| - lambda)
Этот шаг подавляет высокочастотный шум перед восстановлением сигнала.
Механизм 2 – сеть LSTM (вентильный модуль)
После очистки вейвлетом шума вступает в действие LSTM-сеть. Вейвлет очищает текущие данные, а LSTM обеспечивает временной контекст обработанной последовательности данных. Также решается проблема исчезающего градиента, характерная для обычных RNN, с помощью вентильной ячейки. Она предназначена для управления долговременной памятью. Основное состояние ячейки LSTM определяется следующим уравнением обновления состояния:
![]()
Где:
- f_t ("забывающий вентиль") задает прошлую информацию, которую нужно отбросить, с помощью сигмоидной функции активации Sigma(W_f * |h_t-1, x_t| + b_f);
- i_t ("входной вентиль") определяет, какую новую информацию сохранить;
- ~c_t (состояние-кандидат) – с помощью tanh создается кандидат новой информации;
- c_t (состояние ячейки) хранит траекторию тренда как обновленную внутреннюю память.
Очищенный вейвлетом сигнал затем проходит через этот вентиль, после чего сеть проверяет согласованность текущего тренда. Результатом расчета является итоговый коэффициент уверенности, служащий динамическим множителем размера лота. Это позволяет модели определить, связана ли недавняя волатильность с действительным пробоем или с периодом пилообразных колебаний, вызванных шумом. С учетом этой обратной связи рыночная экспозиция корректируется соответствующим образом.
Реализация на MQL5
Реализация этого подхода с двумя механизмами в MQL5 в виде пользовательского класса управления капиталом требует наследования от стандартного базового класса CExpertMoney. Переопределение виртуальных функций базового класса CheckOpenLong() и CheckOpenShort() позволяет динамически перехватывать сигналы советника и соответственно уменьшать или увеличивать размер позиции.
Однако перед рассмотрением деталей кода необходимо обсудить инструменты оценки рынка. В предыдущей статье с пользовательским классом управления капиталом использовался суффиксный автомат, опирающийся на необработанные ценовые строки для торговли ценовой структурой на повторяющихся или цикличных рынках. Подход этой статьи направлен на волатильные и шумные рыночные условия, поэтому простого анализа цен недостаточно. Требуется больше контекста. Для этого инициализируются два встроенных индикатора: Relative Strength Index и Average True Range. Почему именно эти два индикатора?
- RSI (индикатор моментума и экстремумов). Когда на рынке наблюдаются пилообразные колебания, внезапный ценовой всплеск может рассматриваться как кратковременное аномальное движение. Однако осциллятор RSI может помочь проверить, указывает ли это движение на устойчивый моментум очищенного сигнала. Это помогает оценить, является ли движение продолжением тренда или чрезмерно растянутым движением-ловушкой.
- ATR (индикатор оценки волатильности). Чтобы позиции трейдера выдерживали волатильные рынки, им часто требуется базовый ориентир. ATR предоставляет количественную оценку текущего рыночного смещения. Когда вейвлетный фильтр выявляет сильный сигнал, он сопоставляется с ATR, чтобы подтвердить всплеск волатильности. Это помогает определить, насколько существенно необходимо уменьшить размер позиций.
Таким образом, RSI и ATR используются как дополнительные проверки и показатели для оценки волатильных рыночных условий. Далее последовательно рассматривается модель класса CMoneyWaveletLSTM: сначала алгоритм, затем режимы, управляемые индикаторами, и далее нейронная сеть.
Шаг 1 – вейвлетный фильтр
В основе механизма шумоподавления лежит базовый класс CWaveletThreshold. Этот вспомогательный класс не перебирает исторические точки данных и массивы в поисках совпадающих паттернов, как это делал суффиксный автомат. Этот класс выполняет одноуровневое дискретное преобразование Хаара (DWT) для последних логарифмических доходностей, то есть натуральных логарифмов отношений между ценами закрытия. Начнем с рассмотрения метода DeNoiseLogReturns этого класса и покажем, как устраняется рыночный шум:
//--- De-noises log-returns and returns the sum of the filtered signal double DeNoiseLogReturns(const double &log_returns[]) { int n = ArraySize(log_returns); if(n % 2 != 0) n -= 1; // Ensure even length for Haar pairs
Преобразованию Хаара требуются пары точек данных для вычисления разностей и средних значений. Сначала проверяется размер массива n. Если заданная длина истории нечетная, из нее вычитается 1, чтобы длина стала четной. Это предотвращает ошибки выхода за границы массива при выполнении цикла.
double approx[]; double detail[]; ArrayResize(approx, n / 2); ArrayResize(detail, n / 2);
В приведенном выше листинге объявляются два динамических массива и задается их размер. Они называются approx и detail. Поскольку каждая пара точек данных сжимается в один коэффициент, размер этих массивов будет в точности равен половине длины истории.
//--- 1. Decomposition (Haar Transform) for(int i = 0; i < n / 2; i++) { approx[i] = (log_returns[2 * i] + log_returns[2 * i + 1]) / MathSqrt(2.0); detail[i] = (log_returns[2 * i] - log_returns[2 * i + 1]) / MathSqrt(2.0); }
После их объявления переходим к основной логике разложения в этой функции. Выше логарифмические доходности перебираются с шагом 2.
- Коэффициент аппроксимации approx предназначен для выделения тренда. Для этого пара усредняется и масштабируется множителем 1/Sqrt(2) с сохранением энергии.
- Коэффициент детализации detail предназначен для выделения высокочастотного шума. Он вычисляет разность между элементами пары и масштабируется тем же множителем 1/Sqrt(2). В высоковолатильной среде пилообразные колебания и шум могут в основном попадать в этот массив коэффициентов детализации.
//--- 2. Soft Thresholding (De-noising at specific scale) for(int i = 0; i < n / 2; i++) { if(MathAbs(detail[i]) < m_threshold) detail[i] = 0.0; // Filter out noise else detail[i] = (detail[i] > 0) ? (detail[i] - m_threshold) : (detail[i] + m_threshold); }
В приведенном выше листинге выполняется подавление шума. Применяется мягкое пороговое преобразование. При переборе высокочастотных коэффициентов detail, если абсолютная величина коэффициента детализации меньше заданного пользователем m_threshold, это считается признаком незначимого рыночного шума. В этом случае значение коэффициента сбрасывается до 0,0. Если значение больше, оно уменьшается в направлении нуля на величину порога. Последний шаг предотвращает резкие скачки конечного сигнала и сглаживает агрессивные всплески, характерные для целевых волатильных рынков.
//--- 3. Reconstruction & Signal Aggregation double denoised_sum = 0.0; for(int i = 0; i < n / 2; i++) { double r0 = (approx[i] + detail[i]) / MathSqrt(2.0); double r1 = (approx[i] - detail[i]) / MathSqrt(2.0); denoised_sum += (r0 + r1); }
Последний шаг этой функции – восстановление последовательности. По сути, выполняется обратное преобразование Хаара. Сохраненные коэффициенты тренда approx объединяются с отфильтрованными коэффициентами детализации detail для восстановления логарифмических доходностей r0 и r1. Они агрегируются в единый очищенный сигнал направленного движения, предназначенный для выделения основного моментума недавней динамики цены. Предполагается, что на этом этапе логарифмические доходности очищены от высокочастотного шума.
Шаг 2 – четыре режима стратегии
После получения очищенного выходного значения denoised_sum необходимо определить, как использовать содержащуюся в нем информацию. Поскольку целевыми являются волатильные рынки, универсальный подход обречен на неудачу. Поэтому, как и в предыдущих статьях, вводится параметр m_algo_mode, позволяющий выбрать подход в зависимости от торгуемого актива и текущих рыночных условий. Он позволяет выбрать одну из четырех отдельных функций. Каждая функция сопоставляет вейвлетный сигнал с RSI и ATR, чтобы вернуть множитель размера лота.
Режим 1 – следование за моментумом и трендом
//+------------------------------------------------------------------+ //| Mode 1: Momentum & Trend Following | //| Relies heavily on Denoised Signal matching RSI trend. | //+------------------------------------------------------------------+ double CMoneyWaveletLSTM::Mode1_MomentumTrend(double signal, double rsi, double atr) { //--- Bullish momentum confirmation if(signal > 0 && rsi > 55.0) return 1.5; //--- Bearish momentum confirmation if(signal < 0 && rsi < 45.0) return 1.5; //--- Choppy/Divergence - reduce lot size return 0.7; }
Этот режим предназначен для агрессивного следования за трендом после пробоя. Для него требуется согласованность сигналов. Когда сигнал Wavelet положителен, то есть бычий, а RSI подтверждает восходящее движение (> 55,0), множитель лота увеличивается до 1,5x. Для медвежьего движения применяется обратная логика. Однако, когда алгоритм и индикатор расходятся, модель предполагает, что рынок находится в фазе пилообразных колебаний. Поэтому размер позиции защитно уменьшается до множителя 0,7x.
Режим 2 – возврат к среднему
//+------------------------------------------------------------------+ //| Mode 2: Mean Reversion | //| Fades the denoised signal when RSI reaches extreme bounds. | //+------------------------------------------------------------------+ double CMoneyWaveletLSTM::Mode2_MeanReversion(double signal, double rsi, double atr) { //--- Overbought, anticipate reversal if(rsi > 70.0 && signal > 0) return 1.25; //--- Oversold, anticipate reversal if(rsi < 30.0 && signal < 0) return 1.25; //--- Normal market conditions - cautious allocation return 0.8; }
В режиме 2, напротив, рассматриваются чрезмерно растянутые рыночные условия, в которых часто происходят резкие возвраты. Здесь выявляются экстремумы: если RSI находится в перекупленности (> 70,0), а вейвлетный сигнал все еще положителен, предполагается скорый возврат к среднему или обвал. При таком сценарии множитель размера позиции увеличивается до 1,25x для работы на ожидаемом возврате к среднему. При нормальных, неэкстремальных условиях применяется понижающий множитель лота 0,8x.
Режим 3 – пробой по волатильности
//+------------------------------------------------------------------+ //| Mode 3: Volatility Breakout (ATR Driven) | //| Scales position if denoised momentum breaks above recent ATR. | //+------------------------------------------------------------------+ double CMoneyWaveletLSTM::Mode3_VolatilityBreakout(double signal, double rsi, double atr) { //--- Transform signal strength context back to price scale roughly double pseudo_price_momentum = MathAbs(signal) * 1000.0; if(pseudo_price_momentum > atr) return 2.0; // Breakout confirmed by Wavelet & ATR, aggressive size return 0.5; // Stagnant, minimize exposure }
В этом режиме отслеживаются исключительно всплески волатильности. Поскольку Wavelet выводит сумму логарифмических доходностей в виде очень малых десятичных значений, абсолютное значение сигнала умножается на 1000,0, чтобы приблизительно перевести его в обычную систему ценовых пунктов pseudo_price_momentum. Затем очищенный моментум напрямую сопоставляется с atr. Если подтвержденный очищенный моментум превышает средний диапазон волатильности, это подтверждает значительный пробой. После такого подтверждения модель масштабирует размер позиции множителем 2,0x. Если подтверждение не получено, множитель снижается до 0,5x.
Режим 4 – консервативный фильтр
//+------------------------------------------------------------------+ //| Mode 4: Conservative / Risk-Averse Filter | //| Only permits sizing up if volatility is low and trend is stable. | //+------------------------------------------------------------------+ double CMoneyWaveletLSTM::Mode4_ConservativeFilter(double signal, double rsi, double atr) { //--- Avoid trading heavily during massive extremes (High ATR, Extreme RSI) if(rsi > 80.0 || rsi < 20.0) return 0.25; //--- If trend is gentle and denoised signal is consistent, standard sizing if(rsi >= 40.0 && rsi <= 60.0) return 1.0; return 0.6; }
Этот режим можно рассматривать как регулятор. Для большинства трейдеров основной задачей является сохранение капитала, особенно в нестабильных рыночных условиях. Поэтому этот режим существенно уменьшает размер лота, когда рынок находится в экстремальном состоянии. При сильной перекупленности или перепроданности RSI множитель снижается до 0,25x. Стандартный размер позиции (множитель 1,0x) применяется только при относительно спокойном рынке, когда RSI находится в диапазоне от 40 до 60.
Шаг 3 – вентильный LSTM-контур
После того как вейвлетный алгоритм и выбранный режим определили исходный множитель лота, он передается нейронной сети. В отличие от автокодировщика из предыдущей статьи, анализировавшего статические снимки данных, LSTM предназначена для оценки временных последовательностей. Для этого создается упрощенная структура одномерной ячейки для прямого прохода, использующая скорость выполнения MQL5.
//--- Calculates LSTM forward pass, returns coefficient [0.5, 1.5] double Calculate(const double &sequence[]) { double h_prev = 0.0, c_prev = 0.0;
Для начала инференса, выполняемого функцией Calculate, скрытому состоянию h_prev и состоянию ячейки c_prev присваиваются нулевые значения (0). Это состояние ячейки служит долговременной памятью сети.
for(int t = 0; t < ArraySize(sequence); t++) { double x = sequence[t]; //--- Simplified 1D-Cell mapping double f = Sigmoid(m_Wf[0] * h_prev + m_Wf[1] * x + m_bf[0]); double i = Sigmoid(m_Wi[0] * h_prev + m_Wi[1] * x + m_bi[0]); double c_tilde = MathTanh(m_Wc[0] * h_prev + m_Wc[1] * x + m_bc[0]);
При хронологическом переборе заданной последовательности логарифмических доходностей на каждом временном шаге t извлекается текущее значение x. Дополнительно:
- "Забывающий вентиль" f вычисляется путем применения сигмоидной функции активации к весам и смещениям. Это определяет, какую долю предыдущей памяти сеть должна отбросить. Значения, близкие к 0, отбрасываются, а значения, близкие к 1, сохраняются.
- Вычисляется "входной вентиль" i, определяющий, какая новая информация текущего шага будет сохранена.
- С помощью функции активации MathTanh вычисляется состояние-кандидат c_tilde. Это нормирует новую потенциальную память в диапазоне от -1 до 1.
double c_t = f * c_prev + i * c_tilde; double o_t = Sigmoid(m_Wo[0] * h_prev + m_Wo[1] * x + m_bo[0]); h_prev = o_t * MathTanh(c_t); c_prev = c_t; }
На этом этапе сеть обновляет свое внутреннее состояние. Новое состояние ячейки c_t равно сумме сохраненной старой памяти f × c_prev и выбранной новой памяти i × c_tilde. Затем вычисляется выходной вентиль o_t, определяющий долю новой внутренней памяти, передаваемую на выход сети. Для следующей итерации цикла обновляются h_prev и c_prev, поскольку LSTM по мере обработки последовательности учитывает траекторию временного ряда.
//--- Map final hidden state to a lot multiplier [0.5, 1.5] return 0.5 + (Sigmoid(h_prev) * 1.0); }
После обработки всей исторической последовательности итоговое скрытое состояние h_prev содержит окончательную оценку уверенности сети. Это итоговое значение затем пропускается через сигмоидную функцию, сжимающую его в диапазон от 0 до 1, и масштабируется. Масштабирование обеспечивает вывод LSTM множителя фильтрации в диапазоне от 0,5 до 1,5: значение 0,5 означает снижение при низкой уверенности, а 1,5 – увеличение при высокой уверенности.
Шаг 4 – основной механизм (Optimize)
Функция Optimize выступает главным координирующим модулем для алгоритма и нейронной сети. Она вызывается всякий раз, когда советник запрашивает открытие длинной или короткой позиции, и выполняет действия в хронологической последовательности, необходимой для увеличения или уменьшения объема.
double CMoneyWaveletLSTM::Optimize(double lots) { double lot = lots; double closes[]; ArraySetAsSeries(closes, true);
Сначала принимается базовое значение lots, рассчитанное с учетом входных параметров риска. Затем подготавливается динамический массив closes[] в режиме временного ряда, чтобы индекс 0 соответствовал самому недавнему бару.
//--- 1. Fetch Prices if(CopyClose(m_symbol.Name(), PERIOD_CURRENT, 0, m_history_length + 1, closes) == m_history_length + 1) { double log_returns[]; ArrayResize(log_returns, m_history_length); //--- 2. Calculate Log Returns for(int i = 0; i < m_history_length; i++) { //--- Log Return: ln(Price_t / Price_t-1) log_returns[i] = MathLog(closes[i] / closes[i + 1]); }
В приведенном выше листинге получаются исторические цены закрытия на основе входного параметра m_history_length. К размеру истории добавляется единица, чтобы вычислить начальную разность. Затем массив перебирается циклом for, чтобы заполнить log_returns[] натуральными логарифмами отношения текущей цены закрытия к предыдущей. Логарифмические доходности могут быть значительно полезнее необработанных цен, поскольку нормируют данные, отражают непрерывное начисление доходности и позволяют вейвлетному алгоритму оценивать относительное процентное смещение вместо абсолютных ценовых значений.
//--- 3. Apply Wavelet De-noising double denoised_signal = m_wavelet.DeNoiseLogReturns(log_returns);
После подготовки необработанных хаотичных логарифмических доходностей они передаются алгоритмическому механизму. Функция DeNoiseLogReturns использует преобразование Хаара, применяет порог и возвращает очищенный суммарный сигнал denoised_signal.
//--- 4. Fetch Indicator Data double rsi_buffer[1]; double atr_buffer[1]; CopyBuffer(m_handle_rsi, 0, 0, 1, rsi_buffer); CopyBuffer(m_handle_atr, 0, 0, 1, atr_buffer); double current_rsi = rsi_buffer[0]; double current_atr = atr_buffer[0];
Перед оценкой сигнала необходимо получить дополнительный контекст. Для этого запрашиваются текущие значения индикаторов RSI и ATR, после чего извлекаются данные по индексу [0], представляющие текущее состояние рынка.
//--- 5. Apply Selected Algorithm Iteration Mode double scale_factor = 1.0; switch(m_algo_mode) { case 1: scale_factor = Mode1_MomentumTrend(denoised_signal, current_rsi, current_atr); break; case 2: scale_factor = Mode2_MeanReversion(denoised_signal, current_rsi, current_atr); break; case 3: scale_factor = Mode3_VolatilityBreakout(denoised_signal, current_rsi, current_atr); break; case 4: scale_factor = Mode4_ConservativeFilter(denoised_signal, current_rsi, current_atr); break; } lot = lot * scale_factor;
Оператор switch направляет логику в соответствии с выбранным пользователем значением m_algo_mode. Выбранный режим оценивает три переменные – очищенный сигнал, RSI и ATR – и возвращает множитель лота алгоритма scale_factor. Этот множитель применяется к базовому лоту. Когда пользователь присваивает m_use_lstm значение false, на этом динамический расчет размера лота завершается.
//--- 6. Gated Mode: Apply the LSTM Network if(m_use_lstm) { //--- Normalize log returns for network input double network_input[]; ArrayResize(network_input, m_history_length); for(int i = 0; i < m_history_length; i++) network_input[i] = log_returns[i] * 100.0; // Scaled up double lstm_coef = m_lstm.Calculate(network_input); lot = lot * lstm_coef; } }
Однако при активной LSTM-сети выполняется еще одна оценка сетью. Нейронные сети обычно испытывают трудности с малыми числами, поэтому создается массив network_input[]. Он заполняется перебором log_returns с умножением каждого значения на 100,0, чтобы масштабировать значения до диапазона, в котором функции активации работают стабильнее. Полученный временной ряд передается функции m_lstm.Calculate(). Сеть оценивает последовательность, учитывает ее траекторию и возвращает коэффициент lstm_coef, который должен находиться в диапазоне от 0,5 до 1,5. Затем целевой объем окончательно умножается на этот коэффициент, чтобы получить итоговый размер позиции.
//--- 7. Broker limits validation double stepvol = m_symbol.LotsStep(); lot = stepvol * NormalizeDouble(lot / stepvol, 0); double minvol = m_symbol.LotsMin(); if(lot < minvol) lot = minvol; double maxvol = m_symbol.LotsMax(); if(lot > maxvol) lot = maxvol; return NormalizeDouble(lot, 2); }
Эти заключительные строки стандартны. По сути, это стандартная проверка управления капиталом в MQL5. Независимо от множителей, сформированных системой с двумя механизмами, необходимо соблюдать строгие рабочие лимиты брокера. Размер лота нормируется в соответствии с требованиями LotStep() символа, а объем строго ограничивается минимальным LotsMin() и максимальным LotsMax(), заданными брокером. Это необходимо сделать до возврата итогового объема советнику.
Анализ после оптимизации
Для оценки практического эффекта модели с двумя механизмами, как и в предыдущих статьях, проведены две оптимизации. В первом случае тестировался только вейвлетный фильтр, а во втором – полная модель с вейвлетом и LSTM-фильтром. Тестирование проводилось на валютной паре USDJPY на 2-часовом таймфрейме с 1.01.2025 по 1.05.2026. Как и ранее, периодом форвардного тестирования был 2026 год, а периодом оптимизации – 2025 год. Тестирование проводилось со встроенными сигналами входа Envelopes и RSI.
Прогон 1 – только вейвлет
В первой оптимизации и последующем форвардном тестировании нейронная сеть была отключена. Оптимизатор адаптировал эту конфигурацию без вентильного LSTM-модуля, выбрав очень реактивное значение Signal_ThresholdOpen, равное 20. Поскольку LSTM не оценивала контекст временного ряда, вейвлетный фильтр сам по себе срабатывал чрезмерно часто. Он реагировал почти на любой сглаженный импульс.

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

Заключение
Подводя итог, вернемся к исходной точке. Модели суффиксного автомата и автокодировщика из предыдущей статьи опирались на исторические данные. Они хорошо определяли повторения и использовали их в торговой логике. Однако новостные и волатильные рыночные условия требуют иных инструментов для успешной работы. Поэтому был разработан и протестирован класс CMoneyWaveletLSTM. Для трейдеров, работающих с волатильными активами и агрессивными трендовыми стратегиями, основой служат не исторические совпадения, а специализированный фильтр достоверности. Настоящее управление капиталом никогда не сводится к статичному проценту. Подбор алгоритмических и нейросетевых инструментов под конкретную рыночную среду делает рыночную экспозицию динамическим отражением текущей ясности рынка.
| имя | описание |
|---|---|
| wz_96.mq5 | Советник, собранный Мастером MQL5 |
| MoneyWaveLetLSTM.mqh | Пользовательский класс управления капиталом, необходимый для сборки в Мастере MQL5 |
| r1.set | Входные параметры для первого тестового прогона |
| r2.set | Входные параметры для второго тестового прогона |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/23013
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
От начального до среднего уровня: Перегрузка операторов (II)
Разработка индикатора Market Memory Zones: Зоны вероятного возврата цены
Реализация шаблона "Декоратор" в MQL5: Добавление логирования, измерения времени выполнения и фильтрации к любому индикатору без изменения исходного кода
Возможности Мастера MQL5, которые вам нужно знать (Часть 94): Использование выборки из резервуара и линейной регрессии в пользовательском классе трейлинг-стопа
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования