Indicator TutorialPine Script v5

Master Volatility Analysis: Build Bollinger Bands in TradingView

From SMA and standard deviation math to a full Pine Script v5 implementation and Pineify workflow.

Bollinger Bands adapt to volatility—expanding in fast markets and contracting in quiet ones. This tutorial shows how to code them, interpret squeezes and walks, and ship faster with a visual editor.

What are Bollinger Bands?

Bollinger Bands, developed by John Bollinger, provide a relative definition of high and low prices using a middle band (typically SMA) and outer bands placed at a multiple of standard deviation away from that average.

Because standard deviation rises and falls with dispersion, the bands widen with volatility and narrow when price compresses—helping traders visualize mean reversion and breakout setups.

Why Traders Use This Indicator

  • Measure volatility: tight bands flag potential expansion; wide bands flag energetic trends.
  • Mean reversion framing: touches of outer bands highlight stretched prices relative to recent data.
  • Trend confirmation: in strong uptrends price often rides between the middle and upper band.
  • Breakout scouting: decisive closes outside bands after a squeeze can signal continuation.
ParameterDefaultDescription
Length20Lookback for the moving average and standard deviation calculations.
SourceClosePrice series used for the average and dispersion math.
StdDev multiplier2.0How many standard deviations to offset the upper and lower bands.
Offset0Visual shift of plots forward or backward on the time axis.

How Bollinger Bands Work: The Formula

The construction is three lines derived from the same window of data:

  • Middle band = SMA(source, length).
  • Upper band = middle + multiplier × standard deviation(source, length).
  • Lower band = middle − multiplier × standard deviation(source, length).

In Pine Script v5, ta.sma and ta.stdev implement the classic form efficiently on each bar.

Signal Interpretation

  • Squeeze: band width near relative lows hints at compression before expansion—direction needs confirmation.
  • W-bottoms and M-tops: Bollinger described patterns that combine price structure with second tests of bands.
  • Walking the bands: repeated upper-band tags in an uptrend often indicate persistence, not an instant reversal.

Combining with Other Indicators

Blend bands with momentum and participation:

  • RSI to qualify overbought/oversold when price tags a band.
  • Volume to validate breakout thrust after squeezes.
  • MACD to see whether momentum aligns as price revisits the middle line.

The Hard Way: Writing Pine Script Manually

Challenges of Manual Coding

Pine version drift breaks older examples—prefix built-ins correctly and match your header version.

Inputs, groups, and plot offsets are easy to miswire, yielding subtle visual bugs.

Alert logic on band crosses requires careful crossover definitions versus simple comparisons.

Extending to EMA cores or dynamic multipliers multiplies test cases quickly.

Pine Script v5
//@version=5
indicator(title="Custom Bollinger Bands Pro", shorttitle="BB Pro", overlay=true, timeframe_gaps=true)

length = input.int(20, minval=1, title="Length", group="Core")
src = input.source(close, title="Source", group="Core")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev Multiplier", group="Core")
offset = input.int(0, "Plot Offset", minval=-500, maxval=500, group="Visuals")
showFill = input.bool(true, "Fill Between Bands", group="Visuals")
showBW = input.bool(true, "Show Bandwidth Panel", group="Extras")

basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev

// Bandwidth: normalized width for squeeze detection
bandwidth = basis != 0 ? (upper - lower) / basis : na
squeeze = ta.lowest(bandwidth, 100) == bandwidth

plot_basis = plot(basis, "Basis", color=color.new(#2962FF, 0), offset=offset)
plot_upper = plot(upper, "Upper", color=color.new(#F23645, 0), offset=offset)
plot_lower = plot(lower, "Lower", color=color.new(#089981, 0), offset=offset)

fillColor = color.new(#2196F3, 88)
if showFill
    fill(plot_upper, plot_lower, color=fillColor, title="Band Fill")

plotchar(squeeze ? low : na, "Squeeze", "●", location=location.belowbar, color=color.new(color.orange, 0), size=size.tiny)

alertcondition(ta.crossover(src, upper), title="Close Cross Above Upper", message="Price crossed above upper Bollinger Band on {{ticker}}")
alertcondition(ta.crossunder(src, lower), title="Close Cross Below Lower", message="Price crossed below lower Bollinger Band on {{ticker}}")
alertcondition(ta.crossover(bandwidth, ta.highest(bandwidth, 20)), title="Bandwidth Expansion", message="Bollinger bandwidth expanding on {{ticker}}")

// Secondary pane-style metric via plot in same overlay (optional user toggle)
plot(showBW ? bandwidth : na, "Bandwidth", color=color.new(color.purple, 0), display=display.pane)

// Reference midline for mean reversion context
hline(0, display=display.none)

Maintenance Note: Switching the middle line to EMA, adding MTF bands, or layering Keltner squeezes all touch the same calculation core—plan migrations as structured refactors, not ad-hoc edits.

The Easy Way: Build with Pineify Visual Editor

What if you could create the same indicator without writing a single line of code? Pineify is a visual editor designed for TradingView users who want professional-grade indicators through an intuitive interface.

FeatureManual Pine ScriptPineify Visual Editor
Learning curveHigh without programming backgroundLow visual interface
Time to build30–60 minutes typicalUnder 5 minutes for standard bands
Error rateHigher syntax and logic riskLower with generated code
CustomizationRequires code editsSliders and toggles
AI assistanceExternal debuggingIntegrated generation help

Stand up BB + RSI + MACD stacks without merging scripts by hand.

Iterate colors, fills, and alerts visually.

Export Pine Script that matches your latest editor version.

Step-by-Step Tutorial

1

Open Pineify

Start a new project at pineify.app.

2

Add Bollinger Bands

Insert the Bollinger module from the indicator library.

3

Tune length and multiplier

Set 20 and 2.0 as a baseline; adjust per timeframe.

4

Style the visuals

Pick band colors and optional channel fill.

5

Add alerts

Wire crosses of price with upper or lower bands if needed.

6

Export Pine Script

Generate and copy the finished script.

7

Install on TradingView

Paste into the Pine Editor, save, and add to chart.

Trading Strategies & Pro Tips

Bollinger squeeze breakout

Wait for band width to compress, then trade the first sustained close outside a band with confirming volume.

Pro Tip: A squeeze signals potential energy, not direction—use structure or momentum for bias.

Mean reversion (“rubber band”)

In ranges, fade extremes back toward the middle band when candlestick confirmation appears at an outer band.

Walking the bands (trend follow)

In strong trends, repeated upper-band contact can mean persistence; buy dips to the middle band instead of shorting every touch.

Double confirmation with RSI

Require RSI divergence or failure swings when price tags a band to avoid fading a healthy impulse.

Common Mistakes to Avoid

  • Over-optimizing length and multiplier to curve-fit history.
  • Treating any outer-band touch as reversal without regime context.
  • Ignoring that lower timeframes generate more noise than daily or 4H charts.

Frequently Asked Questions

Build Bollinger Bands without writing a single line of code

  • Go from idea to chart in minutes.
  • Export clean Pine Script with zero syntax hunting.
  • Layer volatility logic with other indicators visually.

Disclaimer: Trading involves significant risk. The indicators, code, and strategies provided are for educational purposes only and do not constitute financial advice. Past performance is not indicative of future results.