RSI-Trend nach Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-16 15:33:40
Tags:

Übersicht

Diese Strategie kombiniert den RSI-Indikator und den gewichteten gleitenden Durchschnitt für den Trend nach dem Handel. Es geht lang, wenn der RSI über 60 liegt und kurz, wenn der RSI unter 40 liegt, wobei der gleitende Durchschnitt die Trendbedingung überprüft. Der 40-Perioden-RSI fungiert als Trendfolgendindikator. Der gewichtete gleitende Durchschnitt verwendet verschiedene Gewichte, um die Auswirkungen von kurzfristigen Schwankungen zu reduzieren.

Strategie Logik

Die Strategie berechnet zunächst den RSI und den gewichteten gleitenden Durchschnitt. Die RSI-Länge beträgt 20 Perioden und die gewichtete MA-Länge 20 mit höheren Gewichten, die die Auswirkungen der kurzfristigen Volatilität reduzieren. Es geht lang, wenn der RSI über 60 liegt und die gewichtete MA-Wechselrate unter -1%. Es geht kurz, wenn der RSI unter 40 liegt und die gewichtete MA-Wechselrate über 1% liegt.

Nach dem Öffnen von Long oder Short werden Stop-Loss und Trailing Take-Profit-Orders gleichzeitig platziert. Der Stop-Loss wird auf 3 ATR vom aktuellen Preis gesetzt. Die anfängliche Trailing Take-Profit-Aktivierung ist 4 ATR entfernt und verläuft in Schritten von 3%. Wenn der Preis entweder einen Stop-Loss oder eine Trailing Take-Profit-Aktivierung erreicht, wird die Position geschlossen.

Die Strategie beinhaltet auch Geldmanagementregeln, die auf dem Festfractional Position Sizing-Ansatz basieren.

Analyse der Vorteile

  • Der RSI-Indikator kann Trends effektiv verfolgen
  • Die gewichtete MA verringert die Auswirkungen von kurzfristigen Schwankungen und vermeidet Schwankungen.
  • Der Profitverlust lässt den Gewinn maximieren.
  • Festgefasste Fraktionspositionsgrößerungskontrollen

Der allgemeine Vorteil besteht in der Fähigkeit, Trends zu verfolgen und gleichzeitig Stopp-Loss- und Trailing-Gewinnmaßnahmen zu ergreifen, um Risiken zu kontrollieren und somit signifikante Gewinne bei starken Trends zu erzielen.

Risikoanalyse

  • Falsche Signale des RSI können zu unnötigen Trades führen
  • Gezwungen, zu stoppen, wenn Preisverstöße aufhören oder die Gewinnniveaus nachlassen, unfähig, den Trends zu folgen
  • Aggressive Geldverwaltungsregeln können zu großen Verlusten führen

Die wichtigsten Risiken stammen aus der Zuverlässigkeit der RSI-Signale und der Stop-Loss-/Trailing-Take-Profit-Einstellungen. Falsche Parameter können zu unnötigem Schließen von Trades oder Verlusten über den Risikobereitschaft hinaus führen.

Lösungen umfassen die Optimierung von RSI-Parametern oder das Hinzufügen anderer Indikatoren zur Signalbestätigung. Anpassen von Stop/Trailing Take-Profit-Niveaus basierend auf verschiedenen Produkten und Volatilitätsbedingungen. Auch mit Geldmanagementregeln vorsichtig sein, um übermäßige Risiken zu vermeiden.

Optimierungsrichtlinien

  • Test andere Indikatoren zusammen mit dem RSI zur Signalbestätigung, z. B. KD, MACD usw.
  • Optimierung der Stop-Loss- und Trailing-Take-Profit-Parameter basierend auf den Produktmerkmalen und dem Volatilitätsbereich
  • Versuchen Sie andere Geldmanagement-Techniken wie Fixed-Size-Handel, Kelly-Formel etc.
  • Zusätzliche Einstiegsbedingungen wie Bollinger-Breakouts, RSI-Divergenzen usw.
  • Erwägen Sie, Positionen zu starken Trends hinzuzufügen

Es gibt viele Aspekte zu optimieren. Erstens ist die Identifizierung anderer Indikatoren zur Ergänzung der RSI-Signale. Der nächste kritische Schritt ist die Optimierung von Stop-Loss / Trailing Take-Profit-Parametern auf der Grundlage historischer Performance. Das Geldmanagement kann auch auf andere Arten umsteigen. Schließlich können Eingangs-, Add-On-Bedingungen zu Pyramidenpositionen in starken Trends verbessert werden.

Zusammenfassung

Die RSI-Trend-Folge-Strategie hat eine klare Logik, wobei RSI für die Trendrichtung und gewichtete MA für die Bestätigung verwendet wird. Ihre Stärke liegt im Trendhandel, maximieren Sie Gewinne mit Stops / Geldmanagement, Risiken kontrollieren. Aber die Zuverlässigkeit des RSI und die Optimierung der Parameter müssen verbessert werden. Wir können die Signalindikatoren, Stop / Trailing-Parameter, Geldmanagementmethoden usw. verbessern, um die Strategie robuster über verschiedene Produkte hinweg zu machen.

