Estrategia de seguimiento de tendencias de doble media móvil de banda de Bollinger

El autor:¿ Qué pasa?, Fecha: 2023-12-11 15:10:02
Las etiquetas:

img

Resumen general

Esta estrategia determina la dirección general de la tendencia del mercado mediante el cálculo de dos promedios móviles exponenciales (EMA) en diferentes plazos de tiempo e identifica oportunidades de sobrecompra y sobreventa a lo largo de la dirección de la tendencia utilizando bandas de Bollinger adaptativas para implementar el comercio de tendencias.

Estrategia lógica

  1. Se calcula la EMA de 200 períodos y la EMA de 30 períodos. Si la EMA de 200 es mayor que la EMA de 30, la tendencia a largo plazo se determina como alcista. De lo contrario, se determina como bajista.

  2. Una vez que se determina la dirección de la tendencia, se calcula la línea de base, la banda superior y la banda inferior de las bandas de Bollinger. La línea de base adopta SMA durante un marco de tiempo configurable (por ejemplo, 8 períodos). El ancho de banda es un multiplicador configurable (por ejemplo, 1.3 y 1.1) de la amplitud de los precios más altos y más bajos durante el mismo período que la línea de base.

  3. Cuando la tendencia a largo plazo es al alza, la ruptura de la banda inferior señala una entrada larga; cuando la tendencia a largo plazo es a la baja, la ruptura de la banda superior señala una entrada corta.

  4. Para filtrar las falsas rupturas, se comprueba que la tasa de cambio de la última vela antes de la ruptura está por debajo de un umbral configurable (por ejemplo, 3%), y se comprueba que el ancho de banda es mayor que un nivel configurable (por ejemplo, 2,2% del precio de cierre).

  5. Después de la apertura de posiciones, se establecen para bloquear las ganancias las posiciones de stop loss (por ejemplo, -3%) y take profit (por ejemplo, 10%).

Los puntos fuertes de la estrategia

  1. Las EMA duales definen la tendencia principal y evitan la apertura desordenada de posiciones cuando la tendencia principal no está clara.

  2. Las bandas de Bollinger adaptativas establecen puntos de entrada a lo largo de la tendencia.

  3. La velocidad de cambio y los requisitos de anchura mínima filtran eficazmente las fallas.

  4. Los ajustes de stop loss y take profit bloquean razonablemente las ganancias manteniendo los riesgos bajo control.

Riesgos estratégicos

  1. Las EMA duales no logran localizar con precisión los puntos de inversión de tendencia, perdiendo oportunidades en los puntos de inflexión de tendencia.

  2. Los parámetros BB incorrectos pueden causar señales falsas.

  3. El stop loss fijo y el take profit no pueden adaptarse a las fluctuaciones del mercado.

Direcciones de optimización

  1. Incorporar otros indicadores para determinar las inversiones de tendencia principales y secundarias.

  2. Adoptar el ajuste dinámico de los parámetros BB.

  3. Establecer órdenes condicionales para detener pérdidas y obtener ganancias basadas en criterios específicos.

Conclusión

Esta estrategia implementa el comercio de tendencias al juzgar la tendencia principal utilizando EMAs duales e identificar oportunidades con Bollinger Bands. Su fortaleza radica en establecer razonablemente las condiciones de entrada, stop loss y take profit para bloquear las ganancias de la tendencia. También hay algunos riesgos, como no capturar los puntos de inflexión de la tendencia y la configuración inadecuada del parámetro BB.


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

//@version=3
//////////////////////////////////////////////////////////////////////
// Component Code Start
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2039, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop

strategy("Custom Band Strategy", overlay=true)
source = close //종가 기준

//추세 조건 설정
emaLong = ema(source, input(200, minval=0))
emaShort = ema(source, input(30, minval=0))
trend = if emaShort>=emaLong
    1
else
    -1
    
plot(emaLong, color=red, transp=0)
plot(emaShort, color=blue, transp=0)


//BB 계산(default 14/3.2)
length = input(8, minval=1)

basis = sma(source, length)
plot(basis, color=green, transp=0)
max=highest(abs(source-basis), length)

factor1 = input(1.3, minval=0.5)
factor2 = input(1.1, minval=0.5)

upper = if trend==1
    basis + max*factor1
else
    basis + max*factor2
lower = if trend==-1
    basis - max*factor1
else
    basis - max*factor2

plot1 = plot(upper)
plot2 = plot(lower)
fill(plot1, plot2, transp=80, color=green)

//밴드 이탈 후 재진입 조건 설정
cross_over = (low<=lower and close>=lower) or crossover(close,lower)
cross_under = (high>=upper and close<=upper) or crossunder(close,upper)

//변동율 계산
maxCandle=highest(abs(open-close), length)
    
roc = abs(open-close)/open*100
changerate = input(3, minval=0.0)

//수익률 계산
value = abs(strategy.position_size)*strategy.position_avg_price
roe = strategy.openprofit/value * 100
expRoeL = (upper-lower)/lower*100
expRoeS = (upper-lower)/upper*100
exp = input(2.2, minval=0.0)

target = input(10, minval=0.0)
stop = input(-3, minval=-10.0)

strategy.close_all(when=roc>=changerate and testPeriod())
strategy.close_all(when=roe>=target and testPeriod())
strategy.close_all(when=roe<=stop and testPeriod())

plotchar(crossover(close,lower) and crossunder(close,upper),color=blue, transp=0, text="cross")
plotchar(roc>=changerate,color=red, transp=0, text="roc")
plotchar(roe>=target,color=blue, transp=0, text="target")
plotchar(roe<=stop,color=green, transp=0, text="stop")

minroe = input(2, minval=0.0)

strategy.close_all(when=cross_under and roe>minroe and testPeriod())
strategy.entry("BBandLE", strategy.long, stop=source, oca_name="BollingerBands",  comment="BBandLE", when=(cross_over) and trend==1 and roc<changerate and expRoeL>exp and source>emaLong and strategy.position_size==0 and testPeriod()) //trend==1 and 
//else
strategy.close_all(when=cross_over and roe>minroe and testPeriod())
strategy.entry("BBandSE", strategy.short, stop=source, oca_name="BollingerBands",  comment="BBandSE", when=(cross_under) and trend==-1 and roc<changerate and expRoeS>exp and source<emaLong and strategy.position_size==0 and testPeriod()) //trend==-1 and 

Más.