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).
Stable 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. Channel at index i is the highest high /
lowest low over the window [i-period+1, i] (and their midpoint),
all input highs/lows still in the buffer — no prior-output
dependence. Rescan that single window for the touched index. Warmup
(i < period-1) leaves all three series NaN at i.
Donchian Channels — the highest high and lowest low over
periodbars, plus their midline. The basis of turtle-trading breakouts.upper = highest(high, period) lower = lowest(low, period) middle = (upper + lower) / 2
Window extrema via monotonic deques → amortized O(1) per bar. Three overlay series: upper, middle, lower.