Author Message:
The Dual Bollinger moving average (DBMA) consists of a moving average (MA) & two Bollinger Bands (BB), with the color of the bands representing the level of price compression. In its default settings, it is a 20-day simple moving average with 2 upper Bollinger Bands, having the standard deviation (SD) settings of 0.5 & 1, respectively.
More Details: https://www.tradingview.com/v/5Q0rRNo6/
CODE: - Added MTF option
CSS:
# https://www.tradingview.com/v/5Q0rRNo6/
#// This source code is subject to the terms of the Mozilla Public License
#// © finallynitin
#indicator(title='Dual Bollinger Moving Average', shorttitle='DBMA', overlay=true)
# converted by Sam4Cok@Samer800 - 10/2023
# updated by Sam4Cok@Samer800 - Added bar Color - 10/2023
# Update by Sam4Cok@Samer800 - Added MTF Option - 12/2023
input colorBars = yes;
input showAlertLabel = yes;
input timeframe = {Default "Chart", "Custom"};
input customTimeframe = AggregationPeriod.FIFTEEN_MIN;
input MA_source = FundamentalType.CLOSE;
input MA_length = 20;
input MA_type = AverageType.SIMPLE;
input UseTrueRange = yes;
input BB_show_upper = yes; # 'Show Upper Bands'
input BB_show_lower = no; # 'Show Lower Bands'
input BB_stdev_near = 0.5; # 'Near Band'
input BB_stdev_far = 1.0; # 'Far Band'
input toggleSQZColors = yes; # 'Squeeze Colors'
def na = Double.NaN;
def tfS = Fundamental(FundamentalType = MA_source);
def tfH = high;
def tfL = low;
def tfC = close;
def mtfS = Fundamental(FundamentalType = MA_source, Period = customTimeframe);
def mtfH = high(Period = customTimeframe);
def mtfL = low(Period = customTimeframe);
def mtfC = close(Period = customTimeframe);
def src; def h; def l; def c;
Switch (timeframe) {
Case "Custom" :
src = mtfS;
h = mtfH;
l = mtfL;
c = mtfC;
Default :
src = tfS;
h = tfH;
l = tfL;
c = tfC;
}
#-- Color
DefineGlobalColor("red", Color.DARK_RED);
DefineGlobalColor("green", CreateColor(0,60,0));
DefineGlobalColor("yellow", CreateColor(177, 159, 0));
DefineGlobalColor("orange", CreateColor(118,76, 0));
DefineGlobalColor("blue" , CreateColor(33,150,243));
DefineGlobalColor("dRed", Color.RED);
DefineGlobalColor("dGreen", Color.GREEN);
DefineGlobalColor("dYellow", Color.YELLOW);
DefineGlobalColor("dOrange", Color.DARK_ORANGE);
DefineGlobalColor("dBlue" , Color.BLUE);
#//--------BMA------
def BMA = MovingAverage(MA_type, src, MA_length);
#//--------SQUEEZE------
#// original concept from John Carter's book "Mastering the Trade"
#// based on LazyBear's script (Squeeze Momentum Indicator) https://in.tradingview.com/script/nqQ1DT5a-Squeeze-Momentum-Indicator-LazyBear/
def tr_ = TrueRange(h, c, l);
def tr = if UseTrueRange then tr_ else (h - l);
def devBB = stdev(src, MA_length);
def devKC = Average(tr, MA_length);
#//Bollinger Near
def upperhalf = BMA + devBB * BB_stdev_near;
def lowerhalf = BMA - devBB * BB_stdev_near;
#//Bollinger 1x
def upperBB = BMA + devBB * BB_stdev_far;
def lowerBB = BMA - devBB * BB_stdev_far;
#//Bollinger 2x
def upBB = BMA + devBB * BB_stdev_far * 2;
def loBB = BMA - devBB * BB_stdev_far * 2;
#//Keltner 1x High
def upKCHi = BMA + devKC;
def loKCHi = BMA - devKC;
#//Keltner 1.5x Mid
def upKCMid = BMA + devKC * 1.5;
def loKCMid = BMA - devKC * 1.5;
#//Keltner 2x Low
def upKCLow = BMA + devKC * 2;
def loKCLow = BMA - devKC * 2;
def sqzOnLow = (loBB >= loKCLow) and (upBB <= upKCLow); # //Low-compression Squeeze: YELLOW
def sqzOnMid = (loBB >= loKCMid) and (upBB <= upKCMid); # //Mid-compression Squeeze: ORANGE
def sqzOnHi = (loBB >= loKCHi) and (upBB <= upKCHi); # //High-compression Squeeze: RED
def sqzFired = (loBB < loKCLow) and (upBB > upKCLow); # //Fired Squeeze: GREEN
def noSqz = !sqzOnLow and !sqzFired; # //No Squeeze: BLUE
def sq_color = if noSqz then 0 else
if sqzOnHi then -2 else
if sqzOnMid then -1 else
if sqzOnLow then 1 else
if sqzFired then 2 else sq_color[1];
def bb_colorOne = if toggleSQZColors then sq_color else 3;
#//--------BOLLINGER BANDS------
plot bbMovAvg = BMA; # 'Bollingerised Moving Average'
bbMovAvg.SetLineWeight(2);
bbMovAvg.AssignValueColor(if bb_colorOne==2 then Color.GRAY else
if bb_colorOne== 1 then GlobalColor("dyellow") else
if bb_colorOne== 0 then GlobalColor("dblue") else
if bb_colorOne==-1 then GlobalColor("dorange") else
if bb_colorOne==-2 then GlobalColor("dred") else Color.DARK_ORANGE);
def farUp = if BB_show_upper then upperBB else na;#, 'Upper Far Band'
def farLo = if BB_show_lower then lowerBB else na;#, 'Lower Far Band'
def nearUp = if BB_show_upper then upperhalf else na;#, 'Upper Near Band'
def nearLo = if BB_show_lower then lowerhalf else na;#, 'Lower Near Band'
#--- Clouds
AddCloud(if bb_colorOne==2 or bb_colorOne[-1]==2 then farUp else na, bbMovAvg, GlobalColor("green"));
AddCloud(if bb_colorOne==2 or bb_colorOne[-1]==2 then bbMovAvg else na, farLo, GlobalColor("green"));
AddCloud(if bb_colorOne==1 or bb_colorOne[-1]==1 then farUp else na, bbMovAvg, GlobalColor("yellow"));
AddCloud(if bb_colorOne==1 or bb_colorOne[-1]==1 then bbMovAvg else na, farLo, GlobalColor("yellow"));
AddCloud(if bb_colorOne==0 or bb_colorOne[-1]==0 then farUp else na, bbMovAvg, GlobalColor("blue"));
AddCloud(if bb_colorOne==0 or bb_colorOne[-1]==0 then bbMovAvg else na, farLo, GlobalColor("blue"));
AddCloud(if bb_colorOne==-1 or bb_colorOne[-1]==-1 then farUp else na, bbMovAvg, GlobalColor("orange"));
AddCloud(if bb_colorOne==-1 or bb_colorOne[-1]==-1 then bbMovAvg else na, farLo, GlobalColor("orange"));
AddCloud(if bb_colorOne==-2 or bb_colorOne[-1]==-2 then farUp else na, bbMovAvg, GlobalColor("red"));
AddCloud(if bb_colorOne==-2 or bb_colorOne[-1]==-2 then bbMovAvg else na, farLo, GlobalColor("red"));
AddCloud(if bb_colorOne==3 then farUp else na, bbMovAvg, Color.DARK_GRAY);
AddCloud(if bb_colorOne==3 then bbMovAvg else na, farLo, Color.DARK_GRAY);
#----
AddCloud(if bb_colorOne==2 or bb_colorOne[-1]==2 then nearUp else na, bbMovAvg, GlobalColor("green"));
AddCloud(if bb_colorOne==2 or bb_colorOne[-1]==2 then bbMovAvg else na, nearLo, GlobalColor("green"));
AddCloud(if bb_colorOne==1 or bb_colorOne[-1]==1 then nearUp else na, bbMovAvg, GlobalColor("yellow"));
AddCloud(if bb_colorOne==1 or bb_colorOne[-1]==1 then bbMovAvg else na, nearLo, GlobalColor("yellow"));
AddCloud(if bb_colorOne==0 or bb_colorOne[-1]==0 then nearUp else na, bbMovAvg, GlobalColor("blue"));
AddCloud(if bb_colorOne==0 or bb_colorOne[-1]==0 then bbMovAvg else na, nearLo, GlobalColor("blue"));
AddCloud(if bb_colorOne==-1 or bb_colorOne[-1]==-1 then nearUp else na, bbMovAvg, GlobalColor("orange"));
AddCloud(if bb_colorOne==-1 or bb_colorOne[-1]==-1 then bbMovAvg else na, nearLo, GlobalColor("orange"));
AddCloud(if bb_colorOne==-2 or bb_colorOne[-1]==-2 then nearUp else na, bbMovAvg, GlobalColor("red"));
AddCloud(if bb_colorOne==-2 or bb_colorOne[-1]==-2 then bbMovAvg else na, nearLo, GlobalColor("red"));
AddCloud(if bb_colorOne==3 then nearUp else na, bbMovAvg, Color.DARK_GRAY);
AddCloud(if bb_colorOne==3 then bbMovAvg else na, nearLo, Color.DARK_GRAY);
#-- Bar Color
AssignPriceColor(if !colorBars then Color.CURRENT else
if sq_color==2 then Color.GRAY else
if sq_color== 1 then GlobalColor("dyellow") else
if sq_color== 0 then GlobalColor("dblue") else
if sq_color==-1 then GlobalColor("dorange") else
if sq_color==-2 then GlobalColor("dred") else Color.DARK_ORANGE);
#----Lebel
AddLabel(showAlertLabel and sq_color==1, "Low-Squeeze", Color.YELLOW);
AddLabel(showAlertLabel and sq_color==-1, "Mid-Squeeze", Color.ORANGE);
AddLabel(showAlertLabel and sq_color==-2, "High-Squeeze", Color.RED);
AddLabel(showAlertLabel and sq_color==2, "Fired-Squeeze", Color.GREEN);
AddLabel(showAlertLabel and !sq_color, "No-Squeeze", Color.GRAY);
#-- END of CODE
Last edited: