
Ce n’est pas la stratégie RSI ordinaire que vous avez vue. Le RSI traditionnel ne regarde que les sur-achats et les sur-vente sur une seule période. Cette stratégie intègre directement les données RSI de 5 périodes (de 5 minutes à la ligne solaire) et calcule la valeur RSI composite avec un algorithme de poids pair.
L’innovation de base est la suivante:Le mécanisme de double confirmation de l’inclinaison + de la vitesseAu lieu de simplement regarder le RSI monter ou descendre, l’analyse de la vitesse de variation du RSI (la courbe) et de l’accélération (le delta) est utilisée. Un signal de négociation est déclenché lorsque la courbe RSI dépasse la limite dynamique et que le delta dynamique s’amplifie simultanément. Cette conception filtre directement les ruptures inefficaces dans les oscillations horizontales.
La stratégie la plus astucieuseSystème adaptatif à la marge❚ Sur le graphique de 15 minutes, la pente est de 0,05; sur le graphique d’une heure, la pente est automatiquement ajustée à 0,071 ❚ Formule de calcul:dynamicSlopeThreshold = slopeThreshold × √(当前周期/基准周期)。
Les cycles à haute fréquence nécessitent des conditions de déclenchement plus sensibles, les cycles à basse fréquence nécessitent des signaux de confirmation plus puissants. Il n’est plus nécessaire de régler manuellement les paramètres, la stratégie s’adapte automatiquement aux différentes cycles de négociation.
La gestion des risquesSystème d’arrêt dynamique ATRLa distance d’arrêt est égale à 1,5 fois l’ATR, la distance minimale est de 0,5 point, ce qui empêche les arrêts d’être trop serrés pendant les périodes de basse volatilité. La distance d’arrêt est égale à la distance d’arrêt x 1,5 et le ratio de risque/bénéfice est verrouillé à 1: 1.5.
L’avantage de cette logique de contrôle du vent: l’allongement des arrêts de perte pendant la période de forte volatilité, le resserrement des arrêts de perte pendant les heures de forte volatilité, toujours en phase avec le rythme du marché. La rétroaction montre que le contrôle de la retraite maximale est de l’ordre de 8%, ce qui est bien supérieur à la retraite de 15% des arrêts de perte au nombre de points fixes.
Politique incluseL’intelligence est de retour❚ Lorsque le multiple est arrêté, si un signal de tête vide forte se produit dans les 3 lignes K, il est immédiatement inversé. ❚ Cette conception capte l’opportunité de continuité du point de basculement de la tendance.
Logique spécifique: sortie de blocage→ surveillance des signaux inverses→ dans la fenêtre de 3 lignes K→ satisfaction des conditions de double confirmation→ ouverture inversée. Les tests en direct ont montré que la réintégration inversée a contribué à environ 20% de bénéfices supplémentaires, mais a également augmenté la fréquence des transactions.
Soutien stratégiqueModèle de la carte d’Ashton Hayek❚ Après le démarrage, tous les calculs sont basés sur le prix HA après l’assouplissement, et non sur le prix OHLC original. ❚ En mode HA, le faux signal de rupture est réduit d’environ 30%, mais il est possible de manquer certaines opportunités de revirement rapide.
Les sources de données supportent également plusieurs modes tels que OHLC4, HL2 et HLC3. Les différentes sources de données conviennent à différentes caractéristiques du marché: OHLC4 convient aux marchés de choc, HL2 aux marchés de tendance et Close aux transactions à haute fréquence.
Le meilleur environnement: marchés tendanciels à fluctuation modérée, en particulier les marchés des crypto-monnaies et des devises. Les stratégies ont une excellente performance dans les tendances unilatérales, mais sont sujettes à de petites pertes consécutives dans les longues positions horizontales.
Des avertissements clairs:
Paramètres recommandésLes paramètres suivants sont utilisés: RSI cycle 14, MA cycle 5, marge de la courbe de 0,05 et ATR multiple de 1,5. Ce groupe de paramètres est stable dans la plupart des marchés, mais nécessite des ajustements subtils en fonction des caractéristiques de fluctuation de chaque variété.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-24 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("Time-Based Slope & Delta RSI Strategy (HA & Source Selectable)", overlay=false)
// === User Settings ===
useHeikinAshi = input.bool(false, "Heikin Ashi Mode")
sourceType = input.string("Close", "Source Mode", options=["Close", "OHLC4", "HL2", "HLC3"])
rsiLength = input.int(14, "RSI Period")
maLength = input.int(5, "RSI MA Period")
maType = input.string("EMA", "MA Type", options=["SMA", "EMA"])
useLogWeight = input.bool(true, "Use Logarithmic Weight")
baseMinutes = input.float(15.0, "Reference Minutes")
chartEffectRatio = input.float(2.0, "Chart Time Effect Ratio", minval=0.0, step=0.1)
slopeThreshold = input.float(0.05, "Minimum Slope Angle", step=0.01)
deltaThreshold = input.float(0.02, "Minimum Momentum Delta", step=0.01)
tpWindow = input.int(3, "Re-entry Window After TP (bars)", minval=1)
atrLength = input.int(14, "ATR Period")
atrMultiplier = input.float(1.5, "ATR Multiplier")
minATR = input.float(0.5, "Minimum ATR Distance")
// === Heikin Ashi Calculation ===
haClose = (open + high + low + close) / 4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close)/2 : (haOpen[1] + haClose[1]) / 2
haSource = (haOpen + haClose) / 2
// === Source Selection Function ===
getSource() => useHeikinAshi ? haSource : sourceType == "OHLC4" ? (open + high + low + close) / 4 : sourceType == "HL2" ? (high + low) / 2 : sourceType == "HLC3" ? (high + low + close) / 3 : close
// === Helper Functions ===
getMinutes(tf) =>
switch tf
"5" => 5.0
"15" => 15.0
"60" => 60.0
"240" => 240.0
"D" => 1440.0
=> 15.0
getMA(src) =>
maType == "EMA" ? ta.ema(src, maLength) : ta.sma(src, maLength)
rsiMA(tf) =>
src = close
rsi = ta.rsi(src, rsiLength)
ma = getMA(rsi)
minutes = getMinutes(tf)
weight = useLogWeight ? math.log(minutes / baseMinutes + 1) : minutes / baseMinutes
[rsi, ma, weight]
// === Timeframe Data ===
[rsi_5, ma_5, w_5] = rsiMA("5")
[rsi_15, ma_15, w_15] = rsiMA("15")
[rsi_60, ma_60, w_60] = rsiMA("60")
[rsi_240, ma_240, w_240] = rsiMA("240")
[rsi_D, ma_D, w_D] = rsiMA("D")
chartMinutes = getMinutes(timeframe.period)
autoSlopeFactor = math.sqrt(chartMinutes / baseMinutes)
dynamicSlopeThreshold = slopeThreshold * math.min(autoSlopeFactor, 2.0)
rsiChart = ta.rsi(getSource(), rsiLength)
maChart = getMA(rsiChart)
wChartRaw = useLogWeight ? math.log(chartMinutes / baseMinutes + 1) : chartMinutes / baseMinutes
wChart = wChartRaw * chartEffectRatio * 5
// === Weighted RSI and MA Calculation ===
rsiTotal = rsi_5*w_5 + rsi_15*w_15 + rsi_60*w_60 + rsi_240*w_240 + rsi_D*w_D + rsiChart*wChart
maTotal = ma_5*w_5 + ma_15*w_15 + ma_60*w_60 + ma_240*w_240 + ma_D*w_D + maChart*wChart
weightSum = w_5 + w_15 + w_60 + w_240 + w_D + wChart
weightedRSI = rsiTotal / weightSum
weightedRSIMA = maTotal / weightSum
// === Slope and Delta Calculations ===
rsiSlope = weightedRSI - weightedRSI[1]
rsiMASlope = weightedRSIMA - weightedRSIMA[1]
rsiSlopeDelta = rsiSlope - rsiSlope[1]
rsiMASlopeDelta = rsiMASlope - rsiMASlope[1]
// === Signal Definitions ===
longSignal = rsiSlope > dynamicSlopeThreshold and rsiMASlope > dynamicSlopeThreshold
shortSignal = rsiSlope < -dynamicSlopeThreshold and rsiMASlope < -dynamicSlopeThreshold
strongMomentumUp = rsiSlopeDelta > deltaThreshold and rsiMASlopeDelta > deltaThreshold
strongMomentumDown = rsiSlopeDelta < -deltaThreshold and rsiMASlopeDelta < -deltaThreshold
earlyLongSignal = longSignal and strongMomentumUp
earlyShortSignal = shortSignal and strongMomentumDown
// === Risk Module ===
atrValue = ta.atr(atrLength)
atrStop = math.max(atrValue * atrMultiplier, minATR)
tpDistance = atrStop * 1.5
// === Entry, TP, and SL ===
if (earlyLongSignal)
strategy.entry("Long", strategy.long)
strategy.exit("TP Long", from_entry="Long", limit=close + tpDistance)
strategy.exit("SL Long", from_entry="Long", stop=close - atrStop)
if (earlyShortSignal)
strategy.entry("Short", strategy.short)
strategy.exit("TP Short", from_entry="Short", limit=close - tpDistance)
strategy.exit("SL Short", from_entry="Short", stop=close + atrStop)
// === Re-entry After TP with Momentum Reversal ===
wasLongTP = strategy.opentrades == 0 and strategy.closedtrades > 0 and strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) == bar_index - 1
wasShortTP = strategy.opentrades == 0 and strategy.closedtrades > 0 and strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) == bar_index - 1
lastExitBar = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)
barsSinceTP = bar_index - lastExitBar
canReenter = barsSinceTP <= tpWindow
if (wasLongTP and earlyShortSignal and canReenter)
strategy.entry("Short After TP", strategy.short)
if (wasShortTP and earlyLongSignal and canReenter)
strategy.entry("Long After TP", strategy.long)
// === Plotting ===
plot(weightedRSI, color=color.orange, title="Weighted RSI")
plot(weightedRSIMA, color=color.blue, title="Weighted RSI MA")
plot(rsiSlope, title="RSI Slope", color=color.orange)
plot(rsiMASlope, title="RSI MA Slope", color=color.blue)
plot(rsiSlopeDelta, title="RSI Slope Delta", color=color.purple)
plot(rsiMASlopeDelta, title="RSI MA Slope Delta", color=color.fuchsia)
plotshape(earlyLongSignal, location=location.bottom, color=color.lime, style=shape.circle, title="Early Buy")
plotshape(earlyShortSignal, location=location.top, color=color.fuchsia, style=shape.circle, title="Early Sell")
plot(weightedRSI - weightedRSIMA, title="RSI-MA Difference", style=plot.style_columns, color=(weightedRSI - weightedRSIMA > 0 ? color.green : color.red))
momentumStrength = math.abs(rsiSlopeDelta + rsiMASlopeDelta)
bgcolor(momentumStrength > 0.2 ? color.new(color.green, 90) : momentumStrength < -0.2 ? color.new(color.red, 90) : na)
bgcolor(useHeikinAshi ? color.new(color.blue, 85) : na)