ReadonlyperiodReadonlyplacementWhere the indicator renders (overlay vs. its own pane).
Optional ReadonlypriceWhich price scale an overlay-placement indicator projects through
(B2). 'right' (the default when undefined) is the primary scale
shared with the price series; 'left' binds the indicator to the
independent secondary scale, which the chart enables — reserving the
left axis strip — only while at least one indicator requests it.
Ignored for pane-placement indicators (they own their sub-pane axis).
Subclasses opt in by overriding this getter (or declaring a matching
readonly field).
ReadonlystdStable human-readable identifier, e.g. sma(20) or rsi(14). Used as
the cache key by the IndicatorRegistry and as a label in legends.
Read the buffer and return one or more aligned series. Every returned
Float64Array MUST have the same length as buffer.length so the
renderer can align values with candles index-for-index.
Memoized wrapper around compute. Returns the same cached array
reference while the SAME buffer's version and length are unchanged.
The buffer identity is part of the key so reusing one indicator
instance across two buffers (or swapping a chart's buffer) never
returns another buffer's stale series — important right after init when
distinct buffers can share version: 0 and the same length.
When the data did change but only via a single realtime tick — an
updateLast (same length) or one append (length + 1) on the SAME
buffer with an unmoved head (firstTime unchanged) — and the
subclass provides an updateTail hook, the tail is patched in O(tail)
instead of recomputing the whole series in O(n). firstTime is part
of the key precisely so a prepend/evictHead (which shifts the head
and renumbers every index) can never be mistaken for an append/update
and forces a full recompute.
Use this on render paths; use compute directly to force a fresh
computation.
ProtectedupdateIncremental tail patch. Each band at index i is a pure function of
the close window [i-period+1, i] (mean ± stdDev·σ), all input closes
still in the buffer — no prior-output dependence. Recompute sum and
sum-of-squares over that single window for the touched index. Warmup
(i < period-1) leaves all three series NaN at i.
Bollinger Bands: middle = SMA(period) upper = middle + stdDev * σ(close, period) lower = middle - stdDev * σ(close, period)
Renders as three overlay lines on the main price pane.
Performance: O(n) total via two rolling sums (sum and sum of squares). Stdev uses the population variance formula σ² = E[x²] − (E[x])² applied to a sliding window. We clamp negative variance to zero — it can only arise from float cancellation when the window is effectively constant.