Estrategia de ruptura de rango dinámico

El autor:¿ Qué pasa?, Fecha: 2023-11-21 15:03:19
Las etiquetas:

img

Resumen general

Esta estrategia está diseñada sobre la base del indicador de Bollinger Bands para crear una estrategia de negociación de ruptura dinámica. Combina las condiciones del filtro del cuerpo de la vela y el filtro de color para buscar oportunidades de entrada de ruptura alrededor de la banda inferior de Bollinger. Las salidas se basan en el filtro del cuerpo. La estrategia gestiona automáticamente el tamaño de la posición y el riesgo.

Estrategia lógica

Cálculo del indicador

Primero, calcule la línea base y la banda inferior de las bandas de Bollinger basándose en el precio bajo:

src = low
basis = sma(src, length) 
dev = mult * stdev(src, length)
lower = basis - dev

Donde src es el precio bajo, longitud es el período de cálculo, base es la media móvil, dev es la desviación estándar y inferior es la banda inferior.

mult se establece generalmente en 2, lo que significa que la banda inferior está a una desviación estándar de distancia.

Condiciones del filtro

La estrategia incluye dos condiciones de filtro:

Filtro del cuerpo de la velaUtilice el tamaño del cuerpo nbody y su abody medio para determinar, sólo generar la señal de comercio cuando nbody es mayor que la mitad de abody.

Filtro de colores
Esto evita una falsa ruptura en la cabeza de la hbox.

Señales comerciales

Generar señal larga cuando se cumplan las condiciones siguientes:

low < lower // price breaks lower band
close < open or usecol == false // color filter
nbody > abody / 2 or usebod == false // body filter  

Cuando el tamaño del cuerpo exceda de nuevo la mitad de la media, posición cercana:

close > open and nbody > abody / 2  

Tamaño de la posición

La estrategia calcula el tamaño de la operación automáticamente para el crecimiento exponencial de la posición:

lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1] 

Control de riesgos

Añadir restricciones sobre el año, el mes y la fecha para limitar la negociación solo en un rango de fechas específico:

when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))

Ventajas

Rango dinámico de operaciones

La banda inferior de Bollinger proporciona un área de soporte dinámico para capturar retracements después de tendencias.

Filtro doble

La combinación del cuerpo de la vela y los filtros de color evita los falsos brotes de manera efectiva.

Tamaño automático de la posición

Los tamaños de las posiciones aumentan exponencialmente al 100% gestionando el riesgo automáticamente.

Rango de fecha

El establecimiento de un intervalo de fechas reduce el riesgo asociado a la volatilidad del mercado en períodos específicos.

Los riesgos

Descenso prolongado

Cuando la tendencia al alza es fuerte, las bandas media y superior de BB pueden moverse hacia arriba rápidamente, causando una caída prolongada.

Soluciones

Combinar con indicadores de tendencia, detener la estrategia cuando se juzga que es un mercado alcista para evitar una reducción prolongada.

Fracaso de la fuga

El escape puede fallar con el retiro y re-prueba de la banda inferior.

Soluciones

Agregue stop loss por debajo del nivel de soporte o agregue lógica para detectar una nueva prueba fallida para un stop loss rápido.

Mejoras

Añadir Stop Loss

Optimizar el stop loss por debajo del soporte basado en los resultados de las pruebas de retroceso.

Optimiza los parámetros

Fino sintonizar el cuerpo del filtro período de permanencia, filtro de color, etc. para encontrar óptimo.

Añadir filtro de tendencia

Detener la estrategia cuando se juzga que es un mercado alcista.

Conclusión

Esta estrategia combina soporte BB, filtro de cuerpo, filtro de color y lógica de ruptura para capturar retracements de alta probabilidad.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Wizard Strategy v1.0", shorttitle = "Wizard str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
length = input(25, defval = 25, minval = 1, maxval = 200, title = "BB Period")
usebod = input(false, defval = false, title = "Use Body-Filter")
usecol = input(false, defval = false, title = "Use Color-Filter")
showar = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Bollinger
src = low
mult = 2
basis = sma(src, length)
dev = mult * stdev(src, length)
lower = basis - dev
plot(lower, color = lime, linewidth = 3, title="Bottom Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebod == false

//Signals
up1 = low < lower and (close < open or usecol == false) and body
exit = close > open and nbody > abody / 2

//Arrows
needar = up1 and showar
plotarrow(needar ? 1 : na)

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Más.