Esta estrategia juzga la conversión de los ciclos alcista y bajista calculando la tasa de cambio del cambio de volumen, que pertenece a las estrategias de divergencia de volumen-precio. Combina el indicador de impulso del volumen y las bandas de Bollinger del precio para determinar el efecto principal del cambio de volumen en el precio y capturar los puntos de inflexión de las tendencias.
Calcular la tasa de cambio del cambio de volumen (la tasa de cambio del indicador de diferencia de volumen), para obtener el resultado del indicador basado en el impulso de volumen.
Calcular Bandas de Bollinger de n resultado para obtener bbr que representa la desviación estándar del impulso de volumen.
Calcular Bandas de Bollinger de precio cerrado para obtener bbr1 que representa la desviación estándar del precio.
Calcular la diferencia hist entre los dos, que es la desviación estándar del impulso de volumen menos la desviación estándar del precio, como indicador final.
Cuando el hist cruza por encima de 0, es la señal de entrada corta, y cuando cruza por debajo de 0, es la señal de entrada larga.
Al calcular la tasa de cambio del cambio de volumen, se amplifica el efecto principal del cambio de volumen en el precio. Cuando el volumen se invierte mientras el precio aún no se ha invertido, hist cruzará por encima o por debajo de 0, generando señales comerciales. Puede predecir los puntos de inflexión de las tendencias de precios con anticipación.
Esta estrategia es una estrategia de divergencia volumen-precio basada en la tasa de cambio de volumen, que puede reflejar de antemano los puntos de inflexión de las tendencias de los precios.
El cálculo de la tasa de cambio del cambio de volumen amplifica el efecto principal del cambio de volumen en el precio, lo que resulta en un mejor rendimiento comercial.
La combinación de indicadores de impulso de volumen con bandas de Bollinger de precios hace que las señales comerciales sean más confiables.
Usar el suavizado exponencial triple en los datos Hist hace que las señales sean más precisas y suaves.
El establecimiento de líneas sobrecompradas/sobrevendidas y órdenes de stop loss/take profit largas/cortas ayuda a controlar los riesgos de manera efectiva.
Muchos parámetros personalizables como la longitud de las bandas de Bollinger, el multiplicador de desviación estándar y los factores de suavizado Hist permiten la optimización de la estrategia.
Es posible que los datos de volumen no reflejen realmente las operaciones de mercado y puedan ser manipulados.
Es posible que la divergencia entre el volumen y el precio no persista y que el precio se rompa sin revertirse.
La configuración incorrecta de los parámetros puede causar exceso de negociación o señales inexactas.
Tenga cuidado con las señales falsas de los datos de volumen anormales.
Las señales de reversión deben evitarse cuando la tendencia es fuerte.
Los riesgos se pueden mitigar optimizando los parámetros, agregando otros filtros y configurando stop loss/take profit.
Optimizar los parámetros de Bollinger Bands para señales más estables.
Añadir un filtro de tendencia para evitar el comercio contra la tendencia.
Incorporar otros indicadores como el MACD para la confirmación de la señal.
Utilice la IA para optimizar automáticamente los parámetros de forma adaptativa.
Añadir un stop loss/take profit dinámico para optimizar la gestión del riesgo.
Aplicar el aprendizaje automático para determinar la tasa de éxito de la divergencia de volumen-precio para una mayor calidad de señal.
Esta estrategia amplifica el efecto principal del cambio de volumen en el precio mediante el cálculo de la tasa de cambio de volumen, lo que permite la detección temprana de los puntos de inflexión de la tendencia. En comparación con los indicadores de volumen individuales, tiene una mayor confiabilidad y precisión. Pero los riesgos como la manipulación de volumen y la ruptura de la divergencia deben protegerse a través de la optimización de parámetros, filtros de indicadores, etc. En el futuro, la IA puede aprovecharse para la optimización adaptativa de parámetros para mejorar aún más la estabilidad y la rentabilidad de la estrategia.
/*backtest start: 2022-10-23 00:00:00 end: 2023-10-29 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © tathal and special thanks to oakwhiz for his porting of my custom volume indicator //@version=5 strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000) startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31) startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12) startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100) endDate = input.int(title='End Date', defval=31, minval=1, maxval=31) endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12) endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100) // Normalize Function normalize(_src, _min, _max) => // Normalizes series with unknown min/max using historical min/max. // _src : series to rescale. // _min, _min: min/max values of rescaled series. var _historicMin = 10e10 var _historicMax = -10e10 _historicMin := math.min(nz(_src, _historicMin), _historicMin) _historicMax := math.max(nz(_src, _historicMax), _historicMax) _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10) // STEP 2: // Look if the close time of the current bar // falls inside the date range inDateRange = true // Stop loss & Take Profit Section l_sl_inp = input(2.0, title='Long Stop Loss %') / 100 l_tp_inp = input(4.0, title='Long Take Profit %') / 100 l_stop_level = strategy.position_avg_price * (1 - l_sl_inp) l_take_level = strategy.position_avg_price * (1 + l_tp_inp) s_sl_inp = input(2.0, title='Short Stop Loss %') / 100 s_tp_inp = input(4.0, title='Short Take Profit %') / 100 s_stop_level = strategy.position_avg_price * (1 + s_sl_inp) s_take_level = strategy.position_avg_price * (1 - s_tp_inp) src = close // Volume Differnce Indicator Delta float change_src = ta.change(src) float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume) float i_pvt = ta.pvt float result = ta.change(i_obv - i_pvt) float nresult = ta.ema(normalize(result, -1, 1), 20) // Volume Differnce Indicator Delta %B length = input.int(20, minval=1, title='Volume Bands Length') mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev') basis = ta.ema(nresult, length) dev = mult * ta.stdev(nresult, length) upper = basis + dev lower = basis - dev bbr = (nresult - lower) / (upper - lower) // Normal %B, Based on close l1 = input.int(20, minval=1, title='Bollinger Bands Length') src2 = close mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev') basis1 = ta.sma(src2, l1) dev1 = mult1 * ta.stdev(src2, l1) upper1 = basis1 + dev1 lower1 = basis1 - dev1 bbr1 = (src - lower1) / (upper1 - lower1) /// Final Output Line hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3')) /// Overbought / Oversold Line Creation oversold = input(-.1) overbought = input(.4) hline(oversold, linewidth=2, color=color.new(#81c784, 62)) hline(overbought, linewidth=2, color=color.new(#c2185b, 38)) /// Long & Short Conditions short = hist > overbought long = hist < oversold /// Colors & Plotting histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350 plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0)) CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na bgcolor(color.new(CrossBgColor, 90)) /// Strategy Methodology if inDateRange strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level) if inDateRange and strategy.position_size > 0 strategy.close_all(when=short) if inDateRange strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level) if inDateRange and strategy.position_size < 0 strategy.close_all(when=long)