English Deutsch 日本語
preview
Разработка торговой стратегии с использованием подхода Volume Boundary

Разработка торговой стратегии с использованием подхода Volume Boundary

MetaTrader 5Трейдинг |
252 0
Daniel Opoku
Daniel Opoku

Введение: недооцененная сила объема

Движение цены на финансовых рынках не происходит само по себе. За каждым изменением — будь оно резким или едва заметным — стоит сила, которая его вызывает: объем. Однако в мире технического анализа цена часто оказывается в центре внимания. Трейдеры тщательно размечают поддержку, сопротивление и графические паттерны, но часто упускают из виду ключевую силу, которая на самом деле движет этими ценовыми изменениями. Объем — это двигатель рынка, и понимание его «языка» является ключом к переходу от пассивного наблюдения за графиком к осознанной, стратегической торговле.

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


Понимание объема: пульс рынка

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

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

  • Низкий объем: наоборот, движение цены на низком объеме рассматривается как слабое и потенциально ненадежное. Оно указывает на отсутствие консенсуса и может быстро развернуться, поскольку не имеет широкой поддержки со стороны участников рынка.

Хотя многие индикаторы, такие как Market Facilitation Index (MFI), On-Balance Volume (OBV) и Accumulation/Distribution, пытаются учитывать объем, они часто представляют расчетные или накопительные значения, которые трудно стандартизировать. Наша цель — работать с объемом более напрямую, сначала приведя его к предсказуемому ограниченному диапазону.

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


Важное различие: реальный объем и тиковый объем

Важно понимать, что данные «объема», доступные трейдерам, неодинаковы на разных рынках.

  • Фондовый рынок (реальный объем): на централизованных биржах, таких как NYSE или NASDAQ, объем фиксируется точно и однозначно. Он отражает фактическое количество проторгованных акций. Если за день было проторговано 5 миллионов акций Microsoft, дневной объем составляет 5 миллионов. Эти данные публикуются в реальном времени и отличаются высокой точностью.

  • Рынок Forex (тиковый объем): валютный рынок децентрализован, и на нем нет единой организации, которая сообщала бы общий объем. Вместо этого Forex-брокеры предоставляют тиковый объем, который используется как приближенный показатель фактической торговой активности. Тиковый объем измеряет количество изменений цены (или «тиков») за заданный период. Логика здесь достаточно надежна: большое число изменений цены обычно подразумевает высокий уровень торговой активности и реального объема. 

Несмотря на это различие, было показано, что тиковый объем сильно коррелирует с фактически проторгованным объемом на децентрализованных рынках, и он широко принят для анализа объема на Forex. В рамках этой статьи мы будем использовать тиковый объем в качестве базовых входных данных для нашего индикатора Volume Boundary.


Математическая основа: построение Volume Boundary

Чтобы построить индикатор Volume Boundary, мы используем тиковый объем и математически преобразуем его в новую шкалу с ограниченным диапазоном значений. Исходный объем (или тиковый объем) не ограничен — он может расти неопределенно долго, — поэтому его трудно напрямую использовать для порогов или осцилляторов. Чтобы сделать поведение объема более удобным для интерпретации, мы выполняем две ключевые операции:

  1. Преобразуем исходный объем с помощью масштабирующей функции (нормализации или логарифмического преобразования).

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

Нормализованное преобразование: этот метод масштабирует объем на основе его недавних статистических характеристик, делая его тяготеющим к среднему значению. 

NormVol

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

logVol

Где:

  • t  = масштабированное значение объема
  • m  = коэффициент масштабирования для настройки чувствительности
  • AvgVol  = простая скользящая средняя объема за заданный период
  • StdVol  = стандартное отклонение объема за тот же период
  • Volume  = текущий объем

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


Функция сглаживания: создание границы

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

  1. Функция кривой «бабочка»
Используется x-компонента кривой «бабочка». Эта нелинейная циклическая функция применяется к преобразованному объему  t  и ограничивает его диапазоном примерно от +3.0 до -3.0. Ее сложная волнообразная природа позволяет улавливать нюансы объемной активности. Функция выражается следующим образом:

