Strategi indikator divergensi RSI

Penulis:ChaoZhang, Tanggal: 2024-01-25 11:49:36
Tag:

img

Gambaran umum

Strategi RSI Divergence Indicator adalah strategi perdagangan kuantitatif berdasarkan indikator Relative Strength Index (RSI).

Logika Strategi

Indikator inti dari strategi ini adalah RSI. Ini menganalisis divergensi antara indikator RSI dan harga. Yang disebut divergensi mengacu pada sinyal berlawanan antara RSI dan harga.

Secara khusus, ketika RSI membentuk titik rendah yang relatif lebih rendah sementara harga membentuk titik rendah yang relatif lebih tinggi, itu adalah divergensi bullish antara RSI dan harga. Ini menyiratkan bahwa harga dapat berbalik ke atas. Strategi akan membangun posisi panjang pada titik ini.

Sebaliknya, ketika RSI membentuk tinggi yang relatif lebih tinggi sementara harga membentuk tinggi yang relatif lebih rendah, itu adalah divergensi bearish antara RSI dan harga. Ini menyiratkan bahwa harga dapat berbalik ke bawah. Strategi akan membangun posisi pendek pada titik ini.

Dengan menangkap perbedaan ini antara RSI dan harga, strategi dapat tepat waktu mendeteksi peluang untuk pembalikan harga dan mencapai membeli rendah dan menjual tinggi.

Keuntungan

Strategi RSI Divergence memiliki keuntungan berikut:

  1. Perbedaan antara RSI dan harga seringkali menyiratkan pembalikan tren yang akan datang, yang merupakan sinyal prediktif yang sangat efektif.

  2. Mencapai membeli rendah dan menjual tinggi. Dengan menetapkan posisi di titik divergensi, ia dapat membeli dengan harga yang relatif rendah dan menjual dengan harga yang relatif tinggi, selaras dengan praktik terbaik perdagangan kuantitatif.

  3. Strategi RSI konvensional hanya berfokus pada area overbought dan oversold. Strategi ini memanfaatkan sifat pembalikan intrinsik dari RSI itu sendiri untuk menangkap titik balik dengan lebih tepat, sangat meningkatkan efisiensi strategi.

  4. Pengaturan parameter sederhana. parameter utama hanya periode RSI dan periode lookback, yang sangat sederhana dan mudah dioptimalkan.

Risiko

Strategi RSI Divergence juga memiliki beberapa risiko:

  1. Sinyal divergensi bisa menjadi sinyal palsu. Perbedaan antara RSI dan harga tidak selalu mengarah pada pembalikan harga nyata. Kadang-kadang mereka juga membentuk pembalikan palsu, yang menyebabkan kerugian perdagangan. Stop loss yang wajar harus ditetapkan untuk mengendalikan risiko.

  2. Performa yang buruk di pasar tren. Ketika harga menunjukkan tren arah yang jelas, ruang keuntungan dari strategi ini akan relatif kecil. Lebih baik untuk secara sementara menonaktifkan strategi dalam hal ini dan menunggu pasar baru yang berkisar.

  3. Risiko piramida. Strategi telah menetapkan parameter piramida. Dalam kasus perdagangan yang kalah berturut-turut, hal itu dapat mempercepat penarikan akun. Ukuran posisi dan stop loss harus dikendalikan untuk mengurangi risiko.

Peningkatan

Strategi ini juga dapat dioptimalkan dalam aspek berikut:

  1. Menggabungkan indikator lain untuk penyaringan sinyal. MACD, KDJ dan indikator lain dapat ditambahkan untuk memverifikasi titik divergensi RSI, menyaring beberapa sinyal palsu dan meningkatkan tingkat kemenangan strategi.

  2. Optimalkan parameter RSI. Periode RSI yang berbeda dapat diuji untuk menemukan yang paling sesuai dengan karakteristik produk. Umumnya antara 6-15 bekerja dengan baik.

  3. Optimalkan periode lookback. Periode lookback secara langsung mempengaruhi frekuensi perdagangan strategi. Nilai yang berbeda dapat diuji untuk menemukan frekuensi optimal, biasanya antara 5-15 adalah kisaran yang baik.

  4. Tambahkan logika stop loss. Metode stop loss yang masuk akal seperti ATR trailing stop loss dapat diimplementasikan untuk dengan cepat memotong kerugian saat terjadi. Ini dapat secara efektif mengendalikan risiko strategi.

Kesimpulan

Strategi RSI Divergence secara akurat menangkap titik balik harga dengan menganalisis sifat pembalikan intrinsik dari indikator RSI itu sendiri. Strategi ini mencapai pendekatan perdagangan beli rendah-jual tinggi. Dibandingkan dengan strategi RSI overbought-oversold tradisional, strategi ini memanfaatkan karakteristik RSI yang lebih halus dan intrinsik, sangat meningkatkan efisiensi. Dengan optimasi parameter dan pengendalian risiko, sangat cocok untuk menangkap peluang perdagangan jangka pendek dalam berbagai pasar.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//study(title="Divergence Indicator", format=format.price)
//GOOGL setting  5 , close, 3 , 1  profitLevel at 75 shows win rate  87.21 %  profit factor 7.059
//GOOGL setting  8 , close, 3 , 1  profitLevel at 80 shows win rate  86.57 %  profit factor 18.96 
//SPY setting    5, close , 3, 3  profitLevel at 70  , shows win rate 80.34%  profit factor 2.348
strategy(title="RSI Divergence Indicator", overlay=false,pyramiding=2, default_qty_value=2,   default_qty_type=strategy.fixed, initial_capital=10000, currency=currency.USD)

len = input(title="RSI Period", minval=1, defval=9)
src = input(title="RSI Source", defval=close)
lbR = input(title="Pivot Lookback Right", defval=3)
lbL = input(title="Pivot Lookback Left", defval=1)
takeProfitRSILevel = input(title="Take Profit at RSI Level", minval=70, defval=80)

rangeUpper = input(title="Max of Lookback Range", defval=60)
rangeLower = input(title="Min of Lookback Range", defval=5)
plotBull = input(title="Plot Bullish", defval=true)
plotHiddenBull = input(title="Plot Hidden Bullish", defval=true)
plotBear = input(title="Plot Bearish", defval=true)
plotHiddenBear = input(title="Plot Hidden Bearish", defval=false)

//useTrailStopLoss = input(false, title="Use Trailing Stop Loss")

sl_type = input("NONE", title="Trailing StopLoss Type", options=['ATR','PERC', 'NONE'])

stopLoss = input(title="Stop Loss%", defval=5, minval=1)

atrLength=input(14, title="ATR Length (for Trailing stop loss)")
atrMultiplier=input(3.5, title="ATR Multiplier (for Trailing stop loss)")


bearColor = color.purple
bullColor = color.green
hiddenBullColor = color.new(color.green, 80)
hiddenBearColor = color.new(color.red, 80)
textColor = color.white
noneColor = color.new(color.white, 100)

osc = rsi(src, len)

