#// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
#// © Beardy_Fred
#indicator('Beardy Squeeze Pro', shorttitle='Squeeze', overlay=false, precision=2)
# Converted by Sam4Cok@Samer800 - 05/2023
# Update - MTF option added
declare lower;
input ShowLabel = yes; # "Alert Price Action Squeeze"
input useChartTimeframe = {Default "yes", "No"};
input manualTimeframe = AggregationPeriod.FIFTEEN_MIN;
input MovAvgType = AverageType.SIMPLE;
input length = 20; # "TTM Squeeze Length"
input BB_mult = 2.0; # "Bollinger Band STD Multiplier"
input KC_mult_high = 1.0; # "Keltner Channel #1"
input KC_mult_mid = 1.5; # "Keltner Channel #2"
input KC_mult_low = 2.0; # "Keltner Channel #3"
def na = Double.NaN;
def last = isNaN(close);
def c;
def h;
def l;
def o;
Switch (useChartTimeframe) {
Case "Yes" :
c = close;
h = high;
l = low;
o = open;
Case "No" :
c = close(Period=manualTimeframe);
h = high(Period=manualTimeframe);
l = low(Period=manualTimeframe);
o = open(Period=manualTimeframe);
}
#--- Color
DefineGlobalColor("up1", CreateColor(0,188,212));
DefineGlobalColor("up2", CreateColor(41,98,255));
DefineGlobalColor("dn1", CreateColor(255,82,82));
DefineGlobalColor("dn2", CreateColor(255,235,59));
#------
DefineGlobalColor("sqz1", CreateColor(255,152,0));
DefineGlobalColor("sqz2", CreateColor(255,82,82));
DefineGlobalColor("sqz3", Color.GRAY);#CreateColor(54,58,69));
DefineGlobalColor("sqz4", CreateColor(76,175,80));
#//BOLLINGER BANDS
def BB_basis = MovingAverage(MovAvgType, c, length);
def dev = BB_mult * stdev(c, length);
def BB_upper = BB_basis + dev;
def BB_lower = BB_basis - dev;
#//KELTNER CHANNELS
def tr = TrueRange(h, c, l);
def KC_basis = MovingAverage(MovAvgType, c, length);
def devKC = MovingAverage(MovAvgType, tr, length);
def KC_upper_high = KC_basis + devKC * KC_mult_high;
def KC_lower_high = KC_basis - devKC * KC_mult_high;
def KC_upper_mid = KC_basis + devKC * KC_mult_mid;
def KC_lower_mid = KC_basis - devKC * KC_mult_mid;
def KC_upper_low = KC_basis + devKC * KC_mult_low;
def KC_lower_low = KC_basis - devKC * KC_mult_low;
#//SQUEEZE CONDITIONS
def NoSqz = BB_lower < KC_lower_low or BB_upper > KC_upper_low;# //NO SQUEEZE: GREEN
def LowSqz = BB_lower >= KC_lower_low or BB_upper <= KC_upper_low;# //LOW COMPRESSION: BLACK
def MidSqz = BB_lower >= KC_lower_mid or BB_upper <= KC_upper_mid;# //MID COMPRESSION: RED
def HighSqz = BB_lower >= KC_lower_high or BB_upper <= KC_upper_high;# //HIGH COMPRESSION: ORANGE
#//MOMENTUM OSCILLATOR
def hh = highest(h, length);
def ll = lowest(l, length);
def avg = (hh + ll) /2;
def avgSMA = (avg + KC_basis) / 2;
def mom = Inertia(c - avgSMA, length);
#//MOMENTUM HISTOGRAM COLOR
def iff_1 = if mom > mom[1] then 2 else 1;
def iff_2 = if mom < mom[1] then -2 else -1;
def mom_color = if mom > 0 then iff_1 else iff_2;
#//SQUEEZE DOTS COLOR
def sq_color = if HighSqz then 3 else
if MidSqz then 2 else
if LowSqz then 1 else 0;
#//ALERTS
AddLabel(ShowLabel, if sq_color==0 then "NO SQUEEZE" else
if sq_color==1 then "LOW COMPRESSION" else
if sq_color==2 then "MID COMPRESSION" else "HIGH COMPRESSION",
if sq_color==3 then GlobalColor("sqz1") else
if sq_color==2 then GlobalColor("sqz2") else
if sq_color==1 then GlobalColor("sqz3") else GlobalColor("sqz4"));
#//PLOTS
plot SQZ = if last then na else 0; # 'SQZ'
plot momentum = mom; # 'MOM'
momentum.SetLineWeight(4);
momentum.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
momentum.AssignValueColor(if mom_color== 2 then GlobalColor("up1") else
if mom_color== 1 then GlobalColor("up2") else
if mom_color==-2 then GlobalColor("dn1") else
if mom_color==-1 then GlobalColor("dn2") else Color.GRAY);
SQZ.SetLineWeight(2);
SQZ.SetPaintingStrategy(PaintingStrategy.LINE_VS_POINTS);
SQZ.AssignValueColor(if sq_color==3 then GlobalColor("sqz1") else
if sq_color==2 then GlobalColor("sqz2") else
if sq_color==1 then GlobalColor("sqz3") else GlobalColor("sqz4"));
#--- END OF CODE