f(t) = sin(t) × expr

Где:  expr = e^(cos(t)) − 2cos(4t) − ( sin(t/12) )^5

Повторяющийся и ограниченный паттерн кривой «бабочка» идеально подходит для выявления циклических экстремумов объемного импульса.

Визуализацию кривой «бабочка» и подробности смотрите здесь-->:  https://www.mql5.com/ru/articles/20113


      2.
Функция тройной синусоиды

Более простая, но эффективная альтернатива — функция тройной синусоиды, ограничивающая масштабированный объем строгим диапазоном от +1 до -1. Это придает индикатору привычный вид классического осциллятора, знакомый пользователям RSI или Stochastics. Функция имеет вид:

f(t) = ( sin(t) )^3

Эта функция дает нормализованный выход с четко различимыми экстремумами по мере приближения индикатора к границам +1 или -1.

График функции тройной синусоиды и подробности приведены здесь: https://www.mql5.com/ru/articles/20220


Построение индикатора Volume Boundary

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

Стандартное отклонение объема задается так: 

StdVol

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

stdform2

Где: 

AvgVol

  • σ = стандартное отклонение
  • N = количество выборок объема
  • μ = простое среднее значение объема
  • v = отдельное значение объема

Итоговая схема работы:

  1. Вычислить AvgVol и StdVol.
  2. Преобразовать объем с помощью нормализации или логарифмического масштабирования.
  3. Передать преобразованное значение в функцию сглаживания
  4. - Кривая «бабочка»  
    - Кривая тройной синусоиды
  5. Вывести результат как индикатор Volume Boundary.

Для нормализации:

  • объем → масштабированное значение → функция сглаживания → выходное значение в ограниченном диапазоне

Для логарифмического масштабирования:

  • объем → log(volume) → функция сглаживания → выходное значение в ограниченном диапазоне


Структура кода индикатора

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

input int VolumePeriod = 20;                    // Period for volume average and std dev
input double ScaleFactor = 1.0;                 // Scaling factor (m)
input ifcn InputMethod = 1;                     // Input method
input sfcn SmoothingMethod = 1;                 // Smoothing method

Индикатор разработан с учетом гибкости, позволяя трейдерам адаптировать его поведение под свою конкретную стратегию и рынок. Это достигается за счет внешних входных параметров:

  • VolumePeriod определяет, сколько баров используется для расчета среднего значения и стандартного отклонения объема.
  • ScaleFactor (m) применяет множитель к преобразованным значениям объема.
  • InputMethod позволяет выбрать между нормализованным и логарифмическим преобразованием.
  • SmoothingMethod позволяет пользователю выбрать между кривой «бабочка» и функцией тройной синусоиды.
   // Set indicator range based on smoothing method
   if(SmoothingMethod == ButterflyCurve)
   {
      IndicatorSetDouble(INDICATOR_MINIMUM, -3.2);
      IndicatorSetDouble(INDICATOR_MAXIMUM, 3.2);
   }
   else
   {
      IndicatorSetDouble(INDICATOR_MINIMUM, -1.2);
      IndicatorSetDouble(INDICATOR_MAXIMUM, 1.2);
   }

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

  • Кривая «бабочка»: границы устанавливаются на -3.2 и +3.2, что учитывает более широкий естественный диапазон выходных значений этой функции.

  • Тройная синусоида: границы устанавливаются на -1.2 и +1.2, идеально обрамляя типичный диапазон осциллятора от -1 до +1 с небольшим запасом.

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

//+------------------------------------------------------------------+
//| Calculate average volume and standard deviation                  |
//+------------------------------------------------------------------+
void CalculateVolumeStats(int pos, int rates_total, const long &tick_volume[])
{
   double sum = 0.0;
   double sumSq = 0.0;
   int count = 0;
   
   for(int i = pos; i < pos + VolumePeriod && i < rates_total; i++)
   {
      double volume_val = (double)tick_volume[i];
      sum += volume_val;
      sumSq += volume_val * volume_val;
      count++;
   }
   
   if(count > 0)
   {
      AvgVolBuffer[pos] = sum / count;
      double variance = (sumSq / count) - (AvgVolBuffer[pos] * AvgVolBuffer[pos]);
      StdVolBuffer[pos] = MathSqrt(MathMax(variance, 0));
   }
   else
   {
      AvgVolBuffer[pos] = 0;
      StdVolBuffer[pos] = 1;
   }
}

