```
#// This source code is subject to the terms of the Mozilla Public License 2.0 at
#study("Multiple Divergence Indicator w/Alerts")
# Created by [email protected] - 10/2022 as requested from https://usethinkscript.com memeber
input src = hl2; # "RSI Source"
input Indicator = {Default RSI, OBV, MACD, STOCH, CCI, MFI};
input alerts = yes;
input sound = {default "NoSound", "Ding", "Bell", "Chimes", "Ring"};
input lbR = 5; # "Pivot Lookback Right"
input lbL = 5; # "Pivot Lookback Left"
input MaxLookback = 60; # "Max of Lookback Range"
input MinLookback = 5; # "Min of Lookback Range"
input DivBull = yes; # "Plot Bullish"
input DivHiddenBull = no; # "Plot Hidden Bullish"
input DivBear = yes; # "Plot Bearish"
input DivHiddenBear = no; # "Plot Hidden Bearish"
def na = double.NaN;
#mfi(src, length) =>
script mfi {
input src = close;
input length = 14;
def upper = sum(volume * (if(src-src[1]) <= 0.0 then 0.0 else src), length);
def lower = sum(volume * (if(src-src[1]) >= 0.0 then 0.0 else src), length);
def mfi = 100.0 - (100.0 / (1.0 + upper / lower));
plot return = mfi;
}
# stoch(source, high, low, length) =>
script stoch {
input src = close;
input h = high;
input l = low;
input len = 0;
def stoch = 100 * (src - lowest(l, len)) / (highest(h, len) - lowest(l, len));
plot return = stoch;
}
def RSI = RSI(Price = src, length= 14);
def obv = TotalSum(sign((close-close[1])) * volume);
def MACD = macd().Diff;
def stochastic = stoch(close, high, low, 14);
def CCI = CCI(Length=20);
def mfi = MFI(src,14);
#----Div-----------
def divSrc;
switch (Indicator) {
case RSI:
divSrc = RSI;
case OBV:
divSrc = OBV;
case MACD:
divSrc = MACD;
case STOCH:
divSrc = Stochastic;
case CCI:
divSrc = CCI;
case MFI:
divSrc = MFI;
}
script FindPivots {
input dat = close; # default data or study being evaluated
input HL = 0; # default high or low pivot designation, -1 low, +1 high
input lbL = 5; # default Pivot Lookback Left
input lbR = 1; # default Pivot Lookback Right
##############
def _nan; # used for non-number returns
def _BN; # the current barnumber
def _VStop; # confirms that the lookforward period continues the pivot trend
def _V; # the Value at the actual pivot point
##############
_BN = BarNumber();
_nan = Double.NaN;
_VStop = if !isNaN(dat) and lbr > 0 and lbl > 0 then
fold a = 1 to lbR + 1 with b=1 while b do
if HL > 0 then dat > GetValue(dat,-a) else dat < GetValue(dat,-a) else _nan;
if (HL > 0) {
_V = if _BN > lbL and dat == Highest(dat, lbL+1) and _VStop
then dat else _nan;
} else {
_V = if _BN > lbL and dat == Lowest(dat, lbL+1) and _VStop
then dat else _nan;
}
plot result = if !IsNaN(_V) and _VStop then _V else _nan;
}
#valuewhen (Cond, source, lbr, occurrence)
script valuewhen {
input cond = 0;
input src = close;
input lbr = 0;
input occurrence = 0;
def n = occurrence + 1;
def offset = fold j = 0 to 200 with p=1 while p < n + 1
do p + ( if p == n then j - n else if cond[j]==yes then 1 else 0 );
plot price = GetValue(src[lbr], offset-1);
}
#_inRange(cond) =>
script _inRange {
input cond = yes;
input rangeUpper = 60;
input rangeLower = 5;
def bars = if cond then 0 else bars[1] + 1;
def inrange = (rangeLower <= bars) and (bars <= rangeUpper);
plot retrun = inRange;
}
#Div(source, lbl, lbr, MaxLookback, MinLookback, DivBull = yes, DivBear = yes, DivHiddenBull=no, DivHiddenBear=no),
script Div {
input divSrc = close;
input lbl = 5;
input lbr = 5;
input MaxLookback = 60;
input MinLookback = 5;
input DivBull = yes;
input DivBear = yes;
input DivHiddenBull=no;
input DivHiddenBear=no;
def h = high;
def l = low;
def pl = findpivots(divSrc,-1, lbL, lbR);
def ph = findpivots(divSrc, 1, lbL, lbR);
def plFound = if !isNaN(pl) then 1 else 0;
def phFound = if !isNaN(ph) then 1 else 0;
def vlFound = valuewhen(plFound, divSrc, 0, 1);
def vhFound = valuewhen(phFound, divSrc, 0, 1);
def plPrice = valuewhen(plFound, l, 0, 1);
def phPrice = valuewhen(phFound, h, 0, 1);
#// Regular Bullish
def oscHL = divSrc > vlFound and _inRange(plFound[1],MaxLookback,MinLookback);
def priceLL = l < plPrice;
def bullCond = DivBull and plFound and oscHL and priceLL;
#// Hidden Bullish
def oscLL = divSrc[lbr] < vlFound and _inRange(plFound[1],MaxLookback,MinLookback);
def priceHL = l[lbr] > plPrice;
def hiddenBullCond = DivHiddenBull and plFound and oscLL and priceHL;
#// Regular Bearish
def oscLH = divSrc < vhFound and _inRange(phFound[1],MaxLookback,MinLookback);
def priceHH = h > phPrice;
def bearCond = DivBear and phFound and oscLH and priceHH;
#// Hidden Bearish
def oscHH = divSrc > vhFound and _inRange(phFound[1],MaxLookback,MinLookback);
def priceLH = h < phPrice;
def hiddenBearCond = DivHiddenBear and phFound and oscHH and priceLH;
plot BullDiv = if bullCond then 1 else 0;
plot BearDiv = if bearCond then 1 else 0;
plot hidBullDiv = if hiddenBullCond then 1 else 0;
plot HidBearDiv = if hiddenBearCond then 1 else 0;
}
#---- Div
def bullCond = DIV(divSrc,lbl,lbr,MaxLookback,MinLookback,DivBull, DivBear, DivHiddenBull, DivHiddenBear).BullDiv;
def bearCond = DIV(divSrc,lbl,lbr,MaxLookback,MinLookback, DivBull, DivBear, DivHiddenBull, DivHiddenBear).BearDiv;
def hiddenBullCond = DIV(divSrc,lbl,lbr,MaxLookback,MinLookback, DivBull, DivBear, DivHiddenBull, DivHiddenBear).hidBullDiv;
def hiddenBearCond = DIV(divSrc,lbl,lbr,MaxLookback,MinLookback, DivBull, DivBear, DivHiddenBull, DivHiddenBear).HidBearDiv;
#------ Bubbles
addchartbubble(bullCond, low, Indicator, color.GREEN, no);
addchartbubble(bearCond, high, Indicator, CreateColor(156,39,176), yes);
addchartbubble(hiddenBullCond, low, Indicator, color.DARK_green, no);
addchartbubble(hiddenBearCond, high, Indicator, color.DARK_red, yes);
#---- Alerts
Alert(alerts and bullCond, "Regular Bull Div", Alert.BAR, sound);
Alert(alerts and bearCond, "Regular Bear Div", Alert.BAR, sound);
Alert(alerts and hiddenBullCond, "Hidden Bull Div", Alert.BAR, sound);
Alert(alerts and hiddenBearCond, "Hidden Bear Div", Alert.BAR, sound);
#----End
```