English
preview
Возможности Мастера MQL5, которые вам нужно знать (Часть 90): Управление капиталом на основе дерева Фенвика и одномерной CNN в MQL5

Возможности Мастера MQL5, которые вам нужно знать (Часть 90): Управление капиталом на основе дерева Фенвика и одномерной CNN в MQL5

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

Введение

В предыдущей статье серии о Мастере MQL5 рассматривались сигналы входа в рынок, объединяющие алгоритм побитовой векторизации с перцептронным классификатором. Отчеты по нескольким форвардным тестам показали, что такое сочетание можно развить в работоспособную торговую систему. Тем не менее сигналы входа, хотя и являются основополагающими, решают только половину задачи. Рассмотрим пользовательский класс управления капиталом, который можно использовать в Мастере MQL5 для сборки советника. Наш подход при разработке нестандартных систем управления капиталом заключается в том, чтобы уменьшать размер позиции тогда, когда этого требует рыночный контекст. Даже при точных сигналах входа использование фиксированного размера лота при торговле волатильными движениями NVDA или очень ликвидными валютными парами может не реализовать часть потенциальной альфы. При этом обычно растет и риск просадки.

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


Проблема

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

В этой статье представлен пользовательский класс управления капиталом с четырьмя режимами дерева Фенвика. Это следующие режимы: линейный (Linear), консервативный (Conservative), агрессивный (Aggressive) и возврат к среднему (MeanReversion). Несмотря на разнообразие режимов, последующее форвардное тестирование показало, что опора исключительно на коэффициенты алгоритма без какого-либо пространственного фильтра оказалась неэффективной. Крупный всплеск объема может вызвать чрезмерно агрессивное сокращение размера лота, что в ряде случаев неоправданно, например при истощении ценового движения и развороте RSI. Для безопасной работы с резкими всплесками объема может потребоваться смена подхода: объем следует рассматривать не как плоскую метрику, а как топологическую структуру. Накопленный объем необходимо структурно отобразить, чтобы точнее применять четыре перечисленных режима алгоритма. Параллельно используется модуль распознавания пространственных паттернов, который позволяет нелинейно считывать эту структуру и точнее ограничивать риск по капиталу.


Алгоритм – дерево Фенвика (BIT) как средство топологического анализа данных

При структурном, а не линейном анализе рыночного объема стандартных средств программирования может оказаться недостаточно. Обычный массив представляет собой плоский одномерный список. В таком массиве объемы записываются по барам, но при этом может теряться целостная картина. Для отображения фактической топологии моментума лучше подойдет двоичное индексное дерево. Оно также называется деревом Фенвика. Разработчики советников также могут использовать дерево Фенвика благодаря высокой скорости вычислений. Дерево имеет понятную иерархическую структуру. Оно не только хранит данные, но и изначально организует их в виде кумулятивных частот. Выделяя отдельные биты в индексе массива, дерево формирует уникальные топологические контейнеры. При его использовании анализируется мы работаем уже не с плоским списком из 32 баров объема. Вместо этого создается структурированная карта для запросов и сравнения различных временных масштабов и масштабов моментума. Вспомогательный класс для этого алгоритма на языке MQL5 представлен ниже:

//+------------------------------------------------------------------+
//| Fenwick Tree (Binary Indexed Tree) Helper Class                  |
//| Efficiently calculates prefix sums for OBV/Volume in O(log n)    |
//+------------------------------------------------------------------+
class CFenwickTree
  {
private:
   double            m_tree[];
   int               m_size;

public:
                     CFenwickTree(int size) : m_size(size)
     {
      //--- 1-based indexing is standard for Binary Indexed Trees
      ArrayResize(m_tree, m_size + 1);
      ArrayInitialize(m_tree, 0.0);
     }

   void              Reset() { ArrayInitialize(m_tree, 0.0); }

   void              Update(int i, double delta)
     {
      for(; i <= m_size; i += (i & -i))
         m_tree[i] += delta;
     }

   double            Query(int i)
     {
      double sum = 0.0;
      for(; i > 0; i -= (i & -i))
         sum += m_tree[i];
      return sum;
     }

   double            QueryRange(int left, int right)
     {
      if(left > right || left < 1 || right > m_size)
         return 0.0;
      return Query(right) - Query(left - 1);
     }
  };

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

   double            QueryRange(int left, int right)
     {
      if(left > right || left < 1 || right > m_size)
         return 0.0;
      return Query(right) - Query(left - 1);
     }

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

