OK this is kind of detailed fo my Tastes but do to the popularity of the TTM Squeeze Thought some might find it handy. NOTE you'll have to turn on "USE SYSTEM FONTS"
in the LOOK and FEEL Options
SO -
BackGround colors indicate Squeeze conditon , GREEN or Gray = Not in a SQUEEZE and RED = Squeezed
The Text gets a little more detailed, they indicate the HISTOGRAM Conditons. Cyan Blue Red Yellow followed by a arrow indicating the DIRECTION of the HISTOGRAM.
in the LOOK and FEEL Options
SO -
BackGround colors indicate Squeeze conditon , GREEN or Gray = Not in a SQUEEZE and RED = Squeezed
The Text gets a little more detailed, they indicate the HISTOGRAM Conditons. Cyan Blue Red Yellow followed by a arrow indicating the DIRECTION of the HISTOGRAM.
Code:
# Custom Watchlist Column: Squeeze + Momentum Histogram Trend
input price = close;
input length = 20;
input Num_Dev_Dn = -2.0;
input Num_Dev_up = 2.0;
input averageType = AverageType.SIMPLE;
input displace = 0;
def sDev = StDev(data = price[-displace], length = length);
def MidLineBB = MovingAverage(averageType, data = price[-displace], length = length);
def LowerBandBB = MidLineBB + Num_Dev_Dn * sDev;
def UpperBandBB = MidLineBB + Num_Dev_up * sDev;
input factorhigh = 1.0;
input factormid = 1.5;
input factorlow = 2.0;
input trueRangeAverageType = AverageType.SIMPLE;
def shifthigh = factorhigh * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftMid = factormid * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftlow = factorlow * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def average = MovingAverage(averageType, price, length);
def Avg = average[-displace];
def UpperBandKCLow = Avg + shiftlow[-displace];
def LowerBandKCLow = Avg - shiftlow[-displace];
def UpperBandKCMid = Avg + shiftMid[-displace];
def LowerBandKCMid = Avg - shiftMid[-displace];
def UpperBandKCHigh = Avg + shifthigh[-displace];
def LowerBandKCHigh = Avg - shifthigh[-displace];
def K = (Highest(high, length) + Lowest(low, length)) / 2 + ExpAverage(close, length);
def momo = Inertia(price - K / 2, length);
# Squeeze definitions
def presqueeze = LowerBandBB > LowerBandKCLow and UpperBandBB < UpperBandKCLow;
def originalSqueeze = LowerBandBB > LowerBandKCMid and UpperBandBB < UpperBandKCMid;
def ExtrSqueeze = LowerBandBB > LowerBandKCHigh and UpperBandBB < UpperBandKCHigh;
# Momentum states
def pos = momo >= 0;
def neg = momo < 0;
def up = momo >= momo[1];
def dn = momo < momo[1];
def PosUp = pos and up; #Cyan
def PosDn = pos and dn; # Blue
def NegDn = neg and dn; # Red
def NegUp = neg and up; # Yellow
def cyanup = PosUp and up[1];
def cyandn = PosUp and dn[1];
def blueup = posdn and up[1];
def bluedn = posdn and dn[1];
def redup = negdn and up[1];
def reddn = negdn and dn[1];
def yllwup = negup and up[1];
def yllwdn = negup and dn[1];
# Numeric output for watchlist sorting + display
def trendValue =
if cyanup then 4.0
else if cyandn then 3.0
else if blueup then 2.0
else if bluedn then 1.0 # Bullish but weakening
else if redup then -4.0
else if reddn then -3.0
else if yllwup then -2.0 # Bearish but improving (less negative)
else if yllwdn then -1.0 # Strong bearish (decreasing momentum)
else 0.0; # Neutral / flat
# Optional: tighter visual scale if you prefer
# def trendValue =
# if PosUp then 2 else if PosDn then 1 else if NegUp then -1 else if NegDn then -2 else 0;
# Background coloring stays exactly the same
AssignBackgroundColor(
if ExtrSqueeze then Color.DARK_RED
else if originalSqueeze then Color.RED
else if presqueeze then CreateColor(128, 128, 128)
else Color.LIGHT_GREEN
);
AddLabel(yes,
if trendValue == 4.0 then "C ▰🢅"
else if trendValue == 3.0 then "C ▰🢆"
else if trendValue == 2.0 then "B ▰🢅"
else if trendValue == 1.0 then "B ▰🢆"
else if trendValue == -4.0 then "R ▰🢅"
else if trendValue == -3.0 then "R ▰🢆"
else if trendValue == -2.0 then "Y ▰🢅"
else if trendValue == -1.0 then "Y ▰🢆"
else "0.0",
if trendValue == 4.0 then CreateColor(0, 204, 204) # cyan
else if trendValue == 3.0 then CreateColor(0, 204, 204) # cyan
else if trendValue == 2.0 then Color.BLUE
else if trendValue == 1.0 then Color.BLUE
else if trendValue == -4.0 then CreateColor(204, 0, 0) # dark red
else if trendValue == -3.0 then CreateColor(204, 0, 0) # dark red
else if trendValue == -2.0 then Color.DARK_ORANGE # or Color.YELLOW
else if trendValue == -1.0 then Color.DARK_ORANGE
else Color.GRAY
);