
La estrategia de ondas de Bollinger es una estrategia de comercio cuantitativa que combina bandas de Bollinger y medias móviles. La estrategia genera señales de comercio mediante el cálculo de la diferencia estándar de las bandas de Bollinger y la señal cruzada de las medias móviles para determinar la tendencia del mercado y las zonas de sobreventa y sobreventa.
La estrategia primero calcula el promedio móvil del índice (EMA) en el período especificado como la línea de referencia. Luego, de acuerdo con esta EMA calcula la línea de subida (EMA + n veces la diferencia estándar) y la línea de bajada (EMA - n veces la diferencia estándar).
Cuando el precio está entre la línea de subida y la línea de bajada, es el rango de fluctuación normal del precio de la acción. Además, la estrategia se combina con otros indicadores como el RSI para filtrar las señales de negociación, reducir la frecuencia de negociación y reducir las pérdidas innecesarias.
En concreto, las reglas para juzgar las señales de negociación de esta estrategia son las siguientes:
Cuando aparezcan las señales de negociación mencionadas anteriormente, ingrese en forma de cantidad fija o proporción de cuenta. Cuando el precio vuelva a la banda de ondas o cuando aparezca la señal en sentido contrario, salga de la posición.
Esta estrategia combina el juicio de tendencia y el juicio de sobreventa y sobrecompra para evitar errores de negociación en el balanceado de crisis. En comparación con la estrategia de un solo indicador, se reduce la apertura de posiciones innecesarias y se controla el riesgo de manera efectiva.
En comparación con la simple estrategia de promedio móvil, las bandas de Bol reflejan mejor la volatilidad y el nivel de riesgo del mercado actual. Cuando la banda de onda es más ancha, la señal de negociación es más confiable; cuando la banda de onda es más ancha, la frecuencia de negociación se reduce automáticamente. Este ajuste de adaptación puede controlar el riesgo de la estrategia según las diferentes condiciones del mercado.
Además, la estrategia es doblemente confirmada por indicadores como el RSI, lo que permite filtrar algunas señales falsas y evitar operaciones erróneas en los puntos de cambio de tendencia. Esto también aumenta la probabilidad de victoria de la estrategia.
La estrategia enfrenta los siguientes riesgos:
Riesgo de optimización de parámetros. Si los parámetros de las medias móviles o los múltiplos de diferencia estándar se establecen incorrectamente, se producen más operaciones de ruido o oportunidades de negociación perdidas. Estos parámetros deben ser repetidamente probados y optimizados.
Riesgo de romper falsas señales. Cuando el precio se reajusta rápidamente después de una brecha corta en la línea de subida y bajada, se produce una señal errónea. En este momento, el comercio aumenta la pérdida. Este riesgo se puede controlar aumentando el ciclo de la media móvil o estableciendo un stop loss.
Riesgo de frecuencia de transacción. Si la brecha entre las líneas ascendentes y descendentes es demasiado pequeña, aumentará el número de transacciones y el pago de las comisiones. Esto tendrá un cierto impacto en la ganancia final.
La estrategia tiene espacio para ser optimizada aún más:
Aumentar los mecanismos de detención de pérdidas. Establecer un alto móvil o un alto de tiempo para ayudar a detener los pérdidas a tiempo y controlar las pérdidas individuales.
Aumentar la gestión de la posición. Por ejemplo, establecer reglas de aumento y disminución de la posición, para que las ganancias aumenten y las pérdidas disminuyan. Esto puede mejorar la rentabilidad de la estrategia.
En combinación con otras señales de filtración de indicadores. Indicadores como KDJ, MACD y otros pueden servir como señales auxiliares de juicio. Esto ayuda a mejorar aún más la rentabilidad de la estrategia.
Optimización de la configuración de los parámetros. La combinación de parámetros puede ser probada mediante métodos más sistemáticos, como algoritmos genéticos, para buscar una mejor configuración de los parámetros.
La estrategia de señales de fluctuación de la banda de Bol integra el juicio de tendencias de las medias móviles y el juicio de sobreventa y sobreventa. Se ajusta la frecuencia de las transacciones según los cambios en el rango de la banda de ondas y se puede adaptar a diferentes estados del mercado. Al mismo tiempo, se combina con indicadores como el RSI para filtrar la señal y evitar transacciones erróneas.
/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//@FiboBuLL
strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
src = input(close, title='Source')
length = input.int(55, minval=1, title='EMA length') // 20 for classis Bollinger Bands SMA line (basis)
mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation') //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)
Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type')
CC = input(true, 'Color Bars')
upper = basis + dev
lower = basis - dev
//Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc.
short = src < lower // and rsi(close,14)<40
long = src > upper // and rsi(close,14)>60
L1 = ta.barssince(long)
S1 = ta.barssince(short)
longSignal = L1 < S1 and not (L1 < S1)[1]
shortSignal = S1 < L1 and not (S1 < L1)[1]
//Plots and Fills
////Long/Short shapes with text
// plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true)
// plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true)
// plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true)
// plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true)
p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band')
p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band')
p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis')
fill(p, p1, color=color.new(color.teal, 85), title='Top Fill') //fill for basis-upper
fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85) //fill for basis-lower
//Barcolor
bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na
barcolor(CC ? bcol : na, editable=false, title='Color Bars')
// //Alerts ---- // Use 'Once per bar close'
// alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close'
// alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}') // Use 'Once per bar close'
Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗')
// === INPUT BACKTEST RANGE ===
FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=2018, title='From Year', minval=2015)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(defval=9999, title='To Year', minval=2010)
// === FUNCTION EXAMPLE ===
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() =>
time >= start and time <= finish ? true : false
if window() and (Show == 'Longs Only' or Show == 'Both')
strategy.entry('AL', direction=strategy.long, when=longSignal)
strategy.close('LongAL', when=shortSignal, comment='AL KAPA')
if window() and (Show == 'Shorts Only' or Show == 'Both')
strategy.entry('SAT', direction=strategy.short, when=shortSignal)
strategy.close('SAT', when=longSignal, comment='SAT KAPA')