#// Indicator for TOS
#// @Author: Skyte
#indicator(title="Relative Strength (IBD Style)", shorttitle="RS", format=format.percent, max_bars_back=260)
# Converted by Sam4Cok@Samer800 - 01/2025
declare lower;
input ref_input = "SPY"; #("SPY", title="Reference")
def na = Double.NaN;
def last = isNaN(close);
def stock = close;
def ref = close(ref_input);
#// use more recent quarters if data for full year is not available
script quarter_perf {
input data = close;
input n = 1;
def qYear = 252 / 4;
def refCandle; def baseCandle; def i;
def i1 = CompoundValue(1, i[1], n);
def refCandle1 = CompoundValue(1, refCandle[1] , n * qYear);
def baseCandle1 = CompoundValue(1, baseCandle[1], (n - 1) * qYear);
if GetValue(data, refCandle1) {
i = n;
refCandle = n * qYear;
baseCandle = (n - 1) * qYear;
} else {
i = if i1[1] > 1 then i1 - 1 else 1;
refCandle = i * qYear;
baseCandle = (i - 1) * qYear;
}
def quarter_perf = (GetValue(data, baseCandle) - GetValue(GetValue(data, baseCandle), refCandle)) /
GetValue(GetValue(data, baseCandle), refCandle) * 100;
plot out = quarter_perf;
}
#// first quarter is weighted more
def quarter = AggregationPeriod.QUARTER;
def q1S = quarter_perf(stock, 1);
def q2S = quarter_perf(stock, 2);
def q3S = quarter_perf(stock, 3);
def q4S = quarter_perf(stock, 4);
def q1R = quarter_perf(ref, 1);
def q2R = quarter_perf(ref, 2);
def q3R = quarter_perf(ref, 3);
def q4R = quarter_perf(ref, 4);
def stock_performance = 0.4 * q1S + 0.2 * q2S + 0.2 * q3S + 0.2 * q4S;
def ref_performance = 0.4 * q1R + 0.2 * q2R + 0.2 * q3R + 0.2 * q4R;
def rs = (stock_performance - ref_performance)/ref_performance * 100;
#-- plot
plot RelativeStrength = if !last then rs else na; #, title="Relative Strength", color=plot_color, linewidth=2)
def zeroLine = if !last then 0 else na;
RelativeStrength.SetLineWeight(2);
RelativeStrength.AssignValueColor(if rs >= zeroLine then Color.GREEN else Color.RED);
AddCloud(rs, zeroLine, Color.GREEN, Color.RED);
#-- END of CODE