plot(osc, title="RSI", linewidth=2, color=#8D1699)
hline(50, title="Middle Line", linestyle=hline.style_dotted)
obLevel = hline(70, title="Overbought", linestyle=hline.style_dotted)
osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted)
fill(obLevel, osLevel, title="Background", color=#9915FF, transp=90)

plFound = na(pivotlow(osc, lbL, lbR)) ? false : true
phFound = na(pivothigh(osc, lbL, lbR)) ? false : true

_inRange(cond) =>
    bars = barssince(cond == true)
    rangeLower <= bars and bars <= rangeUpper

//------------------------------------------------------------------------------
// Regular Bullish

// Osc: Higher Low
oscHL = osc[lbR] > valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// Price: Lower Low
priceLL = low[lbR] < valuewhen(plFound, low[lbR], 1)

bullCond = plotBull and priceLL and oscHL and plFound

plot(
	 plFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bullish",
	 linewidth=2,
	 color=(bullCond ? bullColor : noneColor),
	 transp=0
	 )


plotshape(
	 bullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bullish Label",
	 text=" Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor,
	 transp=0
	 )

//------------------------------------------------------------------------------
// Hidden Bullish

// Osc: Lower Low
oscLL = osc[lbR] < valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// Price: Higher Low
priceHL = low[lbR] > valuewhen(plFound, low[lbR], 1)

hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound

plot(
	 plFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish",
	 linewidth=2,
	 color=(hiddenBullCond ? hiddenBullColor : noneColor),
	 transp=0
	 )

plotshape(
	 hiddenBullCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bullish Label",
	 text=" H Bull ",
	 style=shape.labelup,
	 location=location.absolute,
	 color=bullColor,
	 textcolor=textColor,
	 transp=0
	 )

longCondition=bullCond or hiddenBullCond
//? osc[lbR] : na  
//hiddenBullCond
strategy.entry(id="RSIDivLE", long=true,  when=longCondition)


//Trailing StopLoss
////// Calculate trailing SL
/////////////////////////////////////////////////////
sl_val = sl_type == "ATR"      ? stopLoss * atr(atrLength) : 
         sl_type == "PERC" ? close * stopLoss / 100 : 0.00

trailing_sl = 0.0
trailing_sl :=   strategy.position_size>=1 ?  max(low  - sl_val, nz(trailing_sl[1])) :  na

//draw initil stop loss
//plot(strategy.position_size>=1 ? trailing_sl : na, color = color.blue , style=plot.style_linebr,  linewidth = 2, title = "stop loss")
//plot(trailing_sl, title="ATR Trailing Stop Loss", style=plot.style_linebr, linewidth=1, color=color.purple, transp=30)
//Trailing StopLoss
////// Calculate trailing SL
/////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Regular Bearish

// Osc: Lower High
oscLH = osc[lbR] < valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// Price: Higher High
priceHH = high[lbR] > valuewhen(phFound, high[lbR], 1)

bearCond = plotBear and priceHH and oscLH and phFound

plot(
	 phFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish",
	 linewidth=2,
	 color=(bearCond ? bearColor : noneColor),
	 transp=0
	 )

plotshape(
	 bearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Regular Bearish Label",
	 text=" Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor,
	 transp=0
	 )

//------------------------------------------------------------------------------
// Hidden Bearish

// Osc: Higher High
oscHH = osc[lbR] > valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// Price: Lower High
priceLH = high[lbR] < valuewhen(phFound, high[lbR], 1)

hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound

plot(
	 phFound ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish",
	 linewidth=2,
	 color=(hiddenBearCond ? hiddenBearColor : noneColor),
	 transp=0
	 )

plotshape(
	 hiddenBearCond ? osc[lbR] : na,
	 offset=-lbR,
	 title="Hidden Bearish Label",
	 text=" H Bear ",
	 style=shape.labeldown,
	 location=location.absolute,
	 color=bearColor,
	 textcolor=textColor,
	 transp=0
	 )
longCloseCondition=crossover(osc,takeProfitRSILevel) or bearCond
strategy.close(id="RSIDivLE", comment="Close All="+tostring(close - strategy.position_avg_price, "####.##"), when= abs(strategy.position_size)>=1  and  sl_type == "NONE" and longCloseCondition)

//close all on stop loss
strategy.close(id="RSIDivLE", comment="TSL="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and (sl_type == "PERC"   or sl_type == "ATR" ) and crossunder(close, trailing_sl)  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89


// Calculate start/end date and time condition
startDate  = input(timestamp("2019-01-01T00:00:00"), type = input.time)
finishDate = input(timestamp("2021-01-01T00:00:00"), type = input.time)
 
time_cond  = time >= startDate and time <= finishDate


Lebih banyak