# Labels show current color status
# Choose how the candles are being colored (green/red) in Multiple user defined TimeFrames by one of 4 methods.
# Trend method is similar but not exactly like TTM_Trend
# Move study from lower to upper and select "upper" at the input useupperlower to display dots on upper price panel. Uncheck at input screen "use left axis"
# Using the study on the lower panel, select "lower" at the input useupperlower to lower to display dots on lower panel
# Dots can be turned off/on at the input screen
# Summary line shows only if all colors are the same, otherwise blank.
declare lower;
input method = { default Averages,"MACD", "Close_Close[1]", "HAOpen_HAClose", "Trend", "HHLLS"};
input useupper_lower = {default lower, upper};
input showdotplot = yes;
input agg1 = AggregationPeriod.MIN;
input agg2 = AggregationPeriod.TWO_MIN;
input agg3 = AggregationPeriod.THREE_MIN;
input agg4 = AggregationPeriod.FIVE_min;
input agg5 = AggregationPeriod.TEN_MIN;
input agg6 = AggregationPeriod.FIFTEEN_MIN;
#Averages
input length1 = 9;
input length2 = 20;
input avgtype = averageType.EXPONENTIAL;
input price = fundamentalType.CLOSE;
def ma1_1 = movingaverage(avgtype, fundamental(price, period = agg1), length1);
def ma2_1 = movingaverage(avgtype, fundamental(price, period = agg1), length2);
def ma1_2 = movingaverage(avgtype, fundamental(price, period = agg2), length1);
def ma2_2 = movingaverage(avgtype, fundamental(price, period = agg2), length2);
def ma1_3 = movingaverage(avgtype, fundamental(price, period = agg3), length1);
def ma2_3 = movingaverage(avgtype, fundamental(price, period = agg3), length2);
def ma1_4 = movingaverage(avgtype, fundamental(price, period = agg4), length1);
def ma2_4 = movingaverage(avgtype, fundamental(price, period = agg4), length2);
def ma1_5 = movingaverage(avgtype, fundamental(price, period = agg5), length1);
def ma2_5 = movingaverage(avgtype, fundamental(price, period = agg5), length2);
def ma1_6 = movingaverage(avgtype, fundamental(price, period = agg6), length1);
def ma2_6 = movingaverage(avgtype, fundamental(price, period = agg6), length2);
#Heiken Ashi defined
def HAclose1 = ohlc4(period = agg1);
def HAopen1 = CompoundValue( 1, ( HAopen1[1] + HAclose1[1] ) / 2, HAclose1 );
def HAclose2 = ohlc4(period = agg2);
def HAopen2 = CompoundValue( 1, ( HAopen2[1] + HAclose2[1] ) / 2, HAclose2 );
def HAclose3 = ohlc4(period = agg3);
def HAopen3 = CompoundValue( 1, ( HAopen3[1] + HAclose3[1] ) / 2, HAclose3 );
def HAclose4 = ohlc4(period = agg4);
def HAopen4 = CompoundValue( 1, ( HAopen4[1] + HAclose4[1] ) / 2, HAclose4 );
def HAclose5 = ohlc4(period = agg5);
def HAopen5 = CompoundValue( 1, ( HAopen5[1] + HAclose5[1] ) / 2, HAclose5 );
def HAclose6 = ohlc4(period = agg6);
def HAopen6 = CompoundValue( 1, ( HAopen3[1] + HAclose6[1] ) / 2, HAclose6 );
#Trend defined
input trend_lookback = 12;
def HH1 = (Highest(high(period = agg1) , trend_lookback) + Lowest(low(period = agg1), trend_lookback)) / 2;
def Trend1 = close(period = agg1) > HH1;
def HH2 = (Highest(high(period = agg2) , trend_lookback) + Lowest(low(period = agg2), trend_lookback)) / 2;
def Trend2 = close(period = agg2) > HH2;
def HH3 = (Highest(high(period = agg3) , trend_lookback) + Lowest(low(period = agg3), trend_lookback)) / 2;
def Trend3 = close(period = agg3) > HH3;
def HH4 = (Highest(high(period = agg4) , trend_lookback) + Lowest(low(period = agg4), trend_lookback)) / 2;
def Trend4 = close(period = agg4) > HH4;
def HH5 = (Highest(high(period = agg5) , trend_lookback) + Lowest(low(period = agg5), trend_lookback)) / 2;
def Trend5 = close(period = agg5) > HH5;
def HH6 = (Highest(high(period = agg6) , trend_lookback) + Lowest(low(period = agg6), trend_lookback)) / 2;
def Trend6 = close(period = agg6) > HH6;
#MACD
input fastlength = 12;
input slowlength = 26;
input macdlength = 9;
input averagetype = AverageType.EXPONENTIAL;
def Value1 = MovingAverage(averagetype, close(period = agg1), fastlength) - MovingAverage(averagetype, close(period = agg1), slowlength);
def Avg1 = MovingAverage(averagetype, Value1, macdlength);
def MACD1 = Value1 - Avg1;
def Value2 = MovingAverage(averagetype, close(period = agg2), fastlength) - MovingAverage(averagetype, close(period = agg2), slowlength);
def Avg2 = MovingAverage(averagetype, Value2, macdlength);
def MACD2 = Value2 - Avg2;
def Value3 = MovingAverage(averagetype, close(period = agg3), fastlength) - MovingAverage(averagetype, close(period = agg3), slowlength);
def Avg3 = MovingAverage(averagetype, Value3, macdlength);
def MACD3 = Value3 - Avg3;
def Value4 = MovingAverage(averagetype, close(period = agg4), fastlength) - MovingAverage(averagetype, close(period = agg4), slowlength);
def Avg4 = MovingAverage(averagetype, Value4, macdlength);
def MACD4 = Value4 - Avg4;
def Value5 = MovingAverage(averagetype, close(period = agg5), fastlength) - MovingAverage(averagetype, close(period = agg5), slowlength);
def Avg5 = MovingAverage(averagetype, Value5, macdlength);
def MACD5 = Value5 - Avg5;
def Value6 = MovingAverage(averagetype, close(period = agg6), fastlength) - MovingAverage(averagetype, close(period = agg6), slowlength);
def Avg6 = MovingAverage(averagetype, Value6, macdlength);
def MACD6 = Value6 - Avg6;
#HHKKS
input length = 20;
input over_bought = 60;
input signal_line = 50;
input over_sold = 10;
input averageTypehhlls = AverageType.EXPONENTIAL;
Assert(length > 1, "'length' must be greater than one: " + length);
def HS1 = if high (period = agg1) > high(period= agg1)[1] then (high (period= agg1) - Lowest(high (period= agg1), length)) / (Highest(high (period= agg1), length) - Lowest(high (period= agg1), length)) else 0;
def LS1 = if low (period= agg1)< low(period= agg1)[1] then (Highest(low(period= agg1), length) - low(period= agg1)) / (Highest(low(period= agg1), length) - Lowest(low(period= agg1), length)) else 0;
def HHS1 = 100 * MovingAverage(averageTypehhlls, HS1, length);
def LLS1 = 100 * MovingAverage(averageTypehhlls, LS1, length);
def HS2 = if high (period = agg2) > high(period= agg2)[1] then (high (period= agg2) - Lowest(high (period= agg2), length)) / (Highest(high (period= agg2), length) - Lowest(high (period= agg2), length)) else 0;
def LS2 = if low (period= agg2)< low(period= agg2)[1] then (Highest(low(period= agg2), length) - low(period= agg2)) / (Highest(low(period= agg2), length) - Lowest(low(period= agg2), length)) else 0;
def HHS2 = 100 * MovingAverage(averageTypehhlls, HS2, length);
def LLS2 = 100 * MovingAverage(averageTypehhlls, LS2, length);
def HS3 = if high (period = agg3) > high(period= agg3)[1] then (high (period= agg3) - Lowest(high (period= agg3), length)) / (Highest(high (period= agg3), length) - Lowest(high (period= agg3), length)) else 0;
def LS3 = if low (period= agg3)< low(period= agg3)[1] then (Highest(low(period= agg3), length) - low(period= agg3)) / (Highest(low(period= agg3), length) - Lowest(low(period= agg3), length)) else 0;
def HHS3 = 100 * MovingAverage(averageTypehhlls, HS3, length);
def LLS3 = 100 * MovingAverage(averageTypehhlls, LS3, length);
def HS4 = if high (period = agg4) > high(period= agg4)[1] then (high (period= agg4) - Lowest(high (period= agg4), length)) / (Highest(high (period= agg4), length) - Lowest(high (period= agg4), length)) else 0;
def LS4 = if low (period= agg4)< low(period= agg4)[1] then (Highest(low(period= agg4), length) - low(period= agg4)) / (Highest(low(period= agg4), length) - Lowest(low(period= agg4), length)) else 0;
def HHS4 = 100 * MovingAverage(averageTypehhlls, HS4, length);
def LLS4 = 100 * MovingAverage(averageTypehhlls, LS4, length);
def HS5 = if high (period = agg5) > high(period= agg5)[1] then (high (period= agg5) - Lowest(high (period= agg5), length)) / (Highest(high (period= agg5), length) - Lowest(high (period= agg5), length)) else 0;
def LS5 = if low (period= agg5)< low(period= agg5)[1] then (Highest(low(period= agg5), length) - low(period= agg5)) / (Highest(low(period= agg5), length) - Lowest(low(period= agg5), length)) else 0;
def HHS5 = 100 * MovingAverage(averageTypehhlls, HS5, length);
def LLS5 = 100 * MovingAverage(averageTypehhlls, LS5, length);
def HS6 = if high (period = agg6) > high(period= agg6)[1] then (high (period= agg6) - Lowest(high (period= agg6), length)) / (Highest(high (period= agg6), length) - Lowest(high (period= agg6), length)) else 0;
def LS6 = if low (period= agg6)< low(period= agg6)[1] then (Highest(low(period= agg6), length) - low(period= agg6)) / (Highest(low(period= agg6), length) - Lowest(low(period= agg6), length)) else 0;
def HHS6 = 100 * MovingAverage(averageTypehhlls, HS6, length);
def LLS6 = 100 * MovingAverage(averageTypehhlls, LS6, length);
#Method applied to each aggregation
def Agg1per;
def Agg2per;
def Agg3per;
def agg4per;
def agg5per;
def agg6per;
plot Agg1lower;
plot Agg2lower;
plot Agg3lower;
plot agg4lower;
plot agg5lower;
plot agg6lower;
if method == method."Averages" {
Agg1per = ma1_1 > ma2_1;
Agg2per = ma1_2 > ma2_2;
Agg3per = ma1_3 > ma2_3;
agg4per = ma1_4 > ma2_4;
agg5per = ma1_5 > ma2_5;
agg6per = ma1_6 > ma2_6;;
}else if method == method."Close_Close[1]" {
Agg1per = close(period = agg1) > close(period = agg1)[1];
Agg2per = close(period = agg2) > close(period = agg2)[1];
Agg3per = close(period = agg3) > close(period = agg3)[1];
agg4per = close(period = agg4) > close(period = agg4)[1];
agg5per = close(period = agg5) > close(period = agg5)[1];
agg6per = close(period = agg6) > close(period = agg6)[1];
} else if method == method."HAOpen_HAClose" {
Agg1per = HAclose1 > HAopen1;
Agg2per = HAclose2 > HAopen2;
Agg3per = HAclose3 > HAopen3;
agg4per = HAclose4 > HAopen4;
agg5per = HAclose5 > HAopen5;
agg6per = HAclose6 > HAopen3;
} else if method == method."Trend" {
Agg1per = Trend1;
Agg2per = Trend2;
Agg3per = Trend3;
agg4per = Trend4;
agg5per = Trend5;
agg6per = Trend6;
} else if method == method."HHLLS" {
Agg1per = HHS1 > LLS1;
Agg2per = HHS2 > LLS2;
Agg3per = HHS3 > LLS3;
agg4per = HHS4 > LLS4;
agg5per = HHS5 > LLS5;
agg6per = HHS6 > LLS6;
} else {
Agg1per = Value1 > Avg1;
Agg2per = Value2 > Avg2;
Agg3per = Value3 > Avg3;
agg4per = Value4 > Avg4;
agg5per = Value5 > Avg5;
agg6per = Value6 > Avg6;
}
#Labels with selection to turn them on/off
input showlabels = yes;
AddLabel(showlabels,
if agg1 / 60000 <= 240
then (agg1 / 60000 + " Min")
else if agg1 / 60000 == 1440
then "Day"
else if agg1 / 60000 == 10080
then "Week"
else if agg1 / 60000 == 43200
then "Month"
else " ",
if (Agg1per == 1 and method == method."HHLLS") or (Agg1per == 1 and method == method."MACD" and Value1 > 0) or (Agg1per == 1 and method != method."MACD" and method != method."HHLLS")
then Color.GREEN
else if (Agg1per == 1 and method == method."MACD" and Value1 < 0)
then Color.DARK_GREEN
else if (Agg1per == 0 and method == method."MACD" and Value1 < 0)
then Color.DARK_RED
else Color.RED);
AddLabel(showlabels,
if agg2 / 60000 <= 240
then (agg2 / 60000 + " Min")
else if agg2 / 60000 == 1440
then "Day"
else if agg2 / 60000 == 10080
then "Week"
else if agg2 / 60000 == 43200
then "Month"
else " ",
if (Agg2per == 1 and method == method."HHLLS") or (Agg2per == 1 and method == method."MACD" and Value2 > 0) or (Agg2per == 1 and method != method."MACD" and method != method."HHLLS")
then Color.GREEN
else if (Agg2per == 1 and method == method."MACD" and Value2 < 0)
then Color.DARK_GREEN
else if (Agg2per == 0 and method == method."MACD" and Value2 < 0)
then Color.DARK_RED
else Color.RED);
AddLabel(showlabels,
if agg3 / 60000 <= 240
then (agg3 / 60000 + " Min")
else if agg3 / 60000 == 1440
then "Day"
else if agg3 / 60000 == 10080
then "Week"
else if agg3 / 60000 == 43200
then "Month"
else " ",
if (Agg3per == 1 and method == method."HHLLS") or (Agg3per == 1 and method == method."MACD" and Value3 > 0) or (Agg3per == 1 and method != method."MACD" and method != method."HHLLS")
then Color.GREEN
else if (Agg3per == 1 and method == method."MACD" and Value3 < 0)
then Color.DARK_GREEN
else if (Agg3per == 0 and method == method."MACD" and Value3 < 0)
then Color.DARK_RED
else Color.RED);
AddLabel(showlabels,
if agg4 / 60000 <= 240
then (agg4 / 60000 + " Min")
else if agg4 / 60000 == 1440
then "Day"
else if agg4 / 60000 == 10080
then "Week"
else if agg4 / 60000 == 43200
then "Month"
else " ",
if (agg4per == 1 and method == method."HHLLS") or (agg4per == 1 and method == method."MACD" and Value4 > 0) or (agg4per == 1 and method != method."MACD" and method != method."HHLLS")
then Color.GREEN
else if (agg4per == 1 and method == method."MACD" and Value4 < 0)
then Color.DARK_GREEN
else if (agg4per == 0 and method == method."MACD" and Value4 < 0)
then Color.DARK_RED
else Color.RED);
AddLabel(showlabels,
if agg5 / 60000 <= 240
then (agg5 / 60000 + " Min")
else if agg5 / 60000 == 1440
then "Day"
else if agg5 / 60000 == 10080
then "Week"
else if agg5 / 60000 == 43200
then "Month"
else " ",
if (agg5per == 1 and method == method."HHLLS") or (agg5per == 1 and method == method."MACD" and Value5 > 0) or (agg5per == 1 and method != method."MACD" and method != method."HHLLS")
then Color.GREEN
else if (agg5per == 1 and method == method."MACD" and Value5 < 0)
then Color.DARK_GREEN
else if (agg5per == 0 and method == method."MACD" and Value5 < 0)
then Color.DARK_RED
else Color.RED);
AddLabel(showlabels,
if agg6 / 60000 <= 240
then (agg6 / 60000 + " Min")
else if agg6 / 60000 == 1440
then "Day"
else if agg6 / 60000 == 10080
then "Week"
else if agg6 / 60000 == 43200
then "Month"
else " ",
if (agg6per == 1 and method == method."HHLLS") or (agg6per == 1 and method == method."MACD" and Value6 > 0) or (agg6per == 1 and method != method."MACD" and method != method."HHLLS")
then Color.GREEN
else if (agg6per == 1 and method == method."MACD" and Value6 < 0)
then Color.DARK_GREEN
else if (agg6per == 0 and method == method."MACD" and Value6 < 0)
then Color.DARK_RED
else Color.RED);
# Label identifying method and color green/red if all green/red otherwise white
def aggsum = Agg1per + Agg2per + Agg3per + agg4per + agg5per + agg6per;
AddLabel(showlabels,
if method == method."Averages"
then "Averages"
else if method == method."Close_Close[1]"
then "C_C[1]"
else if method == method."HAOpen_HAClose"
then "HAC_HAO"
else if method == method."Trend"
then "Trend"
else if method == method."HHLLS"
then "HHLLS"
else "MACD" ,
if aggsum == 6
then Color.GREEN
else if aggsum == 0
then Color.RED
else Color.WHITE);
plot lineh = if IsNaN(close) or showdotplot == no
then Double.NaN
else if useupper_lower == useupper_lower.upper then 7 else Double.NaN;
plot linel = if IsNaN(close) or showdotplot == no
then Double.NaN
else if useupper_lower == useupper_lower.upper then -7 else Double.NaN;
lineh.SetDefaultColor(Color.DARK_GRAY);
linel.SetDefaultColor(Color.DARK_GRAY);
if IsNaN(close) or showdotplot == no {
Agg1lower = Double.NaN;
Agg2lower = Double.NaN;
Agg3lower = Double.NaN;
agg4lower = Double.NaN;
agg5lower = Double.NaN;
agg6lower = Double.NaN;
} else {
Agg1lower = if !IsNaN(Agg1per) then if useupper_lower == useupper_lower.upper then -8.75 else 6 else Double.NaN;
Agg2lower = if !IsNaN(Agg2per) then if useupper_lower == useupper_lower.upper then -9.00 else 5 else Double.NaN;
Agg3lower = if !IsNaN(Agg3per) then if useupper_lower == useupper_lower.upper then -9.25 else 4 else Double.NaN;
agg4lower = if !IsNaN(agg4per) then if useupper_lower == useupper_lower.upper then -9.50 else 3 else Double.NaN;
agg5lower = if !IsNaN(agg5per) then if useupper_lower == useupper_lower.upper then -9.75 else 2 else Double.NaN;
agg6lower = if !IsNaN(agg6per) then if useupper_lower == useupper_lower.upper then -10.00 else 1 else Double.NaN;
}
Agg1lower.SetPaintingStrategy(PaintingStrategy.POINTS);
Agg1lower.AssignValueColor(if (Agg1per == 1 and method != method."MACD") or (Agg1per == 1 and method == method."MACD" and Value1 > 0)
then Color.GREEN
else if (Agg1per == 1 and method == method."MACD" and Value1 < 0)
then Color.DARK_GREEN
else if (Agg1per == 0 and method == method."MACD" and Value1 < 0)
then Color.DARK_RED
else Color.RED);
Agg2lower.SetPaintingStrategy(PaintingStrategy.POINTS);
Agg2lower.AssignValueColor(if (Agg2per == 1 and method != method."MACD") or (Agg2per == 1 and method == method."MACD" and Value2 > 0)
then Color.GREEN
else if (Agg2per == 1 and method == method."MACD" and Value2 < 0)
then Color.DARK_GREEN
else if (Agg2per == 0 and method == method."MACD" and Value2 < 0)
then Color.DARK_RED
else Color.RED);
Agg3lower.SetPaintingStrategy(PaintingStrategy.POINTS);
Agg3lower.AssignValueColor(if (Agg3per == 1 and method != method."MACD") or (Agg3per == 1 and method == method."MACD" and Value3 > 0)
then Color.GREEN
else if (Agg3per == 1 and method == method."MACD" and Value3 < 0)
then Color.DARK_GREEN
else if (Agg3per == 0 and method == method."MACD" and Value3 < 0)
then Color.DARK_RED
else Color.RED);
agg4lower.SetPaintingStrategy(PaintingStrategy.POINTS);
agg4lower.AssignValueColor(if (agg4per == 1 and method != method."MACD") or (agg4per == 1 and method == method."MACD" and Value4 > 0)
then Color.GREEN
else if (agg4per == 1 and method == method."MACD" and Value4 < 0)
then Color.DARK_GREEN
else if (agg4per == 0 and method == method."MACD" and Value4 < 0)
then Color.DARK_RED
else Color.RED);
agg5lower.SetPaintingStrategy(PaintingStrategy.POINTS);
agg5lower.AssignValueColor(if (agg5per == 1 and method != method."MACD") or (agg5per == 1 and method == method."MACD" and Value5 > 0)
then Color.GREEN
else if (agg5per == 1 and method == method."MACD" and Value5 < 0)
then Color.DARK_GREEN
else if (agg5per == 0 and method == method."MACD" and Value5 < 0)
then Color.DARK_RED
else Color.RED);
agg6lower.SetPaintingStrategy(PaintingStrategy.POINTS);
agg6lower.AssignValueColor(if (agg6per == 1 and method != method."MACD") or (agg6per == 1 and method == method."MACD" and Value6 > 0)
then Color.GREEN
else if (agg6per == 1 and method == method."MACD" and Value6 < 0)
then Color.DARK_GREEN
else if (agg6per == 0 and method == method."MACD" and Value6 < 0)
then Color.DARK_RED
else Color.RED);
plot linediv = if IsNaN(close) or showdotplot == no
then Double.NaN
else if useupper_lower == useupper_lower.upper then -8.5 else 6.25;
plot sumagg = if IsNaN(close) or showdotplot == no
then Double.NaN
else if aggsum == 6 or aggsum == 0 then if useupper_lower == useupper_lower.upper then -8.25 else 6.5 else Double.NaN;
sumagg.SetPaintingStrategy(PaintingStrategy.POINTS);
sumagg.AssignValueColor(if aggsum == 6
then Color.GREEN
else if aggsum == 0
then Color.RED
else Color.WHITE);
#Squeeze Added
input showsqueeze = yes;
def bbupper = reference BollingerBands().UpperBand;
def kcupper = KeltnerChannels().Upper_Band;
def Squeeze = bbupper - kcupper < 0;
plot Squeezeplot = if showsqueeze and Squeeze then linediv else Double.NaN;
Squeezeplot.SetDefaultColor(Color.BLACK);
Squeezeplot.SetPaintingStrategy(PaintingStrategy.POINTS);
Squeezeplot.SetLineWeight(1);
Squeezeplot.HideBubble();
#Count of Periods in consecutive squeeze
rec countsq = if Squeeze then countsq[1] + 1 else 0;
rec count1sq = if !Squeeze then count1sq[1] + 1 else 0;
#Expansion Bubbles
input n = 5;
def n1 = n + 1;
def c = close;
input showsqueezebubble = yes;
AddChartBubble(showsqueezebubble and !IsNaN(c[n1]) and IsNaN(c[n]),
linediv[n1] ,
( if Squeeze[n1] then "S \n" + Round(countsq[n1], 2) else "NS \n" + count1sq[n1]) ,
if aggsum[n1] == 6
then Color.GREEN
else if aggsum[n1] == 0
then Color.RED
else Color.WHITE, up = No);
Alert(Between(aggsum[1], 0, 2) and aggsum == 6 and !Squeeze, "Candles - All Green", Alert.BAR, Sound.Ding);
Alert(Between(aggsum[1], 1, 3) and aggsum == 0 and !Squeeze, "Candles - All Red ", Alert.BAR, Sound.Ding);