Eine RSI-Umkehrhandelsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-30 17:06:45
Tags:

img

Übersicht

Diese Strategie identifiziert überkaufte und überverkaufte Marktbedingungen unter Verwendung des RSI-Indikators, um in überkauften Zonen auf bearish Crossovers zu gehen und in überverkauften Zonen auf bullish Crossovers zu gehen. Es handelt sich um eine auf Indikatoren basierende Umkehrhandelsstrategie. Die Strategie beinhaltet Trend Trailing Stops und Fixed Take Profit/Stop Loss, um das Handelsrisiko effektiv zu kontrollieren.

Strategie Logik

Die Handelssignale dieser Strategie werden auf der Grundlage von Bullish/Bearish Crossovers des RSI-Indikators generiert. Der RSI-Indikator verwendet typischerweise 30 als Überverkaufslinie und 70 als Überkaufslinie. Wenn die RSI-Linie über die Überverkaufslinie überschreitet, wird ein Kaufsignal generiert. Wenn die RSI-Linie unter die Überkaufslinie überschreitet, wird ein Verkaufssignal generiert. Basierend auf dieser Logik identifiziert die Strategie Überkaufs- und Überverkaufszonen und erzeugt entsprechende Long/Short-Signale.

Nach dem Eintritt in eine Position verwendet die Strategie Prozentsatz-Trailing-Stops, indem sie kontinuierlich den höchsten/niedrigsten Preis aktualisiert und einen festen Prozentsatz davon als Stop-Loss abhebt. Es gibt auch feste Gewinn- und Stop-Loss-Level, die die Position schließen, wenn der Zielgewinn erreicht oder der maximale Verlust überschritten wird. Diese Kombination kann das Handelsrisiko effektiv kontrollieren.

Analyse der Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Die Verwendung des RSI zur Ermittlung von Überkauf-/Überverkaufswerten ist eine ausgereifte Handelstechnik zur zuverlässigen Erfassung von Marktturnpunkten.

  2. Die Verwendung von Bullish/Bearish Crossovers filtert einige falsche Signale aus und macht den Handel zuverlässiger.

  3. Trendfolgende Stopps sperren so weit wie möglich Gewinne ein und haben gleichzeitig schnelle Stopp-Outs, um Verluste pro Handel zu begrenzen.

  4. Festgelegte TP/SL-Level kontrollieren auch das Handelsrisiko wirksam.

  5. Allgemeine einfache und klare Logik, leicht zu verstehen und umzusetzen, für Anfänger geeignet.

Risikoanalyse

Zu den Risiken dieser Strategie gehören:

  1. RSI-Signale können falsch sein, mit hoher Wahrscheinlichkeit eines Musterversagens, was zu einem Stop-Loss-Trigger führt.

  2. Festbetrag TP/SL kann sich nicht an die Volatilität des Marktes anpassen, kann die Gewinne verkürzen oder Verluste verursachen.

  3. Der Prozentsatz folgt nur dem höchsten/niedrigsten Preis, kann zu aggressiv sein und die Gewinne zurücklassen.

  4. Überanpassungsrisiken als Parameter könnten nur für historische Daten optimiert werden.

  5. Hohe Handelsfrequenz erhöht die Transaktionskosten und -verschiebungen.

Optimierungsrichtlinien

Möglichkeiten zur Verbesserung der Strategie:

  1. Optimieren Sie die RSI-Parameter für optimale Ergebnisse.

  2. Für eine höhere Signalgenauigkeit Filterindikatoren hinzufügen.

  3. Anpassungsfähige Stopps/Gewinne basierend auf der Marktvolatilität.

  4. Um die Transaktionskosten zu senken, ist die Häufigkeit des Handels zu begrenzen.

  5. Zusätzliche Positionsgröße, um Verluste pro Handel zu begrenzen.

  6. Rücktest über einen längeren Zeitraum zur Stabilitätsprüfung.

Schlussfolgerung

Zusammenfassend ist dies eine typische Umkehrstrategie, bei der der RSI verwendet wird, um Überkauf/Überverkauf zu identifizieren, wobei Bull/Bear-Crossovers als Signale dienen. Trend-Trailing-Stops und fixierte TP/SL-Risikomanagement. Die Logik ist einfach und einfach zu implementieren, geeignet für Anfänger. Allerdings müssen Risiken wie falsche Signale und Kurvenanpassung durch weitere Verifizierung und Optimierung vor dem Live-Handel angegangen werden.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Author: © JoshuaMcGowan
// Taken from https://www.tradingview.com/script/GbZGYi6l-Adding-some-essential-components-to-a-prebuilt-RSI-strategy/
// Just updated to compile in version 4. 

//@version=4

strategy("Adding some essential components to a prebuilt RSI 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(2100, "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=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

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

// Replace RSI Component, Long/Short, and Long Signal/Short Signal conditions with your trade setup components.
///////////// RSI component /////////////

length = input( 14 )
overSold = input( 30 )
overBought = input( 70 )
price = close

vrsi = rsi(price, length)
notna = not na(vrsi)

/////////////// STRATEGY ///////////////

ts = input(99999, "Trailing Stop") / 100
tp = input(99999, "Take Profit") / 100
sl = input(99999, "Stop Loss") / 100

// Update this with your setup. 
long = notna and crossover(vrsi, overSold)
short = notna and crossunder(vrsi, overBought)

last_long = 0
last_short = 0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

// Update this to reflect your setup. 
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

float last_open_long_signal = 0
float last_open_short_signal = 0
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 = 0
last_short_signal = 0
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

float last_high = 0
float last_low = 0
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(200, "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=long_signal)
    strategy.entry("Short", strategy.short, when=short_signal)

    // plot(long_call, color=color.red)
    // plot(short_call, color=color.green)
    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)







Mehr