Estrategia de ruptura doble

El autor:¿ Qué pasa?, fecha: 2023-11-03 17:16:02
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Análisis de ventajas

  • Las bandas de Bollinger ofrecen señales claras de ruptura para captar oportunidades de tendencia
  • El filtro ADX evita el comercio de mercados agitados sin tendencias claras
  • Stop loss controla eficazmente las pérdidas de una sola operación
  • El retraso en las ganancias se bloquea en la mayoría de las ganancias

Análisis de riesgos

  • Las rupturas pueden ser falsas sin considerar el volumen
  • El filtro ADX también puede perder oportunidades de tendencia
  • Detener pérdidas y tomar ganancias demasiado cerca puede ser detenido fuera
  • El mal ajuste de los parámetros afecta el rendimiento de la estrategia

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.

Direcciones de mejora

  • Optimizar la longitud de las bandas de Bollinger para obtener los mejores resultados de ruptura
  • Filtro ADX de sintonía fina para equilibrar la precisión de la tendencia y las señales falsas
  • Añadir otros indicadores para confirmar la validez de la ruptura
  • Optimizar el rango de pérdida de parada para evitar una sensibilidad excesiva
  • Ampliar el rango de ganancias para obtener más ganancias

Conclusión

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)




Más.