#// Indicator for TOS
#// © QuantEdgeB
#indicator("Hyper MA Loop | QuantEdgeB", overlay = false)
# Converted by Sam4Cok@Samer800 - 02/2025
# Added Support/Resistance bands -Chewie76 03/2025
input colorBars = no;
input HyperMaSource = close; # "HyperMA Source"
input HyperMaLength = 2; # "Hyper MA Length"
input strat_loop = 1; # 'Start'
input end_loop = 60; # 'End'
input ThresholdForLong = 40; # 'Threshold for long'
input ThresholdForShort = 8; # 'Threshold for short'
input inner = yes;
input factor = 1.0;
input factor2 = 1.6;
input factor3 = 2.0;
input factor4 = 3.0;
input factor5 = 4.2;
input trueRangeAverageType = AverageType.EXPONENTIAL;
def displace = 0;
def na = Double.NaN;
def last = IsNaN(close);
#// Hyper MA Calculation
script f_HyMA {
input src = close;
input len = 2;
def sum_hyp = fold i = 0 to len with p do
p + src[i] * (1 / (len - i));
def sum_weights = fold j = 0 to len with q do
q + (1 / (len - j));
def f_HyMA = if sum_weights > 0 then sum_hyp / sum_weights else Double.NaN;
plot out = f_HyMA;
}
#// Loop Function
script loop_f {
input a = 1;
input b = 60;
input ma = close;
def sum2 = fold i = a to b + 1 with p do
p + (if ma > ma[i] then 1 else -1);
plot out = sum2;
}
def HyMa = f_HyMA(HyperMaSource, HyperMaLength);
def hyma_loop = loop_f(strat_loop , end_loop, HyMa);
#// Final Signal
def Long_C = hyma_loop > ThresholdForLong;
def Short_C = hyma_loop < ThresholdForShort;
def QB = if Long_C and !Short_C then 1 else
if Short_C then -1 else QB[1];
#// Color
def col = if QB > 0 then 1 else if QB < 0 then -1 else 0;
#// Extra Plots
def plotline1 = ExpAverage(close, 3);
plot plotline2 = ExpAverage(plotline1, 16 * 2);
def plotline3 = ExpAverage(plotline1, 16 * 3);
def plotline4 = ExpAverage(plotline1, 25); #14
def band_width = AbsValue(plotline2 - plotline4) / close;
plotline2.SetDefaultColor(Color.YELLOW);
plotline2.SetLineWeight(1);
def shift = factor * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), 34);
def shift2 = factor2 * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), 34);
def shift3 = factor3 * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), 34);
def shift4 = factor4 * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), 34);
def shift5 = factor5 * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), 34);
#// Plots
def upCol = (col > 0 or col[-1] > 0);
def dnCol = (col < 0 or col[-1] < 0);
def Line4 = if !last then plotline4 else na;
#Line4.AssignValueColor(if col > 0 then Color.CYAN else if col < 0 then Color.MAGENTA else Color.GRAY);
plot Upper_Band = if inner then plotline2[-displace] + shift[-displace] else double.nan;
#Upper_Band.SetDefaultColor(CreateColor(255, 51, 153));
Upper_Band.SetDefaultColor(Color.dark_gray);
plot Lower_Band = if inner then plotline2[-displace] - shift[-displace] else double.nan;
#Lower_Band.SetDefaultColor(CreateColor(102, 255, 153));
Lower_Band.SetDefaultColor(Color.dark_gray);
plot Upper_Band2 = if inner then plotline2[-displace] + shift2[-displace] else double.nan;
#Upper_Band2.SetDefaultColor(CreateColor(255, 51, 153));
Upper_Band2.SetDefaultColor(Color.dark_orange);
Upper_Band2.setlineWeight(1);
plot Lower_Band2 = if inner then plotline2[-displace] - shift2[-displace] else double.nan;
#Lower_Band2.SetDefaultColor(CreateColor(102, 255, 153));
Lower_Band2.SetDefaultColor(Color.lime);
Lower_Band2.setlineWeight(1);
plot Upper_Band3 = plotline2[-displace] + shift3[-displace];
Upper_Band3.SetDefaultColor(color.magenta);
Upper_Band3.setlineWeight(1);
plot Lower_Band3 = plotline2[-displace] - shift3[-displace];
Lower_Band3.SetDefaultColor(Color.cyan);
Lower_Band3.setlineWeight(1);
plot Upper_Band4 = plotline2[-displace] + shift4[-displace];
Upper_Band4.SetDefaultColor(Createcolor(153,0,153));
Upper_Band4.setlineWeight(2);
plot Lower_Band4 = plotline2[-displace] - shift4[-displace];
Lower_Band4.SetDefaultColor(Createcolor(0,153,153));
Lower_Band4.setlineWeight(2);
plot Upper_Band5 = plotline2[-displace] + shift5[-displace];
Upper_Band5.SetDefaultColor(Color.dark_gray);
Upper_Band5.setlineWeight(2);
plot Lower_Band5 = plotline2[-displace] - shift5[-displace];
Lower_Band5.SetDefaultColor(Color.dark_gray);
Lower_Band5.setlineWeight(2);
AddCloud(upper_band3, upper_band4 , CreateColor(204,102,255), CreateColor(204,102,255));
AddCloud(lower_band3, lower_band4, CreateColor(153,255,255), CreateColor(153,255,255));
AddCloud(if upCol then plotline4 else na, plotline3, Color.CYAN, Color.CYAN);
AddCloud(if upCol then plotline2 else na, plotline3, Color.CYAN, Color.CYAN);
AddCloud(if dnCol then plotline4 else na, plotline3, Color.PLUM, Color.PLUM);
AddCloud(if dnCol then plotline2 else na, plotline3, Color.PLUM, Color.PLUM);
AddCloud(if col > 0 and last[-2] then plotline2 else na, plotline3, Color.CYAN, Color.CYAN);
AddCloud(if col < 0 and last[-2] then plotline4 else na, plotline3, Color.PLUM, Color.PLUM);
AddCloud(if col < 0 and last[-2] then plotline2 else na, plotline3, Color.PLUM, Color.PLUM);
#-- Bar Color
AssignPriceColor(if !colorBars then Color.CURRENT else
if col > 0 then Color.CYAN else if col < 0 then Color.MAGENTA else Color.GRAY);
#-- END of CODE