Diver RSI
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © justdoit7772

//@version=5
indicator(title="Diver RSI", format=format.price, timeframe="", timeframe_gaps=true)

// rsi 구하기
rsi = ta.rsi(close, 14)
plot(rsi)
hline(30)
hline(70)

// pivot_low 구하기
pivot_low = ta.pivotlow(rsi, 5, 5)
bgcolor(pivot_low ? color.new(color.green, 85) : na, offset = -5)

// 상승 다이버전스 판단기준 [1] 피봇로우가 발견 되었는가?
plFound = na(pivot_low) ? false : true
// 상승 다이버전스 판단기준 [2] 2개의 피봇로우에서 rsi가 증가 하였는가?
is_pl_higher = rsi[5]  > ta.valuewhen(plFound, rsi[5], 1)
// 상승 다이버전스 판단기준 [3] 피봇로우 2개에서의 저가는 감소 하였는가?
is_price_lower = low[5] < ta.valuewhen(plFound, low[5], 1)
// 상승 다이버전스 판단기준 [4] 2개의 피봇간 range 제한
_inRange(cond) =>
    bars = ta.barssince(cond == true)
    5 <= bars and bars <= 50
    
bullCond = plFound and is_pl_higher and is_price_lower and _inRange(plFound[1])
plot(
     plFound ? rsi[5] : na,
     offset=-5,
     title="Regular Bullish",
     linewidth=2,
     color=(bullCond ? color.green : na)
     )

// pivot_high 구하기
pivot_high = ta.pivothigh(rsi, 5, 5)
bgcolor(pivot_high ? color.new(color.red, 85) : na, offset = -5)

// 상승 다이버전스 판단기준 [1] 피봇하이가 발견 되었는가?
phFound = na(pivot_high) ? false : true
// 상승 다이버전스 판단기준 [2] 2개의 피봇하이에서 rsi가 감소 하였는가?
is_ph_lower = rsi[5] < ta.valuewhen(phFound, rsi[5], 1)
// 상승 다이버전스 판단기준 [3] 피봇로우 2개에서의 고가는 증가 하였는가?
is_price_higher = high[5] > ta.valuewhen(phFound, high[5], 1)
// 상승 다이버전스 판단기준 [4] 2개의 피봇간 range 제한 (이미 앞에서 구현함)
// _inRange(cond) =>
//     bars = ta.barssince(cond == true)
//     5 <= bars and bars <= 50
    
bearCond = phFound and is_ph_lower and is_price_higher and _inRange(phFound[1])
plot(
     phFound ? rsi[5] : na,
     offset=-5,
     title="Regular Bearish",
     linewidth=2,
     color=(bearCond ? color.red : na)
     )

/////****  Divergence Indicator 원본소스   ****/////
// len = input.int(title="RSI Period", minval=1, defval=14)
// src = input(title="RSI Source", defval=close)
// lbR = input(title="Pivot Lookback Right", defval=5)
// lbL = input(title="Pivot Lookback Left", defval=5)
// 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=false)
// plotBear = input(title="Plot Bearish", defval=true)
// plotHiddenBear = input(title="Plot Hidden Bearish", defval=false)
// bearColor = color.red
// 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 = ta.rsi(src, len)

// plot(osc, title="RSI", linewidth=2, color=#2962FF)
// hline(50, title="Middle Line", color=#787B86, linestyle=hline.style_dotted)
// obLevel = hline(70, title="Overbought", color=#787B86, linestyle=hline.style_dotted)
// osLevel = hline(30, title="Oversold", color=#787B86, linestyle=hline.style_dotted)
// fill(obLevel, osLevel, title="Background", color=color.rgb(33, 150, 243, 90))

// plFound = na(ta.pivotlow(osc, lbL, lbR)) ? false : true
// phFound = na(ta.pivothigh(osc, lbL, lbR)) ? false : true
// _inRange(cond) =>
// 	bars = ta.barssince(cond == true)
// 	rangeLower <= bars and bars <= rangeUpper

// //------------------------------------------------------------------------------
// // Regular Bullish
// // Osc: Higher Low

// oscHL = osc[lbR] > ta.valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// // Price: Lower Low

// priceLL = low[lbR] < ta.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)
//      )

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

// //------------------------------------------------------------------------------
// // Hidden Bullish
// // Osc: Lower Low

// oscLL = osc[lbR] < ta.valuewhen(plFound, osc[lbR], 1) and _inRange(plFound[1])

// // Price: Higher Low

// priceHL = low[lbR] > ta.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)
// 	 )

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

// //------------------------------------------------------------------------------
// // Regular Bearish
// // Osc: Lower High

// oscLH = osc[lbR] < ta.valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// // Price: Higher High

// priceHH = high[lbR] > ta.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)
// 	 )

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

// //------------------------------------------------------------------------------
// // Hidden Bearish
// // Osc: Higher High

// oscHH = osc[lbR] > ta.valuewhen(phFound, osc[lbR], 1) and _inRange(phFound[1])

// // Price: Lower High

// priceLH = high[lbR] < ta.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)
// 	 )

// plotshape(
// 	 hiddenBearCond ? osc[lbR] : na,
// 	 offset=-lbR,
// 	 title="Hidden Bearish Label",
// 	 text=" H Bear ",
// 	 style=shape.labeldown,
// 	 location=location.absolute,
// 	 color=bearColor,
// 	 textcolor=textColor
// 	 )