La stratégie de suivi de tendance adaptative est une stratégie de trading quantitative qui combine les bandes de Bollinger et les indicateurs de moyenne mobile pour ajuster dynamiquement le facteur de force de tendance et atteindre le suivi de tendance et le stop loss. Cette stratégie utilise les bandes de Bollinger pour calculer la volatilité des prix et calculer ainsi dynamiquement une force de tendance raisonnable.
L'indicateur principal de cette stratégie est les bandes de Bollinger. Les bandes de Bollinger se composent d'une bande moyenne, d'une bande supérieure et d'une bande inférieure. La bande moyenne est la moyenne mobile simple de n jours, la bande supérieure est la bande moyenne + k fois l'écart type de n jours, et la bande inférieure est la bande moyenne - k fois l'écart type de n jours. Ici, nous sélectionnons la bande moyenne de 20 jours et 2 fois l'écart type pour construire les bandes de Bollinger.
Ensuite, nous calculons la bande passante (bande supérieure - bande inférieure) sur le ratio de la bande moyenne, appelé le facteur de force. Ce ratio reflète la volatilité actuelle du marché et la force de la tendance. Nous définissons les valeurs maximales et minimales du facteur de force pour éviter qu'il ne soit trop grand ou trop petit.
Avec un facteur de force raisonnable, combiné à l'indicateur ATR, les bandes supérieure et inférieure se déplacent respectivement vers le haut et vers le bas par une distance de facteur de force ATR * pour former un canal de tendance adaptatif.
En outre, la stratégie définit également un mécanisme de stop loss. Après la formation d'une position longue, si le prix tombe en dessous du point le plus bas lors de l'ouverture de la position, la sortie stop loss; il en va de même pour les positions courtes.
Cette stratégie présente les avantages suivants:
La manière dont le facteur de force est calculé permet à la stratégie d'ajuster dynamiquement la largeur du canal en fonction de la volatilité du marché, en élargissant le canal dans une tendance haussière et en rétrécissant le canal dans un marché oscillant pour atteindre l'auto-adaptation à différents types de marchés.
Fréquence d'opération modérée: comparativement aux stratégies de moyenne mobile simple, les stratégies de bandes de Bollinger ajustent les canaux moins fréquemment, évitant ainsi l'ouverture et la fermeture inutilement fréquentes des positions.
La rupture des rails supérieur et inférieur peut filtrer efficacement le bruit du marché et assurer une forte probabilité de capter l'ouverture des tendances.
Mécanisme de stop loss: la méthode de stop loss intégrée permet de contrôler efficacement une seule perte, ce qui est un avantage majeur de cette stratégie.
Cette stratégie comporte également des risques:
La période n et le multiplicateur k des bandes de Bollinger ont une grande influence sur les résultats, nécessitant des tests répétés pour trouver la combinaison optimale de paramètres.
L'incapacité de suivre les tendances lorsque les bandes de Bollinger divergent. Lorsque les prix fluctuent violemment, les rails de bandes de Bollinger s'étendent rapidement, ce qui entraîne une incapacité à suivre les tendances. La stratégie doit alors être interrompue, en attendant que les rails convergent avant de la réinitialiser.
Les stratégies de Bollinger Bands ne sont pas parfaites, il y aura aussi une certaine quantité de faux signaux générés, ce qui nécessite de supporter les pertes correspondantes.
Le stop loss de cette stratégie ne prend en compte que les prix les plus élevés et les plus bas après l'ouverture d'une position, sans incorporer des méthodes de stop loss plus complexes basées sur la volatilité, etc., qui peuvent être trop agressives ou conservatrices, nécessitant une optimisation.
Cette stratégie doit être optimisée dans les domaines suivants:
Les paramètres de la stratégie peuvent être optimisés pour différentes devises et cycles afin d'améliorer l'adaptabilité de la stratégie.
Optimiser le mécanisme de stop loss. Le stop loss en mouvement, le stop loss en oscillation, le stop loss en trail, etc. peuvent être introduits pour rendre la méthode de stop loss plus intelligente.
Incorporer d'autres indicateurs pour filtrer les signaux d'entrée. Des indicateurs tels que MACD, KDJ, etc. peuvent être ajoutés pour éviter les faux signaux des bandes de Bollinger dans les marchés oscillant latéralement.
Ajouter des mécanismes de gestion des positions. Mettre en œuvre des méthodes de gestion de suivi du stop profit, de négociation pyramidale, de position proportionnelle fixe, etc. pour améliorer la rentabilité des stratégies.
Effectuer l'optimisation des backtests. Examiner de manière exhaustive les résultats de la stratégie en élargissant le délai des backtests, en ajustant les paramètres, en analysant les rapports des backtests, etc. pour trouver les paramètres optimaux.
Dans l'ensemble, la stratégie de suivi de tendance adaptative est une stratégie quantitative assez mature. Elle utilise des bandes de Bollinger pour capturer dynamiquement les tendances, combinée à l'indicateur ATR pour construire un canal adaptatif pour juger des tendances longues et courtes.
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true) Pd=input(2, minval=1,maxval = 100, title="Period") Bw=input(50, minval=1,maxval = 100, title="Bandwidth") minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor") maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor") plot_trend=input(true, title="Plot trend") plot_losscut = input(true, title="Plot losscut") /////////////// Calculate the BB's /////////////// basisBB = ema(close, 20) devBB = 2 * stdev(close, 20) upperBB = basisBB + devBB lowerBB = basisBB - devBB //plot(upperBB) //plot(lowerBB) ///////////// Trend //////////////////////////// rawFactor = ((upperBB-lowerBB)/basisBB)*Bw Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor Up=hl2-(Factor*atr(Pd)) Dn=hl2+(Factor*atr(Pd)) TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1) TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1) Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80) sig_trend_long = Trend[1] == -1 and Trend == 1 sig_trend_short = Trend[1] == 1 and Trend == -1 ///////////// Loss Cut //////////////////////////// price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1] current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1]) sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) ) has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1]) sig_reentry_long = not has_position and current_trend == 1 and low > price_cut sig_reentry_short = not has_position and current_trend == -1 and high < price_cut bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70) plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny) plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny) LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60) fill(TrendDownPlot, LossCutPlot, color=silver, transp=90) plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny) plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny) ///////////// Strategy //////////////////////////// if true strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long) strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short) if(current_trend == 1) strategy.close('long', when=sig_loss_cut == true) //strategy.exit('lc',from_entry='long', stop=price_cut) if( current_trend == -1 ) strategy.close('short', when=sig_loss_cut == true) //strategy.exit('sc',from_entry='short', stop=price_cut)