# rsi_exp_smoothing
#https://usethinkscript.com/threads/custom-exponential-smoothing.15372/
#Custom Exponential Smoothing
def na = double.nan;
def bn = barnumber();
#---------------------------------
# data
# RSI
# TD Ameritrade IP Company, Inc. (c) 2007-2023
declare lower;
input length = 14;
input over_Bought = 70;
input over_Sold = 30;
input price = close;
input averageType = AverageType.WILDERS;
input showBreakoutSignals = no;
def NetChgAvg = MovingAverage(averageType, price - price[1], length);
def TotChgAvg = MovingAverage(averageType, AbsValue(price - price[1]), length);
def ChgRatio = if TotChgAvg != 0 then NetChgAvg / TotChgAvg else 0;
def RSI = 50 * (ChgRatio + 1);
#plot OverSold = over_Sold;
#plot OverBought = over_Bought;
#plot UpSignal = if RSI crosses above OverSold then OverSold else Double.NaN;
#plot DownSignal = if RSI crosses below OverBought then OverBought else Double.NaN;
#UpSignal.SetHiding(!showBreakoutSignals);
#DownSignal.SetHiding(!showBreakoutSignals);
#RSI.DefineColor("OverBought", GetColor(5));
#RSI.DefineColor("Normal", GetColor(7));
#RSI.DefineColor("OverSold", GetColor(1));
#RSI.AssignValueColor(if RSI > over_Bought then RSI.color("OverBought") else if RSI < over_Sold then RSI.color("OverSold") else RSI.color("Normal"));
#OverSold.SetDefaultColor(GetColor(8));
#OverBought.SetDefaultColor(GetColor(8));
#UpSignal.SetDefaultColor(Color.UPTICK);
#UpSignal.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
#DownSignal.SetDefaultColor(Color.DOWNTICK);
#DownSignal.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
#------------------------
def data = RSI;
input show_original = no;
plot zdata = if show_original then data else na;
zdata.setdefaultcolor(color.cyan);
addlabel(show_original, "original", zdata.TakeValueColor());
#-------------------
#For example, using 0.75 of current RSI reading and 0.25 of exponential value one bar ago.
input percent_of_current_data = 75;
def remain_per = 100 - percent_of_current_data;
input remaining_percent_from_avg = AverageType.EXPONENTIAL;
input remaining_percent_avg_len = 21;
# calc an avg of orig data
def ma1 = MovingAverage(remaining_percent_from_avg, data, remaining_percent_avg_len);
def remain_dat = remain_per/100 * ma1[1];
def curr_dat = percent_of_current_data/100 * data;
def smooth_data = remain_dat + curr_dat;
plot zsmooth = smooth_data;
zsmooth.setdefaultcolor(color.yellow);
addlabel(1, "smoothed", zsmooth.TakeValueColor());
#