Il s'agit d'une stratégie de tendance d'oscillation inverse basée sur le canal des bandes de Bollinger.
La stratégie utilise les bandes de Bollinger comme indicateur technique principal. Les bandes de Bollinger se composent de la moyenne mobile de n périodes et de l'écart des bandes supérieures/inférieures. La bande supérieure = MA de n périodes + m * écart type de n périodes, la bande inférieure = MA de n périodes - m * écart type de n périodes. n et m sont des paramètres.
Lorsque le prix s'approche de la bande supérieure, il indique une tendance haussière, mais peut s'inverser au sommet. Lorsque le prix s'approche de la bande inférieure, il indique une tendance à la baisse, mais peut s'inverser au bas. Une rupture efficace des bandes de Bollinger peut signaler un potentiel d'inversion.
Les règles de négociation spécifiques sont les suivantes:
Allez long lorsque vous êtes proche > bande supérieure, allez court lorsque vous êtes proche < bande inférieure.
Utilisez la moyenne mobile n-période comme signal de prise de profit et d'arrêt de perte. Fermez long lorsque la fermeture est inférieure à MA, fermez court lorsque la fermeture est supérieure à MA.
Utilisez une quantité fixe pour chaque transaction.
Utilisez une taille de position fractionnée fixe. Augmentez la taille de la position d'un montant fixe lorsque le ratio de profit fixe est atteint, diminuez la taille lorsque la perte est atteinte.
Les avantages de cette stratégie:
L'utilisation du canal Bollinger Bands pour déterminer la direction de la tendance et les renversements commerciaux, évite la plupart des fléchettes et améliore le taux de gain.
La moyenne mobile est un signal fiable de prise de profit/arrêt de perte, qui bloque la plupart des bénéfices.
La quantité fixe est simple et facile à mettre en œuvre, aucun calcul complexe n'est nécessaire.
La dimension de position fractionnée fixe élargit les bénéfices tout en contrôlant le risque par ajustement de position.
Les risques de cette stratégie:
Les bandes de Bollinger peuvent générer des signaux incorrects, ce qui entraîne des pertes en négociant contre tendance.
Le retard de la moyenne mobile peut entraîner une prise de profit insuffisante.
La quantité fixe ne peut pas s'adapter aux conditions du marché, les risques de sur-/sous-dimensionnement des positions.
L'ajustement agressif de la taille de la position selon la méthode fractionnelle fixe peut accroître les pertes.
Solutions: Optimiser les paramètres des bandes de Bollinger pour améliorer la précision du signal. Ajouter d'autres indicateurs pour déterminer la tendance. Réduire la taille de la quantité fixe. Réduire le ratio d'ajustement de la taille de la position dans la méthode de taille de position fractionnée.
La stratégie peut être améliorée par les aspects suivants:
Optimisez les paramètres des bandes de Bollinger comme n et m pour augmenter la précision.
Ajoutez d'autres indicateurs comme MACD, KD pour éviter de mauvais signaux.
Modifier la quantité fixe en position dynamique en fonction des conditions du marché.
Ratio d'ajustement du dimensionnement des positions inférieur dans le dimensionnement des positions fractionnaires à la courbe de fonds propres lisse.
Ajoutez des stratégies de stop loss comme le stop loss mobile, le stop loss de rupture pour contrôler le risque.
Optimisation des paramètres pour trouver des combinaisons optimales de paramètres.
En résumé, il s'agit d'une stratégie d'inversion typique des bandes de Bollinger. Elle identifie les points d'inversion par les bandes de Bollinger, définit la prise de profit/arrêt de perte par moyenne mobile, contrôle le risque par quantité fixe et taille de position fractionnée.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 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/ // © gsanson66 //This strategy uses the well-known Bollinger Bands Indicator //@version=5 strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18) //----------------------------------------FUNCTIONS---------------------------------------// //@function Displays text passed to `txt` when called. debugLabel(txt, color) => label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small) //@function which looks if the close date of the current bar falls inside the date range inBacktestPeriod(start, end) => (time >= start) and (time <= end) //---------------------------------------USER INPUTS--------------------------------------// //Technical parameters bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters") mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters") smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters") //Money Management fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management") increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management") //Backtesting period startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period") endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period") //----------------------------------VARIABLES INITIALISATION-----------------------------// strategy.initial_capital = 50000 //Exit SMA smaExit = ta.sma(close, smaLength) //BB Calculation basis = ta.sma(close, bbLength) dev = mult * ta.stdev(close, bbLength) upperBB = basis + dev lowerBB = basis - dev //Money management equity = strategy.equity - strategy.openprofit var float capital_ref = strategy.initial_capital var float cashOrder = strategy.initial_capital * 0.95 //Backtesting period bool inRange = na //------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------// //Checking if the date belong to the range inRange := true //Checking performances of the strategy if equity > capital_ref + fixedRatio spread = (equity - capital_ref)/fixedRatio nb_level = int(spread) increasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder + increasingOrder capital_ref := capital_ref + nb_level*fixedRatio if equity < capital_ref - fixedRatio spread = (capital_ref - equity)/fixedRatio nb_level = int(spread) decreasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder - decreasingOrder capital_ref := capital_ref - nb_level*fixedRatio //Checking if we close all trades in case where we exit the backtesting period if strategy.position_size!=0 and not inRange strategy.close_all() debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116)) //-----------------------------------EXIT SIGNAL------------------------------// if strategy.position_size > 0 and close < smaExit strategy.close("Long") if strategy.position_size < 0 and close > smaExit strategy.close("Short") //----------------------------------LONG/SHORT CONDITION---------------------------// //Long Condition if close > upperBB and inRange qty = cashOrder/close strategy.entry("Long", strategy.long, qty) //Short Condition if close < lowerBB and inRange qty = cashOrder/close strategy.entry("Short", strategy.short, qty) //---------------------------------PLOTTING ELEMENT----------------------------------// plot(smaExit, color=color.orange) upperBBPlot = plot(upperBB, color=color.blue) lowerBBPlot = plot(lowerBB, color=color.blue) fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))