Trendhandelsstrategie basierend auf EMA und RSI


Erstellungsdatum: 2023-09-20 14:21:16 zuletzt geändert: 2023-09-20 14:21:16
Kopie: 0 Klicks: 894
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie kombiniert die EMA und den RSI, um die Richtung des Trends zu erkennen und zu handeln. Sie ist positiv, wenn der Preis über der EMA liegt und der RSI unter dem Kaufpunkt liegt. Sie ist negativ, wenn der Preis unter der EMA liegt und der RSI über dem Verkaufspunkt liegt.

Strategieprinzip

  1. Die Berechnung der 200-Tage-EMA dient als mittlerer Indikator für Trends. Die EMA reagiert schnell auf Preisänderungen und kann die Richtung des Trends effektiv bestimmen.

  2. Der 14-Tage-RSI wird berechnet, um zu beurteilen, ob ein Überkauf oder Überverkauf stattfindet. Ein RSI unter 50 wird als Überverkauf und ein RSI über 50 als Überkauf angesehen.

  3. Vergleichen Sie die Größenverhältnisse der letzten beiden K-Linien, um die Richtung der Tendenz zu bestimmen. Die letzten beiden Schlusskosten werden als steigend betrachtet und als rückläufig betrachtet.

  4. Wenn der Kurs im Aufwärtstrend ist und über der 200-Tage-EMA liegt und der RSI unter 50 liegt und steigt, gibt es ein Kaufsignal.

  5. Wenn der Preis im Abwärtstrend unter der 200-Tage-EMA liegt und der RSI über 50 liegt und fällt, gibt es ein Verkaufssignal.

  6. Die Höchst- und Tiefstpreise der ATR und der letzten 14 K-Linien werden für die Berechnung von Stop-Loss- und Stop-Stop-Punkten verwendet.

  7. Die Anwendung einer mobilen Stop-Loss-Strategie zur Risikokontrolle.

Analyse der Stärken

  1. Der Doppelindikator kombiniert die Richtung der Tendenz, um die Genauigkeit zu verbessern. Die EMA beurteilt den Haupttrend, der RSI und die K-Linie-Beziehung beurteilen den lokalen Trend und die Zeit für den Kauf und Verkauf.

  2. Der RSI verhindert effektiv falsche Durchbrüche. Unnötige Transaktionen, die durch den leeren Zustand des RSI vermieden werden, verhindern die Verzögerung des EMA.

  3. Der mobile Stop-Loss ist eine effektive Steuerung des Verlustes, der durch einzelne große Amplitude-Schwankungen entsteht.

  4. Die optimierten Parameterkombinationen machen die Strategie-Parameter robuster.

Risikoanalyse

  1. In einem Hochamplitude-Schwanken sind EMA und RSI sehr wahrscheinlich, um falsche Signale zu erzeugen.

  2. Eine zu geringe Stop-Loss-Rate führt zu zu häufigen Stop-Losses; eine zu hohe Stop-Loss-Rate führt zu schweren Verlustkontrollen. Die ATR-Parameter sollten entsprechend angepasst werden.

  3. Die RSI-Parameter sollten entsprechend gelockert werden, um eine verpasste Tendenz zu vermeiden.

Optimierungsrichtung

  1. ATR-Parameter und Stopp-Distanz angepasst, um bessere Stopppunkte zu finden.

  2. Optimierung der EMA- und RSI-Indikatorparameter, um eine geeignete Kombination von Parametern zu finden

  3. Zusätzliche Hilfsindikatoren wie MACD, Brinband usw. werden zur Verbesserung der Signalgenauigkeit hinzugefügt.

  4. Die unterschiedlichen Parameter-Einstellungen verschiedener Sorten können getestet werden, um die Parameter-Stabilität weiter zu verbessern.

  5. Es kann versucht werden, die Strategie in bestimmten Zeitabschnitten zu schließen, um Zeitabschnitte zu vermeiden, die zu falschen Signalen führen können.

Zusammenfassen

Die Strategie ist insgesamt relativ stabil, die Erträge stabil, die Maximalrücknahme und die Sharp-Rate sind sehr gut. Durch die Optimierung der Parameter und die Anpassung der Stop-Loss-Punkte kann die Wirksamkeit der Strategie weiter gesteigert werden.

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

//@version=5
// strategy("EMA RSI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Author       : AJ Rupasinghege
// Date         : 06/11/2022
// Release      : v6.0
// Description  : If the last two closes are in ascending order, the rsi is below 50 and ascending, and the current candle is above 200 ema, then LONG. 
//                If the last two closes are in descending order, the rsi is above 50 and descending, and the current candle is below 200 ema, then SHORT. 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// INPUTS //////////////////////////////////////////////////////////////

ema_length = input(200, "EMA Length")
rsi_buy_value = input(50, "RSI Buy Value")
rsi_sell_value = input(50, "RSI Sell Value")
show_data = input.bool(0, "Show Data")


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// VARIABLES //////////////////////////////////////////////////////////

