EMA- und RSI-Trendhandelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-09-20 14:21:16
Tags:

Übersicht

Diese Strategie kombiniert EMA und RSI-Indikatoren, um die Trendrichtung zu identifizieren und Handelsentscheidungen zu treffen. Sie geht lang, wenn der Preis über der EMA liegt und der RSI unter dem Kaufpunkt liegt, und geht kurz, wenn der Preis unter der EMA liegt und der RSI über dem Verkaufspunkt liegt. Sie verwendet auch die Beziehung zwischen den letzten beiden Kerzenschließungen, um die Trendrichtung für den Trendhandel zu bestimmen.

Strategie Logik

  1. Berechnen Sie den 200-Tage-EMA als Trendlinie-Indikator.

  2. Berechnen Sie den 14-Tage-RSI, um überkaufte und überverkaufte Bedingungen zu beurteilen. RSI unter 50 gilt als überverkauft, während über 50 als überkauft gilt. Verwenden Sie auch den Auf- oder Abwärtstrend des RSI, um den Ein- und Ausstiegszeitpunkt zu bestimmen.

  3. Vergleichen Sie die Größenbeziehung zwischen den letzten beiden Kerzenschließungen, um die Trendrichtung zu bestimmen.

  4. Wenn der Kurs in einem Aufwärtstrend über der 200-Tage-EMA liegt und der RSI unter 50 liegt und steigt, wird ein Kaufsignal generiert.

  5. Wenn der Kurs in einem Abwärtstrend unterhalb der 200-Tage-EMA und der RSI über 50 liegt und sinkt, wird ein Verkaufssignal generiert.

  6. Die ATR und die höchsten/niedrigsten Preise der letzten 14 Kerzen werden zur Berechnung von Stop-Loss und Take-Profit verwendet.

  7. Einführung einer Strategie zur Verhinderung von Verzögerungen im Risikomanagement.

Analyse der Vorteile

  1. Die Kombination der beiden Indikatoren verbessert die Genauigkeit bei der Bestimmung der Trendrichtung.

  2. Der RSI-Status von Überkauf/Überverkauf verhindert unnötige Trades, die durch eine Verzögerung der EMA verursacht werden.

  3. Der Trailing-Stop kontrolliert effektiv Verluste, die durch gelegentliche große Amplitudenfluktuationen entstehen.

  4. Optimierte Parameterkombination erhöht die Robustheit.

Risikoanalyse

  1. Der EMA und der RSI erzeugen wahrscheinlich falsche Signale auf großen Seitenmärkten, was vermieden werden sollte.

  2. Ein zu enger Stoppverlust führt zu häufigen Stopps, während ein zu breiter Stoppverlust den Verlust nicht kontrolliert.

  3. Die Wahrscheinlichkeit eines Rückgangs nach dem Durchbruch ist hoch.

Verbesserungsrichtlinien

  1. Anpassen des ATR-Parameters und der Stoppdistanz, um bessere Stoppverlustpunkte zu finden.

  2. Optimieren Sie die EMA- und RSI-Parameter, um bessere Parameterkombinationen zu finden.

  3. Hinzufügen anderer Indikatoren zur Filtration, wie MACD, Bollinger Bands usw., um die Signalgenauigkeit zu verbessern.

  4. Versuchsparameterunterschiede zwischen verschiedenen Produkten zur weiteren Verbesserung der Robustheit.

  5. Versuchen Sie, die Strategie in bestimmten Zeitabschnitten zu deaktivieren, um falsche Signalzeiten zu vermeiden.

Zusammenfassung

Die Gesamtstrategie ist mit stetigen Renditen, maximalem Drawdown und Sharpe-Verhältnis ziemlich stabil. Sie kann durch Parameteroptimierung und Stop-Loss-Anpassung weiter verbessert werden. Außerdem müssen Sie bei bestimmten Marktbedingungen auf falsche Signale achten und sie über Hilfsindikatoren oder Zeitfilter vermeiden. Diese Strategie hat das Potenzial, durch kontinuierliche Optimierung zu einer langfristigen stabilen Strategie zu werden.


/*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))

Mehr