
La estrategia de comercio por porcentaje de movimiento de volumen de transacción es un sistema de comercio integral que combina el análisis de la dinámica de la transacción, la filtración de la conducta de los precios, la detección de brechas y la lógica de stop loss/stop. El núcleo de la estrategia es identificar el momento de la expansión o contracción de la transacción mediante el cálculo de un indicador similar al Williams %R de la transacción relativa (RVPR) en combinación con un filtro de doble línea uniforme (Fast and Slow Moving Averages). La estrategia se ajusta aún más a las condiciones de la escena mediante un filtro de comportamiento de precios configurable, basado en diferentes tipos de gráficos de arbitraje.
El principio central de esta estrategia es convertir los datos de volumen de transacciones en intervalos porcentuales, utilizando un método de cálculo similar al de Williams %R para analizar la relación entre el volumen de transacciones actual y su alcance histórico. La estrategia utiliza los siguientes componentes clave para generar señales de transacción:
Oscilador de volumen de negocios relativo %R: compara el volumen de negocios actual con los máximos y mínimos de volumen de negocios histórico para calcular la posición relativa. Este indicador es similar al Williams %R en el campo de los precios, pero se aplica a los datos de volumen de negocios.
Filtro de doble media móvil: la estrategia utiliza dos promedios móviles de volumen de transacción (FAST y SLOW) y se puede elegir entre varios algoritmos de suavización (SMA, EMA, JMA, T3, Super Smoother, etc.). Cuando el volumen de transacciones es mayor que el promedio rápido y el promedio rápido es mayor que el promedio lento, se puede hacer una señal múltiple para indicar una tendencia de volumen de transacciones hacia arriba; y viceversa.
El filtro de comportamiento de los precios: filtra las señales de comercio de acuerdo con las diferentes formas de filtración:
Atravesar el filtro: selectivamente excluye las operaciones cerca de los puntos altos/bajos de los 5 pilares para evitar operaciones con un riesgo de rendimiento inferior.
Sistemas de detención y parada: mecanismo de detención/parada dinámico basado en el ATR (Amplitud Real Media), que se puede configurar multiplicadamente para ajustar la distancia de detención y parada.
Tiempo de salida: se puede optar por salir de la operación después de un número fijo de palos.
Las condiciones de entrada multihead incluyen: volumen de transacción mayor que el promedio móvil rápido, promedio móvil rápido mayor que el promedio móvil lento, volumen de transacción relativo% R mayor que el umbral, el precio a través de filtros de dirección multihead, y la opción de estar por debajo del punto más alto de ruptura reciente. Las condiciones de entrada de cabeza vacía son al contrario, y se disparan a la posición de paridad en las condiciones de salida establecidas.
Análisis multidimensional: Esta estrategia combina el volumen de transacciones, el comportamiento de los precios y la dinámica de las paradas/paradas para proporcionar un marco integral de análisis del mercado.
Altitud personalizable: la estrategia ofrece una variedad de parámetros que se pueden ajustar, incluido el control de la dirección de la operación, el filtro de diferentes modelos de comportamiento de precios, la selección del tipo de promedio móvil de volumen de transacción, etc., lo que permite a los comerciantes personalizarlos según su propio estilo y preferencias del mercado.
Filtrado de entrada inteligente: mediante la combinación de la dinámica de la transacción y el comportamiento del precio, la estrategia puede identificar oportunidades de transacción de mayor probabilidad y evitar señales de transacción de baja calidad.
Mecanismos de salida flexibles: La estrategia ofrece opciones de salida basadas en el tiempo y el precio, incluidas las salidas de número de barras fijas y el stop/stop dinámico basado en ATR, lo que hace que la gestión del riesgo sea más flexible y efectiva.
Adaptación a varios entornos de mercado: a través de diferentes modelos de comportamiento de precios (simple, filtrado, agresivo, interno), las estrategias pueden adaptarse a diferentes condiciones de mercado, incluidas las tendencias y los mercados intermedios.
Integración de indicadores tecnológicos avanzados: la estrategia integra varios tipos de promedios móviles avanzados, como JMA, T3 y Super Smoother, que funcionan bien para reducir el ruido y capturar las tendencias reales.
Riesgo de optimización de parámetros: debido a que la estrategia contiene varios parámetros ajustables, existe el riesgo de optimización excesiva, lo que puede conducir a un excelente rendimiento de retroalimentación histórica pero una mala efectividad en el disco. La solución es el uso de pruebas avanzadas y análisis de robustez para garantizar que los parámetros se mantengan estables en diferentes condiciones de mercado.
Riesgo de falsa ruptura: los saltos de volumen de transacción no siempre están acompañados de un movimiento de precios sostenible. La estrategia puede generar una señal errónea en una falsa ruptura. Se puede mitigar este riesgo agregando indicadores de confirmación adicionales o retrasando la entrada.
Dependencia del entorno de mercado: la estrategia puede no funcionar de manera consistente en diferentes entornos de mercado (por ejemplo, alta volatilidad vs baja volatilidad). Se recomienda probar la estrategia en diferentes condiciones de mercado antes de implementarla.
Riesgo de desencadenar un stop: el stop basado en el ATR puede desencadenarse cuando la volatilidad se expande repentinamente. Es posible que sea más efectivo considerar el uso de un multiplicador de stop ajustado a la volatilidad o el establecimiento de un stop en un punto clave de soporte/resistencia.
Tiempo de salida no es flexible: los salidas de barras fijas pueden cerrar operaciones ganadoras demasiado pronto o cerrar operaciones perdedoras demasiado tarde. Se puede considerar el momento de salida de manera dinámica en combinación con tendencias o indicadores de dinámica.
Complejidad de los cálculos: La estrategia utiliza una variedad de complejos algoritmos de medias móviles y combinaciones de condiciones, lo que puede aumentar la carga de cálculo y provocar retrasos en la ejecución. En las operaciones en tiempo real, es posible que se necesite simplificar algunos indicadores intensivos en el cálculo.
Ajuste dinámico de la barrera: la estrategia actual utiliza una barrera R% de volumen de negocios relativo fijo (<27), se puede considerar la posibilidad de realizar un ajuste automático de la barrera de adaptación, en función de la volatilidad de volumen de negocios reciente. Esto permitirá a la estrategia adaptarse mejor a las diferentes condiciones del mercado y a los cambios estacionales.
Confirmación de varios marcos de tiempo: la introducción de señales de confirmación de marcos de tiempo más altos, que solo se negocian en la dirección de la tendencia más grande, puede mejorar la probabilidad de éxito de la estrategia y el porcentaje de retorno por riesgo. Por ejemplo, la señal múltiple en la línea horaria se ejecuta solo cuando la línea diaria se mueve hacia arriba en el día.
Análisis de la calidad del volumen de transacciones: Además del volumen de transacciones relativo, se puede agregar un indicador de dispersión del volumen de transacciones o un análisis de la distribución del volumen de transacciones para evaluar la calidad del volumen de transacciones en lugar de solo la cantidad. Esto ayuda a distinguir entre las tendencias saludables en la confirmación del volumen de transacciones y las señales de agotamiento potencial.
Detención inteligente: El detener/parar de base de ATR actual puede ser mejorado para un sistema más inteligente, por ejemplo, basado en posiciones de soporte/resistencia clave, o el uso de un detener ajustado por volatilidad, que aprieta la detención en períodos de baja volatilidad y relaja la detención en períodos de alta volatilidad.
Incorporación de la estructura del mercado: la integración de análisis de la estructura del precio (como soporte/resistencia, líneas de tendencia, canales de precios) en la estrategia puede mejorar la calidad de los puntos de entrada y salida.
Mejora de la gestión de riesgos: realiza un ajuste dinámico del tamaño de la posición, basado en la volatilidad del mercado actual y el rendimiento de la estrategia reciente, aumenta la posición en un entorno de alta probabilidad de éxito y reduce la posición en un período de incertidumbre.
Integración de aprendizaje automático: El uso de algoritmos de aprendizaje automático para optimizar dinámicamente los parámetros de la estrategia o predecir qué filtros de comportamiento de precios son más efectivos en las condiciones actuales del mercado puede mejorar aún más el rendimiento de la estrategia.
La estrategia de comercio por porcentaje de movimiento de volumen de transacción relativo es un sistema de comercio completo y flexible que ofrece a los comerciantes una herramienta poderosa para identificar oportunidades potenciales de mercado mediante la combinación de análisis de volumen de transacción, filtros de comportamiento de precios múltiples y tecnologías de gestión de riesgos dinámicos. La ventaja central de la estrategia reside en su adaptabilidad y personalización, que permite a los comerciantes adaptarse a las preferencias personales y las condiciones del mercado.
La estrategia es especialmente adecuada para los comerciantes que buscan señales de reversión o continuación de la tendencia basadas en la confirmación del volumen de transacción. Mediante el uso de un indicador de volumen de transacción relativo al estilo de Williams % R, la estrategia puede identificar saltos de volumen de transacción que generalmente representan cambios importantes en el estado de ánimo del mercado o aceleración de la tendencia.
A pesar de que la estrategia ofrece muchas ventajas, los comerciantes deben estar atentos a los riesgos potenciales de optimización excesiva y la dependencia de las condiciones del mercado. Mediante la prueba y el ajuste continuos, combinados con la dirección de optimización recomendada, los comerciantes pueden mejorar aún más la estabilidad y la rentabilidad a largo plazo de esta estrategia. Finalmente, como todas las estrategias de negociación, la clave del éxito radica en una comprensión profunda de sus principios, administrar sabiamente los riesgos y evaluar continuamente su rendimiento en diferentes condiciones del mercado.
/*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)