DBMA - Dual Bollinger Moving Average for ThinkOrSwim

samer800

Moderator - Expert
VIP
Lifetime
BC71O7Y.png

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:

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

BC71O7Y.png

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:

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
input MA_source = 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;

#-- Color
DefineGlobalColor("red", Color.DARK_RED);
DefineGlobalColor("green", CreateColor(0,60,0));#Color.DARK_GREEN);
DefineGlobalColor("yellow", CreateColor(177, 159, 0));#CreateColor(236,212,0));
DefineGlobalColor("orange", CreateColor(118,76, 0));#CreateColor(196,117,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, MA_source, 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(high, close, low);
def tr = if UseTrueRange then tr_ else (high - low);
def devBB  = stdev(MA_source, 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.AssignValueColor(if bb_colorOne==2 then GlobalColor("dgreen") 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);


#----Lebel

AddLabel(sq_color==1,  "Low-Squeeze",   Color.YELLOW);
AddLabel(sq_color==-1, "MID-Squeeze",   Color.ORANGE);
AddLabel(sq_color==-2, "HIGH-Squeeze",  Color.RED);
AddLabel(sq_color==2,  "Fired-Squeeze", Color.GREEN);
AddLabel(!sq_color,    "No-Squeeze",    Color.GRAY);

#-- END of CODE

Hi,
Would you be able update the pricecolor/candle color reflecting same color as TTM pro indicator?

Thank u
 
Hi,
Would you be able update the pricecolor/candle color reflecting same color as TTM pro indicator?

Thank u
add this at the end of the code:

CSS:
input colorBars = yes;
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);
 
Thank you for the conversion. I did a copy & paste but only get the upper part of the shading. Any idea why is that?

1697501084903.png
 

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
346 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top