Indicator · Pine Script v6 · Own pane

Bollinger Band Width Percentile - Multi Time Frame

by mushroom-men-Trading· code credited to EltAlt

This indicator calculates the Bollinger Band Width Percentile (BBWP) across multiple selectable timeframes to assess relative volatility levels.

View on GitHub

GitHub stars2on the repository
Pine versionv6current
Lines of code313
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update9 months ago25 Jan 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

313 lines of Pine Script v6 from Indicators/indicators/DNA Made/Bollinger Band Width Percentile - Multi Time Frame.pine, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

Bollinger Band Width Percentile - Multi Time Frame.pine
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © EltAlt
//@version=6

// -----------------------------------------------------------------------------
//
// Title:    Bollinger Band Width Percentile - Multi Time Frame
// Authors:  @EltAlt
// Revision: v1.02
// Date:     06-June-2022
//
// Description
// =============================================================================
// My plan with this indicator was when trading at short timeframes, to modify my expectations on the potential impact of short term volatility based on volatility in 
// longer timeframes, and when trading on longer timeframes to attempt to find an optimal entry point based on shorter term volatility.
//
// =============================================================================
//
// I would gladly accept any suggestions to improve the script.
// If you encounter any problems please share them with me.
//
// Thanks to The_Caretaker for "Bollinger Band Width Percentile" upon which this multi time frame version is based.
//
// Changlog
// =============================================================================
//
// 1.00 • First public release
// 1.01 • Added bar color options
//      • Cleaned up the inputs
// 1.02 • Added Auto timeframe setting.
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//
indicator('Bollinger Band Width Percentile - Multi Time Frame', 'BBWP MTF', overlay = false, format = format.percent, precision = 2, max_bars_back = 1000)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// ============ Inputs

chartTicker = syminfo.tickerid
charttf = timeframe.period

source = input.source(defval = close, title = 'Price Source', inline = '1', group = 'General Properties')
basistype = input.string(defval = 'SMA', title = '  BBPW Basis Type', options = ['SMA', 'EMA', 'VWMA'], inline = '1', group = 'General Properties')
stfalerttrans = input.int(defval = 50, minval = 1, maxval = 100, title = 'Alert Transparency: Single TF', inline = '2', group = 'General Properties')
alerttrans = input.int(defval = 50, minval = 1, maxval = 100, title = 'All TF', inline = '2', group = 'General Properties')
barcolors = input.string(defval = 'Standard', title = 'Price Chart Bar Colors', options = ['Standard', 'From Short TF BBWP', 'From Medium TF BBWP', 'From Long TF BBWP'], inline = '3', group = 'General Properties')

// Short Time Frame BBWP 
bbwpse = input.bool(defval = true, title = 'Enable', inline = '1', group = 'Short Time Frame BBWP')
bbwpstf = input.string(defval = 'Chart', title = '        Timeframe', inline = '1', group = 'Short Time Frame BBWP', options = ['Chart', '1', '3', '5', '10', '15', '30', '45', '60', '120', '180', '240', '720', 'D', '3D', '5D', 'W'])
bbwpsle = input.int(defval = 13, title = 'Length', minval = 1, inline = '2', group = 'Short Time Frame BBWP')
bbwpslk = input.int(defval = 252, title = '   Lookback', minval = 1, inline = '2', group = 'Short Time Frame BBWP')
bbwpsmal = input.int(defval = 5, title = 'MA', inline = '3', group = 'Short Time Frame BBWP')
bbwpsmat = input.string(defval = 'SMA', title = '     MA Type', options = ['SMA', 'EMA', 'HMA', 'VWMA'], inline = '3', group = 'Short Time Frame BBWP')

