EMA dan RSI Trend Trading Strategy

Penulis:ChaoZhang, Tanggal: 2023-09-20 14:21:16
Tag:

Gambaran umum

Strategi ini menggabungkan indikator EMA dan RSI untuk mengidentifikasi arah tren dan membuat keputusan perdagangan. Ini pergi panjang ketika harga di atas EMA dan RSI di bawah titik beli, dan pergi pendek ketika harga di bawah EMA dan RSI di atas titik jual.

Logika Strategi

  1. Menghitung 200 hari EMA sebagai indikator garis tren. EMA merespon dengan cepat terhadap perubahan harga dan secara efektif menentukan arah tren.

  2. Perhitungkan RSI 14 hari untuk menilai kondisi overbought dan oversold. RSI di bawah 50 dianggap oversold, sementara di atas 50 dianggap overbought. Juga gunakan tren naik atau turun RSI untuk menentukan waktu masuk dan keluar.

  3. Bandingkan hubungan ukuran antara dua penutupan lilin terakhir untuk menentukan arah tren.

  4. Ketika dalam tren naik, harga di atas 200 hari EMA, dan RSI di bawah 50 dan naik, sinyal beli dihasilkan.

  5. Ketika dalam tren penurunan, harga di bawah 200 hari EMA, dan RSI di atas 50 dan turun, sinyal jual dihasilkan.

  6. ATR dan harga tertinggi / terendah dari 14 lilin terakhir digunakan untuk menghitung stop loss dan mengambil keuntungan.

  7. Mengadopsi strategi trailing stop untuk manajemen risiko.

Analisis Keuntungan

  1. Kombinasi dari dua indikator meningkatkan akurasi dalam menentukan arah tren. EMA menilai tren utama dan hubungan RSI&Candle menilai tren lokal dan waktu masuk/keluar.

  2. Status RSI overbought/oversold menghindari perdagangan yang tidak perlu yang disebabkan oleh keterlambatan EMA.

  3. Trailing stop secara efektif mengendalikan kerugian yang disebabkan oleh fluktuasi amplitudo besar sesekali.

  4. Kombinasi parameter yang dioptimalkan meningkatkan kekuatan.

Analisis Risiko

  1. EMA dan RSI cenderung menghasilkan sinyal yang salah di pasar sisi amplitudo besar, yang harus dihindari.

  2. Stop loss yang terlalu ketat menyebabkan sering berhenti sementara stop loss yang terlalu luas gagal mengendalikan kerugian.

  3. Kemungkinan penurunan setelah terobosan tinggi. Parameter RSI harus rileks untuk menghindari kehilangan tren.

Arah Peningkatan

  1. Sesuaikan parameter ATR dan jarak berhenti untuk menemukan titik stop loss yang lebih baik.

  2. Mengoptimalkan parameter EMA dan RSI untuk menemukan kombinasi parameter yang lebih baik.

  3. Tambahkan indikator lain untuk penyaringan, seperti MACD, Bollinger Bands dll, untuk meningkatkan akurasi sinyal.

  4. Perbedaan parameter uji antara produk yang berbeda untuk meningkatkan ketahanan lebih lanjut.

  5. Cobalah menonaktifkan strategi selama periode waktu tertentu untuk menghindari jam sinyal yang salah.

Ringkasan

Strategi keseluruhan cukup stabil dengan pengembalian yang stabil, penarikan maksimum dan rasio Sharpe. Ini dapat ditingkatkan lebih lanjut dengan optimasi parameter dan penyesuaian stop loss. Juga perlu memperhatikan sinyal yang salah selama kondisi pasar tertentu, dan menghindarinya melalui indikator tambahan atau filter waktu. Strategi ini berpotensi menjadi strategi stabil jangka panjang melalui optimasi berkelanjutan.


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

Lebih banyak