Die RSI Trend Reversal Strategie ist eine quantitative Handelsstrategie, die auf dem Relative Strength Index (RSI) und dem Average True Range (ATR) basiert. Sie passt die Take Profit und Stop Loss (TP/SL) -Niveaus dynamisch an, um sich an schnelle Marktschwankungen anzupassen und Trendumkehrchancen zu erfassen.
Der Kern der RSI Trend Reversal Strategy liegt in der Konstruktion dynamischer TP/SL-Bänder. Erstens verwendet sie benutzerdefinierte Funktionen highest_custom und lowest_custom, um die höchsten und niedrigsten Preise seit dem letzten Crossover zu finden, die die Basis der Bande bilden. Dann berechnet sie den RSI und den ATR mit einer vom Benutzer angegebenen Länge und führt folgende Berechnungen durch:
Hier ist der Multiplikator ein benutzerdefinierter Band-Erweiterungsfaktor. Wenn der Preis über das obere Band bricht, geht er lang; wenn er unter das untere Band bricht, geht er kurz. Die Farben dieser beiden Bands ändern sich auch je nach Position des Preises in Bezug auf die Bands, so dass es einfach zu beobachten ist.
Die RSI Trend Reversal Strategie nutzt RSI und ATR, um adaptive Bands zu konstruieren, die TP/SL-Punkte dynamisch anpassen und prompt auf Marktveränderungen reagieren können. Die Strategie hat eine klare Logik, eine breite Anwendbarkeit und kann ein leistungsfähiges Werkzeug für quantitative Trader sein. In der Praxis muss jedoch immer noch auf Parameterwahl und Risikokontrolle geachtet werden, und es wird empfohlen, sie in Kombination mit anderen Indikatorsignalen zu verwenden, um die Gesamtleistung zu verbessern. Die Strategie bietet weiteren Optimierungsraum, wie das Hinzufügen von Trendfiltern und Parameteroptimierung.
/*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)