Функция  CalculateVolumeStats()  является вычислительным ядром, которое формирует важнейшую статистическую базу на основе исходных данных тикового объема.

Ключевые шаги:

  1. Функция проходит по заданному периоду  VolumePeriod  и вычисляет сумму объемов, а также сумму их квадратов.
  2. Затем она рассчитывает простое среднее значение ( AvgVolBuffer ).
  3. Используя вычисленное среднее, она получает дисперсию, а затем стандартное отклонение ( StdVolBuffer ). Конструкция  MathMax(variance, 0)  гарантирует, что дисперсия никогда не станет отрицательной, что важно для численной устойчивости.
  4. Эти значения сохраняются в буферах индикатора для использования на последующем этапе преобразования.
//+------------------------------------------------------------------+
//| Calculate scaled input t                                         |
//+------------------------------------------------------------------+
double CalculateInputT(int pos, const long &tick_volume[])
{
   double currentVolume = (double)tick_volume[pos];
   double t = 0;
   
   if(InputMethod == scaledMethod)
   {
      if(StdVolBuffer[pos] != 0)
         t = ScaleFactor * (currentVolume - AvgVolBuffer[pos]) / StdVolBuffer[pos];
      else
         t = 0;
   }
   else // logMethod
   {
      if(currentVolume > 0)
         t = ScaleFactor * MathLog(currentVolume);
      else
         t = 0;
   }
   
   return t;
}

Функция  CalculateInputT()  — это место, где исходный объем масштабируется в стандартизованное значение  t , готовое к финальной операции ограничения.

Логика работы:

  • Сначала функция получает тиковый объем текущего бара.

  • Если выбран нормализованный (масштабированный) метод, она рассчитывает  t  по формуле:
    t = m * (Volume - AvgVol) / StdVol . Это показывает, на сколько стандартных отклонений текущий объем отличается от своего недавнего среднего значения.

  • Если выбран логарифмический метод, она вычисляет  t  как:
    t = m * log(Volume) , что сжимает шкалу объема и эффективнее работает с большими диапазонами значений.

  • Полученное значение  t  возвращается и позже передается в выбранную функцию сглаживания (Butterfly или Triple Sine), чтобы сформировать итоговое значение индикатора в ограниченном диапазоне.

   for(int i = limit; i >= 0; i--)
   {
      // Calculate volume statistics
      CalculateVolumeStats(i, rates_total, tick_volume);
      
      // Calculate scaled input t
      double t = CalculateInputT(i, tick_volume);
      
      // Apply smoothing function
      if(SmoothingMethod == ButterflyCurve)
      {
         OscillatorBuffer[i] = ButterflyMethod(t);
      }
      else // Triple sine method
      {
         OscillatorBuffer[i] = TripleSineMethod(t);
      }
   }

Этот фрагмент индикатора выполняет основное вычисление для осциллятора Volume Boundary. Цикл обрабатывает бары в обратном порядке — от самых новых баров к более старым, обеспечивая эффективное и точное обновление индикатора.

  1. Сначала вычисляется статистика объема
    Функция CalculateVolumeStats() определяет среднее значение и стандартное отклонение за выбранный период анализа. Эти значения необходимы для нормализованного преобразования.

  2. Вычисляется масштабированное входное значение t
    С помощью CalculateInputT() код преобразует исходный объем в масштабированную форму — либо через нормализацию, либо через логарифмическое преобразование, в зависимости от выбора пользователя.

  3. Применяется функция сглаживания

    • Если выбрана кривая «бабочка», масштабированное значение t передается в ButterflyMethod(t).

    • Если выбрана тройная синусоида, вместо нее используется TripleSineMethod(t).

  4. Результат сохраняется в буфере осциллятора
    Вычисленный результат помещается в OscillatorBuffer[i] , который затем отображается на графике как итоговый объемный осциллятор с ограниченным диапазоном значений.

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


