Estrategia de negociación del oscilador del ciclo delta de la diferencia de volumen

El autor:¿ Qué pasa?, Fecha: 2023-10-30 11:45:42
Las etiquetas:

img

Resumen general

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.

La lógica de la negociación

  1. 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.

  2. Calcular Bandas de Bollinger de n resultado para obtener bbr que representa la desviación estándar del impulso de volumen.

  3. Calcular Bandas de Bollinger de precio cerrado para obtener bbr1 que representa la desviación estándar del precio.

  4. 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.

  5. 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.

Ventajas

  1. 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.

  2. 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.

  3. 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.

  4. Usar el suavizado exponencial triple en los datos Hist hace que las señales sean más precisas y suaves.

  5. El establecimiento de líneas sobrecompradas/sobrevendidas y órdenes de stop loss/take profit largas/cortas ayuda a controlar los riesgos de manera efectiva.

  6. 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.

Los riesgos

  1. Es posible que los datos de volumen no reflejen realmente las operaciones de mercado y puedan ser manipulados.

  2. Es posible que la divergencia entre el volumen y el precio no persista y que el precio se rompa sin revertirse.

  3. La configuración incorrecta de los parámetros puede causar exceso de negociación o señales inexactas.

  4. Tenga cuidado con las señales falsas de los datos de volumen anormales.

  5. 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.

Oportunidades de mejora

  1. Optimizar los parámetros de Bollinger Bands para señales más estables.

  2. Añadir un filtro de tendencia para evitar el comercio contra la tendencia.

  3. Incorporar otros indicadores como el MACD para la confirmación de la señal.

  4. Utilice la IA para optimizar automáticamente los parámetros de forma adaptativa.

  5. Añadir un stop loss/take profit dinámico para optimizar la gestión del riesgo.

  6. Aplicar el aprendizaje automático para determinar la tasa de éxito de la divergencia de volumen-precio para una mayor calidad de señal.

Conclusión

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)



Más.