Stratégie de dynamique Golden Cross avec bandes de Bollinger

Auteur:ChaoZhang est là., Date: 2023-11-21 12:01:25
Les étiquettes:

img

Résumé

Cette stratégie combine les moyennes mobiles, les bandes de Bollinger et les indicateurs de prix moyen pondéré par volume (VWAP). Il entre dans des positions longues lorsque la croix d'or se forme et que la moyenne mobile rapide dépasse la moyenne lente.

La logique de la stratégie

La logique de base repose sur les moyennes mobiles pour déterminer la direction de la tendance et les bandes de Bollinger pour localiser la plage de fluctuation pour les signaux d'achat.

  1. Construisez le système de croix d'or en utilisant l'EMA de 50 jours et l'EMA de 200 jours. Une tendance à la hausse est identifiée lorsque l'EMA rapide traverse au-dessus de l'EMA lente.

  2. Lorsque le prix est supérieur à VWAP, cela indique que le prix est en phase haussière qui favorise les positions longues.

  3. Lorsque le prix touche ou dépasse la bande inférieure de Bollinger, cela suggère que le prix peut être proche d'un point de rebond, offrant ainsi une bonne opportunité.

  4. Sortir des positions longues avec profit lorsque le prix dépasse la bande supérieure de Bollinger.

En combinant ces règles, la stratégie est en mesure de localiser des entrées longues appropriées sur les marchés haussiers et de définir un stop loss/profit taking pour assurer des rendements.

Les avantages

  • Le système de la croix d'or détermine la direction de la tendance majeure, évitant les petits gains et les pertes au milieu des consolidations.

  • VWAP mesure la direction de l'onde de prix pour des signaux d'achat plus précis.

  • Les bandes de Bollinger ajoutent de la résilience en localisant les achats tout en définissant un stop loss/profit taking locks dans les gains.

  • Des indicateurs de confirmation multiples améliorent la fiabilité.

Risques et solutions

  • La croix d'or peut donner de faux signaux, ajustez les périodes de MA et ajoutez d'autres confirmations.

  • Des paramètres de Bollinger inappropriés pourraient rendre la stratégie inefficace.

  • Un seuil de stop-loss trop large ne permet pas de limiter efficacement les pertes.

Directions d'optimisation

  • Optimiser les combinaisons MA en testant différents paramètres pour trouver la meilleure.

  • Testez les périodes de Bollinger et les ensembles de paramètres pour une meilleure bande passante et volatilité.

  • Testez et ajustez les plages de perte d'arrêt pour équilibrer la maîtrise des risques et éviter un déclenchement prématuré.

Conclusion

Cette stratégie établit un équilibre entre la découverte d'opportunités et le contrôle des risques en intégrant l'analyse MA, Bollinger et VWAP pour les entrées.


/*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)

Plus de