La tendance des bandes de Bollinger à double moyenne mobile suivant la stratégie

Auteur:ChaoZhang est là., Date: 2023-11-01 14:15:11 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie prend des décisions de trading basées sur des Bollinger Bands mobiles doubles pour suivre la tendance. Elle utilise la convergence et la divergence des rails supérieurs et inférieurs des Bollinger Bands pour déterminer les changements de tendance, en achetant près du rail inférieur et en vendant près du rail supérieur, pour atteindre l'achat bas et la vente élevée.

La logique de la stratégie

La stratégie s'applique à la fois aux bandes de Bollinger simples et aux bandes de Bollinger améliorées.

Les bandes de Bollinger simples utilisent la SMA des prix de clôture pour la bande du milieu, tandis que les bandes de Bollinger améliorées utilisent l'EMA des prix de clôture.

Les bandes supérieure et inférieure sont calculées par déviation type de la bande moyenne ± N.

La stratégie évalue la force de la tendance sur la base de l'écart entre les bandes supérieure et inférieure.

En particulier, lorsque le prix s'approche de la bande inférieure, il s'allonge. Lorsque le prix s'approche de la bande supérieure, il ferme la position. La méthode de stop loss est un pourcentage fixe. Le stop de suivi peut également être activé.

Le bénéfice dépend de la fermeture près de la bande du milieu ou de la bande supérieure.

La stratégie peut également choisir de ne vendre qu'avec un bénéfice pour éviter les pertes.

Analyse des avantages

Les avantages de cette stratégie:

  1. Les bandes de Bollinger doubles améliorent l' efficacité

En comparant des bandes de Bollinger simples et améliorées, il peut choisir la meilleure version pour une efficacité plus élevée.

  1. La force de la tendance est jugée par le spread

Quand le spread se rétrécit, cela indique une tendance à la hausse.

  1. Prise de bénéfices et arrêt de perte flexibles

Le pourcentage fixe de stop loss contrôle les pertes d'un seul trade.

  1. Mécanisme de protection contre les pertes

Seule une vente à profit empêche la perte de s'étendre.

Analyse des risques

Les risques incluent:

  1. Risque de recours

Une tendance qui se poursuit entraîne des risques de retrait, il faut supporter mentalement des pertes consécutives.

  1. Risque de piqûre

Lorsque les bandes sont larges, le marché peut tourner sur le côté. La stratégie est moins efficace.

  1. Résultats de l'analyse de risque

Il faut un stop plus modéré comme ATR.

Directions d'optimisation

La stratégie peut optimiser:

  1. Paramètres des bandes de Bollinger

Testez différentes longueurs de MA, multiples d'écart type pour trouver des combinaisons optimales pour différents marchés.

  1. Ajouter des filtres

Ajoutez des filtres comme MACD, KD en plus du signal de Bollinger pour réduire les transactions pendant les marchés à ciseaux.

  1. Prise de bénéfices et arrêt des pertes

Testez différentes méthodes d'arrêt de trailing ou optimisez le stop loss en fonction de la volatilité, de l'ATR, etc.

  1. Gestion de l'argent

Optimiser la taille des positions par transaction, tester différentes stratégies additionnelles.

Conclusion

Cette stratégie combine les atouts des bandes de Bollinger doubles, jugeant la force de la tendance par la largeur de la bande et les retraits de trading pendant les tendances.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 00:00:00
period: 1h
basePeriod: 15m
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/
// © JCGMarkets 

//@version=4
strategy("B.Bands | Augmented | Intra-range | Long-Only", shorttitle = "BB|A|IR|L", initial_capital=5000, commission_value=0.075, slippage = 1, overlay = true)

//Technical Indicators Data
show_simp   = input(false, title="Trade on Simple Bollinger Bands ", type= input.bool, group="Select Strategy System")
show_augm   = input(true, title="Trade on Augmented Bollinger Bands", type= input.bool, group="Select Strategy System") 
periods     = input(20, title="Periods for Moving Average", type =input.integer, minval = 2, step = 1, group="Technical Inputs")
std         = input(2, title="Std", type = input.float, minval=0.1 , step = 0.1, group="Technical Inputs")

// Strategy data
max_spread_bb   = input(20000.0, title="Max Spread Tolerance Beetween Bands", type=input.float, step=0.1, group="Strategy Inputs")
entry_source    = input(close, title="Entry data source", type=input.source, group="Strategy Inputs")
exit_source     = input(high, title="Exit data source", type=input.source, group="Strategy Inputs")
take_profit     = input("middle", title = "Profit to band:", options = ["middle", "opposite"], group="Strategy Inputs")
stop_loss       = input(3.00, title="Stop Loss %", type=input.float, step=0.05, group="Strategy Inputs")
trailing        = input(false, title="Activate trailing stop?", type = input.bool, group="Strategy Inputs")
stop_perc       = input(6.00, title="Trailing %", type=input.float, step=0.125, group="Strategy Inputs") * 0.01
sell_profit     = input(false, title="Only sell in profit (Stop Loss still active) ", type= input.bool, group="Strategy Inputs")