Используя существующие пользовательские классы сигналов RSI и Envelopes, можно собрать советник для тестирования этого подхода. Дерево Фенвика тестируется в четырех режимах. Первым базовым вариантом является режим линейного масштабирования. В этом режиме советник получает данные из исходного буфера On-Balance Volume (OBV). Поскольку дерево Фенвика эффективнее работает с положительными значениями, этот алгоритм требует нормирования исходного массива OBV. В периоде анализа находится минимальное значение, которое вычитается из всех элементов. Так исходный массив OBV преобразуется в пригодный для использования формат положительных дельт объема. После заполнения дерева советник делит окно пополам, чтобы получить историческую и недавнюю суммы.

//+------------------------------------------------------------------+
//| Iteration 1: Linear Scaling (Standard Trend Following)           |
//+------------------------------------------------------------------+
double CMoneyFenwickCNN::AlgorithmMode1_Linear(double current_ratio)
  {
   if(current_ratio <= m_base_volume_ratio)
      return 1.0;
   return MathMin(current_ratio / m_base_volume_ratio, 2.0); // Capped at 2.0x
  }

Исходная логика проста: если недавний объем существенно превышает историческую базу, торговый сигнал, вероятно, получает подтверждение со стороны институциональных участников и допускает больший размер лота. Используется множитель с жестким ограничением 2,0x для защиты от аномалий. Это первый логический шаг. Дерево Фенвика формирует структуру рыночного объема, а в первом режиме эта структура интерпретируется. Линейная логика алгоритма, хотя и работоспособна в принципе, иногда может быть негибкой. Это может объяснить расхождение между двумя приведенными ниже отчетами форвардного тестирования. По результатам оптимизации предпочтение было отдано режиму "AlgorithmModel Linear", однако стоит кратко рассмотреть и еще три варианта.

Режим 1, рассмотренный выше, можно считать слишком доверчивым. Альтернативный подход, более скептичный к рыночным аномалиям, может лучше подойти для отдельных инструментов в особых рыночных условиях. Перейдем к режиму 2, в котором используется консервативное масштабирование:

//+------------------------------------------------------------------+
//| Iteration 2: Conservative Scaling (Square Root Dampening)        |
//+------------------------------------------------------------------+
double CMoneyFenwickCNN::AlgorithmMode2_Conservative(double current_ratio)
  {
   if(current_ratio <= m_base_volume_ratio)
      return 1.0;
//--- Dampens aggressive spikes to protect capital
   return MathMin(MathSqrt(current_ratio / m_base_volume_ratio), 1.25); // Capped tightly at 1.25x
  }

Этот математический подход исходит из того, что внезапные топологические пики по своей природе являются ловушками. При применении демпфирования квадратным корнем сглаживаются резкие пики данных объема, что значительно сокращает рыночную экспозицию. Для защиты капитала устанавливается жесткий предел 1,25x. В иных случаях, как использовать преимущество, когда сигналы входа Envelopes совпадают с хорошо сформированным пробоем? Для этого рассмотрим другой режим – режим 3, реализованный ниже:

//+------------------------------------------------------------------+
//| Iteration 3: Aggressive Scaling (Exponential Momentum)           |
//+------------------------------------------------------------------+
double CMoneyFenwickCNN::AlgorithmMode3_Aggressive(double current_ratio)
  {
   if(current_ratio <= m_base_volume_ratio)
      return 0.5; //--- Punish low volume
//--- Exponential reward for structural volume breakouts
   return MathMin(MathPow(current_ratio / m_base_volume_ratio, 2.0), 3.0); // Capped at 3.0x
  }

Это наиболее строгий режим: если топология объема не выглядит достаточно убедительной, система активно урезает размер лота вдвое. Однако при выявлении деревом подлинного структурного всплеска этот режим отражает его, экспоненциально увеличивая экспозицию до агрессивного предела 3,0x. Таким образом, дерево Фенвика используется для максимизации альфы. Наконец, последний режим – самый контринтуитивный; его можно кратко описать как поиск "пустоты" в объеме. Предположим, дерево Фенвика выявляет недавнее иссякание объема по сравнению с предыдущим накоплением. В этом случае ищется возврат к среднему. Это реализуется следующим образом:

