# RSI_HistoAlert_Strategy
# Based on code located at: https://www.tradingview.com/script/bXMVCkJK-RSI-HistoAlert-Strategy/
# Derived from TOS standard RSI Study
# Converted by rad14733 for usethinkscript.com
#hint: Paints both RSI histogram and line, plus Buy and Sell alert lines.\nNote that this version uses a different scale than the standard RSI Indicator.
# v1.0 : 2021-02-23 : Initial Release
# v1.1 : 2021-02-24 : Added sound alerts for zeroline crossover
declare lower;
input length = 13; #14
input over_Bought = 20;
input over_Sold = -20;
input showBreakoutSignals = yes;
input buyAlertValue = -10;
input sellAlertValue = 10;
input showZerolineCrossovers = yes;
input showRsiLine = no;
input showAvgRSI = yes;
input showZeroLine = no;
input showAvgRsiCloud = yes;
input showAvgRSICrossovers = yes;
input useZerolineAlerts = no;
input price = close;
input averageType = AverageType.WILDERS;
def rsi = RSI(length, over_Bought, over_Sold, price, averageType, showBreakoutSignals) - 50;
plot rsiHist = rsi;
rsiHist.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
rsiHist.SetLineWeight(3);
rsiHist.assignValueColor(
if rsiHist > 0 and rsiHist >= rsiHist[1]
then Color.CYAN
else if rsiHist > 0 and rsiHist < rsiHist[1]
then Color.DARK_ORANGE
else if rsiHist < 0 and rsiHist <= rsiHist[1]
then Color.RED
else Color.YELLOW
);
#rsiHist.AssignValueColor(if rsi > 0 then Color.GREEN else Color.RED); #Original
plot rsiLine = if showRsiLine then rsi else Double.NaN;
rsiLine.SetPaintingStrategy(PaintingStrategy.LINE);
rsiLine.SetDefaultColor(Color.BLUE);
rsiLine.SetLineWeight(2);
plot zeroline = if showZeroLine then 0 else Double.NaN;
zeroline.SetDefaultColor(Color.WHITE);
zeroline.SetPaintingStrategy(PaintingStrategy.LINE);
zeroline.SetStyle(Curve.FIRM);
zeroline.SetLineWeight(1);
# Zeroline Crossover Indicators
plot xUp = if showZerolineCrossovers and rsi crosses above zeroline then zeroline - 1 else Double.NaN;
xUp.SetDefaultColor(Color.DARK_GREEN);
xUp.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
xUp.SetLineWeight(1);
plot xDown = if showZerolineCrossovers and rsi crosses below zeroline then zeroline + 1 else Double.NaN;
xDown.SetDefaultColor(Color.DARK_RED);
xDown.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
xDown.SetLineWeight(1);
plot BuyAlertLevel = buyAlertValue;
BuyAlertLevel.SetDefaultColor(Color.YELLOW);
BuyAlertLevel.SetPaintingStrategy(PaintingStrategy.LINE);
BuyAlertLevel.SetStyle(Curve.SHORT_DASH);
BuyAlertLevel.SetLineWeight(1);
plot SellAlertLevel = sellAlertValue;
SellAlertLevel.SetDefaultColor(Color.YELLOW);
SellAlertLevel.SetPaintingStrategy(PaintingStrategy.LINE);
SellAlertLevel.SetStyle(Curve.SHORT_DASH);
SellAlertLevel.SetLineWeight(1);
# v1.1 : Alert Code
Alert(useZerolineAlerts and rsi crosses above zeroline, "RSI_HistoAlert xUp", Alert.BAR, Sound.Ding);
Alert(useZerolineAlerts and rsi crosses below zeroline, "RSI_HistoAlert xDown", Alert.BAR, Sound.Ding);
# v1.2 : Average RSI Line and Crossover Indicators
plot avgRSI = if showAvgRSI then Average(rsi, length) else Double.NaN;
#avgRSI.AssignValueColor(if rsi > avgRsi then Color.Green else Color.RED);
avgRSI.SetPaintingStrategy(PaintingStrategy.LINE);
avgRSI.SetStyle(Curve.FIRM);
avgRSI.SetLineWeight(2);
avgRSI.AssignValueColor(
if rsiHist > avgRsi and rsiHist > 0
then Color.WHITE
else if rsiHist > 0 and rsiHist < avgRsi
then Color.RED
else if rsiHist < 0 and rsiHist < avgRsi
then Color.WHITE
else Color.CYAN
);
avgRSI.AssignValueColor(Color.WHITE);
plot xAvgUp = if showAvgRSICrossovers and (rsi crosses above avgRSI and rsi > rsi[1]) then avgRSI else Double.NaN;
xAvgUp.SetDefaultColor(Color.ORANGE);
xAvgUp.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
xAvgUp.SetLineWeight(1);
plot xAvgDown = if showAvgRSICrossovers and (rsi crosses below avgRSI and rsi < rsi[1]) then avgRSI else Double.NaN;
xAvgDown.SetDefaultColor(Color.YELLOW);
xAvgDown.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
xAvgDown.SetLineWeight(1);
# RSI Breakout OB/OS Lines and Crossovers
plot obPlot = if showBreakoutSignals then over_Bought else Double.NaN;
obPlot.SetDefaultColor(Color.WHITE);
obPlot.SetPaintingStrategy(PaintingStrategy.LINE);
obPlot.SetStyle(Curve.FIRM);
obPlot.SetLineWeight(1);
plot osPlot = if showBreakoutSignals then over_Sold else Double.NaN;
osPlot.SetDefaultColor(Color.WHITE);
osPlot.SetPaintingStrategy(PaintingStrategy.LINE);
osPlot.SetStyle(Curve.FIRM);
osPlot.SetLineWeight(1);
plot osXover = if showBreakoutSignals and (rsi crosses above over_Sold and rsi > rsi[1]) then over_Sold else Double.NaN;
osXover.SetDefaultColor(Color.GREEN);
osXover.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
osXover.SetLineWeight(1);
plot obXbelow = if showBreakoutSignals and (rsi crosses below over_Bought and rsi < rsi[1]) then over_Bought else Double.NaN;
obXbelow.SetDefaultColor(Color.RED);
obXbelow.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
obXbelow.SetLineWeight(1);
# AddCloud - rad14733 - v1.1
AddCloud(if showAvgRsiCloud then 0 else Double.Nan, if showAvgRsiCloud then avgRsi else Double.Nan, Color.WHITE, Color.WHITE);
# END - RSI_HistoAlert_Strategy