Демонстрация работы осциллятора Volume Boundary (VBO)

В этом разделе мы рассмотрим, как осциллятор Volume Boundary (VBO) визуально ведет себя на графике при двух доступных методах входного преобразования: нормализованном и логарифмическом. Эти примеры помогают показать, как индикатор реагирует на изменения рыночной активности и как функции сглаживания влияют на его выход.

Использование нормализованного преобразования:

Когда применяется нормализованный метод (рисунок 1), осциллятор свободно колеблется как в положительной, так и в отрицательной области. Поскольку этот метод корректирует объем относительно его среднего значения и стандартного отклонения, VBO становится очень чувствительным к изменениям волатильности и торговой активности. Такое поведение сохраняется на всех таймфреймах и для обеих функций сглаживания — кривой «бабочка» и тройной синусоиды. 

VBO_NT

Рисунок 1: нормализованное преобразование VBO

Использование логарифмического преобразования:

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

VBO_LN

Рисунок 2: логарифмическое преобразование VBO


Разработка торгового робота Volume Bound Expert Advisor (VBO-EA)

После завершения разработки осциллятора Volume Boundary (VBO) мы расширяем его применение, создавая торговую стратегию и советник VBO-EA, который использует индикатор для формирования торговых сигналов на покупку и продажу. VBO может генерировать сигналы несколькими способами, например:

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

В этой статье мы демонстрируем подход на основе порогов, дополненный базовым подтверждением движением цены (price action).

Торговая стратегия: порог и подтверждение движением цены


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

Критерии входа

Сигнал на покупку:

Сделка на покупку открывается при выполнении обоих условий ниже:

  1. Последняя закрытая свеча является бычьей (Close > Open)
  2. Сигнал VBO пересекает заданный пороговый уровень

    Пороговый уровень может быть положительным или отрицательным в зависимости от используемого метода сглаживания и настроек трейдера.

    Сигнал на продажу:

    Сделка на продажу открывается, когда:

    1. Последняя закрытая свеча является медвежьей (Close < Open)
    2. Сигнал VBO пересекает выбранный пороговый уровень

      Это объединяет подтверждение на основе объема с направлением движения цены.

      Правила выхода

      Каждая сделка будет управляться с помощью заранее заданных уровней Take Profit (TP) и Stop Loss (SL). Их можно задавать как фиксированное число пунктов или как процент от капитала счета. Для выхода из позиций мы используем фиксированное значение в пунктах.

      Логика нескольких входов

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

      Правила следующие:

      • Если первый вход происходит на положительном пороге,
        то второй вход должен происходить на отрицательном пороге (и наоборот).

      • Для второго входа требуется только условие порога — подтверждение движением цены не нужно.

      Такой подход с чередованием порогов помогает диверсифицировать входы и избежать чрезмерной концентрации на одном импульсном всплеске.

      Пример:
      • Первый вход в покупку: срабатывает на отрицательном пороге при поддержке подтверждения движением цены
      • Второй вход в покупку: срабатывает на положительном пороге без необходимости подтверждения движением цены

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


      Демонстрация торгового советника VBO Expert Advisor

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

      EA предоставляет ряд настраиваемых параметров, включая:

      • Параметры индикатора (метод преобразования, метод сглаживания, коэффициент масштабирования, период объема)
      • Торговые параметры, такие как размер лота
      • Пороговые уровни, используемые для сигналов Buy и Sell
      • Значения Take Profit и Stop Loss для управления риском

      Эти настройки, показанные на рисунке 3, дают трейдерам полный контроль над тем, как VBO-EA интерпретирует поведение объема и выполняет сделки.

      VBO_inputs

      Рисунок 3: параметры VBO-EA

      VBO_EA

      Рисунок 4: демонстрация VBO EA


      Заключение

      В этой статье был представлен осциллятор Volume Boundary (VBO) — новый подход, который преобразует исходный рыночный объем в интерпретируемый сигнал в ограниченном диапазоне с помощью математических функций, таких как кривая «бабочка» и тройная синусоида. Преобразуя неограниченный объем в управляемую осциллирующую форму с ограниченным диапазоном значений, VBO дает более ясное представление об участии рынка, импульсе и изменениях активности на разных таймфреймах.

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

      Это исследование подчеркивает ценность переосмысления традиционных рыночных элементов — таких как объем — через математические структуры для получения новых перспектив и повышения ясности торговых решений.

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

      Имя файлаОписание
      VolumeBoundary.mq5Этот файл содержит индикатор, который отображается в отдельном окне графика. Он обрабатывает и визуализирует данные объема, приведенные к фиксированным границам, позволяя трейдерам наблюдать за поведением осциллятора независимо от основного ценового графика.
      VB_EA.mq5Этот файл содержит торговый советник (Expert Advisor, EA), отвечающий за выполнение автоматизированных торговых решений. Он интегрирует логику осциллятора Volume Boundary (VBO), обрабатывает входящие сигналы и управляет входами и выходами из сделок в соответствии с заданными правилами стратегии.

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

      Прикрепленные файлы |
      VolumeBoundary.mq5 (6.79 KB)
      VB_EA.mq5 (11.5 KB)
      Изучение Стандартной библиотеки MQL5 (часть 1): Знакомство с CTrade, CiMA и CiATR Изучение Стандартной библиотеки MQL5 (часть 1): Знакомство с CTrade, CiMA и CiATR
      Стандартная библиотека MQL5 — чрезвычайно полезный инструмент при разработке торговых алгоритмов для MetaTrader 5. В этой серии мы будем учиться создавать с помощью нее эффективные торговые инструменты для MetaTrader 5. Под инструментами подразумеваются собственные советники, индикаторы и другие вспомогательные средства. Сегодня мы разработаем трендового советника с использованием классов CTrade, CiMA и CiATR. Тема будет полезна всем — и начинающим, так и опытным разработчикам. Приятного чтения.
      Создание  профессиональной торговой системы на основе Heikin Ashi (Часть 1): Разработка пользовательского индикатора Создание профессиональной торговой системы на основе Heikin Ashi (Часть 1): Разработка пользовательского индикатора
      Эта статья — первая часть серии из двух материалов, предназначенной для освоения практических навыков и лучших практик написания пользовательских индикаторов на MQL5. На практическом примере Heikin Ashi в статье рассматривается теория графиков Heikin Ashi, объясняется, как рассчитываются свечи Heikin Ashi, и показывается их применение в техническом анализе. Центральная часть материала — пошаговое руководство по разработке полнофункционального индикатора Heikin Ashi с нуля, с понятными пояснениями, которые помогают читателям разобраться, что именно писать в коде и почему. Эти базовые знания подготовят почву для второй части, где мы создадим советник, торгующий на основе логики Heikin Ashi.
      Моделирование рынка: Position View (II) Моделирование рынка: Position View (II)
      В этой статье я покажу как максимально просто и практично использовать индикатор для отслеживания открытых позиций на торговом сервере. Я делаю это именно так, шаг за шагом, чтобы показать, что вам не обязательно переносить всё это в советник. Многие из вас, вероятно, уже привыкли к этому по той или иной причине. На самом деле это ерунда, так как по мере развития данной реализации станет ясно, что вы сможете создавать или реализовать различные типы индикаторов для этой цели.
      Рыночные секреты Ларри Уильямса (Часть 1): Создание индикатора свинговой структуры рынка в MQL5 Рыночные секреты Ларри Уильямса (Часть 1): Создание индикатора свинговой структуры рынка в MQL5
      Практическое руководство по созданию индикатора рыночной структуры в стиле Ларри Уильямса на MQL5: настройка буферов, определение свинговых точек, настройка графических построений и применение индикатора трейдерами в техническом анализе рынка.