BBANDS (Bollinger Bands)
Bollinger Bands consist of a middle SMA with upper and lower bands at a standard deviation distance. They expand during high volatility and contract during low volatility.
Declaration
function init(ctx) { ctx.indicator('bb', 'BBANDS', { period: 20, stdDev: 2 }); }
Options
| Option | Type | Default | Description |
|---|---|---|---|
period | number | 20 | SMA lookback period |
stdDev | number | 2 | Standard deviation multiplier |
source | string | 'close' | Price source |
Output
Returns an object with three series, accessed via underscore naming:
| Property | Description |
|---|---|
upper | Upper band (SMA + stdDev x sigma) |
middle | Middle band (SMA) |
lower | Lower band (SMA - stdDev x sigma) |
Accessing Values
function onBar(ctx, i) { const upper = ctx.ind.bb_upper[i]; const middle = ctx.ind.bb_middle[i]; const lower = ctx.ind.bb_lower[i]; }
Use Cases
Bollinger Bounce (Mean Reversion)
function onBar(ctx, i) { const close = ctx.series.close[i]; const lower = ctx.ind.bb_lower[i]; const upper = ctx.ind.bb_upper[i]; if (close <= lower) { ctx.order.market('ASSET', 1, { signal: 'buy', reason: 'bb_bounce_lower' }); } if (close >= upper) { ctx.order.close('ASSET', { signal: 'sell', reason: 'bb_touch_upper' }); } }
Bollinger Squeeze (Breakout)
function onBar(ctx, i) { const bandwidth = (ctx.ind.bb_upper[i] - ctx.ind.bb_lower[i]) / ctx.ind.bb_middle[i]; const prevBandwidth = (ctx.ind.bb_upper[i-1] - ctx.ind.bb_lower[i-1]) / ctx.ind.bb_middle[i-1]; // Squeeze: narrow bands followed by expansion if (bandwidth > prevBandwidth * 1.5 && ctx.series.close[i] > ctx.ind.bb_upper[i]) { ctx.order.market('ASSET', 1, { signal: 'buy', reason: 'bb_squeeze_breakout' }); } }
Calculation
- Middle = SMA(Close, period)
- Upper = Middle + stdDev x StdDeviation(Close, period)
- Lower = Middle - stdDev x StdDeviation(Close, period)
Related
- Keltner Channels - ATR-based bands (less sensitive)
- ATR - Volatility measure
- Donchian - High/low channel bands
indicatorbbandsbollingervolatilitybandsqsl