bbwpspt = input.string(defval = 'Solid Line', title = 'Plot Type', options = ['Solid Line', 'Background', 'Hidden', 'Average S M', 'Average S L', 'Average M L', 'Average S M L'], inline = '4', group = 'Short Time Frame BBWP')
bbwpspw = input.int(defval = 2, title = '   Width', minval = 1, maxval = 14, inline = '4', group = 'Short Time Frame BBWP')
bbwpspc = input.string(defval = 'Color from Medium', title = 'Plot Color', options = ['RGB Spectrum', 'RB Spectrum', 'RG Spectrum', 'Solid Color', 'Color from Medium', 'Color from Long'], inline = '5', group = 'Short Time Frame BBWP')
bbwpsppc = input.color(defval = #FFFF00, title = '   Solid Color', inline = '5', group = 'Short Time Frame BBWP')
bbwpsmapt = input.string(defval = 'Solid Line', title = 'MA Plot', options = ['Solid Line', 'Hidden'], inline = '6', group = 'Short Time Frame BBWP')
bbwpsmapw = input.int(defval = 1, title = 'MA Width', inline = '6', group = 'Short Time Frame BBWP')
bbwpsmappc = input.color(defval = #FFFFFFFF, title = 'MA Color', inline = '6', group = 'Short Time Frame BBWP')

shortalertstip = 'Short timeframe alerts will appear in the bottom third of the chart. If enforced by all other enabled alerts a full length alert will plot.'
shortalerts = input.bool(defval = true, title = 'Short TF Alerts', inline = 'a1', group = 'Short Time Frame BBWP', tooltip = shortalertstip)
shtalertsma = input.bool(defval = true, title = 'MA Filter', inline = 'a1', group = 'Short Time Frame BBWP')
shtalertsri = input.bool(defval = false, title = 'and', inline = 'a1', group = 'Short Time Frame BBWP')
shtalertsripc = input.float(defval = 1, maxval = 100, minval = 0, title = 'Moving %', inline = 'a1', group = 'Short Time Frame BBWP', step = 0.1)
shortupperlevel = input.int(98, 'Short Term Extreme High', minval = 1, inline = 'a3', group = 'Short Time Frame BBWP')
shortlowerlevel = input.int(2, 'Low', minval = 1, inline = 'a3', group = 'Short Time Frame BBWP')

// Medium Time Frame BBWP
bbwpme = input.bool(defval = true, title = 'Enable', inline = '1', group = 'Medium Time Frame BBWP')
bbwpmtf = input.string(defval = 'Auto', title = '        Timeframe', inline = '1', group = 'Medium Time Frame BBWP', options = ['Auto', '5', '10', '15', '30', '45', '60', '120', '180', '240', '720', 'D', '3D', '5D', 'W', '2W'])
bbwpmle = input.int(defval = 13, title = 'Length', minval = 1, inline = '2', group = 'Medium Time Frame BBWP')
bbwpmlk = input.int(defval = 252, title = '   Lookback', minval = 1, inline = '2', group = 'Medium Time Frame BBWP')
bbwpmmal = input.int(defval = 5, title = 'MA', inline = '3', group = 'Medium Time Frame BBWP')
bbwpmmat = input.string(defval = 'SMA', title = '     MA Type', options = ['SMA', 'EMA', 'VWMA'], inline = '3', group = 'Medium Time Frame BBWP')

bbwpmpt = input.string(defval = 'Hidden', title = 'Plot Type', options = ['Solid Line', 'Hidden', 'Average S M', 'Average S L', 'Average M L', 'Average S M L'], inline = '4', group = 'Medium Time Frame BBWP')
bbwpmpw = input.int(defval = 2, title = '   Width', minval = 1, maxval = 4, inline = '4', group = 'Medium Time Frame BBWP')
bbwpmpc = input.string(defval = 'RG Spectrum', title = 'Plot Color', options = ['RGB Spectrum', 'RB Spectrum', 'RG Spectrum', 'Solid Color', 'Color from Long'], inline = '5', group = 'Medium Time Frame BBWP')
bbwpmppc = input.color(defval = #FFFF00, title = '   Solid Color', inline = '5', group = 'Medium Time Frame BBWP')
bbwpmmapt = input.string(defval = 'Hidden', title = 'MA Plot', options = ['Solid Line', 'Hidden'], inline = '6', group = 'Medium Time Frame BBWP')
bbwpmmappc = input.color(defval = #FFFFFFCF, title = 'MA Color', inline = '6', group = 'Medium Time Frame BBWP')
bbwpmmapw = input.int(defval = 1, title = 'MA Width', inline = '6', group = 'Medium Time Frame BBWP')

mediumalertstip = 'Medium timeframe alerts will appear in the middle third of the chart. If enforced by all other enabled alerts a full length alert will plot.'
mediumalerts = input.bool(defval = true, title = 'Medium TF Alerts', inline = 'm', group = 'Medium Time Frame BBWP', tooltip = mediumalertstip)
medalertsma = input.bool(defval = true, title = 'MA Filter', inline = 'm', group = 'Medium Time Frame BBWP')
medalertsri = input.bool(defval = false, title = 'and', inline = 'm', group = 'Medium Time Frame BBWP')
medalertsripc = input.float(defval = 1, maxval = 100, minval = 0, title = 'Moving %', inline = 'm', group = 'Medium Time Frame BBWP', step = 0.1)
mediumupperlevel = input.int(98, 'Medium Term Extreme High', minval = 1, inline = 'm2', group = 'Medium Time Frame BBWP')
mediumlowerlevel = input.int(2, 'Low', minval = 1, inline = 'm2', group = 'Medium Time Frame BBWP')

// Long Time Frame BBWP
bbwple = input.bool(defval = true, title = 'Enable', inline = '1', group = 'Long Time Frame BBWP')
bbwpltf = input.string(defval = 'Auto', title = '        Timeframe', inline = '1', group = 'Long Time Frame BBWP', options = ['Auto', '5', '10', '15', '30', '45', '60', '120', '180', '240', '720', 'D', '3D', '5D', 'W', '2W', 'M'])
bbwplle = input.int(defval = 13, title = 'Length', minval = 1, inline = '2', group = 'Long Time Frame BBWP')
bbwpllk = input.int(defval = 252, title = '   Lookback', minval = 1, inline = '2', group = 'Long Time Frame BBWP')
bbwplmal = input.int(defval = 5, title = 'MA', inline = '3', group = 'Long Time Frame BBWP')
bbwplmat = input.string(defval = 'SMA', title = '     MA Type', options = ['SMA', 'EMA', 'VWMA'], inline = '3', group = 'Long Time Frame BBWP')

bbwplpt = input.string(defval = 'Background', title = 'Plot Type', options = ['Solid Line', 'Background', 'Hidden', 'Average S M', 'Average S L', 'Average M L', 'Average S M L'], inline = '4', group = 'Long Time Frame BBWP')
bbwplpw = input.int(defval = 2, title = '   Width', minval = 1, maxval = 4, inline = '4', group = 'Long Time Frame BBWP')
bbwplpc = input.string(defval = 'RG Spectrum', title = 'Plot Color', options = ['RGB Spectrum', 'RB Spectrum', 'RG Spectrum', 'Solid Color'], inline = '5', group = 'Long Time Frame BBWP')
bbwplppc = input.color(defval = #FFFF00, title = '   Solid Color', inline = '5', group = 'Long Time Frame BBWP')
bbwplmapt = input.string(defval = 'Hidden', title = 'MA Plot', options = ['Solid Line', 'Hidden'], inline = '6', group = 'Long Time Frame BBWP')
bbwplmappc = input.color(defval = #FFFFFF99, title = 'MA Color', inline = '6', group = 'Long Time Frame BBWP')
bbwplmapw = input.int(defval = 1, title = 'MA Width', inline = '6', group = 'Long Time Frame BBWP')
bbwplbga = input.int(defval = 75, maxval = 100, minval = 0, title = 'Background Transparency Above MA', inline = '7', group = 'Long Time Frame BBWP')
bbwplbgb = input.int(defval = 90, maxval = 100, minval = 0, title = 'Below MA', inline = '7', group = 'Long Time Frame BBWP')
linebackground = input.bool(defval = true, title = 'Highlight Lines in Background Mode', inline = '8', group = 'Long Time Frame BBWP')
highlightcolor = input.color(defval = #00000088, title = 'With Color', inline = '8', group = 'Long Time Frame BBWP')

longalertstip = 'Long timeframe alerts will appear in the top third of the chart. If enforced by all other enabled alerts a full length alert will plot.'
longalerts = input.bool(defval = true, title = 'Long TF Alerts', inline = 'l', group = 'Long Time Frame BBWP', tooltip = longalertstip)
lngalertsma = input.bool(defval = true, title = 'MA Filter', inline = 'l', group = 'Long Time Frame BBWP')
lngalertsri = input.bool(defval = false, title = 'and', inline = 'l', group = 'Long Time Frame BBWP')
lngalertsripc = input.float(defval = 1, maxval = 100, minval = 0, title = 'Moving %', inline = 'l', group = 'Long Time Frame BBWP', step = 0.1)
longupperlevel = input.int(98, 'Long Term Extreme High', minval = 1, inline = 'l2', group = 'Long Time Frame BBWP')
longlowerlevel = input.int(2, 'Low', minval = 1, inline = 'l2', group = 'Long Time Frame BBWP')

backtesttip = 'You can use the Backtest Signal to simulate trades in a backtester, set the values here to match what your backtester is expecting.\nAlert values are totaled and plotted to display.none, if you need to see them for testing change the Style Settings for the Backtest Signal plot.'
hghalertval = input.float(defval = -3, title = 'All Timeframes Alert Value High', inline = '1', group = 'Backtestable Alerts', tooltip = 'backtesttip')
lowalertval = input.float(defval = 3, title = 'Low', inline = '1', group = 'Backtestable Alerts')
hghalertshtval = input.float(defval = -2, title = 'Short Term Alert Value   High', inline = '2', group = 'Backtestable Alerts')
lowalertshtval = input.float(defval = 2, title = 'Low', inline = '2', group = 'Backtestable Alerts')
hghalertmedval = input.float(defval = -1, title = 'Medium Term Alert Value  High', inline = '3', group = 'Backtestable Alerts')
lowalertmedval = input.float(defval = 1, title = 'Low', inline = '3', group = 'Backtestable Alerts')
hghalertlngval = input.float(defval = -1, title = 'Long Term Alert Value   High', inline = '4', group = 'Backtestable Alerts')
lowalertlngval = input.float(defval = 1, title = 'Low', inline = '4', group = 'Backtestable Alerts')

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// ============ Functions

f_ma(_type, _source, _length) =>
    _type == 'VWMA' ? ta.vwma(_source, _length) : _type == 'EMA' ? ta.ema(_source, _length) : _type == 'HMA' ? ta.hma(_source, _length) : ta.sma(_source, _length)

f_mas(_type, _source, _length, _tf) =>
    request.security(chartTicker, _tf, f_ma(_type, _source, _length))

f_bbw(_src, _length, _type) =>
    float basis = f_ma(_type, _src, _length)
    float dev = ta.stdev(_src, _length)
    _bbw = (basis + dev - (basis - dev)) / basis
    _bbw
    //_bbw = ta.bbw(_src,_length,1)

f_percentrank(_source, _lookback) =>
    _count = 0.0
    for _i = 1 to _lookback by 1
        _count := _count + (_source[_i] > _source ? 0 : 1)
        _count
    _return = _count / _lookback * 100
    _return

f_bbwp(_source, _length, _lookback, _type) =>
    _bbw = f_bbw(_source, _length, _type)
    _len = bar_index < _lookback ? bar_index : _lookback
    _bbwp = f_percentrank(_bbw, _len)
    _return = bar_index >= _length ? _bbwp : na
    _return

f_bbwps(_length, _lookback, _tf) =>
    float _bbw = request.security(chartTicker, _tf, f_bbwp(source, _length, _lookback, basistype))
    _bbw

f_plotaverages(_type, _S, _M, _L) =>
    switch _type
        'Average S M' => (_S + _M) / 2
        'Average S L' => (_S + _L) / 2
        'Average M L' => (_M + _L) / 2
        'Average S M L' => (_S + _M + _L) / 3

f_color(_type, _solidcolor, _percent) =>
    _color = switch _type
        'RGB Spectrum' => _percent >= 50 ? color.from_gradient(_percent, 50, 100, #0AFF00, #FF2900) : color.from_gradient(_percent, 0, 49, #0000FF, #0AFF00)
        'RB Spectrum' => color.from_gradient(_percent, 0, 100, #0000FF, #FF2900)
        'RG Spectrum' => color.from_gradient(_percent, 0, 100, #00FF00, #FF0000)
        'Solid Line' => _solidcolor
        'Solid Color' => _solidcolor
        'Background' => color.from_gradient(_percent, 0, 100, #00FF00, #FF0000)
        'Hidden' => na
    _color

f_hghalert(_source, _level, _mafilter, _movingaverage, _rising, _percent) =>
    _alert = _source > _level ? _mafilter ? _source < _movingaverage ? _rising ? _source < _source[1] * (1 - _percent / 100) ? true : false : true : false : true : false
    _alert

f_tfhghalert(_tf, _source, _level, _mafilter, _movingaverage, _rising, _percent) =>
    _alert = request.security(chartTicker, _tf, f_hghalert(_source, _level, _mafilter, _movingaverage, _rising, _percent))
    _alert

f_lowalert(_source, _level, _mafilter, _movingaverage, _rising, _percent) =>
    _alert = _source < _level ? _mafilter ? _source > _movingaverage ? _rising ? _source > _source[1] * (1 + _percent / 100) ? true : false : true : false : true : false
    _alert

f_tflowalert(_tf, _source, _level, _mafilter, _movingaverage, _rising, _percent) =>
    _alert = request.security(chartTicker, _tf, f_lowalert(_source, _level, _mafilter, _movingaverage, _rising, _percent))
    _alert


// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// ============ Logic

bbwpstfc = bbwpstf == 'Chart' ? charttf : bbwpstf

bbwpmtfc = bbwpmtf == 'Auto' ? charttf == '1' ? '5' : charttf == '3' ? '10' : charttf == '5' ? '15' : charttf == '10' ? '30' : charttf == '15' ? '60' : charttf == '30' ? '120' : charttf == '45' ? '120' : charttf == '60' ? '240' : charttf == '120' ? '480' : charttf == '180' ? '720' : charttf == '240' ? 'D' : charttf == '720' ? 'D' : charttf == 'D' ? '3D' : charttf == '3D' ? 'W' : charttf == '5D' ? '2W' : charttf == 'W' ? 'M' : na : bbwpmtf

bbwpltfc = bbwpltf == 'Auto' ? charttf == '1' ? '15' : charttf == '3' ? '30' : charttf == '5' ? '45' : charttf == '10' ? '120' : charttf == '15' ? '240' : charttf == '30' ? '480' : charttf == '45' ? '720' : charttf == '60' ? 'D' : charttf == '120' ? '2D' : charttf == '180' ? '3D' : charttf == '240' ? '4D' : charttf == '720' ? '5D' : charttf == 'D' ? 'W' : charttf == '3D' ? '2W' : charttf == '5D' ? 'M' : charttf == 'W' ? '2M' : na : bbwpltf

bbwps = bbwpse ? bbwpstf == 'Chart' ? f_bbwp(source, bbwpsle, bbwpslk, basistype) : f_bbwps(bbwpsle, bbwpslk, bbwpstfc) : na
bbwpm = bbwpme ? f_bbwps(bbwpmle, bbwpmlk, bbwpmtfc) : na
bbwpl = bbwple ? f_bbwps(bbwplle, bbwpllk, bbwpltfc) : na

bbwpsplot = bbwpspt == 'Average S M' or bbwpspt == 'Average S L' or bbwpspt == 'Average M L' or bbwpspt == 'Average S M L' ? f_plotaverages(bbwpspt, bbwps, bbwpm, bbwpl) : bbwps

bbwpmplot = bbwpmpt == 'Average S M' or bbwpmpt == 'Average S L' or bbwpmpt == 'Average M L' or bbwpmpt == 'Average S M L' ? f_plotaverages(bbwpmpt, bbwps, bbwpm, bbwpl) : bbwpm

bbwplplot = bbwplpt == 'Average S M' or bbwplpt == 'Average S L' or bbwplpt == 'Average M L' or bbwplpt == 'Average S M L' ? f_plotaverages(bbwplpt, bbwps, bbwpm, bbwpl) : bbwpl

bbwpsma = bbwpsmal > 1 ? bbwpstf == 'Chart' ? f_ma(bbwpsmat, bbwpsplot, bbwpsmal) : f_mas(bbwpsmat, bbwpsplot, bbwpsmal, bbwpstfc) : na
bbwpmma = bbwpmmal > 1 ? f_mas(bbwpmmat, bbwpmplot, bbwpmmal, bbwpmtfc) : na
bbwplma = bbwplmal > 1 ? f_mas(bbwplmat, bbwplplot, bbwplmal, bbwpltfc) : na

c_bbwps = bbwpspt != 'Hidden' ? bbwpspc == 'Color from Medium' ? bbwpme ? f_color(bbwpmpc, bbwpmppc, bbwpm) : na : bbwpspc == 'Color from Long' ? bbwple ? f_color(bbwplpc, bbwplppc, bbwpl) : na : f_color(bbwpspc, bbwpsppc, bbwpsplot) : na

c_bbwpm = bbwpmpt != 'Hidden' ? bbwpmpc == 'Color from Long' ? bbwple ? f_color(bbwplpc, bbwplppc, bbwpl) : na : f_color(bbwpmpc, bbwpmppc, bbwpm) : na

c_bbwpl = bbwplpt != 'Hidden' ? f_color(bbwplpc, bbwplppc, bbwplplot) : na

plotbackground = bbwple and bbwplpt == 'Background' ? true : false

c_bbwpsma = bbwpspt == 'Hidden' or bbwpsmapt == 'Hidden' ? na : bbwpsmappc
c_bbwpmma = bbwpmpt == 'Hidden' or bbwpmmapt == 'Hidden' ? na : bbwpmmappc
c_bbwplma = bbwplpt == 'Hidden' or bbwplpt == 'Background' or bbwplmapt == 'Hidden' ? na : bbwplmappc

plotshortbackground = plotbackground and linebackground and bbwpspt != 'Hidden' ? bbwpsplot : na
plotmediumbackground = plotbackground and linebackground and bbwpmpt != 'Hidden' ? bbwpmplot : na

highcolor = color.red
lowcolor = bbwpspc == 'RGB Spectrum' or bbwpspc == 'RB Spectrum' ? color.blue : color.green

bool hghalertsht = false
bool lowalertsht = false

if bbwpstf == 'Chart'
    hghalertsht := bbwpse and shortalerts ? f_hghalert(bbwpsplot, shortupperlevel, shtalertsma, bbwpsma, shtalertsri, shtalertsripc) : false
    lowalertsht := bbwpse and shortalerts ? f_lowalert(bbwpsplot, shortlowerlevel, shtalertsma, bbwpsma, shtalertsri, shtalertsripc) : false
    lowalertsht
else
    hghalertsht := bbwpse and shortalerts ? f_tfhghalert(bbwpstfc, bbwpsplot, shortupperlevel, shtalertsma, bbwpsma, shtalertsri, shtalertsripc) : false
    lowalertsht := bbwpse and shortalerts ? f_tflowalert(bbwpstfc, bbwpsplot, shortlowerlevel, shtalertsma, bbwpsma, shtalertsri, shtalertsripc) : false
    lowalertsht

hghalertmed = bbwpme and mediumalerts ? f_tfhghalert(bbwpmtfc, bbwpmplot, mediumupperlevel, medalertsma, bbwpmma, medalertsri, medalertsripc) : false
lowalertmed = bbwpme and mediumalerts ? f_tflowalert(bbwpmtfc, bbwpm, mediumlowerlevel, medalertsma, bbwpmma, medalertsri, medalertsripc) : false

hghalertlng = bbwple and longalerts ? f_tfhghalert(bbwpltfc, bbwplplot, longupperlevel, lngalertsma, bbwplma, lngalertsri, lngalertsripc) : false
lowalertlng = bbwple and longalerts ? f_tflowalert(bbwpltfc, bbwpl, longlowerlevel, lngalertsma, bbwplma, lngalertsri, lngalertsripc) : false

hghalert = (bbwpse and shortalerts or bbwpme and mediumalerts or bbwple and longalerts) and (bbwpse and shortalerts ? hghalertsht : true) and (bbwpme and mediumalerts ? hghalertmed : true) and (bbwple and longalerts ? hghalertlng : true)

lowalert = (bbwpse and shortalerts or bbwpme and mediumalerts or bbwple and longalerts) and (bbwpse and shortalerts ? lowalertsht : true) and (bbwpme and mediumalerts ? lowalertmed : true) and (bbwple and longalerts ? lowalertlng : true)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// ============ Plots

bgcolor(plotbackground ? color.new(c_bbwpl, bbwplplot > bbwplma ? bbwplbga : bbwplbgb) : na)
barcolor(barcolors == 'From Short TF BBWP' ? f_color(bbwpspc, bbwpsppc, bbwps) : barcolors == 'From Medium TF BBWP' ? f_color(bbwpmpc, bbwpmppc, bbwpm) : barcolors == 'From Long TF BBWP' ? f_color(bbwplpc, bbwplppc, bbwpl) : na)

p_bbwpsbk = plot(plotshortbackground, 'BBWP Short Time Frame Background', highlightcolor, math.max(1, bbwpspw + 3))
p_bbwpmbk = plot(plotmediumbackground, 'BBWP Medium Time Frame Background', highlightcolor, math.max(1, bbwpmpw + 3))

p_bbwps = plot(bbwpsplot, 'BBWP Short Time Frame', c_bbwps, math.max(1, bbwpspw), plot.style_line)
p_bbwpsma = plot(bbwpsma, 'BBWP Short MA', c_bbwpsma, math.max(1, bbwpsmapw), plot.style_line)

p_bbwpm = plot(bbwpmplot, 'BBWP Medium Time Frame', c_bbwpm, math.max(1, bbwpmpw), plot.style_line)
p_bbwpmma = plot(bbwpmma, 'BBWP Medium MA', c_bbwpmma, math.max(1, bbwpmmapw), plot.style_line)

p_bbwpl = plot(plotbackground ? na : bbwplplot, 'BBWP Long Time Frame', c_bbwpl, math.max(1, bbwplpw), plot.style_line)
p_bbwplma = plot(plotbackground ? na : bbwplma, 'BBWP Long MA', c_bbwplma, math.max(1, bbwplmapw), plot.style_line)

p_scaleHi = hline(100, 'Scale High', highcolor, hline.style_solid)
p_midLine = hline(50, 'Mid-Line', color.silver, hline.style_dashed)
p_scaleLo = hline(0, 'Scale Low', lowcolor, hline.style_solid)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// ============ Alerts

p_lowalertsht = plot(lowalertsht ? 33 : na, 'Short Timeframe Low', color.new(lowcolor, stfalerttrans), 1, plot.style_columns, histbase = 0)
p_lowalertmed = plot(lowalertmed ? 66 : na, 'Medium Timeframe Low', color.new(lowcolor, stfalerttrans), 1, plot.style_columns, histbase = 33)
p_lowalertlng = plot(lowalertlng ? 100 : na, 'Long Timeframe Low', color.new(lowcolor, stfalerttrans), 1, plot.style_columns, histbase = 66)

p_hghalertsht = plot(hghalertsht ? 33 : na, 'Short Timeframe High', color.new(highcolor, stfalerttrans), 1, plot.style_columns, histbase = 0)
p_hghalertmed = plot(hghalertmed ? 66 : na, 'Medium Timeframe High', color.new(highcolor, stfalerttrans), 1, plot.style_columns, histbase = 33)
p_hghalertlng = plot(hghalertlng ? 100 : na, 'Long Timeframe High', color.new(highcolor, stfalerttrans), 1, plot.style_columns, histbase = 66)

p_hghalertall = plot(hghalert ? 100 : na, 'Extreme High', color.new(highcolor, alerttrans), 1, plot.style_columns, histbase = 0)
p_lowalertall = plot(lowalert ? 100 : na, 'Extreme Low', color.new(lowcolor, alerttrans), 1, plot.style_columns, histbase = 0)

float alertlevel = 0
alertlevel := alertlevel + (hghalert ? hghalertval : 0)
alertlevel := alertlevel + (lowalert ? lowalertval : 0)
alertlevel := alertlevel + (hghalertsht ? hghalertshtval : 0)
alertlevel := alertlevel + (lowalertsht ? lowalertshtval : 0)
alertlevel := alertlevel + (hghalertmed ? hghalertmedval : 0)
alertlevel := alertlevel + (lowalertmed ? lowalertmedval : 0)
alertlevel := alertlevel + (hghalertlng ? hghalertlngval : 0)
alertlevel := alertlevel + (lowalertlng ? lowalertlngval : 0)

p_alertsignal = plot(alertlevel, 'Backtest Signal', style = plot.style_columns, display = display.none)

Overview

Bollinger Band Width Percentile - Multi Time Frame evaluates the current bandwidth against historical lookback periods and plots percentile values alongside moving average signal lines in a separate pane. Users can customize basis calculation types (SMA, EMA, VWMA), lookback lengths, smoothing moving averages, extreme percentile thresholds, and optional bar colors on the main price chart.

Details

Published by

mushroom-men-Trading on GitHub

Code credit

EltAlt, as written in the script's header

Type

Indicator, Pine Script v6

Draws

Separate pane below the chart

Category

Volatility & bands

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Price Sourcesourceclosesource
  BBPW Basis TypestringSMAbasistype
Alert Transparency: Single TFint50stfalerttrans
All TFint50alerttrans
Price Chart Bar ColorsstringStandardbarcolors
Enablebooltruebbwpse
        TimeframestringChartbbwpstf
Lengthint13bbwpsle
   Lookbackint252bbwpslk
MAint5bbwpsmal
     MA TypestringSMAbbwpsmat
Plot TypestringSolid Linebbwpspt
Show all 40 settings
SettingTypeDefaultVariable
   Widthint2bbwpspw
Plot ColorstringColor from Mediumbbwpspc
   Solid Colorcolor#FFFF00bbwpsppc
MA PlotstringSolid Linebbwpsmapt
MA Widthint1bbwpsmapw
MA Colorcolor#FFFFFFFFbbwpsmappc
Short TF Alertsbooltrueshortalerts
MA Filterbooltrueshtalertsma
andboolfalseshtalertsri
Moving %float1shtalertsripc
Short Term Extreme Highint98shortupperlevel
Lowint2shortlowerlevel
Enablebooltruebbwpme
        TimeframestringAutobbwpmtf
Lengthint13bbwpmle
   Lookbackint252bbwpmlk
MAint5bbwpmmal
     MA TypestringSMAbbwpmmat
Plot TypestringHiddenbbwpmpt
   Widthint2bbwpmpw
Plot ColorstringRG Spectrumbbwpmpc
   Solid Colorcolor#FFFF00bbwpmppc
MA PlotstringHiddenbbwpmmapt
MA Colorcolor#FFFFFFCFbbwpmmappc
MA Widthint1bbwpmmapw
Medium TF Alertsbooltruemediumalerts
MA Filterbooltruemedalertsma
andboolfalsemedalertsri
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

This indicator calculates the distribution of close-to-close percentage changes using rate of change on closing prices. It bins percentage changes into intervals of 0.25 percent increments from negative to positive values and plots a normalized cumulative hist

Indicator v4 Volatility & bands
Updated 10 days ago · GPL-3.0 GitHub repository of Close-to-Close % Change Distribution

This indicator plots a Supertrend-based trend-following setup in a separate pane and skips conditions it treats as a sideways market. A volatility range is built from an ATR value, with RMA, SMA, EMA, or WMA smoothing, or from a fixed point distance. Optional

Indicator v5 TrendVolatility & bands
Updated 1 year ago · MPL-2.0 GitHub repository of Trend Following Setup - Sideways Market Skipper
330 stars

This indicator plots candle range and open-to-close movement as percentages in a separate pane. Range is the high-low difference divided by the low, and change is the close-open difference divided by the open. Both series draw as columns. Teal columns show ran

Indicator v5 Volatility & bands
Updated 2 months ago · None stated GitHub repository of Percent & Volatility [Alorse]

Mojito v3 Strategy

by namuan
318 stars

The Mojito v3 Strategy indicator evaluates volatility term structure by calculating the ratio between front-month and second-month VIX futures contracts. It smooths this ratio using a configurable median filter and compares the result against user-defined uppe

Indicator v5 Volatility & bands
Updated 2 months ago · MIT GitHub repository of Mojito v3 Strategy

Function - Logistic Equation

by ricardosantos79
261 stars

Calculates dynamic modeling values by applying a mathematical logistic differential equation to price change over a specified lookback length. It measures price momentum relative to the recent high-low price range. The script plots positive and negative logist

Indicator v5 Oscillators & momentumVolatility & bands
Updated 4 years ago · None stated GitHub repository of Function - Logistic Equation

MACD-V

by harryguiacorn
219 stars

MACD-V is a volatility-normalized momentum indicator based on research by Alex Spiroglou. It calculates the standard MACD histogram and normalizes it by dividing by the Average True Range (ATR). Plotted in a separate pane as a colored histogram, it includes us

Indicator v5 Oscillators & momentumVolatility & bands
Updated 1 year ago · None stated GitHub repository of MACD-V

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers