Разработка торговой стратегии с использованием подхода Volume Boundary
Введение: недооцененная сила объема
Движение цены на финансовых рынках не происходит само по себе. За каждым изменением — будь оно резким или едва заметным — стоит сила, которая его вызывает: объем. Однако в мире технического анализа цена часто оказывается в центре внимания. Трейдеры тщательно размечают поддержку, сопротивление и графические паттерны, но часто упускают из виду ключевую силу, которая на самом деле движет этими ценовыми изменениями. Объем — это двигатель рынка, и понимание его «языка» является ключом к переходу от пассивного наблюдения за графиком к осознанной, стратегической торговле.
В этой статье мы представляем математический подход, позволяющий преобразовать исходные, неограниченные данные объема в форму с ограниченным диапазоном значений — то, что мы называем индикатором 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, мы используем тиковый объем и математически преобразуем его в новую шкалу с ограниченным диапазоном значений. Исходный объем (или тиковый объем) не ограничен — он может расти неопределенно долго, — поэтому его трудно напрямую использовать для порогов или осцилляторов. Чтобы сделать поведение объема более удобным для интерпретации, мы выполняем две ключевые операции:
Преобразуем исходный объем с помощью масштабирующей функции (нормализации или логарифмического преобразования).
Пропускаем масштабированный объем через нелинейную функцию сглаживания, чтобы ограничить его фиксированным диапазоном.
Нормализованное преобразование: этот метод масштабирует объем на основе его недавних статистических характеристик, делая его тяготеющим к среднему значению.

Логарифмическое преобразование: этот метод уменьшает влияние чрезвычайно больших значений объема, сжимая их, и при этом слегка расширяет меньшие значения. Он особенно полезен на рынках, где объем часто демонстрирует нерегулярные всплески, помогая создать более сбалансированную и читаемую шкалу.
![]()
Где:
- t = масштабированное значение объема
- m = коэффициент масштабирования для настройки чувствительности
- AvgVol = простая скользящая средняя объема за заданный период
- StdVol = стандартное отклонение объема за тот же период
- Volume = текущий объем
Хотя эти преобразования стандартизируют данные, однако даже после этого выходное значение t все еще не имеет жестких границ. Следующий, решающий шаг — пропустить это масштабированное значение через функцию сглаживания, которая приводит его к фиксированному, предсказуемому диапазону.
Функция сглаживания: создание границы
После преобразования масштабированный объем передается в функцию сглаживания, чтобы привести его к фиксированному диапазону. Это делает значение осциллирующим, плавным и подходящим для порогов в индикаторе.
- Функция кривой «бабочка»
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
Чтобы вычислить нормализованный объем, нам нужны среднее значение и стандартное отклонение объема за выбранный период. Торговая платформа должна рассчитывать эти два ключевых статистических компонента для каждого нового бара.
Стандартное отклонение объема задается так:

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

Где:

- σ = стандартное отклонение
- N = количество выборок объема
- μ = простое среднее значение объема
- v = отдельное значение объема
Итоговая схема работы:
- Вычислить AvgVol и StdVol.
- Преобразовать объем с помощью нормализации или логарифмического масштабирования.
- Передать преобразованное значение в функцию сглаживания - Кривая «бабочка»
- Вывести результат как индикатор 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() является вычислительным ядром, которое формирует важнейшую статистическую базу на основе исходных данных тикового объема.
Ключевые шаги:
- Функция проходит по заданному периоду VolumePeriod и вычисляет сумму объемов, а также сумму их квадратов.
- Затем она рассчитывает простое среднее значение ( AvgVolBuffer ).
- Используя вычисленное среднее, она получает дисперсию, а затем стандартное отклонение ( StdVolBuffer ). Конструкция MathMax(variance, 0) гарантирует, что дисперсия никогда не станет отрицательной, что важно для численной устойчивости.
- Эти значения сохраняются в буферах индикатора для использования на последующем этапе преобразования.
//+------------------------------------------------------------------+ //| 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. Цикл обрабатывает бары, двигаясь от последних к более ранним, обеспечивая эффективное и точное обновление индикатора.
Сначала вычисляется статистика объема
Функция CalculateVolumeStats() определяет среднее значение и стандартное отклонение за выбранный период анализа. Эти значения необходимы для нормализованного преобразования.Вычисляется масштабированное входное значение t
С помощью CalculateInputT() код преобразует исходный объем в масштабированную форму — либо через нормализацию, либо через логарифмическое преобразование, в зависимости от выбора пользователя.Применяется функция сглаживания
Если выбрана кривая «бабочка», масштабированное значение t передается в ButterflyMethod(t).
Если выбрана тройная синусоида, вместо нее используется TripleSineMethod(t).
Результат сохраняется в буфере осциллятора
Вычисленный результат помещается в OscillatorBuffer[i] , который затем отображается на графике как итоговый объемный осциллятор с ограниченным диапазоном значений.
По сути, этот цикл является вычислительным ядром индикатора: он преобразует исходный объем в математически ограниченный диапазоном осциллятор с помощью выбранного метода сглаживания.
Демонстрация работы осциллятора Volume Boundary (VBO)
В этом разделе мы рассмотрим, как осциллятор Volume Boundary (VBO) визуально ведет себя на графике при двух доступных методах входного преобразования: нормализованном и логарифмическом. Эти примеры помогают показать, как индикатор реагирует на изменения рыночной активности и как функции сглаживания влияют на его выход.
Использование нормализованного преобразования:
Когда применяется нормализованный метод (рисунок 1), осциллятор свободно колеблется как в положительной, так и в отрицательной области. Поскольку этот метод корректирует объем относительно его среднего значения и стандартного отклонения, VBO становится очень чувствительным к изменениям волатильности и торговой активности. Такое поведение сохраняется на всех таймфреймах и для обеих функций сглаживания — кривой «бабочка» и тройной синусоиды.

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

