
EMA, MACD, RSI, CVD, ATR
La stratégie traditionnelle d’inversion ne regarde qu’un ou deux indicateurs? C’est le jeu. Cette stratégie nécessite la confirmation simultanée de quatre dimensions: le contexte de la tendance EMA, la conversion de la dynamique MACD, le surboutique RSI et l’analyse des flux d’ordres. Les données de retrospective montrent que ce mécanisme de filtrage strict augmente le taux de filtrage des faux signaux à plus de 80%.
Ce n’est pas chaque inversion qui vaut la peine d’être échangée, seulement une inversion quadruplement confirmée est de l’argent et de l’or.
L’innovation centrale de la stratégie réside dans la combinaison de l’analyse de la déviation du RSI et de la différence de la circulation cumulée (CVD). Lorsque le prix est innovant mais que le RSI refuse de s’innover, le deltaEma montre une augmentation de la force d’achat, c’est-à-dire une paire d’or inversée en bas. Les données montrent que le signal avec la confirmation de la déviation du RSI a un taux de victoire 35% plus élevé que le signal de retournement ordinaire.
L’analyse technique traditionnelle regarde le prix, le trader intelligent regarde les flux de capitaux.
Le paramètre de stop loss utilise un ajustement dynamique de 1,5 fois l’ATR, ce qui permet d’éviter que les stop loss fixes ne soient fréquemment déclenchés pendant les périodes de forte volatilité, tout en assurant une protection suffisante pendant les périodes de faible volatilité. Le calcul de l’ATR à 14 cycles fournit un portrait réaliste des fluctuations du marché, le facteur de 1,5 fois affichant le meilleur rapport risque/bénéfice lors de la rétroévaluation.
Les pertes consécutives sont l’ennemi juré de la stratégie de renversement, et le stop strict est le seul remède.
La stratégie nécessite un trafic supérieur à 1,3 fois la moyenne de 20 cycles pour confirmer l’efficacité du signal. Cette condition apparemment simple filtre en fait 70% des signaux de mauvaise qualité.
Le marché peut tromper, mais pas le volume.
L’EMA à 50 cycles détermine la tendance intermédiaire, l’EMA à 200 cycles détermine la direction de la tendance principale. La stratégie ne cherche des occasions de reprise que lorsque le prix est proche ou inférieur à l’EMA, cette pensée “avance dans l’adversité” qui augmente le taux de réussite des transactions de 45% à 65%.
Les baisses de prix ne sont pas toutes répercutées, mais seulement les baisses de prix des supports clés qui méritent d’être couvertes.
La rétrospective montre que la stratégie se démarque dans les conditions de choc, avec un taux de victoire mensuel de plus de 70%. Cependant, dans les marchés à forte tendance, les signaux de renversement sont sujets à l’étouffement des forces de la tendance, auquel cas il est recommandé de réduire la position ou de suspendre son utilisation.
Il n’y a pas de stratégie universelle, seulement celle qui convient à un marché particulier. En reconnaissant cela, vous dépassez les 90% des traders.
Toute stratégie quantitative présente un risque d’échec, en particulier dans des conditions de marché extrêmes. La stratégie a enregistré des pertes consécutives au cours des périodes de hausse des taux en mars 2020 et en 2022. Il est recommandé d’appliquer une gestion rigoureuse des fonds, avec une seule marge de risque ne dépassant pas 2% du compte et d’évaluer régulièrement l’efficacité de la stratégie.
/*backtest
start: 2025-12-10 15:15:00
end: 2026-03-10 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FundedRelay
//@version=6
strategy("4x Reversal Confluence Strategy", overlay=true,
margin_long=100, margin_short=100,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100)
// ────────────────────────────────────────
// INPUTS
// ────────────────────────────────────────
emaShortLen = input.int(50, "EMA Short (context)", minval=20)
emaLongLen = input.int(200, "EMA Long (major trend)")
macdFast = input.int(12, "MACD Fast")
macdSlow = input.int(26, "MACD Slow")
macdSignal = input.int(9, "MACD Signal")
rsiLen = input.int(14, "RSI Length")
rsiOversold = input.int(35, "RSI Oversold Level")
rsiOverbought = input.int(65, "RSI Overbought Level")
divLookback = input.int(5, "Divergence Lookback Bars", minval=3)
volMult = input.float(1.3,"Volume > Avg Multiplier", minval=1.0)
atrLen = input.int(14, "ATR Length for Stops")
atrMultSL = input.float(1.5,"ATR Stop Multiplier", minval=0.5)
useVolume = input.bool(true, "Require Volume Spike")
// ────────────────────────────────────────
// INDICATORS
// ────────────────────────────────────────
emaShort = ta.ema(close, emaShortLen)
emaLong = ta.ema(close, emaLongLen)
plot(emaShort, "EMA Short", color=color.blue, linewidth=2)
plot(emaLong, "EMA Long", color=color.orange, linewidth=3)
// MACD
[macdLine, signalLine, hist] = ta.macd(close, macdFast, macdSlow, macdSignal)
// RSI
rsi = ta.rsi(close, rsiLen)
// Volume proxy delta
upVol = close > close[1] ? volume : close == close[1] ? volume * 0.5 : 0.0
dnVol = close < close[1] ? volume : close == close[1] ? volume * 0.5 : 0.0
delta = upVol - dnVol
deltaEma = ta.ema(delta, 5)
cvd = ta.cum(delta)
cvdEma = ta.ema(cvd, 21)
// Volume average
volAvg = ta.sma(volume, 20)
// ────────────────────────────────────────
// DIVERGENCE DETECTION
// ────────────────────────────────────────
priceLow = ta.pivotlow(low, divLookback, divLookback)
priceHigh = ta.pivothigh(high, divLookback, divLookback)
rsiLow = ta.pivotlow(rsi, divLookback, divLookback)
rsiHigh = ta.pivothigh(rsi, divLookback, divLookback)
// Bullish RSI divergence
bullRsiDiv = not na(priceLow) and not na(rsiLow) and
low < low[divLookback * 2] and rsi > rsi[divLookback * 2]
// Bearish RSI divergence
bearRsiDiv = not na(priceHigh) and not na(rsiHigh) and
high > high[divLookback * 2] and rsi < rsi[divLookback * 2]
// ────────────────────────────────────────
// BULLISH CONDITIONS
// ────────────────────────────────────────
bullTrendContext = close <= emaShort or close <= emaLong
bullMacd = ta.crossover(macdLine, signalLine) or (hist > hist[1] and hist[1] <= 0)
bullRsi = rsi < rsiOversold or bullRsiDiv or (rsi[1] <= rsiOversold and rsi > rsiOversold)
bullOrderFlow = deltaEma > 0 and deltaEma > deltaEma[1] and cvdEma > cvdEma[1]
bullVolume = not useVolume or volume > volAvg * volMult
bullSignal = bullTrendContext and bullMacd and bullRsi and bullOrderFlow and bullVolume
// ────────────────────────────────────────
// BEARISH CONDITIONS
// ────────────────────────────────────────
bearTrendContext = close >= emaShort or close >= emaLong
bearMacd = ta.crossunder(macdLine, signalLine) or (hist < hist[1] and hist[1] >= 0)
bearRsi = rsi > rsiOverbought or bearRsiDiv or (rsi[1] >= rsiOverbought and rsi < rsiOverbought)
bearOrderFlow = deltaEma < 0 and deltaEma < deltaEma[1] and cvdEma < cvdEma[1]
bearVolume = not useVolume or volume > volAvg * volMult
bearSignal = bearTrendContext and bearMacd and bearRsi and bearOrderFlow and bearVolume
// ────────────────────────────────────────
// ENTRIES
// ────────────────────────────────────────
if bullSignal
strategy.entry("Long", strategy.long)
if bearSignal
strategy.entry("Short", strategy.short)
// ────────────────────────────────────────
// EXITS
// ────────────────────────────────────────
// Close on opposite signal
if bearSignal
strategy.close("Long", comment="Opp Signal → Exit Long")
if bullSignal
strategy.close("Short", comment="Opp Signal → Exit Short")
// Initial ATR stop-loss
atrVal = ta.atr(atrLen)
strategy.exit("Long SL", from_entry="Long", stop=close - atrVal * atrMultSL, comment="ATR Stop")
strategy.exit("Short SL", from_entry="Short", stop=close + atrVal * atrMultSL, comment="ATR Stop")
// ────────────────────────────────────────
// VISUALS
// ────────────────────────────────────────
plotshape(bullSignal, title="Bull Rev", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(bearSignal, title="Bear Rev", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
bgcolor(bullSignal ? color.new(color.green, 92) : na)
bgcolor(bearSignal ? color.new(color.red, 92) : na)
// Debug helpers (uncomment when needed)
//plotshape(bullRsiDiv, "Bull RSI Div", shape.labelup, location.belowbar, color=color.lime, text="Bull Div", size=size.tiny)
//plotshape(bearRsiDiv, "Bear RSI Div", shape.labeldown, location.abovebar, color=color.orange, text="Bear Div", size=size.tiny)