var SL = 0.0
var SLT= 0.0


//Simple BB Calculation -> adapt if needed with different std for upper-lower, sma-ema, etc 
middle_sim = sma(close, periods)

//Augmented BB Calculation -> adapt if needed with different std for upper lower, etc
middle_augm  = ema(close, periods)
middle_upp = ema(high, periods)
middle_low = ema(low, periods)

//Multiplier
dev      = stdev(close, periods) * std

//Upper & Lower Bands
upper = (middle_sim + dev)
lower = (middle_sim - dev)

//Augmented Bands
upper_augm = (middle_upp + dev)
lower_augm = (middle_low - dev)

//Bands Spread
spread   = upper - lower
spread_augm   = upper_augm - lower_augm

//From date
filter_from    =   input(  true,    title="===> From", group="Date Control")
from_y         =   input(  2010,    title = "from year", group="Date Control")
from_m         =   input(     1,    title = "from month", minval =1, maxval=12, group="Date Control")
from_d         =   input(     1,    title = "from day",  minval=1, maxval=31, group="Date Control")

//To date
filter_to   =    input( true,   title="===> To", group="Date Control")
to_y        =    input( 2030,   title = "To year", group="Date Control")
to_m        =    input(    1,   title = "To month", minval =1, maxval=12, group="Date Control")
to_d        =    input(    1,  title = "To day",  minval=1, maxval=31, group="Date Control")

// Date Condition
In_date() =>  true

in_position = strategy.position_size > 0 

// Trailing stop 
SLT := if in_position and In_date()
    stop_inicial = entry_source * (1 - stop_perc)
    max(stop_inicial, SLT[1])
else
    0

slts = (low <= SLT) and (trailing == true)


//Essential Trade logics
entry_long = (entry_source <= lower) and (spread < max_spread_bb)
entry_long_augm = (entry_source <= lower_augm) and (spread_augm < max_spread_bb)

// Simple Bollinger Conditions

if (not in_position and show_simp and In_date())
    if entry_long
        // Trigger buy order
        position_size = round( strategy.equity / close ) // All available equity for this strategy example
        strategy.entry("Entry", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100)) // You could determine wether or not implement stop loss with bool input and if condition here.


if in_position and show_simp and not sell_profit and In_date()
    //Exits if not sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = middle_sim, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = upper, stop = SL, comment="Exit")    

if in_position and show_simp and sell_profit and In_date()
    //Exits if sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? middle_sim: na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? upper: na), stop = SL, comment="Exit")    



if in_position and show_simp and slts and In_date()
    //Trailing activation
    strategy.close("Entry", comment="SLT")

if not In_date()
    //Exit due out of date range
    strategy.close("Entry", comment="Out of date range")



// Augmented Bollinger Conditions

if (not in_position and show_augm and In_date()) 
    if entry_long_augm
        // Trigger buy order
        position_size = round( strategy.equity / close )
        strategy.entry("Entry_A", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100) )

if in_position and show_augm and not sell_profit and In_date()
    //Exits and not sell in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = middle_augm, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = upper_augm, stop = SL, comment="Exit")            
        

if in_position and show_augm and sell_profit and In_date() 
    //Exit only in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? middle_augm:na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? upper_augm: na) , stop = SL, comment="Exit") 


if in_position  and show_augm and slts and In_date()
    //Trigger trailing
    strategy.close("Entry_A", comment="SLT")
    
if not In_date()
    //Out of date trigger
    strategy.close("Entry_A", comment= "Out of date range")




// Plotting

plot(in_position ? SL > 0 ? SL : na : na , style = plot.style_circles, color = color.red, title = "Stop Loss")
plot(in_position ? trailing ? SLT > 0 ? SLT : na : na : na , style = plot.style_circles, color = color.blue, title = "Trailing Stop" )

s = plot(show_simp ? upper : na , color = color.aqua)
plot(show_simp ? middle_sim : na , color=color.red)
i = plot(show_simp ? lower : na , color = color.aqua)
fill(s,i, color=color.new(color.aqua,90))


plot(show_augm ? middle_augm : na , color=color.blue)
s_a = plot( show_augm ? upper_augm : na, color=color.orange)
i_a = plot( show_augm ? lower_augm : na, color= color.orange)
fill(s_a,i_a, color=color.new(color.orange, 90))

Plus de