Il s'agit d'une stratégie de trading de rupture longue basée sur des lignes de tendance dynamiques et une confirmation de volume. La stratégie identifie les hauts swing clés en suivant les mouvements de prix en temps réel et construit dynamiquement des lignes de tendance. Lorsque le prix dépasse la ligne de tendance supérieure avec un volume significatif, la stratégie entre dans une position longue tout en gérant le risque grâce à des mécanismes de prise de profit, de stop-loss et de trailing stop basés sur le pourcentage.
La logique de base est basée sur trois piliers principaux: la construction dynamique de la ligne de tendance, la confirmation du volume et le système de gestion des risques. Premièrement, la stratégie utilise la fonction ta.pivothigh pour identifier dynamiquement les hauts de fluctuation des prix et construit des lignes de tendance supérieures en fonction de la pente et de l'intersection calculées à partir des deux hauts de fluctuation les plus récents. Deuxièmement, les signaux d'entrée doivent être accompagnés d'un volume 1,5 fois supérieur à la moyenne de 20 périodes pour assurer la validité de la rupture. Enfin, la stratégie utilise un pourcentage fixe de prise de profit (2%) et d'arrêt de perte (1%), avec un arrêt de trailing de 1% pour verrouiller les bénéfices.
Il s'agit d'une stratégie bien conçue de suivi des tendances avec une logique solide. Grâce à la combinaison de lignes de tendance dynamiques et de confirmation du volume, ainsi qu'à un système complet de gestion des risques, la stratégie démontre une bonne adaptabilité et fiabilité. Bien qu'elle ait une certaine dépendance au marché, il y a une marge d'amélioration significative grâce aux directions d'optimisation suggérées.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-09 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Long Only Strategy with Dynamic Trend Lines, Fixed TP/SL, and Trailing SL+", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10, pyramiding=0, // Prevent multiple entries calc_on_order_fills=true, calc_on_every_tick=true) // === Parameters === swingThreshold = input.int(5, title="Swing Detection Threshold") tpPercent = input.float(2.0, title="Take Profit (%)") slPercent = input.float(1.0, title="Stop Loss (%)") trailPercent = input.float(1.0, title="Trailing Stop (%)") volumeThresholdMultiplier = input.float(1.5, title="Volume Spike Threshold (x MA)") // === Volume Indicator === avgVolume = ta.sma(volume, 20) volumeSpike = volume > (avgVolume * volumeThresholdMultiplier) // === Detect Swing High === isSwingHigh = ta.pivothigh(high, swingThreshold, swingThreshold) // Variables to store swing highs var float swingHigh1 = na var float swingHigh2 = na var int swingHighBar1 = na var int swingHighBar2 = na // Update swing highs if (isSwingHigh) swingHigh2 := swingHigh1 swingHighBar2 := swingHighBar1 swingHigh1 := high[swingThreshold] swingHighBar1 := bar_index - swingThreshold // === Calculate Upper Trend Line === var float upperSlope = na var float upperIntercept = na // Calculate slope and intercept for upper trend line if there are two swing highs if (not na(swingHigh1) and not na(swingHigh2)) deltaX = swingHighBar1 - swingHighBar2 if (deltaX != 0) upperSlope := (swingHigh1 - swingHigh2) / deltaX upperIntercept := swingHigh1 - (upperSlope * swingHighBar1) else upperSlope := 0 upperIntercept := swingHigh1 // Calculate trend line price for the current bar var float upperTrendPrice = na if (not na(upperSlope) and not na(upperIntercept)) upperTrendPrice := upperSlope * bar_index + upperIntercept // Calculate trend line price for the previous bar var float upperTrendPrice_prev = na if (not na(upperSlope) and not na(upperIntercept)) upperTrendPrice_prev := upperSlope * (bar_index - 1) + upperIntercept // === Buy Condition Based on Trend Line Breakout === // Buy Signal: Price breaks above Upper Trend Line with volume spike breakoutBuyCondition = (not na(upperTrendPrice)) and (close > upperTrendPrice) and (not na(upperTrendPrice_prev)) and (close[1] <= upperTrendPrice_prev) and volumeSpike // === Manage Single Position === // Calculate Take Profit and Stop Loss levels based on percentage longTakeProfit = close * (1 + tpPercent / 100) longStopLoss = close * (1 - slPercent / 100) // Calculate Trailing Stop as trail_offset (in price) trail_offset = close * (trailPercent / 100) // Execute Trade with Single Position Management if (breakoutBuyCondition) // Close existing short position if any if (strategy.position_size < 0) strategy.close("Sell") // Open long position strategy.entry("Buy", strategy.long) // Set Take Profit, Stop Loss, and Trailing Stop Loss for long position strategy.exit("Take Profit Buy", from_entry="Buy", limit=longTakeProfit, stop=longStopLoss, trail_offset=trail_offset) // Plot Buy Signal plotshape(breakoutBuyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")