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

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

MetaTrader 5Трейдинг |
35 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/en/articles/20113


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

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

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

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

График функции тройной синусоиды и подробности приведены здесь: https://www.mql5.com/en/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.
      Особенности написания экспертов Особенности написания экспертов
      Написание и тестирование экспертов в торговой системе MetaTrader 4.
      Рыночные секреты Ларри Уильямса (Часть 1): Создание индикатора свинговой структуры рынка в MQL5 Рыночные секреты Ларри Уильямса (Часть 1): Создание индикатора свинговой структуры рынка в MQL5
      Практическое руководство по созданию индикатора рыночной структуры в стиле Ларри Уильямса на MQL5: настройка буферов, определение свинговых точек, настройка графических построений и применение индикатора трейдерами в техническом анализе рынка.