Strategi perdagangan tren berdasarkan EMA dan RSI


Tanggal Pembuatan: 2023-09-20 14:21:16 Akhirnya memodifikasi: 2023-09-20 14:21:16
menyalin: 0 Jumlah klik: 894
1
fokus pada
1617
Pengikut

Ringkasan

Strategi ini menggabungkan dua indikator EMA dan RSI untuk mengidentifikasi arah tren dan melakukan perdagangan. Ketika harga berada di atas EMA dan RSI di bawah titik beli, maka harga akan bullish. Ketika harga berada di bawah EMA dan RSI di atas titik jual, maka harga akan bearish.

Prinsip Strategi

  1. 200-hari EMA, sebagai indikator garis rata untuk menilai tren. EMA merespon cepat terhadap perubahan harga, sehingga dapat secara efektif menilai arah tren.

  2. Perhitungan RSI 14 hari untuk menentukan apakah ada overbought atau oversold. RSI di bawah 50 dianggap sebagai oversold, di atas 50 dianggap sebagai overbought.

  3. Bandingkan dua garis K terakhir untuk menentukan arah tren. Dua garis terakhir dianggap sebagai tren naik dan turun.

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

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

  6. ATR dan harga tertinggi, harga terendah dari 14 garis K terbaru digunakan untuk menghitung titik berhenti dan titik berhenti.

  7. Menggunakan strategi mobile stop loss untuk mengendalikan risiko.

Analisis Keunggulan

  1. Indikator ganda menggabungkan arah tren untuk menilai akurasi. EMA menilai tren utama, RSI dan hubungan K untuk menilai tren lokal dan waktu untuk membeli dan menjual.

  2. Indikator RSI secara efektif menghindari false breakout. Dengan kondisi kosong RSI menghindari perdagangan yang tidak perlu yang disebabkan oleh keterlambatan indikator EMA.

  3. Stop loss bergerak secara efektif mengontrol kerugian yang disebabkan oleh fluktuasi amplitudo individu yang besar.

  4. Kombinasi parameter yang dioptimalkan membuat parameter kebijakan lebih robust.

Analisis risiko

  1. Dalam situasi getaran amplitudo besar, EMA dan RSI memiliki probabilitas yang lebih besar untuk menghasilkan sinyal yang salah. Anda harus menghindari situasi seperti itu.

  2. Stop loss yang terlalu kecil akan menyebabkan stop loss yang terlalu sering; stop loss yang terlalu besar akan sulit untuk mengontrol kerugian. ATR harus disesuaikan dengan parameter yang sesuai.

  3. Kemungkinan besar akan terjadi penyesuaian setelah EMA di siang hari, di mana parameter RSI harus dilonggarkan secara tepat untuk menghindari kehilangan tren.

Arah optimasi

  1. Sesuai dengan parameter ATR dan jarak penghentian, menemukan titik penghentian yang lebih baik.

  2. Optimalkan parameter EMA dan RSI untuk menemukan kombinasi parameter yang lebih sesuai.

  3. Menambahkan indikator tambahan untuk filter, seperti MACD, Brin band, dan lain-lain, untuk meningkatkan akurasi sinyal.

  4. Perbedaan pengaturan parameter dari varietas yang berbeda dapat diuji untuk meningkatkan stabilitas parameter lebih lanjut.

  5. Anda dapat mencoba untuk menutup strategi pada periode waktu tertentu, menghindari periode waktu yang mudah menghasilkan sinyal yang salah.

Meringkaskan

Strategi ini secara keseluruhan relatif stabil, dengan keuntungan yang stabil, maksimum penarikan dan Sharp Rate yang sangat baik. Dengan parameter optimasi dan penyesuaian titik stop loss, Anda dapat meningkatkan efektivitas strategi. Anda juga perlu waspada terhadap sinyal kesalahan yang mungkin dihasilkan dalam situasi tertentu, dengan indikator tambahan atau penyaringan waktu untuk menghindari situasi ini.

Kode Sumber Strategi
/*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))