Strategi RSI Divergence Indicator adalah strategi perdagangan kuantitatif berdasarkan indikator Relative Strength Index (RSI).
Indikator inti dari strategi ini adalah RSI. Ini menganalisis
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.
Strategi RSI Divergence memiliki keuntungan berikut:
Perbedaan antara RSI dan harga seringkali menyiratkan pembalikan tren yang akan datang, yang merupakan sinyal prediktif yang sangat efektif.
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.
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.
Pengaturan parameter sederhana. parameter utama hanya periode RSI dan periode lookback, yang sangat sederhana dan mudah dioptimalkan.
Strategi RSI Divergence juga memiliki beberapa risiko:
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.
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.
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.
Strategi ini juga dapat dioptimalkan dalam aspek berikut:
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.
Optimalkan parameter RSI. Periode RSI yang berbeda dapat diuji untuk menemukan yang paling sesuai dengan karakteristik produk. Umumnya antara 6-15 bekerja dengan baik.
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.
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.
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