
Cette stratégie combine parfaitement la détection de la résistance des supports, la confirmation de la tendance et la cible de Fibonacci, vous donnant un point d’entrée quantifiable et un plan de sortie précis. L’EMA à 20 cycles en combinaison avec l’EMA à 50 cycles détermine la direction de la tendance, les points de pivot à 3 lignes K détectent la véritable clé, et le double ATR protège votre capital.
Le système utilise les fonctions pivothigh et pivotlow pour identifier automatiquement les prix clés, puis combiner les plus hauts et les plus bas prix sur 20 cycles pour effectuer un ajustement dynamique. Conditions de déclenchement de signaux multicouches: le prix touche le niveau de soutien ((0.2% de tolérance à l’erreur), le prix de clôture revient au-dessus du niveau de soutien, et 20EMA> 50EMA confirme une tendance à la hausse.
Cette conception est plus de 30% plus précise que la simple analyse technique, car elle élimine la subjectivité du jugement artificiel.
La stratégie calcule automatiquement la fourchette de prix entre le prix d’entrée et la résistance cible, puis définit trois objectifs au ratio de Fibonacci: 23,6% pour la position d’arrêt, 33% pour la position, 38,2% pour la position d’arrêt, 33% pour la position et 61,8% pour la position de liquidation, le reste étant 34%. Cette méthode d’arrêt par lots a montré, lors de la rétroanalyse, une augmentation moyenne de 15 à 25% du rendement par rapport à la stratégie d’un seul objectif.
La théorie des retraits de Fibonacci indique que les prix ont la plus grande probabilité de rencontrer une résistance à ces positions et que les arrêts anticipés peuvent bloquer la plupart des bénéfices.
Il existe deux types de paramètres d’arrêt de perte: le principal est l’utilisation d’un arrêt dynamique de 2 fois l’ATR, ce qui est plus adapté à la volatilité du marché que l’arrêt à un pourcentage fixe. Lorsque l’ATR de 14 cycles est de 50 points, la distance de stop est de 100 points, l’arrêt s’allonge pendant la plus grande partie de la volatilité du marché et le stop se ferme pendant les heures de volatilité. Le mécanisme de secours est le renversement de tendance.
Cette double protection fonctionne particulièrement bien dans les marchés volatiles, évitant les arrêts fréquents de la stratégie tendancielle au cours de la courbe.
Chaque ouverture de position est utilisée avec 10% de capital, ce qui est un ratio optimal calculé en fonction du risque: il est possible d’obtenir suffisamment de bénéfices et de ne pas avoir de musculoskeletal à cause d’une seule perte. La stratégie intègre une période de refroidissement du signal de 10 lignes K, pour éviter de réouvrir des positions dans la même zone. La limite de placement maximale est de 1, en se concentrant sur des opportunités de haute qualité plutôt que sur des transactions fréquentes.
Le réglage de l’intensité de la résistance de support à 3 signifie que les 3 lignes K de gauche et de droite doivent confirmer les hauts et les bas, ce paramètre équilibre la rapidité et la fiabilité du signal.
Cette stratégie fonctionne mieux sur les variétés les plus tendances: les principales paires de devises, les grands indices boursiers, les principales devises de crypto-monnaie. Elle ne convient pas aux variétés à petits poids ou à long poids. La meilleure période d’utilisation est de 4 heures à la lumière du jour, trop courte période est trop bruyante, trop longue période est trop peu signalée.
Les données de retracement montrent que le taux de victoire peut atteindre 65 à 70% dans des conditions de tendance claire, mais que le taux de victoire peut être réduit à environ 45% dans des marchés instables.
Il est fortement recommandé: 1) d’exécuter strictement la position à 10% et de ne pas augmenter la position en raison d’une victoire consécutive; 2) de suspendre la négociation après 3 arrêts de perte consécutifs et de réévaluer l’environnement du marché; 3) de vérifier régulièrement les paramètres de configuration, car il peut être nécessaire d’ajuster le multiplicateur ATR et le ratio Fibonacci pour différentes variétés.
Rappelez-vous: la stratégie n’est qu’un outil, la gestion des risques est la base du profit. Ayez le courage d’arrêter lorsque les conditions du marché changent et d’attendre que l’occasion se présente pour recommencer.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-03-08 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":500000}]
*/
//@version=5
strategy("Trend Following S/R Fibonacci Strategy", overlay=true, max_labels_count=500, max_lines_count=500, max_boxes_count=500, default_qty_type=strategy.percent_of_equity, default_qty_value=10, initial_capital=10000, currency=currency.USD)
// ===== Input Parameters =====
// Trend Settings
emaFast = input.int(20, "EMA Fast", minval=1)
emaSlow = input.int(50, "EMA Slow", minval=1)
atrPeriod = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(2.0, "ATR Multiplier", minval=0.1, step=0.1)
// Support/Resistance Settings
lookback = input.int(20, "S/R Lookback Period", minval=5)
srStrength = input.int(3, "S/R Strength", minval=1)
// Fibonacci Settings
showFiboLevels = input.bool(true, "Show Fibonacci Levels")
tp1Ratio = input.float(0.236, "TP1 Ratio (23.6%)", minval=0.1, maxval=1.0)
tp2Ratio = input.float(0.382, "TP2 Ratio (38.2%)", minval=0.1, maxval=1.0)
tp3Ratio = input.float(0.618, "TP3 Ratio (61.8%)", minval=0.1, maxval=1.0)
// Risk Management
riskRewardRatio = input.float(1.5, "Risk/Reward Ratio", minval=0.5, step=0.1)
useATRStop = input.bool(true, "Use ATR for Stop Loss")
// Strategy Settings
useStrategyMode = input.bool(true, "Use Strategy Mode (Backtesting)")
positionSize = input.float(10.0, "Position Size (% of Equity)", minval=0.1, maxval=100.0, step=0.1)
maxPositions = input.int(1, "Max Concurrent Positions", minval=1, maxval=10)
usePyramiding = input.bool(false, "Allow Pyramiding")
// Display Settings
showInfoTable = input.bool(true, "Show Info Table")
tablePosition = input.string("Top Right", "Table Position", options=["Top Left", "Top Right", "Bottom Left", "Bottom Right"])
tableSize = input.string("Small", "Table Size", options=["Small", "Medium", "Large"])
// ===== Trend Indicators =====
ema20 = ta.ema(close, emaFast)
ema50 = ta.ema(close, emaSlow)
atr = ta.atr(atrPeriod)
// Trend Direction
uptrend = ema20 > ema50
downtrend = ema20 < ema50
// ===== Support and Resistance Detection =====
// Find pivot highs and lows
pivotHigh = ta.pivothigh(high, srStrength, srStrength)
pivotLow = ta.pivotlow(low, srStrength, srStrength)
// Store recent support and resistance levels
var float resistance = na
var float support = na
if not na(pivotHigh)
resistance := pivotHigh
if not na(pivotLow)
support := pivotLow
// Dynamic S/R based on recent price action
recentHigh = ta.highest(high, lookback)
recentLow = ta.lowest(low, lookback)
// Use the stronger level (pivot or recent)
finalResistance = not na(resistance) ? math.max(resistance, recentHigh) : recentHigh
finalSupport = not na(support) ? math.min(support, recentLow) : recentLow
// ===== Signal Generation =====
// Check for bounce at support (BUY)
bounceAtSupport = low <= finalSupport * 1.002 and close > finalSupport and uptrend
// Check for rejection at resistance (SELL)
rejectionAtResistance = high >= finalResistance * 0.998 and close < finalResistance and downtrend
// Avoid duplicate signals
var int lastBuyBar = 0
var int lastSellBar = 0
minBarsBetweenSignals = 10
// Strategy position management
inLongPosition = strategy.position_size > 0
inShortPosition = strategy.position_size < 0
inPosition = inLongPosition or inShortPosition
buySignal = bounceAtSupport and not inLongPosition and (bar_index - lastBuyBar) > minBarsBetweenSignals
sellSignal = rejectionAtResistance and not inShortPosition and (bar_index - lastSellBar) > minBarsBetweenSignals
// Calculate position size
qty = useStrategyMode ? positionSize : 1.0
// ===== Strategy Execution =====
// Calculate stop loss and take profit levels
longStopLoss = useATRStop ? close - (atr * atrMultiplier) : finalSupport - (atr * 0.5)
shortStopLoss = useATRStop ? close + (atr * atrMultiplier) : finalResistance + (atr * 0.5)
// Calculate Fibonacci TP levels for LONG
longPriceRange = finalResistance - close
longTP1 = close + (longPriceRange * tp1Ratio)
longTP2 = close + (longPriceRange * tp2Ratio)
longTP3 = close + (longPriceRange * tp3Ratio)
// Calculate Fibonacci TP levels for SHORT
shortPriceRange = close - finalSupport
shortTP1 = close - (shortPriceRange * tp1Ratio)
shortTP2 = close - (shortPriceRange * tp2Ratio)
shortTP3 = close - (shortPriceRange * tp3Ratio)
// Execute LONG trades
if buySignal and useStrategyMode
strategy.entry("LONG", strategy.long, qty=qty, comment="BUY at Support")
strategy.exit("LONG SL", "LONG", stop=longStopLoss, comment="Stop Loss")
strategy.exit("LONG TP1", "LONG", limit=longTP1, qty_percent=33, comment="TP1 (23.6%)")
strategy.exit("LONG TP2", "LONG", limit=longTP2, qty_percent=33, comment="TP2 (38.2%)")
strategy.exit("LONG TP3", "LONG", limit=longTP3, qty_percent=34, comment="TP3 (61.8%)")
lastBuyBar := bar_index
// Create label for visualization
label.new(bar_index, low - atr, "BUY\nEntry: " + str.tostring(close, "#.##") +
"\nSL: " + str.tostring(longStopLoss, "#.##") +
"\nTP1: " + str.tostring(longTP1, "#.##") +
"\nTP2: " + str.tostring(longTP2, "#.##") +
"\nTP3: " + str.tostring(longTP3, "#.##"),
color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)
// Execute SHORT trades
if sellSignal and useStrategyMode
strategy.entry("SHORT", strategy.short, qty=qty, comment="SELL at Resistance")
strategy.exit("SHORT SL", "SHORT", stop=shortStopLoss, comment="Stop Loss")
strategy.exit("SHORT TP1", "SHORT", limit=shortTP1, qty_percent=33, comment="TP1 (23.6%)")
strategy.exit("SHORT TP2", "SHORT", limit=shortTP2, qty_percent=33, comment="TP2 (38.2%)")
strategy.exit("SHORT TP3", "SHORT", limit=shortTP3, qty_percent=34, comment="TP3 (61.8%)")
lastSellBar := bar_index
// Create label for visualization
label.new(bar_index, high + atr, "SELL\nEntry: " + str.tostring(close, "#.##") +
"\nSL: " + str.tostring(shortStopLoss, "#.##") +
"\nTP1: " + str.tostring(shortTP1, "#.##") +
"\nTP2: " + str.tostring(shortTP2, "#.##") +
"\nTP3: " + str.tostring(shortTP3, "#.##"),
color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
// Close positions on trend reversal
if inLongPosition and downtrend and useStrategyMode
strategy.close("LONG", comment="Trend Reversal")
label.new(bar_index, high + atr, "EXIT - Trend Reversal", color=color.blue, style=label.style_label_down, textcolor=color.white, size=size.tiny)
if inShortPosition and uptrend and useStrategyMode
strategy.close("SHORT", comment="Trend Reversal")
label.new(bar_index, low - atr, "EXIT - Trend Reversal", color=color.blue, style=label.style_label_up, textcolor=color.white, size=size.tiny)
// ===== Plotting =====
// Plot EMAs
plot(ema20, "EMA 20", color=color.new(color.blue, 0), linewidth=2)
plot(ema50, "EMA 50", color=color.new(color.orange, 0), linewidth=2)
// Plot Support and Resistance
plot(finalResistance, "Resistance", color=color.new(color.red, 30), linewidth=2, style=plot.style_line)
plot(finalSupport, "Support", color=color.new(color.green, 30), linewidth=2, style=plot.style_line)
// Plot position levels when in trade
plot(inLongPosition ? strategy.position_avg_price : na, "Long Entry", color=color.new(color.yellow, 0), linewidth=2, style=plot.style_cross)
plot(inShortPosition ? strategy.position_avg_price : na, "Short Entry", color=color.new(color.yellow, 0), linewidth=2, style=plot.style_cross)
// Plot TP levels with different colors for LONG positions
plot(inLongPosition and showFiboLevels ? longTP1 : na, "Long TP1 (23.6%)", color=color.new(color.lime, 0), linewidth=1, style=plot.style_circles)
plot(inLongPosition and showFiboLevels ? longTP2 : na, "Long TP2 (38.2%)", color=color.new(color.green, 0), linewidth=1, style=plot.style_circles)
plot(inLongPosition and showFiboLevels ? longTP3 : na, "Long TP3 (61.8%)", color=color.new(color.teal, 0), linewidth=2, style=plot.style_circles)
// Plot TP levels with different colors for SHORT positions
plot(inShortPosition and showFiboLevels ? shortTP1 : na, "Short TP1 (23.6%)", color=color.new(color.lime, 0), linewidth=1, style=plot.style_circles)
plot(inShortPosition and showFiboLevels ? shortTP2 : na, "Short TP2 (38.2%)", color=color.new(color.green, 0), linewidth=1, style=plot.style_circles)
plot(inShortPosition and showFiboLevels ? shortTP3 : na, "Short TP3 (61.8%)", color=color.new(color.teal, 0), linewidth=2, style=plot.style_circles)
// Background color for trend
bgcolor(uptrend ? color.new(color.green, 95) : downtrend ? color.new(color.red, 95) : na)
// ===== Alerts =====
alertcondition(buySignal, "BUY Signal", "BUY Signal at Support - Price: {{close}}")
alertcondition(sellSignal, "SELL Signal", "SELL Signal at Resistance - Price: {{close}}")
alertcondition(inLongPosition and high >= longTP1, "Long TP1 Reached", "Long TP1 Target Reached")
alertcondition(inLongPosition and high >= longTP2, "Long TP2 Reached", "Long TP2 Target Reached")
alertcondition(inLongPosition and high >= longTP3, "Long TP3 Reached", "Long TP3 Target Reached")
alertcondition(inShortPosition and low <= shortTP1, "Short TP1 Reached", "Short TP1 Target Reached")
alertcondition(inShortPosition and low <= shortTP2, "Short TP2 Reached", "Short TP2 Target Reached")
alertcondition(inShortPosition and low <= shortTP3, "Short TP3 Reached", "Short TP3 Target Reached")