[/trans]


/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This code is based on RSI and a backed weighted MA
//@version=5
strategy("RSI + MA BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


//------------------------FUNCTIONS---------------------------//

//@function which calculate a retro weighted moving average to minimize the impact of short term reversal
rwma(source, length) =>
    sum = 0.0
    denominator = 0.0
    weight = 0.0
    weight_x = 100/(4+(length-4)*1.30)
    weight_y = 1.30*weight_x
    for i=0 to length - 1
        if i <= 3
            weight := weight_x
        else
            weight := weight_y
        sum := sum + source[i] * weight
        denominator := denominator + weight
    rwma = sum/denominator

//@function which permits the user to choose a moving average type
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "RWMA" => rwma(source, length)

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//--------------------------------USER INPUTS-------------------------------//

//Technical parameters
rsiLengthInput = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
maTypeInput = input.string("RWMA", title="MA Type", options=["SMA", "RWMA"], group="MA Settings", inline="1")
maLenghtInput = input.int(20, minval=1, title="MA Length", group="MA Settings", inline="1")
rsiLongSignalValue = input.int(60, minval=1, maxval=99, title="RSI Long Signal", group="Strategy parameters", inline="3")
rsiShortSignalValue = input.int(40, minval=1, maxval=99, title="RSI Short Signal", group="Strategy parameters", inline="3")
rocMovAverLongSignalValue = input.float(-1, maxval=0, title="ROC MA Long Signal", group="Strategy parameters", inline="4")
rocMovAverShortSignalValue = input.float(1, minval=0, title="ROC MA Short Signal", group="Strategy parameters", inline="4")
//TP Activation and Trailing TP
takeProfitActivationInput = input.float(4, minval=1.0, title="TP activation in multiple of ATR", group="Strategy parameters")
trailingStopInput = input.float(3, minval=0, title="Trailing TP in percentage", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2018 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")

strategy.initial_capital = 50000

//------------------------------VARIABLES INITIALISATION-----------------------------//

float rsi = ta.rsi(close, rsiLengthInput)
float ma = ma(close, maLenghtInput, maTypeInput)
float roc_ma = ((ma/ma[maLenghtInput]) - 1)*100
float atr = ta.atr(20)
var float trailingStopOffset = na
var float trailingStopActivation = na
var float trailingStop = na
var float stopLoss = na
var bool long = na
var bool short = na
var bool bufferTrailingStopDrawing = na
float theoreticalStopPrice = na
bool inRange = na
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
    strategy.close_all()
    bufferTrailingStopDrawing := false
    stopLoss := na
    trailingStopActivation := na
    trailingStop := na
    short := false
    long := false


//------------------------------STOP LOSS AND TRAILING STOP ACTIVATION----------------------------//

// We handle the stop loss and trailing stop activation 
if (low <= stopLoss or high >= trailingStopActivation) and long
    if high >= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if low <= stopLoss
        long := false
    stopLoss := na
    trailingStopActivation := na
if (low <= trailingStopActivation or high >= stopLoss) and short
    if low <= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if high >= stopLoss
        short := false
    stopLoss := na
    trailingStopActivation := na


//-------------------------------------TRAILING STOP--------------------------------------//

// If the traling stop is activated, we manage its plotting with the bufferTrailingStopDrawing
if bufferTrailingStopDrawing and long
    theoreticalStopPrice := high - trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice > trailingStop
        trailingStop := theoreticalStopPrice
    else if low <= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        long := false
if bufferTrailingStopDrawing and short
    theoreticalStopPrice := low + trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice < trailingStop
        trailingStop := theoreticalStopPrice
    else if high >= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        short := false


//---------------------------------LONG CONDITION--------------------------//

if rsi >= 60 and roc_ma <= rocMovAverLongSignalValue and inRange and not long
    if short
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        short := false
    trailingStopActivation := close + takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close - 3*atr
    long := true
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    strategy.exit("Exit Long", "Long", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------SHORT CONDITION-------------------------------//

if rsi <= 40 and roc_ma >= rocMovAverShortSignalValue and inRange and not short
    if long
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        long := false
    trailingStopActivation := close - takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close + 3*atr
    short := true
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    strategy.exit("Exit Short", "Short", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------PLOTTING ELEMENT---------------------------------//

// Plotting of element in the graph
plotchar(rsi, "RSI", "", location.top, color.rgb(0, 214, 243))
plot(ma, "MA", color.rgb(219, 219, 18))
plotchar(roc_ma, "ROC MA", "", location.top, color=color.orange)
// Visualizer trailing stop and stop loss movement
plot(stopLoss, "SL", color.red, 3, plot.style_linebr)
plot(trailingStopActivation, "Trigger Trail", color.green, 3, plot.style_linebr)
plot(trailingStop, "Trailing Stop",  color.blue, 3, plot.style_linebr)


Mehr