Esta estrategia genera bandas de precios basadas en la volatilidad suavizada del precio y produce señales comerciales cuando el precio rompe las bandas.
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.
Las ventajas de esta estrategia son:
El uso de la volatilidad de los precios para construir señales comerciales puede rastrear eficazmente los cambios del mercado.
La suavización de la volatilidad con una media móvil exponencial puede filtrar el ruido y generar señales comerciales más confiables.
El intervalo de bandas puede ajustarse mediante el coeficiente de volatilidad, lo que hace que la estrategia sea más flexible.
Combinado con el juicio de ruptura, puede capturar las oportunidades comerciales a tiempo cuando se produce una inversión de tendencia.
Esta estrategia también presenta algunos riesgos:
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.
La configuración incorrecta del rango de banda puede conducir a un sobrecomercio o a señales insuficientes.
Hay un retraso temporal en las señales de ruptura, lo que puede causar una entrada prematura o una entrada tardía.
La estrategia se puede optimizar mediante:
Prueba de diferentes ciclos de datos de precios para encontrar el período más adecuado para calcular la volatilidad.
Probando diferentes algoritmos de promedio móvil como promedio móvil ponderado.
Introducción del volumen de operaciones u otros indicadores para confirmar las señales de ruptura.
Configuración del stop loss o del trailing stop para controlar las pérdidas por operación.
Optimización del coeficiente de volatilidad para determinar el rango óptimo de banda.
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")