Рисунок 2: логарифмическое преобразование VBO
Разработка торгового робота Volume Bound Expert Advisor (VBO-EA)
После завершения разработки осциллятора Volume Boundary (VBO) мы расширяем его применение, создавая торговую стратегию и советник VBO-EA, который использует индикатор для формирования торговых сигналов на покупку и продажу. VBO может генерировать сигналы несколькими способами, например:
- Метод порогов — реакция на заранее заданные верхний и нижний граничные уровни
- Метод наклона гистограммы — анализ растущих или уменьшающихся столбцов осциллятора
- Метод пересечения нулевой линии — обнаружение изменений рыночного импульса
В этой статье мы демонстрируем подход на основе порогов, дополненный базовым подтверждением движением цены (price action).
Торговая стратегия: порог и подтверждение движением цены
Этот подход требует, чтобы VBO пробил заранее заданный пороговый уровень, а направление самой ценовой свечи подтвердило сигнал. Такой двухуровневый фильтр помогает убедиться, что объемный сигнал сопровождается соответствующим движением цены, повышая надежность сигнала.
Критерии входа
Сигнал на покупку:
Сделка на покупку открывается при выполнении обоих условий ниже:
- Последняя закрытая свеча является бычьей (Close > Open)
- Сигнал VBO пересекает заданный пороговый уровень
Пороговый уровень может быть положительным или отрицательным в зависимости от используемого метода сглаживания и настроек трейдера.
Сигнал на продажу:
Сделка на продажу открывается, когда:
- Последняя закрытая свеча является медвежьей (Close < Open)
- Сигнал VBO пересекает выбранный пороговый уровень
Это объединяет подтверждение на основе объема с направлением движения цены.
Правила выхода
Каждая сделка будет управляться с помощью заранее заданных уровней Take Profit (TP) и Stop Loss (SL). Их можно задавать как фиксированное число пунктов или как процент от капитала счета. Для выхода из позиций мы используем фиксированное значение в пунктах.
Логика нескольких входов
Стратегия допускает два входа в одном направлении, но с чередованием порога, чтобы избежать скопления сделок на одном и том же сигнале.
Правила следующие:
Если первый вход происходит на положительном пороге,
то второй вход должен происходить на отрицательном пороге (и наоборот).Для второго входа требуется только условие порога — подтверждение движением цены не нужно.
Такой подход с чередованием порогов помогает диверсифицировать входы и избежать чрезмерной концентрации на одном импульсном всплеске.
Пример:- Первый вход в покупку: срабатывает на отрицательном пороге при поддержке подтверждения движением цены
- Второй вход в покупку: срабатывает на положительном пороге без необходимости подтверждения движением цены
Эта структура гарантирует, что последующие входы происходят при разных объемных условиях, что помогает лучше сбалансировать входы и сократить число дублирующих сигналов.
Демонстрация торгового советника VBO Expert Advisor
VBO-EA предоставляет гибкий набор пользовательских параметров, позволяющих трейдерам адаптировать стратегию под предпочитаемые рыночные условия и профиль риска. Эти параметры также можно оптимизировать в MetaTrader 5, чтобы повысить результативность и определить наиболее эффективные комбинации параметров.
EA предоставляет ряд настраиваемых параметров, включая:
- Параметры индикатора (метод преобразования, метод сглаживания, коэффициент масштабирования, период объема)
- Торговые параметры, такие как размер лота
- Пороговые уровни, используемые для сигналов Buy и Sell
- Значения Take Profit и Stop Loss для управления риском
Эти настройки, показанные на рисунке 3, дают трейдерам полный контроль над тем, как VBO-EA интерпретирует поведение объема и выполняет сделки.

Рисунок 3: параметры 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
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Изучение стандартной библиотеки MQL5 (часть 1): Знакомство с CTrade, CiMA и CiATR
Создание профессиональной торговой системы на основе Heikin Ashi (Часть 1): Разработка пользовательского индикатора
Рыночные секреты Ларри Уильямса (Часть 1): Создание индикатора свинговой структуры рынка в MQL5
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования