Stratégie de tendance à l'inversion des oscillations des bandes de Bollinger

Auteur:ChaoZhang est là., Date: le 31 octobre 2023 à 14h30h45
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de tendance d'oscillation inverse basée sur le canal des bandes de Bollinger.

La logique de la stratégie

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:

  1. Allez long lorsque vous êtes proche > bande supérieure, allez court lorsque vous êtes proche < bande inférieure.

  2. 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.

  3. Utilisez une quantité fixe pour chaque transaction.

  4. 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.

Analyse des avantages

Les avantages de cette stratégie:

  1. 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.

  2. La moyenne mobile est un signal fiable de prise de profit/arrêt de perte, qui bloque la plupart des bénéfices.

  3. La quantité fixe est simple et facile à mettre en œuvre, aucun calcul complexe n'est nécessaire.

  4. La dimension de position fractionnée fixe élargit les bénéfices tout en contrôlant le risque par ajustement de position.

Analyse des risques

Les risques de cette stratégie:

  1. Les bandes de Bollinger peuvent générer des signaux incorrects, ce qui entraîne des pertes en négociant contre tendance.

  2. Le retard de la moyenne mobile peut entraîner une prise de profit insuffisante.

  3. La quantité fixe ne peut pas s'adapter aux conditions du marché, les risques de sur-/sous-dimensionnement des positions.

  4. 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.

Directions d'amélioration

La stratégie peut être améliorée par les aspects suivants:

  1. Optimisez les paramètres des bandes de Bollinger comme n et m pour augmenter la précision.

  2. Ajoutez d'autres indicateurs comme MACD, KD pour éviter de mauvais signaux.

  3. Modifier la quantité fixe en position dynamique en fonction des conditions du marché.

  4. Ratio d'ajustement du dimensionnement des positions inférieur dans le dimensionnement des positions fractionnaires à la courbe de fonds propres lisse.

  5. Ajoutez des stratégies de stop loss comme le stop loss mobile, le stop loss de rupture pour contrôler le risque.

  6. Optimisation des paramètres pour trouver des combinaisons optimales de paramètres.

Résumé

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


Plus de