//+------------------------------------------------------------------+
//| Iteration 4: Contrarian/Mean Reversion (Inverse Scaling)         |
//+------------------------------------------------------------------+
double CMoneyFenwickCNN::AlgorithmMode4_MeanReversion(double current_ratio)
  {
   if(current_ratio == 0)
      return 1.0;
//--- Scales up when recent volume is heavily exhausted compared to historical
   return MathMin(m_base_volume_ratio / current_ratio, 2.0);
  }

Используемый здесь математический подход полностью инвертирует традиционную логику. Здесь активно ищется топологический обрыв или внезапное глубокое истощение моментума. Если недавнее соотношение объемов снижается, а сигналы входа Envelopes и RSI указывают на разворот, этот режим выявляет вакуум. Это предназначено для выявления момента, когда розничные трейдеры исчерпали капитал. Вместо сокращения объема при низком объеме рынка этот режим увеличивает размер лота. Инвертируя соотношение, режим существенно увеличивает объем при ожидаемом возврате к среднему. Экспозиция безопасно ограничивается множителем 2,0x. Это намеренно контринтуитивный подход: капитал в основном задействуется тогда, когда рынок уже выдохся.


Слой глубокого обучения – одномерная CNN

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

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

Для интерпретации пространственной иерархии используется одномерная CNN как фильтр глубокого обучения. Хотя рекуррентные нейронные сети обычно лучше подходят для временных рядов, они могут быть вычислительно затратными. Одномерная CNN, напротив, может быть легковесной и эффективно извлекать локальные признаки. Перемещение ядра CNN по входным данным массива OBV создает продвинутый фильтр, способный выявлять характерные формы следов институционального объема и игнорировать розничный шум. Поэтому вместо тяжелых внешних библиотек или специализированного экспорта моделей из Python в ONNX для прямого прохода движок инференса реализуется непосредственно на языке MQL5. Используемый класс сети предназначен для обработки нормированной последовательности, созданной деревом Фенвика. Ниже приведена реализация класса CNN:

//+------------------------------------------------------------------+
//| 1D Convolutional Neural Network (CNN) Helper Class               |
//+------------------------------------------------------------------+
class CCNN1DNetwork
  {
private:
   int               m_input_size;
   int               m_filters;
   int               m_kernel_size;
   double            m_conv_weights[];
   double            m_dense_weights[];

public:
                     CCNN1DNetwork(int input_size, int filters, int kernel_size)
      :              m_input_size(input_size), m_filters(filters), m_kernel_size(kernel_size)
     {
      ArrayResize(m_conv_weights, m_filters * m_kernel_size);
      ArrayResize(m_dense_weights, m_filters);
     }

   void              InitBaseline()
     {
      for(int i = 0; i < ArraySize(m_conv_weights); i++)
         m_conv_weights[i] = 0.1;
      for(int i = 0; i < ArraySize(m_dense_weights); i++)
         m_dense_weights[i] = 1.0 / m_filters;
     }

   double            Calculate(const double &sequence[])
     {
      int output_length = m_input_size - m_kernel_size + 1;
      if(output_length <= 0)
         return 1.0;
      double dense_input[];
      ArrayResize(dense_input, m_filters);
      ArrayInitialize(dense_input, 0.0);
      //--- 1D Convolution & ReLU
      for(int f = 0; f < m_filters; f++)
        {
         double filter_sum = 0.0;
         for(int i = 0; i < output_length; i++)
           {
            double conv_val = 0.0;
            for(int k = 0; k < m_kernel_size; k++)
               conv_val += sequence[i + k] * m_conv_weights[f * m_kernel_size + k];
            if(conv_val < 0.0)
               conv_val = 0.0;
            filter_sum += conv_val;
           }
         dense_input[f] = filter_sum / output_length; // Global Average Pooling
        }
      //--- Dense Layer
      double logit = 0.0;
      for(int f = 0; f < m_filters; f++)
         logit += dense_input[f] * m_dense_weights[f];
      return 1.0 / (1.0 + MathExp(-logit)); // Sigmoid [0,1]
     }
  };

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

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

Алгоритм Фенвика и сеть CNN объединяются в функции Optimize пользовательского класса управления капиталом следующим образом:

