Indicateur RSI Stratégie double

Auteur:ChaoZhang est là., Date: 19 septembre 2023 à 19 h 43
Les étiquettes:

Résumé

Cette stratégie utilise l'indicateur d'indice de force relative (RSI) pour déterminer les niveaux de surachat et de survente pour les courts et les longs.

La logique de la stratégie

La logique de base comprend:

  1. Calcul de la valeur du RSI
  2. Définition des limites supérieures et inférieures de l'indice de résistance
  3. Retour à court lorsque le RSI dépasse la limite supérieure
  4. Départ long lorsque le RSI dépasse la limite inférieure
  5. Définition des niveaux de prise de profit et de stop-loss
  6. Position de sortie lorsque l'indice de volatilité s'inverse ou que le résultat de prise de profit/arrêt de perte est atteint

L'indicateur RSI montre un surachat au-dessus de 70 et un survente au-dessous de 30 conditions de marché. La stratégie utilise cette logique classique pour déterminer les entrées longues / courtes basées sur la valeur du RSI contre des limites prédéfinies. Des paramètres personnalisables permettent également d'optimiser les limites, le stop loss, etc. pour l'adaptation du marché.

Les avantages

  • L'indicateur d'indices de rentabilité identifie efficacement les états de marché surachetés/survendus
  • L'indicateur de risque a une base théorique solide
  • Les paramètres personnalisables s'adaptent aux différents instruments et conditions
  • Résultats de l'analyse de risque

Risques et atténuation

  • Le risque de faux signaux RSI entraînant des pertes
  • Exigent une optimisation continue des niveaux d'indice de résistance
  • Les stops peuvent être fréquemment atteints pendant l'action des prix agités

Les mesures d'atténuation

  1. Facteurs supplémentaires pour confirmer les signaux et éviter les faux
  2. Optimiser les niveaux de l'indice de résistance en fonction des caractéristiques de l'instrument
  3. Ajustez le placement de stop-loss pour réduire les risques liés à la frappe

Des possibilités d'amélioration

La stratégie peut être renforcée par:

  1. Apprentissage automatique pour l'optimisation automatique du niveau RSI

  2. Confirmation du volume pour éviter les fausses ruptures

  3. Facteurs supplémentaires tels que les moyennes mobiles pour la confirmation multifactorielle

  4. Arrêt adaptatif basé sur la volatilité du marché

  5. Analyse du volume pour évaluer les entrées/sorties de fonds

  6. Combinaison avec des stratégies non corrélées pour réduire le tirage de portefeuille

Conclusion

Il s'agit d'une stratégie de réversion moyenne simple et pratique utilisant RSI pour la détection de surachat / survente. Les paramètres personnalisables permettent l'adaptation aux marchés en évolution. Des améliorations telles que les arrêts adaptatifs, la confirmation multifactorielle et l'optimisation des paramètres peuvent rendre la stratégie plus robuste.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("4All V3", shorttitle="Strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

src = close
len = input(4, minval=1, title="Length")

up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

rsin = input(5)
sn = 100 - rsin
ln = 0 + rsin

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 10000
tp = input(15, "Take Profit") / 10000
sl = input(23, "Stop Loss") / 10000

pyr = input(1, "Pyramiding")

short = crossover(rsi, sn)
long = crossunder(rsi, ln)

totalLongs = 0
totalLongs := nz(totalLongs[1])
totalShorts = 0
totalShorts := nz(totalShorts[1])

totalLongsPrice = 0
totalLongsPrice := nz(totalLongsPrice[1])
totalShortsPrice = 0
totalShortsPrice := nz(totalShortsPrice[1])

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if long
    sectionLongs := sectionLongs + 1
    sectionShorts := 0

if short
    sectionLongs := 0
    sectionShorts := sectionShorts + 1

longCondition = long and sectionLongs >= pyr
shortCondition = short and sectionShorts >= pyr

last_long = na
last_short = na
last_long := longCondition ? time : nz(last_long[1])
last_short := shortCondition ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = na
last_open_short_signal = na
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = na
last_short_signal = na
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = na
last_low = na
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(1, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=longCondition)
    strategy.entry("Short", strategy.short, when=shortCondition)
    
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

Plus de