//@version=5
indicator(title='vvvsss', shorttitle='')
source = close
long_term_div = input(true, title='Use long term Divergences?')
div_lookback_period = [Link](55, minval=1, title='Lookback Period')
fastLength = [Link](12, minval=1)
slowLength = [Link](26, minval=1)
signalLength = [Link](9, minval=1)
smoother = [Link](2, minval=1)
fastMA = [Link](source, fastLength)
slowMA = [Link](source, slowLength)
macd = fastMA - slowMA
macd2 = macd / slowMA * 100
d = [Link](macd2, smoother) // smoothing PPO
bullishPrice = low
priceMins = bullishPrice > bullishPrice[1] and bullishPrice[1] < bullishPrice[2] or
low[1] == low[2] and low[1] < low and low[1] < low[3] or low[1] == low[2] and
low[1] == low[3] and low[1] < low and low[1] < low[4] or low[1] == low[2] and
low[1] == low[3] and low[1] and low[1] == low[4] and low[1] < low and low[1] <
low[5] // this line identifies bottoms and plateaus in the price
oscMins = d > d[1] and d[1] < d[2] // this line identifies bottoms in the PPO
BottomPointsInPPO = oscMins
bearishPrice = high
priceMax = bearishPrice < bearishPrice[1] and bearishPrice[1] > bearishPrice[2] or
high[1] == high[2] and high[1] > high and high[1] > high[3] or high[1] == high[2]
and high[1] == high[3] and high[1] > high and high[1] > high[4] or high[1] ==
high[2] and high[1] == high[3] and high[1] and high[1] == high[4] and high[1] >
high and high[1] > high[5] // this line identifies tops in the price
oscMax = d < d[1] and d[1] > d[2] // this line identifies tops in the PPO
TopPointsInPPO = oscMax
currenttrough4 = [Link](oscMins, d[1], 0) // identifies the value of PPO at
the most recent BOTTOM in the PPO
lasttrough4 = [Link](oscMins, d[1], 1) // NOT USED identifies the value of
PPO at the second most recent BOTTOM in the PPO
currenttrough5 = [Link](oscMax, d[1], 0) // identifies the value of PPO at
the most recent TOP in the PPO
lasttrough5 = [Link](oscMax, d[1], 1) // NOT USED identifies the value of
PPO at the second most recent TOP in the PPO
currenttrough6 = [Link](priceMins, low[1], 0) // this line identifies the
low (price) at the most recent bottom in the Price
lasttrough6 = [Link](priceMins, low[1], 1) // NOT USED this line identifies
the low (price) at the second most recent bottom in the Price
currenttrough7 = [Link](priceMax, high[1], 0) // this line identifies the
high (price) at the most recent top in the Price
lasttrough7 = [Link](priceMax, high[1], 1) // NOT USED this line identifies
the high (price) at the second most recent top in the Price
delayedlow = priceMins and [Link](oscMins) < 3 ? low[1] : na
delayedhigh = priceMax and [Link](oscMax) < 3 ? high[1] : na
// only take tops/bottoms in price when tops/bottoms are less than 5 bars away
lowest_1 = [Link](currenttrough6, 4)
filter = [Link](priceMins) < 5 ? lowest_1 : na
highest_1 = [Link](currenttrough7, 4)
filter2 = [Link](priceMax) < 5 ? highest_1 : na
//delayedbottom/top when oscillator bottom/top is earlier than price bottom/top
y11 = [Link](oscMins, delayedlow, 0)
y12 = [Link](oscMax, delayedhigh, 0)
// only take tops/bottoms in price when tops/bottoms are less than 5 bars away,
since 2nd most recent top/bottom in osc
y2 = [Link](oscMax, filter2, 1) // identifies the highest high in the tops
of price with 5 bar lookback period SINCE the SECOND most recent top in PPO
y6 = [Link](oscMins, filter, 1) // identifies the lowest low in the bottoms
of price with 5 bar lookback period SINCE the SECOND most recent bottom in PPO
long_term_bull_filt = [Link](priceMins, [Link](div_lookback_period), 1)
long_term_bear_filt = [Link](priceMax, [Link](div_lookback_period), 1)
y3 = [Link](oscMax, currenttrough5, 0) // identifies the value of PPO in the
most recent top of PPO
y4 = [Link](oscMax, currenttrough5, 1) // identifies the value of PPO in the
second most recent top of PPO
y7 = [Link](oscMins, currenttrough4, 0) // identifies the value of PPO in
the most recent bottom of PPO
y8 = [Link](oscMins, currenttrough4, 1) // identifies the value of PPO in
the SECOND most recent bottom of PPO
y9 = [Link](oscMins, currenttrough6, 0)
y10 = [Link](oscMax, currenttrough7, 0)
bulldiv = BottomPointsInPPO ? d[1] : na // plots dots at bottoms in the PPO
beardiv = TopPointsInPPO ? d[1] : na // plots dots at tops in the PPO
i = currenttrough5 < [Link](d, div_lookback_period) // long term bearish
oscilator divergence
i2 = y10 > long_term_bear_filt // long term bearish top divergence
i3 = delayedhigh > long_term_bear_filt // long term bearish delayedhigh divergence
i4 = currenttrough4 > [Link](d, div_lookback_period) // long term bullish osc
divergence
i5 = y9 < long_term_bull_filt // long term bullish bottom div
i6 = delayedlow < long_term_bull_filt // long term bullish delayedbottom div
plot(d, color=[Link]([Link], 0))
plot(bulldiv, title='Tops', color=[Link]([Link], 0),
style=plot.style_circles, linewidth=4, offset=-1)
plot(beardiv, title='Bottoms', color=[Link]([Link], 0),
style=plot.style_circles, linewidth=4, offset=-1)
plot(y10 > y2 and oscMax and y3 < y4 ? d : na, title='Bearish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)
plot(y9 < y6 and oscMins and y7 > y8 ? d : na, title='Bullish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)
plot(delayedlow < y6 and y7 > y8 ? d : na, title='Bullish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)
plot(delayedhigh > y2 and y3 < y4 ? d : na, title='Bearish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)
plot(long_term_div and oscMax and i and i2 ? d : na, title='Bearish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)
plot(long_term_div and oscMins and i4 and i5 ? d : na, title='Bullish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)
plot(long_term_div and i and i3 ? d : na, title='Bearish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)
plot(long_term_div and i4 and i6 ? d : na, title='Bullish Divergence2',
color=[Link]([Link], 0), style=plot.style_circles, linewidth=4)