Estrategia de banda de volatilidad suave

El autor:¿ Qué pasa?, Fecha: 2024-01-29 16:22:14
Las etiquetas:

img

Resumen general

Esta estrategia genera bandas de precios basadas en la volatilidad suavizada del precio y produce señales comerciales cuando el precio rompe las bandas.

Estrategia lógica

La estrategia primero calcula el rango de volatilidad promedio del precio durante un cierto período, luego suaviza el rango de volatilidad utilizando un promedio móvil exponencial para generar volatilidad suavizada. La volatilidad suavizada multiplicada por un coeficiente da el rango de las bandas. Cuando el precio se rompe por encima de la banda superior, se genera una señal de compra. Cuando el precio se rompe por debajo de la banda inferior, se genera una señal de venta.

Específicamente, la volatilidad suavizada smrng se calcula mediante la función smoothrng. La banda superior hband y la banda inferior lband de las bandas de precios se calculan a continuación sobre la base de smrng. La condición larga longCondition y la condición corta shortCondition se configuran en función de eso. Cuando se cumple la condición larga, se genera una señal de compra. Cuando se cumple la condición corta, se genera una señal de venta.

Análisis de ventajas

Las ventajas de esta estrategia son:

  1. El uso de la volatilidad de los precios para construir señales comerciales puede rastrear eficazmente los cambios del mercado.

  2. La suavización de la volatilidad con una media móvil exponencial puede filtrar el ruido y generar señales comerciales más confiables.

  3. El intervalo de bandas puede ajustarse mediante el coeficiente de volatilidad, lo que hace que la estrategia sea más flexible.

  4. Combinado con el juicio de ruptura, puede capturar las oportunidades comerciales a tiempo cuando se produce una inversión de tendencia.

Análisis de riesgos

Esta estrategia también presenta algunos riesgos:

  1. En la volatilidad anormal del mercado, la volatilidad suavizada puede no reflejar con precisión la volatilidad real, lo que lleva a señales erróneas.

  2. La configuración incorrecta del rango de banda puede conducir a un sobrecomercio o a señales insuficientes.

  3. Hay un retraso temporal en las señales de ruptura, lo que puede causar una entrada prematura o una entrada tardía.

Direcciones de optimización

La estrategia se puede optimizar mediante:

  1. Prueba de diferentes ciclos de datos de precios para encontrar el período más adecuado para calcular la volatilidad.

  2. Probando diferentes algoritmos de promedio móvil como promedio móvil ponderado.

  3. Introducción del volumen de operaciones u otros indicadores para confirmar las señales de ruptura.

  4. Configuración del stop loss o del trailing stop para controlar las pérdidas por operación.

  5. Optimización del coeficiente de volatilidad para determinar el rango óptimo de banda.

Resumen de las actividades

La lógica general de esta estrategia es clara, utilizando la volatilidad de los precios para construir bandas y las rupturas de precios para generar señales comerciales, que pueden rastrear eficazmente los cambios de tendencia del mercado.


/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)

// Source
src = input(defval=close, title="Source")

// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t * 2) - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])

downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)

strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)

// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")

// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")

// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)

// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")

Más.