RSI adalah strategi perdagangan kuantitatif yang didasarkan pada indikator RSI yang relatif kuat. Dengan menganalisis perbedaan antara indikator RSI dan harga, RSI menemukan peluang untuk membalikkan tren harga, untuk mencapai tujuan jual beli rendah.
Indikator inti dari strategi ini adalah RSI. Ini menganalisis selisih yang sangat besar antara indikator RSI dan harga. Yang disebut selisih yang sangat besar adalah adanya sinyal kebalikan antara indikator RSI dan harga.
Secara khusus, ketika RSI membentuk titik rendah yang lebih rendah, dan harga membentuk titik rendah yang lebih tinggi, maka RSI dan harga berbeda. Ini menunjukkan bahwa harga mungkin akan berbalik naik. Strategi akan membangun posisi multihead pada saat ini.
Sebaliknya, ketika RSI membentuk titik tinggi yang lebih tinggi dan harga membentuk titik tinggi yang lebih rendah, maka adalah divergensi posisi kosong antara RSI dan harga. Ini menandakan bahwa harga mungkin akan berbalik ke bawah. Strategi akan membangun posisi kosong pada saat ini.
Dengan menangkap titik-titik perbedaan antara RSI dan harga, strategi dapat menemukan peluang untuk membalikkan harga tepat pada waktunya, dan mencapai posisi jual-beli rendah.
Strategi divergensi RSI memiliki keuntungan sebagai berikut:
Capture price reversal point accuracy. RSI dan price divergence seringkali merupakan sinyal prediksi yang sangat efektif yang mengindikasikan adanya pembalikan tren yang akan terjadi.
Mencapai low buy high sell. Dengan membangun posisi di titik perpecahan, dapat membeli di titik yang relatif rendah dan menjual di titik yang relatif tinggi, sesuai dengan praktik terbaik dalam perdagangan kuantitatif.
Strategi RSI konvensional hanya berfokus pada area overbought dan oversold. Strategi ini menggunakan sifat reversal dari indikator RSI itu sendiri untuk menangkap titik pivot dengan cara yang lebih akurat. Strategi ini sangat meningkatkan efisiensi.
Pengaturan parameter yang sederhana. Parameter utama hanya ada dua, yaitu periode RSI dan interval review, sangat sederhana dan mudah dioptimalkan.
RSI juga memiliki beberapa risiko dalam strategi divergensi terbuka:
Perbedaan sinyal mungkin merupakan sinyal palsu. Perbedaan antara RSI dan harga tidak selalu menyebabkan reversal harga yang sebenarnya. Kadang-kadang juga terjadi reversal palsu.
Tidak berkinerja baik di pasar tren. Strategi ini memiliki ruang keuntungan yang relatif kecil ketika harga saham menunjukkan tren yang jelas. Dalam hal ini, sebaiknya berhenti menggunakan strategi ini untuk sementara waktu dan menunggu gerakan getaran baru.
Risiko rebound. Strategi ini menetapkan parameter rebound yang dapat mempercepat kerugian akun jika terjadi beberapa transaksi yang merugikan. Ini memerlukan pengendalian ukuran posisi dan titik berhenti untuk mengurangi risiko.
Strategi ini juga dapat dioptimalkan dalam beberapa hal:
Anda dapat menambahkan MACD, KDJ, dan indikator lainnya untuk memverifikasi titik perbedaan RSI, memfilter beberapa sinyal palsu, dan meningkatkan peluang strategi.
Optimalkan parameter RSI. Anda dapat menguji parameter siklus RSI yang berbeda untuk menemukan pengaturan siklus RSI yang lebih sesuai dengan karakteristik varietas. Biasanya, antara 6-15 adalah yang terbaik.
Optimalkan interval review. Interval review secara langsung mempengaruhi frekuensi perdagangan strategi. Anda dapat menguji parameter yang berbeda untuk menemukan frekuensi yang optimal.
Meningkatkan strategi stop loss. Anda dapat mengatur logika stop loss yang masuk akal berdasarkan ATR, stop loss bergerak, dan lain-lain. Dengan stop loss yang cepat jika terjadi kerugian, Anda dapat secara efektif mengendalikan risiko strategi.
Strategi RSI divergensi polygon dengan menganalisis sifat reversal dari indikator RSI itu sendiri, tepat menangkap titik balik dari perubahan harga. Strategi perdagangan dengan harga rendah dan harga tinggi. Dibandingkan dengan strategi RSI overbought dan oversold dalam arti tradisional, menggunakan fitur RSI yang lebih halus dan primitif, meningkatkan efisiensi strategi secara signifikan.
/*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