
Le RSI est une stratégie de trading quantitative basée sur un indice relativement faible (RSI) et une amplitude réelle moyenne (ATR). La stratégie s’adapte aux fluctuations rapides du marché en ajustant dynamiquement le stop loss (TP/SL) pour capturer les opportunités de reprise de tendance. La stratégie est centrée sur le RSI et, combinée à l’ATR, mesure la volatilité et construit les deux bandes dynamiques d’adaptation suivantes comme base pour ouvrir des positions de placement.
Le cœur de la stratégie de retour de tendance du RSI est la construction d’une zone de stop-loss dynamique. Tout d’abord, utilisez les fonctions personnalisées highest_custom et lowest_custom pour trouver le prix le plus élevé et le prix le plus bas depuis le dernier croisement, formant ainsi une base de bande.
Le multiplicateur est un facteur d’expansion de la bande de fréquence personnalisée par l’utilisateur. Si le prix est supérieur à la barre de fréquence, il est plus élevé, si le prix est inférieur à la barre de fréquence, il est plus bas.
La stratégie de retour de tendance RSI utilise le RSI et l’ATR pour construire des bandes d’adaptation qui permettent d’ajuster dynamiquement les points d’arrêt et de perte en temps opportun pour répondre aux changements du marché. La logique de la stratégie est claire, son champ d’application est large et peut être un outil puissant pour les traders quantifiés.
/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("RSI Trend Reversal", overlay=true, max_bars_back = 4999, calc_on_every_tick = false)
//INPUTS
rsi_length = input.int(title = "Lenght", defval = 8)
rsi_mult = input.float(title = "Multiplier", defval = 1.5, step = .05)
lookback = input.int(title = "Delay to prevent idealization", defval = 1)
sltp = input.float(title = "Minimum Difference", defval = 10)
src = input.source(title = "Source Input", defval = close)
//PARAMETERS INITILIZATION
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//FUNCTION INITILIZATION
highest_custom(src, length) =>
x = src
for i = 0 to length
if src[i] > x
x := src[i]
x
lowest_custom(src, length) =>
x = src
for i = 0 to length
if src[i] < x
x := src[i]
x
rsilev(src, length, mult, sltp) =>
sl = (100 - sltp) / 100
tp = (100 + sltp) / 100
var bool crossup = na
var bool crossdown = na
var float dir = na
dir_change = ta.change(dir)
var float BearGuy = 0
BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
BearGuy += 1
else
BearGuy := BullGuy
var float upper = na
var float lower = na
rsilower = ta.rsi(src, length)
rsiupper = math.abs(ta.rsi(src, length) - 100)
atr = ta.atr(length) / src
lower := highest_custom(math.max(highest_custom(highest_custom(src, BearGuy) * (1 - (atr + ((1 / (rsilower) * mult)))), BearGuy), src * sl), BearGuy)
upper := lowest_custom(math.min(lowest_custom(lowest_custom(src, BearGuy) * (1 + (atr + ((1 / (rsiupper) * mult)))), BearGuy), src * tp), BearGuy)
var float thresh = na
if na(thresh)
thresh := lower
if na(dir)
dir := 1
if crossdown
dir := -1
if crossup
dir := 1
if dir == 1
thresh := lower
if dir == -1
thresh := upper
crossup := ta.crossover(src, thresh)
crossdown := ta.crossunder(src, thresh)
thresh
rsiclose = rsilev(hclose, rsi_length, rsi_mult, sltp)
//PLOTTING
var color col = color.lime
if hclose > rsiclose
col := color.lime
if hclose < rsiclose
col := color.red
plot(rsiclose, linewidth = 2, color = col)
//STRATEGY
buy = ta.crossover(hclose, rsiclose)
sell = ta.crossunder(hclose, rsiclose)
if buy[lookback]
strategy.entry("long", strategy.long)
if sell[lookback]
strategy.entry("Short", strategy.short)