//+------------------------------------------------------------------+
//| Optimizing lot size via Fenwick Tree and optionally the 1D CNN   |
//+------------------------------------------------------------------+
double CMoneyFenwickCNN::Optimize(double lots)
  {
   double lot = lots;
   if(m_window_size > 0 && m_handle_obv != INVALID_HANDLE)
     {
      double obv_buffer[];
      ArraySetAsSeries(obv_buffer, true);
      if(CopyBuffer(m_handle_obv, 0, 0, m_window_size, obv_buffer) == m_window_size)
        {
         m_bit.Reset();
         double min_obv = obv_buffer[0];
         for(int i = 0; i < m_window_size; i++)
            if(obv_buffer[i] < min_obv)
               min_obv = obv_buffer[i];
         for(int i = 0; i < m_window_size; i++)
           {
            double normalized_vol = MathAbs(obv_buffer[m_window_size - 1 - i] - min_obv);
            m_bit.Update(i + 1, normalized_vol);
           }
         int mid_point = m_window_size / 2;
         double recent_vol_sum = m_bit.QueryRange(mid_point + 1, m_window_size);
         double historical_vol_sum = m_bit.QueryRange(1, mid_point);
         if(historical_vol_sum > 0)
           {
            double current_ratio = recent_vol_sum / historical_vol_sum;
            double scale_factor = 1.0;
            //--- Select the designated Algorithm Iteration
            switch(m_algo_mode)
              {
               case 1:
                  scale_factor = AlgorithmMode1_Linear(current_ratio);
                  break;
               case 2:
                  scale_factor = AlgorithmMode2_Conservative(current_ratio);
                  break;
               case 3:
                  scale_factor = AlgorithmMode3_Aggressive(current_ratio);
                  break;
               case 4:
                  scale_factor = AlgorithmMode4_MeanReversion(current_ratio);
                  break;
              }
            lot = NormalizeDouble(lot * scale_factor, 2);
           }
         //--- Gatekeeper: The Neural Network Filter
         if(m_use_cnn)
           {
            double seq[];
            ArrayResize(seq, m_window_size);
            for(int i = 0; i < m_window_size; i++)
              {
               seq[i] = m_bit.QueryRange(i + 1, i + 1);
              }
            double cnn_coefficient = m_cnn.Calculate(seq);
            lot = NormalizeDouble(lot * cnn_coefficient, 2);
           }
        }
     }
   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(lot);
  }

В приведенном выше листинге CNN используется в ветви if, проверяющей, включена ли CNN. Если CNN включена, объявленный массив последовательности заполняется данными и передается экземпляру класса CNN через функцию Calculate. Сеть оценивает пространственную структуру объема и возвращает коэффициент вероятности. Это значение не является статичным коэффициентом, а представляет собой динамический показатель уверенности сети в сигналах, генерируемых классами Envelopes и RSI. 

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


Отчеты Тестера стратегий и анализ производительности

Тестирование проводится для оценки эффективности алгоритма, нейронной сети и возможной синергии их сочетания. Проведены два независимых теста: один только с алгоритмом Фенвика, другой – с алгоритмом Фенвика и CNN. Оценка синергии алгоритма и сети позволяет определить преимущества перехода от жесткого линейного подхода к нелинейной архитектуре с фильтрацией на основе машинного обучения. Тестирование EURUSD проводится с 01.01.2025 по 01.05.2026. Окно оптимизации – с 01.01.2025 по 30.01.2025, а период форвардного тестирования – с 01.01.2026 по 01.05.2026. Используются те же сигналы входа из пользовательских классов Envelopes и RSI, а внимание сосредоточено исключительно на управлении капиталом. Отчет по форвардному тестированию после оптимизации с включенным только алгоритмом приведен ниже:

r1

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

Форвардный тест дал разочаровывающий результат: чистый убыток -773,82 доллара США и крайне низкий профит-фактор 0,39. Анализ сделок выявляет очевидные ошибки структурной интерпретации. Из шести сделок советника пять оказались убыточными, что соответствует доле убытков 83,33%. Какие причины могли привести к такому результату? Двоичное индексное дерево точно отобразило коэффициент объема и предоставило корректные данные. Однако линейная логика не соответствовала рыночному контексту.

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

Следует учитывать, что некоторые сигналы входа могли быть пропущены, поэтому форвардный отчет мог оказаться убыточным независимо от алгоритма. Чтобы проверить, сможет ли нейронная сеть скорректировать такое поведение, были повторно оптимизированы пороги сигналов и управления капиталом за 2025 год, после чего проведено форвардное тестирование за первые четыре месяца 2026 года. Таким образом, торговая среда, таймфрейм H4 и исходные индикаторы остались прежними. Однако пороги открытия и закрытия были скорректированы для более эффективной работы сочетания алгоритма и нейронной сети. Каждая последовательность из 32 периодов пространственно структурированных данных объема, полученная из дерева Фенвика, теперь напрямую передавалась в движок инференса CNN.

