
Соотносительно сделанная торговля в процентном соотношении - это комплексная торговая система, которая сочетает в себе анализ динамики сделанной торговли, фильтрацию ценового поведения, обнаружение прорывов и динамическую логику остановок/стопов. В основе стратегии лежит вычисление аналогичного показателя Williams %R для соотношения сделанной торговли (RVPR) в сочетании с двумя линейными фильтрами (Fast and Slow Moving Averages) для определения момента расширения или сокращения сделанной торговли.
Ключевым принципом этой стратегии является преобразование данных о количестве сделок в процентные диапазоны с использованием расчетных методов, аналогичных William %R, для анализа отношения текущих сделок к их историческому диапазону. Стратегия использует следующие ключевые компоненты для создания торговых сигналов:
Относительный оборот %R: сравнивает текущий оборот с историческими максимумами и минимумами оборотных величин и вычисляет относительную позицию. Этот показатель похож на Williams %R в области цен, но применяется к данным о оборотных величинах.
Двойная фильтрация движущихся средних: стратегия использует два движущихся средних по объему сделок (быстрое и медленное), можно выбрать различные алгоритмы сглаживания (SMA, EMA, JMA, T3, Super Smoother и т. Д.). Когда объем сделок больше, чем скоростная средняя линия, и скоростная средняя линия больше, чем медленная средняя линия, то можно сделать многосигнал, показывая тенденцию к росту сделок; и наоборот.
Фильтр ценового поведения: для дальнейшей фильтрации торговых сигналов в зависимости от различных форм фильтра:
Прорыв фильтра: выборочно исключайте сделки, находящиеся вблизи высоких/низких точек пяти столбцов, чтобы избежать сделок с низким соотношением риска и прибыли.
Система остановки и остановки: динамический механизм остановки/остановки, основанный на ATR (средняя реальная амплитуда), может быть настроен на множители для регулирования расстояния между остановкой и остановкой.
Время выхода: вы можете выбрать выход из сделки после фиксированного количества палок.
Условия многоголового входа включают: объем сделки, превышающий скоростной скользящий средний, скоростной скользящий средний, превышающий скоростной скользящий средний, относительный объем сделки %R превышающий пороговое значение, цены, проходящие через многоголовый фильтр направления, и опционально ниже недавнего прорывного максимума. Условия пустого входа - наоборот, и вызывают пассивное положение при установленных условиях выхода.
Многомерный анализ: Стратегия, объединяющая объемы сделок, ценовое поведение и динамику стоп-стопов, обеспечивает общую базу для анализа рынка.
Высота настраиваемости: Стратегия предлагает множество параметров, которые можно настроить, включая управление направлением торговли, различные модели фильтрации ценового поведения, выбор типа движущейся средней по объему торговли и т. д., что позволяет трейдерам настраивать их в соответствии с их собственным стилем и предпочтениями рынка.
Интеллектуальная фильтрация входа: благодаря объединению динамики оборота и модели ценового поведения, стратегия может идентифицировать более вероятные торговые возможности и избегать низкокачественных торговых сигналов.
Гибкий механизм выхода: стратегии предоставляют варианты выхода, основанные на времени и цене, включая выход с фиксированным количеством баров и динамический стоп/стоп на основе ATR, что делает управление рисками более гибким и эффективным.
Приспособность к различным рыночным условиям: стратегия может быть адаптирована к различным рыночным условиям, включая трендовые и промежуточные рынки, с помощью различных моделей ценового поведения (простые, фильтрованные, радикальные, внутренние).
Интеграция высокотехнологичных индикаторов: Стратегия включает в себя несколько высокотехнологичных типов скользящих средних, таких как JMA, T3 и Super Smoother, которые превосходно работают для уменьшения шума и захвата реальных тенденций.
Риск оптимизации параметров: из-за того, что стратегия содержит несколько настраиваемых параметров, существует риск переоптимизации, что может привести к превосходной производительности исторической обратной связи, но плохой эффективности в реальном времени. Решение заключается в использовании прогрессивного тестирования и анализа неустойчивости, чтобы гарантировать, что параметры могут оставаться стабильными в разных рыночных условиях.
Риск ложного прорыва: резкий рост объема торгов не всегда сопровождается устойчивым движением цены, тактика может создать ошибочный сигнал при ложном прорыве. Риск может быть уменьшен путем добавления дополнительных подтверждающих показателей или задержки входа.
Зависимость от рыночной среды: стратегия может работать неравномерно в различных рыночных условиях (например, высокая волатильность против низкой волатильности). Рекомендуется тестировать стратегию в различных рыночных условиях до ее реализации.
Риск возникновения стоп-убытков: использование стоп-убытков на основе ATR может быть вызвано в случае внезапного расширения волатильности. Возможно, будет более эффективно рассмотреть возможность использования стоп-убытков с использованием коэффициентов, скорректированных на волатильность, или настройка стоп-убытков на ключевые уровни поддержки/сопротивления.
Время выхода не является гибким: фиксированный выход может быть слишком ранним для закрытия прибыльной сделки или слишком поздним для закрытия убыточной сделки. Можно рассматривать время выхода в сочетании с трендом или динамическим показателем для динамической корректировки выхода.
Комплексность вычислений: стратегия использует множество сложных алгоритмов и комбинаций условий, которые могут увеличить нагрузку на вычисления и привести к задержкам в выполнении. В режиме реального времени может потребоваться упрощение некоторых вычислительно-интенсивных показателей.
Динамическая настройка на отступление: текущая стратегия использует фиксированный относительный объем сделок (%R) на отступление ((27), можно рассмотреть возможность осуществления адаптивной настройки на отступление в зависимости от последних колебаний объема сделок. Это позволит стратегии лучше адаптироваться к различным рыночным условиям и сезонным изменениям.
Подтверждение в нескольких временных рамках: введение подтверждающего сигнала в более высоких временных рамках, торгуя только в направлении более крупной тенденции, может повысить выигрышную вероятность стратегии и риск-рентабельность. Например, многоголовый сигнал на часовой линии выполняется только в том случае, если дневная линия имеет тенденцию к повышению.
Анализ качества объема сделок: помимо относительного объема сделок, можно добавить показатель дисперсии объема сделок или анализ распределения объема сделок, чтобы оценить качество сделок, а не только их количество. Это помогает различать здоровые тенденции, подтверждающие объем сделок и потенциальные сигналы об истощении.
Интеллектуальные остановки/остановки: существующие базовые остановки/остановки ATR могут быть улучшены для более интеллектуальных систем, например, основанных на ключевых позициях поддержки/сопротивления, или с использованием остановки, регулируемой волатильностью, с ужесточением остановки в периоды низких колебаний и расслаблением остановки в периоды высоких колебаний.
Интеграция с структурой рынка: интеграция анализа структуры цены (например, поддержка/сопротивление, трендовые линии, ценовые каналы) в стратегию может повысить качество точек входа и выхода.
Усиление управления рисками: осуществление динамического изменения размера позиции, основанного на текущей волатильности рынка и недавней стратегической деятельности, увеличение позиции в условиях высокой выигрышной вероятности и уменьшение позиции в неопределенный период.
Интеграция машинного обучения: использование алгоритмов машинного обучения для динамической оптимизации параметров стратегии или прогнозирования, какие фильтры ценового поведения наиболее эффективны в текущих рыночных условиях, может дополнительно повысить эффективность стратегии.
Стратегия торговли с динамикой процента относительной загруженности является полноценной и гибкой торговой системой, которая предоставляет трейдерам мощный инструмент для выявления потенциальных рыночных возможностей путем комбинирования анализа загруженности, фильтров многообразия ценового поведения и динамических технологий управления рисками. Основные преимущества стратегии заключаются в ее адаптивности и настраиваемости, позволяющей трейдерам приспосабливаться к личным предпочтениям и рыночным условиям.
Эта стратегия особенно подходит для тех трейдеров, которые ищут сигналы о реверсии или продолжении тренда, основанные на подтверждении торгового объема. С помощью показателя относительного торгового объема в стиле Williams % R стратегия может идентифицировать пики торгового объема, которые обычно представляют собой важные сдвиги в настроениях рынка или ускорение тренда.
Несмотря на то, что эта стратегия предлагает множество преимуществ, трейдеры должны быть осторожны с потенциальными рисками переоптимизации и зависимостью от рыночных условий. Благодаря постоянному тестированию и корректировке, в сочетании с рекомендуемым направлением оптимизации, трейдер может еще больше повысить устойчивость и долгосрочную прибыльность этой стратегии. В конечном итоге, как и для всех торговых стратегий, ключ к успеху заключается в глубоком понимании ее принципов, разумном управлении рисками и постоянной оценке ее эффективности в различных рыночных условиях.
/*backtest
start: 2024-07-04 00:00:00
end: 2025-07-02 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GabrielAmadeusLau
//@version=6
strategy("Relative Volume Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === Input: Trade Direction === //
tradeDirection = input.string("Long Only", title="Trade Direction", options=["Long Only", "Short Only", "Both"], group="Strategy Settings")
dirBarModeL = input.string("Simple", title="Long Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
dirBarModeS = input.string("Inside", title="Short Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
useBreakout = input.bool(true, "Use Breakout Filter", group="Strategy Settings")
useSLTP = input.bool(false, "Use Stop Loss & Take Profit", group="Strategy Settings")
atrSLMult = input.float(1, "ATR SL Multiplier", step = 0.05, group="Strategy Settings")
atrTPMult = input.float(1.75, "ATR TP Multiplier", step = 0.05, group="Strategy Settings")
// === Input: MA Function Selector === //
// — T3 Moving Average Function —
// src = input source (e.g. rsi1, close, etc.)
// length = smoothing length (period)
// a = T3 alpha (commonly between 0.7 and 0.9)
t3(src, length, a) =>
e1 = ta.ema(src, length)
e2 = ta.ema(e1, length)
e3 = ta.ema(e2, length)
e4 = ta.ema(e3, length)
e5 = ta.ema(e4, length)
e6 = ta.ema(e5, length)
c1 = -a * a * a
c2 = 3 * a * a + 3 * a * a * a
c3 = -6 * a * a - 3 * a - 3 * a * a * a
c4 = 1 + 3 * a + a * a * a + 3 * a * a
c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
// == Jurik MA == //
jma(float src, int length, float power, float phase) =>
phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
alpha = math.pow(beta, power)
JMA = 0.0
e0 = 0.0
e0 := (1 - alpha) * src + alpha * nz(e0[1])
e1 = 0.0
e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(e2[1])
JMA := e2 + nz(JMA[1])
//===== 2 Pole Super Smoother Filter =====//
superSmoother(float Series, float Period) =>
var float ALPHA = math.pi * math.sqrt(2.0) / Period
var float BETA = math.exp(-ALPHA )
var float COEF2 = -math.pow(BETA, 2)
var float COEF1 = math.cos( ALPHA ) * 2.0 * BETA
var float COEF0 = 1.0 - COEF1 - COEF2
float sma2 = math.avg(Series, nz(Series[1], Series))
float smooth = na, smooth := COEF0 * sma2 +
COEF1 * nz(smooth[1]) +
COEF2 * nz(smooth[2])
// === MA Selector === //
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :
type == "EMA" ? ta.ema(source, length) :
type == "SMMA (RMA)"? ta.rma(source, length) :
type == "WMA" ? ta.wma(source, length) :
type == "VWMA" ? ta.vwma(source, length) :
type == "HMA" ? ta.hma(source, length) :
type == "ALMA" ? ta.alma(source, length, 0.85, 6) :
type == "LSMA" ? ta.linreg(source, length, 0) :
type == "Optimal MA"? math.avg(ta.alma(source, length, 0.85, 6), ta.rma(source, length), ta.sma(source, length)) :
type == "JMA" ? jma(source, length, 2, 50) :
type == "Super Smoother" ? superSmoother(source, length) :
type == "T3" ? t3(source, length, 0.7) :
na
// === Input Parameters === //
rvolRLength = input.int(112, title="Relative Volume %R Length", minval=1, group="Relative Volume", tooltip="%R used for scaling from 0 to 100, I prefer 73 or 112.")
rvolmaTypeInput = input.string("Optimal MA" , "Type", options = ["None", "SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA", "HMA", "ALMA", "LSMA", "Optimal MA", "JMA", "Super Smoother", "T3"], group = "Relative Volume")
rvolFastLength = input.int(7, title="Relative Volume Fast MA", minval=1, group="Relative Volume")
rvolSlowLength = input.int(161, title="Relative Volume Slow MA", minval=1, group="Relative Volume")
exitBars = input.int(18, title="Bars Until Exit", group="Strategy Settings", tooltip="Exit trade after N bars")
rvolThreshold = input.int(27, "Minimum Relative Volume %R Threshold", group="Relative Volume")
// === Williams %R for Volume === //
wpr(src, length) =>
max_ = ta.highest(src, length)
min_ = ta.lowest(src, length)
(100 * (src - max_) / (max_ - min_)) * -1
// === Volume MAs === //
rvol = wpr(volume, rvolRLength)
rvolFast = ma(volume, rvolFastLength, rvolmaTypeInput)
rvolSlow = ma(volume, rvolSlowLength, rvolmaTypeInput)
// === Price Action Filters === //
up = close > open
upRange = low > low[1] and close > high[1]
upRange_Aggr = close > close[1] and close > open[1]
insideDayUp = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4] and close[4] < close[5] //and not (close > close[1])
down = close < open
downRange = high < high[1] and close < low[1]
downRange_Aggr= close < close[1] and close < open[1]
insideDayDown = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4] and close[4] > close[5] //and not (close < close[1])
breakoutHigh = ta.highest(high, 5)
breakoutLow = ta.lowest(low, 5)
// === Mode-Based Filter Logic === //
longBarOK =
dirBarModeL == "Simple" ? up :
dirBarModeL == "Filtered" ? upRange :
dirBarModeL == "Aggressive"? upRange_Aggr :
dirBarModeL == "Inside"? insideDayUp :
dirBarModeL == "Filtered & Aggressive" ? upRange or upRange_Aggr :
dirBarModeL == "Filtered & Aggressive & Inside" ? upRange or upRange_Aggr or insideDayUp :
dirBarModeL == "Without" ? true : false
shortBarOK =
dirBarModeS == "Simple" ? down :
dirBarModeS == "Filtered" ? downRange :
dirBarModeS == "Aggressive"? downRange_Aggr :
dirBarModeS == "Inside"? insideDayDown :
dirBarModeS == "Filtered & Aggressive"? downRange or downRange_Aggr or insideDayDown :
dirBarModeS == "Filtered & Aggressive & Inside"? upRange_Aggr or insideDayDown :
dirBarModeS == "Without" ? true : false
// === Entry & Exit Logic === //
longCondition = volume > rvolFast and rvolFast > rvolSlow and longBarOK and rvol > rvolThreshold and (not useBreakout or close < breakoutHigh)
shortCondition = volume < rvolFast and rvolFast < rvolSlow and shortBarOK and rvol < (100 - rvolThreshold) and (not useBreakout or close > breakoutLow)
exitLongCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Long"
exitShortCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Short"
atr = ta.atr(math.round(math.avg(rvolFastLength, rvolSlowLength)))
longSL = useSLTP ? close - atrSLMult * atr : na
longTP = useSLTP ? close + atrTPMult * atr : na
shortSL = useSLTP ? close + atrSLMult * atr : na
shortTP = useSLTP ? close - atrTPMult * atr : na
// === Strategy Execution === //
if (tradeDirection == "Long Only" or tradeDirection == "Both")
if (longCondition)
strategy.entry("Long", strategy.long, stop=longSL, limit=longTP)
if (tradeDirection == "Short Only" or tradeDirection == "Both")
if (shortCondition)
strategy.entry("Short", strategy.short, stop=shortSL, limit=shortTP)
if (exitLongCondition)
strategy.close("Long")
if (exitShortCondition)
strategy.close("Short")
// === Plotting === //
plot(rvol, title="Relative Volume %R", color=color.orange, style = plot.style_columns, format = format.price)
plot(rvolFast, title="Fast Volume MA", color=color.green, format = format.volume)
plot(rvolSlow, title="Slow Volume MA", color=color.red, format = format.volume)