Esta estrategia utiliza bandas de Bollinger para identificar puntos de ruptura para operaciones largas y cortas, combinadas con el indicador ADX para filtrar condiciones de mercado desfavorables de baja volatilidad, con el fin de seguir las tendencias.
La estrategia se basa principalmente en el indicador de Bollinger Bands para determinar la dirección larga o corta. La banda media de Bollinger Bands es la media móvil de N días del precio de cierre, y el ancho de la banda se calcula utilizando la desviación estándar. Una ruptura por debajo de la banda inferior señala operaciones largas, mientras que una ruptura por encima de la banda superior señala operaciones cortas.
Para evitar breakouts inválidos y operaciones erróneas en mercados agitados sin tendencia, la estrategia incorpora el indicador ADX para filtrar las condiciones de mercado de baja volatilidad. Las señales de negociación solo se generan cuando el valor de ADX está por debajo de un umbral.
La estrategia también establece el stop loss y take profit para operaciones abiertas. Específicamente, después de abrir una posición, el precio más bajo y el precio más alto de los N días anteriores se registran como los niveles de stop loss y take profit para esa dirección. Esto permite bloquear las ganancias mientras se reducen las pérdidas por reversiones.
Desde la lógica del código, la estrategia primero calcula las bandas de Bollinger y los parámetros de ADX. Luego comprueba si el precio rompe la banda superior o inferior de las bandas, y si ADX está por debajo del umbral, para generar señales comerciales.
Considere combinar con otros indicadores para confirmar la ruptura con el volumen; optimizar el filtro ADX utilizando la pendiente para identificar los cambios de tendencia; ampliar el rango de stop loss y take profit para evitar una salida prematura.
La estrategia tiene una lógica clara y simple, utilizando bandas de Bollinger para señales de ruptura obvias, filtradas por ADX para las condiciones de tendencia, para capturar oportunidades de tendencia.
/*backtest start: 2023-10-26 00:00:00 end: 2023-11-02 00:00:00 period: 1m basePeriod: 1m 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/ // © tweakerID // This strategy uses Bollinger Bands to buy when the price // crosses over the lower band and sell when it crosses down // the upper band. It only takes trades when the ADX is // below a certain level, and exits all trades when it's above it. //@version=4 strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100) //Inputs i_reverse=input(false, title="Reverse Trades") i_ADXClose=input(true, title="ADX Close") i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit") i_SwingLookback=input(20, title="Swing Lo/Hi Lookback") i_SLExpander=input(defval=0, step=.5, title="SL Expander") i_TPExpander=input(defval=0, step=.5, title="TP Expander") //ADX Calculations adxlen = input(14, title="ADX Smoothing") dilen = input(20, title="DI Length") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) adxlevel=input(30, step=5) //BB Calculations BBCALC=input(false, title="-----------BB Inputs-----------") length = input(20, minval=1) mult = input(2.0, minval=0.001, maxval=50) MAlen=input(defval=9) source = close basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Entry Logic BUY = crossover(source, lower) and sig < adxlevel SELL = crossunder(source, upper) and sig < adxlevel //SL & TP Calculations SwingLow=lowest(i_SwingLookback) SwingHigh=highest(i_SwingLookback) bought=strategy.position_size != strategy.position_size[1] LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander) SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander) lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander)) sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander) islong=strategy.position_size > 0 isshort=strategy.position_size < 0 SL= islong ? LSL : isshort ? SSL : na TP= islong ? lTP : isshort ? sTP : na //Entries strategy.entry("long", long=i_reverse?false:true, when=BUY) strategy.entry("short", long=i_reverse?true:false, when=SELL) //EXITS if i_ADXClose strategy.close_all(when=sig > adxlevel) if i_SL strategy.exit("longexit", "long", stop=SL, limit=TP) strategy.exit("shortexit", "short", stop=SL, limit=TP) //Plots plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL") plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP") plot(upper) plot(lower)