La stratégie Trailing Stop est une stratégie de trading quantitative qui combine des indicateurs de jugement de tendance et des mécanismes de trailing stop.
L'indicateur de Supertrend est un indicateur de tendance à la hausse ou à la baisse. L'indicateur de Supertrend intègre l'indicateur ATR et le point pivot pour déterminer plus précisément la direction de la tendance.
Lorsque le signal d'achat est généré, la stratégie ouvre une position longue. En même temps, elle calcule en temps réel une ligne d'arrêt en retard. La méthode de calcul de cette ligne d'arrêt est le point pivot moins la valeur de l'indicateur ATR. Tant que le prix de clôture actuel est supérieur à cette ligne d'arrêt, la ligne d'arrêt augmentera en temps réel et maintiendra une position d'arrêt-perte raisonnable. Si le prix traverse la ligne d'arrêt, la position sera fermée avec un stop-perte.
La stratégie intègre également les indicateurs ADX et RSI pour filtrer les signaux de trading inappropriés.
Le plus grand avantage de cette stratégie est qu'elle peut bien saisir la direction de la tendance et réaliser un suivi de la tendance. L'indicateur Supertrend est plus précis que les moyennes mobiles simples et peut rapidement déterminer les points tournants.
En outre, les indicateurs ADX et RSI sont ajoutés à la stratégie de filtrage, évitant ainsi les erreurs pendant les périodes de forte volatilité du marché.
Le plus grand risque de cette stratégie est que le jugement de tendance soit erroné et que l'indicateur Supertrend émet un mauvais signal. Bien que l'indicateur Supertrend soit supérieur aux moyennes mobiles simples, il est inévitable que des erreurs de jugement se produisent dans des conditions de marché complexes. À ce stade, il est nécessaire de s'appuyer sur des mécanismes de stop loss pour contrôler les pertes.
En outre, des paramètres de stratégie inappropriés peuvent également poser des risques. Par exemple, un paramètre ATR trop grand entraînera des ajustements de ligne de stop-loss trop agressifs. Des paramètres inappropriés des paramètres ADX et RSI peuvent également manquer des opportunités de trading ou augmenter la probabilité de mauvaises transactions. Cela nécessite un backtesting historique approfondi pour trouver les paramètres optimaux.
La stratégie peut être encore optimisée dans les aspects suivants:
Essayez d'autres indicateurs de jugement de tendance tels que DMI et KDJ en combinaison avec l'indicateur Supertrend pour former un système de jugement
Augmenter le module d'optimisation des paramètres adaptatifs basé sur l'apprentissage automatique afin que le paramètre ATR, le paramètre ADX, le paramètre RSI, etc. puissent être ajustés en fonction du marché en temps réel au lieu de valeurs fixes.
Introduire des indicateurs de sentiment pour remplacer les indicateurs RSI pour le filtrage des signaux Les indicateurs RSI ne fonctionnent pas bien dans des conditions de marché complexes, tandis que les indicateurs de sentiment social peuvent mieux déterminer l'enthousiasme du marché.
Augmenter le module de gestion de la taille de la position. Selon la distance entre la ligne d'arrêt et le prix actuel, ajuster dynamiquement la taille de la position. Plus loin de la ligne d'arrêt, plus la taille de la position peut être augmentée de manière appropriée pour améliorer le potentiel de profit.
La stratégie Tracking Trailing Stop utilise des méthodes telles que l'analyse des tendances, les trailing stops et le filtrage multifactoriel.
/*backtest start: 2023-01-16 00:00:00 end: 2024-01-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Bendre ADX Sup Trend", overlay = true) /////////////////////////// // SuperTrend + Pivot Point ////////////////////////// src = input(close, title="EMA Source") PPprd = input(defval = 2, title="Pivot Point Period") AtrFactor=input(defval = 2, title = "ATR Factor") AtrPd=input(defval = 18, title = "ATR Period") StartDate = input(timestamp("1 Dec 2022"), title="Start Date") EndDate = input(timestamp("12 Jan 2023"), title="End Date") var float ph = na var float pl = na ph := ta.pivothigh(PPprd, PPprd) pl :=ta.pivotlow(PPprd, PPprd) float center = na center := center[1] // float lastpp = ph ? ph : pl ? pl : 0.0 float lastpp = na(ph) ? na(pl) ? na : pl : ph if lastpp > 0 if na(center) center := lastpp else center := (center * 2 + lastpp) / 3 Up = center - (AtrFactor * ta.atr(AtrPd)) Dn = center + (AtrFactor * ta.atr(AtrPd)) var float TUp = na var float TDown = na Trend = 0 TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // Lines linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend") bsignalSSPP = close > Trailingsl ssignalSSPP = close < Trailingsl /////// // ADX ////// lenADX = 14 th = 14 TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = ta.sma(DX, lenADX) ////// // MA ///// lenMA = 21 srcMA = input(close, title="Source") // offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) offsetMA = input(0, title="Offset") outMA = ta.sma(srcMA, lenMA) // // RSI // length = input( 14 ) overSold = input( 30 ) overBought = input( 65 ) price = close vrsi = ta.rsi(price, length) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy and vrsi > overBought) // .order // Tuned version strategy.entry("Buy", strategy.long) // strategy.close("Sell", "close Sell") if (sell) and (strategy.position_size > 0) // strategy.entry("Sell", strategy.short) strategy.close("Buy", "Close Buy") // if(sell and vrsi < overSold ) // strategy.entry("Sell", strategy.short) // if(buy) and (strategy.position_size > 0) // strategy.close("Sell", "close Sell")