Stratégie de momentum de pente pondérée dans le temps

RSI SLOPE DELTA ATR Multi-Timeframe
Date de création: 2025-09-25 14:09:37 Dernière modification: 2025-09-25 14:09:37
Copier: 0 Nombre de clics: 206
2
Suivre
319
Abonnés

Stratégie de momentum de pente pondérée dans le temps Stratégie de momentum de pente pondérée dans le temps

L’analyse de la courbe RSI à plusieurs périodes: 3 fois plus précise que les stratégies RSI traditionnelles

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.

Conception de seuil dynamique: réglage automatique de la sensibilité en fonction de la période du graphique

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.

Module de contrôle du vent ATR: 1,5 fois le freinage ATR, pour un contrôle strict du risque individuel

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.

Mécanisme de reprise par inversion: ouverture de position par inversion dans les 3 lignes K après l’arrêt

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.

Modèle Haiken-Ash: atténuer le bruit des prix et améliorer la stabilité du signal

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.

Scenarios et avertissements à risque

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

  • Les marchés de choc ont un mauvais rendement et un risque élevé de pertes continues
  • Le calcul de plusieurs périodes augmente la complexité de la stratégie et nécessite des données historiques suffisantes.
  • La fonction de retour en arrière peut causer des doubles pertes lors de fausses percées
  • Les retours historiques ne représentent pas les bénéfices futurs, les performances du disque dur peuvent varier.

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é.

Code source de la stratégie
/*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)