EMA dan RSI Trend Trading Strategy

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

Ringkasan

Strategi ini menggabungkan penunjuk EMA dan RSI untuk mengenal pasti arah trend dan membuat keputusan perdagangan. Ia pergi panjang apabila harga di atas EMA dan RSI di bawah titik beli, dan pergi pendek apabila harga di bawah EMA dan RSI di atas titik jual.

Logika Strategi

  1. Mengira EMA 200 hari sebagai penunjuk garis trend. EMA bertindak balas dengan cepat terhadap perubahan harga dan menentukan arah trend dengan berkesan.

  2. Mengira RSI 14 hari untuk menilai keadaan overbought dan oversold. RSI di bawah 50 dianggap oversold, manakala di atas 50 dianggap overbought. Juga gunakan trend menaik atau menurun RSI untuk menentukan masa masuk dan keluar.

  3. Bandingkan hubungan saiz antara dua penutupan lilin terakhir untuk menentukan hala tuju trend.

  4. Apabila dalam trend menaik, harga di atas EMA 200 hari, dan RSI di bawah 50 dan meningkat, isyarat beli dihasilkan.

  5. Apabila dalam trend menurun, harga di bawah 200 hari EMA, dan RSI di atas 50 dan jatuh, isyarat jual dihasilkan.

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

  7. Mengambil strategi penangguhan untuk pengurusan risiko.

Analisis Kelebihan

  1. Gabungan dua penunjuk meningkatkan ketepatan dalam menentukan arah trend. EMA menilai trend utama dan hubungan RSI&Candle menilai trend tempatan dan masa masuk / keluar.

  2. RSI secara berkesan mengelakkan pecah palsu. Status RSI overbought/oversold mengelakkan perdagangan yang tidak perlu disebabkan oleh EMA yang tertinggal.

  3. Hentian pengangkutan secara berkesan mengawal kehilangan yang disebabkan oleh turun naik amplitudo yang besar.

  4. Gabungan parameter yang dioptimumkan meningkatkan ketahanan.

Analisis Risiko

  1. EMA dan RSI mungkin menghasilkan isyarat yang salah di pasaran sampingan amplitud besar, yang harus dielakkan.

  2. Kerugian berhenti yang terlalu ketat menyebabkan berhenti yang kerap sementara kehilangan berhenti yang terlalu luas gagal mengawal kehilangan. Parameter ATR harus diselaraskan dengan betul.

  3. Kemungkinan penarikan balik selepas terobosan adalah tinggi. Parameter RSI harus santai untuk mengelakkan kehilangan trend.

Arahan Penambahbaikan

  1. Sesuaikan parameter ATR dan jarak berhenti untuk mencari titik kehilangan berhenti yang lebih baik.

  2. Mengoptimumkan parameter EMA dan RSI untuk mencari kombinasi parameter yang lebih baik.

  3. Tambah penunjuk lain untuk penapisan, seperti MACD, Bollinger Bands dan lain-lain, untuk meningkatkan ketepatan isyarat.

  4. Perbezaan parameter ujian antara produk yang berbeza untuk meningkatkan ketahanan.

  5. Cuba melumpuhkan strategi dalam tempoh masa tertentu untuk mengelakkan jam isyarat yang salah.

Ringkasan

Strategi keseluruhan agak stabil dengan pulangan yang stabil, penarikan maksimum dan nisbah Sharpe. Ia boleh bertambah baik dengan pengoptimuman parameter dan penyesuaian stop loss. Juga perlu berhati-hati dengan isyarat yang salah semasa keadaan pasaran tertentu, dan mengelakkannya melalui penunjuk tambahan atau penapis masa. Strategi ini berpotensi menjadi strategi stabil jangka panjang melalui pengoptimuman berterusan.


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