La stratégie d'inversion de tendance RSI est une stratégie de trading quantitative basée sur l'indice de force relative (RSI) et la plage moyenne vraie (ATR). Elle ajuste dynamiquement les niveaux de profit et de stop loss (TP / SL) pour s'adapter aux fluctuations rapides du marché et saisir les opportunités d'inversion de tendance.
Le noyau de la stratégie d'inversion de tendance RSI réside dans la construction de bandes dynamiques TP/SL. Premièrement, il utilise les fonctions personnalisées highest_custom et lowest_custom pour trouver les prix les plus élevés et les plus bas depuis le dernier croisement, formant la base des bandes. Ensuite, il calcule le RSI et l'ATR avec une longueur spécifiée par l'utilisateur et effectue les calculs suivants:
Ici, le multiplicateur est un facteur d'expansion de bande défini par l'utilisateur. Si le prix dépasse la bande supérieure, il va long; s'il dépasse la bande inférieure, il va court. Les couleurs de ces deux bandes changent également en fonction de la position du prix par rapport aux bandes, ce qui facilite l'observation.
La stratégie d'inversion de tendance du RSI utilise le RSI et l'ATR pour construire des bandes adaptatives qui peuvent ajuster dynamiquement les points TP / SL et répondre rapidement aux changements du marché. La stratégie a une logique claire, une large applicabilité et peut être un outil puissant pour les traders quantitatifs. Cependant, dans l'utilisation pratique, il faut toujours faire attention à la sélection des paramètres et au contrôle des risques, et il est recommandé de l'utiliser en combinaison avec d'autres signaux d'indicateur pour améliorer la performance globale. La stratégie a davantage de marge d'optimisation, comme l'ajout de filtres de tendance et l'optimisation des paramètres.
/*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)