Estrategia de impulso de Golden Cross con bandas de Bollinger

El autor:¿ Qué pasa?, Fecha: 2023-11-21 12:01:25
Las etiquetas:

img

Resumen general

Esta estrategia combina promedio móvil, bandas de Bollinger e indicadores de precio promedio ponderado por volumen (VWAP). Entra en posiciones largas cuando se forma la cruz de oro y el promedio móvil rápido rompe por encima del lento. La estrategia también utiliza el canal de bandas de Bollinger y solo considera entrar cuando el precio toca la banda inferior, evitando así entradas y salidas frecuentes en medio de las fluctuaciones del mercado.

Estrategia lógica

La lógica central se basa en las medias móviles para determinar la dirección de la tendencia y las bandas de Bollinger para localizar el rango de fluctuación para las señales de compra.

  1. Construir el sistema de cruz de oro utilizando EMA de 50 días y EMA de 200 días. Se identifica una tendencia al alza cuando la EMA rápida cruza por encima de la EMA lenta.

  2. Cuando el precio está por encima de VWAP, indica que el precio está en una fase ascendente que favorece las posiciones largas.

  3. Cuando el precio acaba de tocar o romper la banda inferior de Bollinger, sugiere que el precio puede estar cerca de un punto de rebote proporcionando así una buena oportunidad.

  4. Salir de las posiciones largas con ganancia cuando el precio exceda la banda superior de Bollinger.

Al combinar estas reglas, la estrategia es capaz de localizar entradas largas apropiadas en los mercados alcistas y establecer el stop loss/profit taking para asegurar los rendimientos.

Ventajas

  • El sistema de cruz dorada determina la dirección de la tendencia principal, evitando pequeñas ganancias y pérdidas en medio de las consolidaciones.

  • VWAP mide la dirección de la ola de precios para señales de compra más precisas.

  • Las bandas de Bollinger añaden resiliencia al localizar compras mientras establecen el stop loss/profit taking locks en las ganancias.

  • Los múltiples indicadores de confirmación mejoran la fiabilidad.

Riesgos y soluciones

  • La cruz de oro puede dar señales falsas, ajusta los períodos de MA y agrega otras confirmaciones.

  • Los parámetros de Bollinger incorrectos podrían hacer que la estrategia sea ineficaz.

  • Un umbral de stop loss demasiado amplio no limita eficazmente las pérdidas.

Direcciones de optimización

  • Optimice las combinaciones de MA probando diferentes parámetros para encontrar la mejor.

  • Prueba los períodos de Bollinger y los conjuntos de parámetros para un mejor ancho de banda y volatilidad.

  • Prueba y ajusta los rangos de pérdida de parada para equilibrar el control del riesgo y evitar el disparo prematuro.

Conclusión

Esta estrategia establece un equilibrio entre el descubrimiento de oportunidades y el control de riesgos mediante la integración del análisis MA, Bollinger y VWAP para las entradas.


/*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"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee

//@version=4
strategy(title="VWAP and BB strategy [$$]", overlay=true,pyramiding=2, default_qty_value=1, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)


fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 6, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
DST = 1 //day light saving for usa
//--- Europe
London = iff(DST==0,"0000-0900","0100-1000")
//--- America
NewYork = iff(DST==0,"0400-1300","0500-1400")
//--- Pacific
Sydney = iff(DST==0,"1300-2200","1400-2300")
//--- Asia
Tokyo = iff(DST==0,"1500-2400","1600-0100")

//-- Time In Range
timeinrange(res, sess) => time(res, sess) != 0

london = timeinrange(timeframe.period, London)
newyork = timeinrange(timeframe.period, NewYork)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate 


is_price_dipped_bb(pds,source1) =>
    t_bbDipped=false
    for i=1 to pds
        t_bbDipped:=  (t_bbDipped   or  close[i]<source1) ? true : false
        if t_bbDipped==true
            break
        else
            continue
            
    t_bbDipped


is_bb_per_dipped(pds,bbrSrc) =>
    t_bbDipped=false
    for i=1 to pds
        t_bbDipped:=  (t_bbDipped   or  bbrSrc[i]<=0) ? true : false
        if t_bbDipped==true
            break
        else
            continue
            
    t_bbDipped
    

// variables  BEGIN
shortEMA = input(50, title="fast EMA", minval=1)
longEMA = input(200, title="slow EMA", minval=1)

//BB

smaLength = input(7, title="BB SMA Length", minval=1)
bbsrc = input(close, title="BB Source")

strategyCalcOption = input(title="strategy to use", type=input.string, options=["BB", "BB_percentageB"],      defval="BB")



//addOnDivergence = input(true,title="Add to existing on Divergence")
//exitOption = input(title="exit on RSI or BB", type=input.string, options=["RSI", "BB"],      defval="BB")

//bbSource = input(title="BB  source", type=input.string, options=["close", "vwap"],      defval="close")
     
//vwap_res = input(title="VWAP Resolution", type=input.resolution, defval="session")
stopLoss = input(title="Stop Loss%", defval=1, minval=1)

//variables  END

longEMAval= ema(close, longEMA)
shortEMAval= ema(close, shortEMA)
ema200val = ema(close, 200)


vwapVal=vwap(close)



// Drawings

//plot emas
plot(shortEMAval, color = color.green, linewidth = 1, transp=0)
plot(longEMAval, color = color.orange, linewidth = 1, transp=0)
plot(ema200val, color = color.purple, linewidth = 2, style=plot.style_line ,transp=0)



//bollinger calculation 
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(bbsrc, smaLength)
dev = mult * stdev(bbsrc, smaLength)
upperBand = basis + dev
lowerBand = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)

bbr = (bbsrc - lowerBand)/(upperBand - lowerBand) 
//bollinger calculation 

//plot bb
//plot(basis, "Basis", color=#872323, offset = offset)
p1 = plot(upperBand, "Upper", color=color.teal, offset = offset)
p2 = plot(lowerBand, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=#198787, transp=95)


plot(vwapVal, color = color.purple, linewidth = 2, transp=0)


// Colour background

//barcolor(shortEMAval>longEMAval and close<=lowerBand ? color.yellow: na)
  

//longCondition=  shortEMAval > longEMAval and  close>open and  close>vwapVal
longCondition=  ( shortEMAval > longEMAval  and close>open and close>vwapVal and close<upperBand ) //and time_cond //     and  close>=vwapVal 



//Entry
strategy.entry(id="long", comment="VB LE" , long=true,  when= longCondition and ( strategyCalcOption=="BB"? is_price_dipped_bb(10,lowerBand) : is_bb_per_dipped(10,bbr)  )   and strategy.position_size<1 )   //is_price_dipped_bb(10,lowerBand))  //and strategy.position_size<1       is_bb_per_dipped(15,bbr) 


//add to the existing position
strategy.entry(id="long", comment="Add" , long=true,  when=strategy.position_size>=1 and close<strategy.position_avg_price and close>vwapVal) //and time_cond)

barcolor(strategy.position_size>=1  ? color.blue: na)



strategy.close(id="long", comment="TP Exit",   when=crossover(close,upperBand) )

//stoploss
stopLossVal =   strategy.position_avg_price * (1-(stopLoss*0.01) )
//strategy.close(id="long", comment="SL Exit",   when= close < stopLossVal)

//strategy.risk.max_intraday_loss(stopLoss, strategy.percent_of_equity)

Más.