var stop_loss = 0.0
var last_trade_entry_price = 0.0
var low_value= 0.0
var atr = 0.0
var high_value = 0.0
var stop_loss_points = 0.0
var limit = 0.0
var bar_id_entry = 0


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// FUNCTIONS //////////////////////////////////////////////////////////

getTradeConditionsLong() =>
    //@function         Used to calculate stop_loss, stop_loss points, limit and label values for long trades
    //@param direction  (float) // strategy.poistion.size
    //@returns          stop_loss, stop_loss_points, limit
    //@Dependancies     low_value, atr, last_trade_entry_price,bar_id_entry
    _stop_loss = low_value - atr
    _stop_lossPoints = (last_trade_entry_price - _stop_loss) *100000
    _limit = last_trade_entry_price + (last_trade_entry_price - low_value + atr) 
    value = "OpenValue: " + str.tostring(last_trade_entry_price) + 
         "\n OpenBarIndex: " + str.tostring(bar_id_entry) + 
         "\n LowValue: " + str.tostring(low_value) + 
         "\n atr: " + str.tostring(atr) + "\n stop_loss: " + 
         str.tostring(_stop_loss) + "\n Limit: " +
         str.tostring(_limit)

    [_stop_loss,_stop_lossPoints,_limit, value]

getTradeConditionsShort() =>
    //@function         Used to calculate stop_loss, stop_loss points, limit and label values for short trades
    //@param direction  (float) // strategy.poistion.size
    //@returns          stop_loss, stop_loss_points, limit
    //@Dependancies     high_value, atr, last_trade_entry_price,bar_id_entry
    _stop_loss = high_value + atr
    _stop_lossPoints = (_stop_loss  -last_trade_entry_price) * 100000
    _limit = last_trade_entry_price - (high_value - last_trade_entry_price + atr)
    value = "OpenValue: " + str.tostring(last_trade_entry_price) + 
         "\n OpenBarIndex: " + str.tostring(bar_id_entry) + 
         "\n HighValue: " + str.tostring(high_value) + 
         "\n atr: " + str.tostring(atr) + "\n stop_loss: " + 
         str.tostring(_stop_loss)  + "\n Limit: " +
         str.tostring(_limit)
    [_stop_loss,_stop_lossPoints,_limit, value]




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// SIGNALS //////////////////////////////////////////////////////////

ema = ta.ema(close,ema_length)
rsi = ta.rsi(close,14)

ema_buy_signal = ema < low
ema_sell_signal = ema > high


rsi_buy_signal = rsi < rsi_buy_value and rsi[1] < rsi[0]
rsi_sell_signal = rsi > rsi_sell_value and rsi[1] > rsi[0]

trend_buy_signal = close[2] < close[1] and close[1] < close[0]
trend_sell_signal = close[2] > close[1] and close[1] > close[0]

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// TRADES //////////////////////////////////////////////////////////
long = trend_buy_signal 
         and ema_buy_signal 
         and rsi_buy_signal
short = trend_sell_signal 
         and ema_sell_signal  
         and rsi_sell_signal

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



if long 
    strategy.entry("Long", strategy.long)

if short 
    strategy.entry("Short", strategy.short)
   

// Calculate Trade Entry Variables
last_trade_entry_price := strategy.opentrades.entry_price(strategy.opentrades - 1)
bar_id_entry := strategy.opentrades.entry_bar_index(strategy.opentrades - 1) 
atr := ta.atr(14) 
low_value := ta.lowest(14)
high_value := ta.highest(14)


// Exit Strategy for Long Positions 
if (strategy.position_size[1] != strategy.position_size and strategy.position_size>0)
    [_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsLong()
    stop_loss := _stop_loss
    stop_loss_points := _stop_loss_points
    limit := _limit
    

    if show_data
        label.new(bar_id_entry,stop_loss - 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none) 
    strategy.exit("Long Exit", "Long", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit   )


// Exit Strategy for Short Positions 
if (strategy.position_size[1] != strategy.position_size and strategy.position_size<0)
    [_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsShort()
    stop_loss := _stop_loss
    stop_loss_points := _stop_loss_points
    limit := _limit

    if show_data
        label.new(bar_id_entry,stop_loss + 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none) 
    strategy.exit("Short Exit", "Short", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit )


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// PLOTS //////////////////////////////////////////////////////////

plot(ema, "SMA", color = color.blue, linewidth = 2 )


p1 = plot(strategy.position_size>0? stop_loss:na, style = plot.style_linebr , color = color.rgb(82, 240, 42) )
p2 = plot(strategy.position_size<0? stop_loss:na, style = plot.style_linebr , color = color.rgb(223, 85, 85) )
p3 = plot(strategy.position_size!=0?limit : na, style = plot.style_linebr , color = color.rgb(94, 85, 223, 100) )


fill(p1, p3, color = color.new(color.green, 90))
fill(p2, p3, color = color.new(#e98787, 90))