Les bandes de Bollinger suivent une tendance stratégique

Auteur:ChaoZhang est là., Date: 15 janvier 2024 à 14h31
Les étiquettes:

img

Résumé

Cette stratégie s'appelle Bollinger Bands Trend Following Strategy. Elle utilise l'indicateur Bollinger Bands pour déterminer les tendances des prix et entre en long ou en short lorsque le prix sort du canal Bollinger Bands. Elle intègre un filtre moyen mobile pour juger de la direction de la tendance lors de la rupture, décidant ainsi entre les entrées longues et courtes.

Principaux

La stratégie repose principalement sur l'indicateur Bollinger Bands pour déterminer la tendance des prix et les points d'entrée.

  1. Ligne médiane: moyenne mobile sur n jours
  2. Ligne supérieure: écart type de n jours à la hausse
  3. Ligne inférieure: écart type à la baisse de n jours

Lorsque le prix se déplace vers le haut de la ligne inférieure à travers la ligne supérieure, une tendance haussière est identifiée. Lorsque le prix se déplace vers le bas de la ligne supérieure à travers la ligne inférieure, une tendance baissière a commencé.

Plus précisément, la logique de la stratégie est la suivante:

  1. Entrez en long lorsque le rapprochement s'éteint vers le haut de la ligne inférieure des bandes.
  2. Entrez à court lorsque le rapprochement se brise vers le bas de la ligne supérieure des bandes.

Pour éviter de fausses ruptures, un filtre de moyenne mobile est ajouté.

Ici, la moyenne mobile exponentielle est utilisée comme indicateur.

En résumé, les critères de détermination de la rupture de tendance sont les suivants:

  1. Signal long: Fermeture dépasse les bandes de la ligne supérieure && Fermeture dépasse la moyenne mobile
  2. Signaux courts: fermeture des bandes inférieures && fermeture des moyennes mobiles

Après l'entrée, le stop-loss suit la ligne médiane et sort quand le prix touche à nouveau la ligne médiane.

Analyse de la force

Les principaux points forts de cette stratégie sont les suivants:

  1. Capturez les nouvelles tendances formées par les ruptures de la ligne moyenne.
  2. Éviter les fausses ruptures par le filtre de moyenne mobile, assure l'entrée uniquement lors de l'inversion de tendance réelle.
  3. Un mécanisme de stop-loss intégré par suivi de la ligne médiane, contrôle efficacement les risques.
  4. Une logique simple et claire, facile à comprendre et à mettre en œuvre, adaptée aux stratégies de trading d'algo.
  5. Utilise le canal des bandes et des indicateurs de moyenne mobile, pas besoin de prédire les prix, identifie les tendances basées sur des preuves après les faits.

Analyse des risques

Malgré les avantages, la stratégie comporte également les risques suivants:

  1. Des paramètres de bandes incorrects peuvent augmenter la fréquence des transactions et les risques. Des paramètres trop sensibles peuvent entraîner des fausses ruptures excessives et un roulement élevé du système.
  2. Une sélection inadéquate des paramètres de la moyenne mobile peut entraîner des tendances réelles manquantes ou générer de faux signaux.
  3. Le stop loss repose sur la ligne médiane, peut sortir prématurément ou laisser trop de marge de retracement.

Pour contrôler les risques susmentionnés, l'optimisation suivante peut être effectuée:

  1. Ajustez correctement les paramètres des bandes, augmentez la largeur du canal pour réduire les fausses probabilités de rupture.
  2. Testez différents types et longueurs de moyennes mobiles pour trouver des combinaisons optimales.
  3. Essayez d'autres méthodes d'arrêt des pertes, par exemple les niveaux d'arrêt des pertes progressifs ou les niveaux d'arrêt des pertes progressifs.

Directions d'optimisation

Sur la base de l'analyse des risques, d'autres optimisations peuvent être effectuées dans les domaines suivants:

  1. Optimisation des paramètres: Utiliser des méthodes plus systématiques comme les algorithmes génétiques pour trouver des combinaisons optimales de paramètres pour les bandes et les moyennes mobiles, afin de rendre la stratégie plus stable et rentable.

  2. Optimisation des pertes par arrêt: Tester différentes techniques de stop loss comme les stops ATR, les stops trailing, etc., afin de déterminer le meilleur mécanisme d'arrêt.

  3. Optimisation des filtres: Essayez d'ajouter d'autres indicateurs tels que RSI, KD, etc. comme filtres supplémentaires, pour réduire les probabilités de faux signaux et augmenter le taux de rentabilité.

  4. Optimisation des critères d'entrée: Ajoutez d'autres considérations comme les conditions de tendance, le VOLUME anormal, etc. pour sélectionner strictement le moment de l'entrée, éviter les entrées inutiles.

  5. Apprentissage automatique: recueillir plus de données historiques pour construire des modèles LSTM, RNN et autres modèles d'apprentissage en profondeur, afin de permettre le meilleur timing d'entrée et de sortie basé sur l'IA.

  6. Gestion dynamique du risque et de la récompense: Incorporer des arrêts de ratio fixe, une augmentation de l'objectif de profit après atteinte de certains niveaux de profit, etc. pour contrôler dynamiquement le risque-rendement.

Grâce à des optimisations dans les domaines ci-dessus, les indicateurs clés tels que la stabilité, la rentabilité, les capacités d'ajustement aux risques peuvent être améliorés de manière globale, transformant la stratégie en un algorithme de qualité de production adapté au trading en direct.

Conclusion

En conclusion, la Bollinger Bands Trend Following Strategy identifie les tendances des prix à l'aide de l'indicateur des bandes et des moyennes mobiles, en entrant à des points de rupture clés.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)

//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================

strategy(title = 'BT-Bollinger Bands - Trend Following',
         shorttitle = 'BBTF',
         overlay = true )


//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================

// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")

// TIME LOGIC 
inTradeWindow = true

// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)


// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)

//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)


// MOVING AVERAGES INPUTS ================================================================================================
string magroup =  'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title="  Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)

// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)

// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit  =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)




// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================

//VERIFY IF THE BUY FILTERS ARE ON OR OFF 
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)                      

//LONG / SHORT POSITIONS LOGIC
bool openLongPosition  = (close[1] < bbUpper) and (close > bbUpper)   and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)


// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0

bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0

longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
    strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)

if not (openLongPosition)
    strategy.cancel('Long Entry')

//submit exit orders for trailing take profit price 
if (longIsActive) and (inTradeWindow)
    strategy.exit(id = 'Long Exit',  stop=bbMiddle, alert_message=messageExit)

//if (closeLongPosition)
   // strategy.close(id = 'Long Entry', alert_message=messageClose)
      

shortEntryPoint = low 
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
    strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)

if not(openShortPosition)
    strategy.cancel('Short Entry')

if (shortIsActive)
    strategy.exit(id = 'Short Exit',  stop = bbMiddle, alert_message=messageExit)

//if (closeShortPosition)
    //strategy.close(id = 'Short Close', alert_message=messageClose)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================

// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')

// EMA/SMA 
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)

// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)

// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)

// ======================================================================================================================


Plus de