r2

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

Ввиду того, что CNN на втором фильтре одобрила лишь одну сделку, доля прибыльных сделок составила 100%. Несмотря на это, просадка по счету составила 15,65%, то есть около 1 500 долларов США, что значительно превышает итоговую чистую прибыль около 100 долларов. Следовательно, вход по-прежнему был связан с существенным риском. Однако при пяти убыточных сделках из шести можно предположить, что CNN правильно распознала достоверность базовой структуры объема, что позволило пережить значительную просадку.

Сопоставление двух форвардных тестов позволяет сделать важные выводы об управлении рисками. Альфу можно сохранять не только за счет исполнения сделок, но и за счет неучастия в них. Дерево Фенвика может формировать структурированное представление рынка и преобразовывать хаотичные объемные буферы в корректные карты признаков. Однако именно CNN, по-видимому, является ключевым элементом для безопасной интерпретации этой структуры и защиты капитала.


Выводы

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

  • Топологическое структурирование данных. Дерево Фенвика – это гораздо больше, чем инструмент ускорения. Это эффективный инструмент иерархической организации накопленных данных. Оно позволяет отобразить топологию объема без сложных пространственных запросов и громоздких манипуляций с массивами. 
  • Конструирование признаков для машинного обучения. Качество нейронной сети определяется качеством ее входных данных. Можно утверждать, что одномерная CNN была бы серьезно ограничена при подаче необработанных неструктурированных буферов. Дерево Фенвика изначально нормирует и подготавливает последовательные данные, преобразуя "хаотичные" объемные ряды в применимые карты признаков. Это создает синергию между алгоритмом и сетью. 
  • Снижение риска за счет нелинейности. Отчеты по тестированию показали, что нелинейное определение объема позиции может быть принципиально защитной стратегией. Используя CNN для анализа формы объема, советник не только мог увеличивать объем позиции, но и, что важнее, исключал задействование капитала в ловушках истощения, которые линейный множитель не распознавал. Воздержание от сделок в условиях шума позволило сохранить маржу.


Заключение

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

имя описание
wz_90_1.mq5 Советник, собранный Мастером MQL5
MoneyFenwick1.mqh Пользовательский класс управления капиталом, используемый в Мастере MQL5

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

Прикрепленные файлы |
wz_90_1.mq5 (8.8 KB)
MoneyFenwick1.mqh (14.17 KB)
Изучение стандартной библиотеки MQL5 (Часть 9): Использование ALGLIB для фильтрации избыточного числа сигналов пересечения скользящих средних Изучение стандартной библиотеки MQL5 (Часть 9): Использование ALGLIB для фильтрации избыточного числа сигналов пересечения скользящих средних
Во время боковых движений цены трейдеры сталкиваются с избыточными сигналами от множественных пересечений скользящих средних. Сегодня мы обсудим, как ALGLIB предварительно обрабатывает исходные данные о ценах для формирования отфильтрованных сигнальных серий пересечений, которые также могут генерировать оповещения при их возникновении. Давайте разберёмся, как можно использовать математическую библиотеку в программах на MQL5.
Неопределённость как модель (Часть 8): Обобщение МНК Неопределённость как модель (Часть 8): Обобщение МНК
Материал показывает, как в MQL5 корректировать результаты регрессий при гетероскедастичности и автокорреляции. Реализована HAC-оценка Ньюи—Уэста для получения робастных стандартных ошибок и корректных t-статистик, что продемонстрировано на задаче оценки влияния новостей на волатильность EURUSD. Для моделей с коррелированными остатками применен CLS для ARMA с регуляризацией Левенберга—Марквардта, проверенный на спреде GOOGL/AAPL.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Изучение стандартной библиотеки MQL5 (Часть 8): Ведение журнала сделок гибридной системы с помощью CFileTxt Изучение стандартной библиотеки MQL5 (Часть 8): Ведение журнала сделок гибридной системы с помощью CFileTxt
В этой статье мы рассмотрим классы модуля File Operations стандартной библиотеки MQL5 для создания надежного модуля отчетности, который автоматически генерирует CSV-файлы, готовые для использования в Excel. В процессе работы мы четко разграничим сделки, выполненные вручную, и ордера, выполненные алгоритмом, закладывая основу для надежной и поддающейся аудиту отчетности по сделкам.