@alphacharts/indicators 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -2
  3. package/dist/all-_xzUPrL7.js +21 -0
  4. package/dist/all-_xzUPrL7.js.map +1 -0
  5. package/dist/all.js +10 -0
  6. package/dist/all.js.map +1 -0
  7. package/dist/define-XUgQMhSl.js +687 -0
  8. package/dist/define-XUgQMhSl.js.map +1 -0
  9. package/dist/index.js +744 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/registry-DdYYyZN_.js +53 -0
  12. package/dist/registry-DdYYyZN_.js.map +1 -0
  13. package/dist/runner-B53M0IsJ.js +237 -0
  14. package/dist/runner-B53M0IsJ.js.map +1 -0
  15. package/dist/studies.js +1 -0
  16. package/dist/tv-volume-BYSbfrVk.js +3454 -0
  17. package/dist/tv-volume-BYSbfrVk.js.map +1 -0
  18. package/dist/types/all.d.ts +3 -0
  19. package/dist/types/chart/marker-floor.d.ts +9 -0
  20. package/dist/types/chart/studies.d.ts +192 -0
  21. package/dist/types/define.d.ts +46 -0
  22. package/dist/types/engine/feed.d.ts +88 -0
  23. package/dist/types/engine/graph.d.ts +136 -0
  24. package/dist/types/engine/kernels.d.ts +9 -0
  25. package/dist/types/engine/study.d.ts +40 -0
  26. package/dist/types/index.d.ts +15 -0
  27. package/dist/types/registry.d.ts +7 -0
  28. package/dist/types/runner.d.ts +91 -0
  29. package/dist/types/studies/all.d.ts +2 -0
  30. package/dist/types/studies/cycle.d.ts +7 -0
  31. package/dist/types/studies/index.d.ts +13 -0
  32. package/dist/types/studies/ma.d.ts +26 -0
  33. package/dist/types/studies/math.d.ts +28 -0
  34. package/dist/types/studies/momentum.d.ts +30 -0
  35. package/dist/types/studies/overlap.d.ts +14 -0
  36. package/dist/types/studies/patterns.d.ts +62 -0
  37. package/dist/types/studies/price.d.ts +6 -0
  38. package/dist/types/studies/sar.d.ts +2 -0
  39. package/dist/types/studies/statistic.d.ts +9 -0
  40. package/dist/types/studies/tv-osc.d.ts +18 -0
  41. package/dist/types/studies/tv-trend.d.ts +20 -0
  42. package/dist/types/studies/tv-volume.d.ts +15 -0
  43. package/dist/types/studies/volatility.d.ts +3 -0
  44. package/dist/types/studies/volume.d.ts +3 -0
  45. package/dist/types/types.d.ts +169 -0
  46. package/dist/types/wasm.d.ts +2 -0
  47. package/dist/types/worker.d.ts +1 -0
  48. package/dist/worker.js +8 -0
  49. package/dist/worker.js.map +1 -0
  50. package/package.json +72 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-XUgQMhSl.js","names":["FEED_FIELDS","Feed","Graph","cfg","what","n","bars","f","i","g","checkConfig","b","revise","t","T","limit","j","lo","hi","mid","field","joinFeed","out","times","feed","describeJoin","chartTimes","m","feedTimes","base","matched","off","min","how","active","setKernels","k","kernels","eligible","from","to","x","Col","cap","Node","SOURCE_NAMES","NaN_","c","next","nd","buffers","body","a","v","fn","r","hit","name","close","open","high","low","h","l","s","o","key","f0","time","col","xv","fx","fy","y","p","q","checkPeriod","cnt","acc","sm","prev","alpha","S","W","den","sv","wv","x1","s0","oldest","xs","isMax","best","at","sample","mv","mean","d","sumX","div","slope","icpt","sl","ic","sy","sxy","bb","src","pc","u","offsetMin","tv","cv","same","DAY_MS","periodsPerYear","TRADING_DAYS","WEEKEND_SHARE","median","counts","perDay","gaps","spacing","week","int","def","float","bool","select","source","COLORS","line","hist","colorDown","band","fillBetween","hline","markers","defineStudy"],"sources":["../src/engine/feed.ts","../src/engine/kernels.ts","../src/engine/graph.ts","../src/define.ts"],"sourcesContent":["// Outside series: another instrument's bars, or the same instrument on another\n// timeframe, given to a study by its host and joined onto the study's own bars\n// by time. The package knows nothing about instruments or timeframes: a feed is\n// bars in their own time (UTC ms, strictly increasing) plus how to join them.\n//\n// The join is a function of the time of the study's bar `t` and of the feed's\n// bars at or before `t - lag`, never of any later bar, so a value on a finished\n// bar cannot change when later bars arrive or are cut off:\n//\n// \"same\" The feed is on the study's own timeframe. The feed's bar with\n// exactly time `t`, else absent (NaN). Nothing is carried from an\n// earlier bar or another day; a bar the other instrument did not\n// trade is a hole, not a copy of the one before.\n// \"closed\" The feed is on a longer timeframe (its bars last `spanMs`). The\n// latest feed bar that has finished by `t`: open time + spanMs <= t.\n// A feed bar still forming at `t` is never shown, so on the live\n// bar the value is the last closed one, and in history no value\n// contains data from after the bar it is shown on. `spanMs` is the\n// nominal length of the feed's bars; a bar that really closes\n// earlier (a session's last bar) is shown a little later than it\n// could be, never earlier.\n//\n// Cost: lookups walk forward from the previous answer, so a run over n bars and\n// a tick both cost O(1) amortised; a lookup that goes backwards (a revision of\n// an older bar) is a binary search.\n\nimport { Graph } from \"./graph.js\";\n\nexport type FeedField = \"open\" | \"high\" | \"low\" | \"close\" | \"volume\";\nexport const FEED_FIELDS: readonly FeedField[] = [\"open\", \"high\", \"low\", \"close\", \"volume\"];\nexport type FeedAlign = \"same\" | \"closed\";\n\nexport interface FeedConfig {\n align: FeedAlign;\n /** Nominal length of one feed bar, ms. Used by \"closed\" (> 0); ignored by \"same\". */\n spanMs: number;\n}\n\n/** Columnar bars of a feed, in the feed's own time. */\nexport interface FeedBars {\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n volume: Float64Array;\n}\n\nexport interface FeedBar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\n/** A feed as sent to a runner: its bars and how to join them. */\nexport interface FeedData extends FeedConfig {\n bars: FeedBars;\n}\n\nexport type FeedChange = \"appended\" | \"revised\";\n\n/**\n * A feed is a graph of its own whose bars are the other series' bars: its base columns (time, open, high, low, close,\n * volume) are the series itself, and whatever is computed from it (a script's `ta.rsi(outside(...), 14)`) is computed\n * on those bars, so a window of 14 is 14 of the series' bars whatever the chart's timeframe. The chart's graph reads\n * the result through the join (`Graph.joined`). Loading or ticking the feed evaluates its graph at once.\n */\nexport class Feed {\n readonly graph = new Graph();\n align: FeedAlign = \"same\";\n spanMs = 0;\n private cur = 0;\n\n get n(): number {\n return this.graph.n;\n }\n\n /** Replace the bars (copied) and the join. Throws, naming `what`, on bars that are not a series. */\n load(bars: FeedBars, cfg: FeedConfig, what = \"outside series\"): void {\n checkConfig(cfg, what);\n const n = bars.time.length;\n for (const f of FEED_FIELDS) {\n if (!(bars[f] instanceof Float64Array)) throw new TypeError(`${what}: ${f} must be a Float64Array`);\n if (bars[f].length !== n) throw new RangeError(`${what}: ${f} has ${bars[f].length} rows, time has ${n}`);\n }\n for (let i = 0; i < n; i++) {\n if (!Number.isFinite(bars.time[i]!)) throw new RangeError(`${what}: time at row ${i} is not a finite number`);\n if (i > 0 && !(bars.time[i]! > bars.time[i - 1]!)) throw new RangeError(`${what}: times must be strictly increasing (row ${i})`);\n }\n const g = this.graph;\n g.clear();\n g.reserve(n);\n g.time.v.set(bars.time);\n for (const f of FEED_FIELDS) g[f].v.set(bars[f]);\n g.n = n;\n g.run(0, n);\n this.cur = 0;\n this.align = cfg.align;\n this.spanMs = cfg.spanMs;\n }\n\n /** Change how the bars are joined, keeping them. */\n configure(cfg: FeedConfig, what = \"outside series\"): void {\n checkConfig(cfg, what);\n this.align = cfg.align;\n this.spanMs = cfg.spanMs;\n }\n\n /** A live bar: the same time as the last bar replaces it, a later time appends; an earlier time throws. */\n apply(b: FeedBar, what = \"outside series\"): FeedChange {\n const g = this.graph;\n const n = g.n;\n if (!Number.isFinite(b.time)) throw new RangeError(`${what}: bar time is not a finite number`);\n if (n > 0 && b.time < g.time.v[n - 1]!) throw new RangeError(`${what}: bar time ${b.time} is earlier than the last bar ${g.time.v[n - 1]}; load the series again instead`);\n const revise = n > 0 && b.time === g.time.v[n - 1];\n const i = revise ? n - 1 : n;\n if (!revise) {\n g.reserve(n + 1);\n g.n = n + 1;\n }\n g.time.v[i] = b.time;\n for (const f of FEED_FIELDS) g[f].v[i] = b[f];\n g.run(i, i + 1);\n return revise ? \"revised\" : \"appended\";\n }\n\n /** The bars as a runner takes them (copies, length n). */\n snapshot(): FeedBars {\n const g = this.graph, n = g.n;\n return { time: g.time.v.slice(0, n), open: g.open.v.slice(0, n), high: g.high.v.slice(0, n), low: g.low.v.slice(0, n), close: g.close.v.slice(0, n), volume: g.volume.v.slice(0, n) };\n }\n\n /** Index of the feed bar the study bar at time `t` sees, or -1 when it sees none. */\n lookup(t: number): number {\n const n = this.graph.n;\n if (n === 0 || t !== t) return -1;\n const T = this.graph.time.v;\n const limit = this.align === \"same\" ? t : t - this.spanMs;\n let j = this.cur < n ? this.cur : n - 1;\n if (T[j]! <= limit) {\n while (j + 1 < n && T[j + 1]! <= limit) j++;\n } else {\n // the answer is before the cursor: last index with time <= limit\n let lo = 0, hi = j;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (T[mid]! <= limit) lo = mid + 1;\n else hi = mid;\n }\n j = lo - 1;\n if (j < 0) return -1;\n }\n this.cur = j;\n if (this.align === \"same\") return T[j] === t ? j : -1;\n return j;\n }\n\n value(field: FeedField, i: number): number {\n return i < 0 ? Number.NaN : this.graph[field].v[i]!;\n }\n}\n\nfunction checkConfig(cfg: FeedConfig, what: string): void {\n if (cfg.align !== \"same\" && cfg.align !== \"closed\") throw new RangeError(`${what}: align must be \"same\" or \"closed\", got ${String(cfg.align)}`);\n if (cfg.align === \"closed\" && !(Number.isFinite(cfg.spanMs) && cfg.spanMs > 0)) throw new RangeError(`${what}: a \"closed\" feed needs spanMs > 0, got ${String(cfg.spanMs)}`);\n}\n\n/** Row `field` of every bar in `feed` joined onto `times`, as a plain array: the join in one call (for tests and tools). */\nexport function joinFeed(feed: Feed, field: FeedField, times: ArrayLike<number>): Float64Array {\n const out = new Float64Array(times.length);\n for (let i = 0; i < times.length; i++) out[i] = feed.value(field, feed.lookup(times[i]!));\n return out;\n}\n\nexport type JoinReason =\n /** Every chart bar sees a feed bar. */\n | \"complete\"\n /** Some chart bars see a feed bar and some do not (holes in the feed, or the feed starts later or ends earlier). */\n | \"partial\"\n /** The join finds nothing: the chart has no bars, or the feed has none. */\n | \"empty\"\n /** Same-length join and the feed's bar times never equal the chart's: the two sit on different clocks (offsetMs). */\n | \"different-clock\"\n /** Longer-timeframe join and no feed bar has finished by any chart bar (the feed starts after the chart ends, or is too short). */\n | \"no-finished-bar\";\n\nexport interface JoinReport {\n align: FeedAlign;\n chartBars: number;\n /** Chart bars that see a feed bar. A chart bar that sees none is blank (NaN) in everything read from the feed. */\n matched: number;\n reason: JoinReason;\n /**\n * For \"different-clock\": how far the feed's bars sit from the chart's, in ms, in (-spanMs/2, spanMs/2]: the first feed bar's\n * time minus the first chart bar's, modulo the bar length. NSE hourly bars open at 09:15 and MCX's at 09:00, so a chart on one\n * reading the other gives +900000 or -900000. Otherwise null.\n */\n offsetMs: number | null;\n /** One sentence a host can show where it would otherwise show \"blank\". */\n message: string;\n}\n\n/**\n * Why a join gives what it gives, for a host to explain a blank outside series: how many chart bars `cfg` joins to a bar of `feedTimes`\n * and, when none, the reason. A pure function of the two time columns and the config handed to `setFeed`; it reads no value.\n */\nexport function describeJoin(chartTimes: ArrayLike<number>, feedTimes: ArrayLike<number>, cfg: FeedConfig): JoinReport {\n checkConfig(cfg, \"outside series\");\n const n = chartTimes.length, m = feedTimes.length;\n const base = { align: cfg.align, chartBars: n };\n if (n === 0 || m === 0) {\n return { ...base, matched: 0, reason: \"empty\", offsetMs: null, message: n === 0 ? \"The chart has no bars.\" : \"The outside series has no bars.\" };\n }\n let matched = 0, j = 0;\n for (let i = 0; i < n; i++) {\n const t = chartTimes[i]!;\n if (cfg.align === \"same\") {\n while (j < m && feedTimes[j]! < t) j++;\n if (j < m && feedTimes[j] === t) matched++;\n } else {\n const limit = t - cfg.spanMs;\n while (j < m && feedTimes[j]! <= limit) j++;\n if (j > 0) matched++;\n }\n }\n if (matched === n) return { ...base, matched, reason: \"complete\", offsetMs: null, message: \"Every chart bar sees a bar of the outside series.\" };\n if (matched > 0) {\n return { ...base, matched, reason: \"partial\", offsetMs: null, message: `${n - matched} of ${n} chart bars have no bar of the outside series and are blank (a missing bar is never filled).` };\n }\n if (cfg.align === \"closed\") {\n return { ...base, matched, reason: \"no-finished-bar\", offsetMs: null, message: \"No bar of the outside series has finished by any chart bar, so every value is blank.\" };\n }\n let off = (feedTimes[0]! - chartTimes[0]!) % cfg.spanMs;\n if (off > cfg.spanMs / 2) off -= cfg.spanMs;\n else if (off <= -cfg.spanMs / 2) off += cfg.spanMs;\n const min = Math.round(Math.abs(off) / 60_000);\n const how = off === 0\n ? \"its bars never fall at the same time as the chart's (the two do not trade at the same times)\"\n : `its bars open ${min} minute${min === 1 ? \"\" : \"s\"} ${off > 0 ? \"after\" : \"before\"} the chart's`;\n return {\n ...base, matched, reason: \"different-clock\", offsetMs: off,\n message: `No chart bar has a bar of the outside series at exactly its time, so every value is blank: ${how}. A series on the chart's own timeframe joins only at equal times; read a longer timeframe (for example 1d) or a series on the same clock.`,\n };\n}\n","// Optional WASM kernels for the batch path. Where @alphacharts/wasm's\n// benchmark shows a win at both 1M and 10M bars (running sum, variance and\n// standard deviation, rolling highest/lowest and their bar offsets, linear\n// regression) a node may hand a full-range run to a kernel that is bit-for-bit\n// the same computation as its own loop (asserted by test/wasm.test.ts), so\n// enabling it never changes a value. Recursive smoothing and WMA are not here:\n// the benchmark shows no win for them.\n\nimport type { Kernels } from \"@alphacharts/wasm\";\n\nexport type BatchKernels = Pick<Kernels, \"sumState\" | \"variance\" | \"highest\" | \"lowest\" | \"highestBars\" | \"lowestBars\" | \"linreg\">;\n\nlet active: BatchKernels | null = null;\n\n/** Route eligible batch runs through `k`; null restores the JS loops. */\nexport function setKernels(k: BatchKernels | null): void {\n active = k;\n}\n\nexport function kernels(): BatchKernels | null {\n return active;\n}\n\n/** Below this many bars the call overhead beats the win. */\nexport const KERNEL_MIN_BARS = 4096;\n\n/** A kernel run needs the whole series from bar 0 and no absent values. */\nexport function eligible(x: Float64Array, from: number, to: number): boolean {\n if (!active || from !== 0 || to < KERNEL_MIN_BARS) return false;\n for (let i = 0; i < to; i++) if (x[i]! !== x[i]!) return false;\n return true;\n}\n","// The study engine: a graph of column nodes evaluated in creation order.\n//\n// Every value a study keeps lives in a Float64Array column indexed by bar, never\n// in hidden object state. A node writes only index i and reads indices <= i of\n// its inputs and <= i-1 of its own columns, so:\n// - a batch run is `run(0, n)` (node by node: tight monomorphic loops),\n// - an appended bar is `run(n, n + 1)`,\n// - a revised last bar is `run(n - 1, n)` again: it overwrites the same slots\n// from the same committed past, so the answer equals a batch run.\n// Per-bar cost is independent of the series length n: O(1) for recursive and\n// running-sum nodes, O(period) for window scans (highest/lowest, linreg).\n// Absent values (warm-up) are NaN, never zero.\n//\n// Columns are replaced when the graph grows (`reserve`); node bodies therefore\n// read `col.v` at the start of each run and never cache it across runs.\n\nimport { Feed, type FeedField } from \"./feed.js\";\nimport { eligible, kernels } from \"./kernels.js\";\n\nexport type Ref = Col | number;\n\nexport class Col {\n v: Float64Array;\n constructor(cap: number) {\n this.v = new Float64Array(cap).fill(Number.NaN);\n }\n}\n\nexport class Node extends Col {\n /** Evaluate bars [from, to). */\n run: (from: number, to: number) => void = () => {};\n}\n\nexport type SourceName = \"open\" | \"high\" | \"low\" | \"close\" | \"hl2\" | \"hlc3\" | \"ohlc4\" | \"hlcc4\";\nexport const SOURCE_NAMES: readonly SourceName[] = [\"close\", \"open\", \"high\", \"low\", \"hl2\", \"hlc3\", \"ohlc4\", \"hlcc4\"];\n\nconst NaN_ = Number.NaN;\n\nexport class Graph {\n /** Bars currently loaded. */\n n = 0;\n private cap = 0;\n /** Every column (inputs, aux, nodes) in creation order: the unit of transfer between threads. */\n readonly cols: Col[] = [];\n private readonly nodes: Node[] = [];\n readonly time: Col;\n readonly open: Col;\n readonly high: Col;\n readonly low: Col;\n readonly close: Col;\n readonly volume: Col;\n private readonly sources = new Map<string, Node>();\n /** Outside series by key: bars given by the host, joined onto this graph's bars by `external`. */\n readonly feeds = new Map<string, Feed>();\n\n constructor(cap = 0) {\n this.cap = cap;\n this.time = this.col();\n this.open = this.col();\n this.high = this.col();\n this.low = this.col();\n this.close = this.col();\n this.volume = this.col();\n }\n\n // ---- storage ----------------------------------------------------------------\n\n /** An auxiliary column (state a node keeps per bar). */\n col(): Col {\n const c = new Col(this.cap);\n this.cols.push(c);\n return c;\n }\n\n /** Make room for `n` bars; existing values are kept. */\n reserve(n: number): void {\n if (n <= this.cap) return;\n const cap = Math.max(n, Math.ceil(this.cap * 1.5), 256);\n for (const c of this.cols) {\n const next = new Float64Array(cap).fill(NaN_);\n next.set(c.v.subarray(0, Math.min(this.n, c.v.length)));\n c.v = next;\n }\n this.cap = cap;\n }\n\n /** Evaluate bars [from, to) on every node. `to` bars must already be loaded. */\n run(from: number, to: number): void {\n if (to > this.cap) throw new RangeError(`graph.run: ${to} bars exceed the reserved ${this.cap}`);\n for (const nd of this.nodes) nd.run(from, to);\n }\n\n /** Forget all values (new data is loaded from bar 0). */\n clear(): void {\n for (const c of this.cols) c.v.fill(NaN_, 0, this.n);\n this.n = 0;\n }\n\n /** Replace every column by transferred buffers (same builder, same order). */\n adopt(buffers: readonly Float64Array[], n: number): void {\n if (buffers.length !== this.cols.length) throw new RangeError(`graph.adopt: ${buffers.length} columns, expected ${this.cols.length}`);\n this.cols.forEach((c, i) => (c.v = buffers[i]!));\n this.cap = buffers[0]?.length ?? 0;\n this.n = n;\n }\n\n // ---- node construction ------------------------------------------------------\n\n /** A node whose evaluation is `body`; the body reads other columns' `.v` when it runs. */\n node(body: (self: Node, from: number, to: number) => void): Node {\n const nd = new Node(this.cap);\n nd.run = (a, b) => body(nd, a, b);\n this.cols.push(nd);\n this.nodes.push(nd);\n return nd;\n }\n\n /** Per-bar function of the index; it may read any column at <= i (own columns at <= i-1). */\n calc(fn: (i: number) => number): Node {\n return this.node((nd, a, b) => {\n const v = nd.v;\n for (let i = a; i < b; i++) v[i] = fn(i);\n });\n }\n\n /** A constant as a column-compatible value. */\n private val(r: Ref): (i: number) => number {\n if (typeof r === \"number\") return () => r;\n return (i) => r.v[i]!;\n }\n\n src(name: SourceName): Node {\n const hit = this.sources.get(name);\n if (hit) return hit;\n const { open, high, low, close } = this;\n let nd: Node;\n switch (name) {\n case \"close\": nd = this.map(close, (x) => x); break;\n case \"open\": nd = this.map(open, (x) => x); break;\n case \"high\": nd = this.map(high, (x) => x); break;\n case \"low\": nd = this.map(low, (x) => x); break;\n case \"hl2\": nd = this.node((s, a, b) => { const h = high.v, l = low.v, v = s.v; for (let i = a; i < b; i++) v[i] = (h[i]! + l[i]!) / 2; }); break;\n case \"hlc3\": nd = this.node((s, a, b) => { const h = high.v, l = low.v, c = close.v, v = s.v; for (let i = a; i < b; i++) v[i] = (h[i]! + l[i]! + c[i]!) / 3; }); break;\n case \"ohlc4\": nd = this.node((s, a, b) => { const o = open.v, h = high.v, l = low.v, c = close.v, v = s.v; for (let i = a; i < b; i++) v[i] = (o[i]! + h[i]! + l[i]! + c[i]!) / 4; }); break;\n case \"hlcc4\": nd = this.node((s, a, b) => { const h = high.v, l = low.v, c = close.v, v = s.v; for (let i = a; i < b; i++) v[i] = (h[i]! + l[i]! + 2 * c[i]!) / 4; }); break;\n default: throw new RangeError(`unknown source \"${String(name)}\"`);\n }\n this.sources.set(name, nd);\n return nd;\n }\n\n // ---- outside series -----------------------------------------------------------\n\n /** The feed `key` (created empty on first use: its bars arrive from the host, and until they do every join is absent). */\n feed(key: string): Feed {\n let f = this.feeds.get(key);\n if (!f) this.feeds.set(key, (f = new Feed()));\n return f;\n }\n\n /** Field `field` of feed `key` joined onto this graph's bars (see feed.ts for the two joins). NaN where the join finds no bar. */\n external(key: string, field: FeedField): Node {\n return this.joined(key, field);\n }\n\n /**\n * A column of feed `key`'s own graph (its base columns by name, or anything computed on its bars) read through the\n * join: at each bar of this graph, the value at the feed row the join finds, NaN when it finds none.\n */\n joined(key: string, col: Col | FeedField): Node {\n const f0 = this.feed(key);\n const time = this.time;\n return this.node((s, a, b) => {\n const t = time.v, v = s.v;\n const f = this.feeds.get(key) ?? f0;\n const c = typeof col === \"string\" ? f.graph[col] : col;\n for (let i = a; i < b; i++) {\n const j = f.lookup(t[i]!);\n v[i] = j < 0 ? NaN_ : c.v[j]!;\n }\n });\n }\n\n // ---- elementwise ------------------------------------------------------------\n\n map(x: Col, f: (x: number) => number): Node {\n return this.node((s, a, b) => {\n const xv = x.v, v = s.v;\n for (let i = a; i < b; i++) v[i] = f(xv[i]!);\n });\n }\n\n map2(x: Ref, y: Ref, f: (x: number, y: number) => number): Node {\n const fx = this.val(x), fy = this.val(y);\n return this.node((s, a, b) => {\n const v = s.v;\n for (let i = a; i < b; i++) v[i] = f(fx(i), fy(i));\n });\n }\n\n add(x: Ref, y: Ref): Node { return this.map2(x, y, (p, q) => p + q); }\n sub(x: Ref, y: Ref): Node { return this.map2(x, y, (p, q) => p - q); }\n mul(x: Ref, y: Ref): Node { return this.map2(x, y, (p, q) => p * q); }\n /** x / y; a zero divisor gives NaN (absent), never Infinity. */\n div(x: Ref, y: Ref): Node { return this.map2(x, y, (p, q) => (q === 0 ? NaN_ : p / q)); }\n max2(x: Ref, y: Ref): Node { return this.map2(x, y, (p, q) => (p !== p || q !== q ? NaN_ : p > q ? p : q)); }\n min2(x: Ref, y: Ref): Node { return this.map2(x, y, (p, q) => (p !== p || q !== q ? NaN_ : p < q ? p : q)); }\n abs(x: Col): Node { return this.map(x, Math.abs); }\n neg(x: Col): Node { return this.map(x, (p) => -p); }\n\n // ---- history ----------------------------------------------------------------\n\n lag(x: Col, k: number): Node {\n return this.node((s, a, b) => {\n const xv = x.v, v = s.v;\n for (let i = a; i < b; i++) v[i] = i >= k ? xv[i - k]! : NaN_;\n });\n }\n\n change(x: Col, k = 1): Node {\n return this.node((s, a, b) => {\n const xv = x.v, v = s.v;\n for (let i = a; i < b; i++) v[i] = i >= k ? xv[i]! - xv[i - k]! : NaN_;\n });\n }\n\n /** Consecutive valid (non-NaN) values of x ending at each bar. */\n validRun(x: Col): Col {\n return this.node((s, a, b) => {\n const xv = x.v, c = s.v;\n for (let i = a; i < b; i++) c[i] = xv[i]! === xv[i]! ? (i > 0 ? c[i - 1]! : 0) + 1 : 0;\n });\n }\n\n // ---- windows ----------------------------------------------------------------\n\n /** Sum over the last p bars (NaN until p valid bars). */\n sum(x: Col, p: number): Node {\n checkPeriod(p);\n if (p === 1) return this.map(x, (v) => v);\n const cnt = this.validRun(x);\n const acc = this.col();\n return this.node((s, a, b) => {\n const xv = x.v, c = cnt.v, t = acc.v, v = s.v;\n if (eligible(xv, a, b)) {\n const r = kernels()!.sumState(xv.subarray(0, b), p);\n v.set(r.sum);\n t.set(r.state);\n return;\n }\n for (let i = a; i < b; i++) {\n const k = c[i]!;\n if (k === 0) { t[i] = 0; v[i] = NaN_; continue; }\n let r = (k > 1 ? t[i - 1]! : 0) + xv[i]!;\n if (k > p) r -= xv[i - p]!;\n t[i] = r;\n v[i] = k >= p ? r : NaN_;\n }\n });\n }\n\n sma(x: Col, p: number): Node {\n const sm = this.sum(x, p);\n return this.map(sm, (t) => t / p);\n }\n\n /**\n * Recursive smoothing y = y' + alpha (x - y'), seeded with the simple mean of\n * the first p valid values (TA-Lib's EMA/Wilder seeding; also Pine's).\n */\n smooth(x: Col, p: number, alpha: number): Node {\n checkPeriod(p);\n const cnt = this.validRun(x);\n return this.node((s, a, b) => {\n const xv = x.v, c = cnt.v, v = s.v;\n for (let i = a; i < b; i++) {\n const k = c[i]!;\n if (k === 0) { v[i] = NaN_; continue; }\n const prev = i > 0 ? v[i - 1]! : NaN_;\n if (prev === prev) v[i] = prev + alpha * (xv[i]! - prev);\n else if (k >= p) {\n let t = 0;\n for (let j = i - p + 1; j <= i; j++) t += xv[j]!;\n v[i] = t / p;\n } else v[i] = NaN_;\n }\n });\n }\n\n ema(x: Col, p: number): Node { return this.smooth(x, p, 2 / (p + 1)); }\n /** Wilder's smoothing (RMA / SMMA). */\n rma(x: Col, p: number): Node { return this.smooth(x, p, 1 / p); }\n\n /** Linearly weighted mean, newest bar weighted p. */\n wma(x: Col, p: number): Node {\n checkPeriod(p);\n const cnt = this.validRun(x);\n const S = this.col(), W = this.col();\n const den = (p * (p + 1)) / 2;\n return this.node((s, a, b) => {\n const xv = x.v, c = cnt.v, sv = S.v, wv = W.v, v = s.v;\n for (let i = a; i < b; i++) {\n const k = c[i]!;\n if (k === 0) { sv[i] = 0; wv[i] = 0; v[i] = NaN_; continue; }\n const x1 = xv[i]!;\n if (k < p) {\n // still filling: W = sum (j+1) x_j over the k values so far\n sv[i] = (k > 1 ? sv[i - 1]! : 0) + x1;\n wv[i] = (k > 1 ? wv[i - 1]! : 0) + k * x1;\n v[i] = NaN_;\n } else if (k === p) {\n sv[i] = (k > 1 ? sv[i - 1]! : 0) + x1;\n wv[i] = (k > 1 ? wv[i - 1]! : 0) + p * x1;\n v[i] = wv[i]! / den;\n } else {\n const s0 = sv[i - 1]!;\n wv[i] = wv[i - 1]! - s0 + p * x1;\n sv[i] = s0 - xv[i - p]! + x1;\n v[i] = wv[i]! / den;\n }\n }\n });\n }\n\n /** Highest value over the last p bars. */\n highest(x: Col, p: number): Node { return this.extreme(x, p, true, false); }\n lowest(x: Col, p: number): Node { return this.extreme(x, p, false, false); }\n /** Bars since the highest/lowest value in the window (0 = this bar); ties pick the most recent. */\n highestBars(x: Col, p: number, oldest = false): Node { return this.extreme(x, p, true, true, oldest); }\n lowestBars(x: Col, p: number, oldest = false): Node { return this.extreme(x, p, false, true, oldest); }\n\n /** `oldest`: ties pick the oldest bar (TA-Lib's MAXINDEX/MININDEX) instead of the newest (Aroon). */\n private extreme(x: Col, p: number, isMax: boolean, bars: boolean, oldest = false): Node {\n checkPeriod(p);\n const cnt = this.validRun(x);\n return this.node((s, a, b) => {\n const xv = x.v, c = cnt.v, v = s.v;\n if (!oldest && eligible(xv, a, b)) {\n const k = kernels()!, xs = xv.subarray(0, b);\n v.set(bars ? (isMax ? k.highestBars(xs, p) : k.lowestBars(xs, p)) : isMax ? k.highest(xs, p) : k.lowest(xs, p));\n return;\n }\n for (let i = a; i < b; i++) {\n if (c[i]! < p) { v[i] = NaN_; continue; }\n let best = xv[i]!, at = 0;\n for (let j = 1; j < p; j++) {\n const y = xv[i - j]!;\n if (isMax ? (oldest ? y >= best : y > best) : (oldest ? y <= best : y < best)) { best = y; at = j; }\n }\n v[i] = bars ? at : best;\n }\n });\n }\n\n /**\n * Population variance over p bars (TA-Lib VAR): mean-centred two-pass over the\n * window, because running sums of squares lose ~1e-8 relative on price series.\n * `sample` divides by p - 1 instead (the unbiased estimator, the one a Sharpe or volatility estimate from a sample uses): the\n * population value scaled by p / (p - 1), undefined for p = 1.\n */\n variance(x: Col, p: number, sample = false): Node {\n checkPeriod(p);\n if (sample && p < 2) throw new RangeError(`sample variance needs a period of at least 2, got ${p}`);\n const m = this.sma(x, p);\n const k = sample ? p / (p - 1) : 1;\n return this.node((s, a, b) => {\n const xv = x.v, mv = m.v, v = s.v;\n if (eligible(xv, a, b)) {\n v.set(kernels()!.variance(xv.subarray(0, b), p));\n if (sample) for (let i = 0; i < b; i++) v[i] = v[i]! * k;\n return;\n }\n for (let i = a; i < b; i++) {\n const mean = mv[i]!;\n if (mean !== mean) { v[i] = NaN_; continue; }\n let t = 0;\n for (let j = i - p + 1; j <= i; j++) { const d = xv[j]! - mean; t += d * d; }\n v[i] = sample ? t / (p - 1) : t / p;\n }\n });\n }\n\n stdev(x: Col, p: number, sample = false): Node { return this.map(this.variance(x, p, sample), Math.sqrt); }\n\n /**\n * Least-squares line over the last p bars against x = 0..p-1 (oldest..newest).\n * `value` is the line at the newest bar; `slope` per bar; `intercept` at the oldest bar.\n */\n linreg(x: Col, p: number): { value: Node; slope: Node; intercept: Node } {\n if (!Number.isInteger(p) || p < 2) throw new RangeError(`linreg: period must be an integer >= 2, got ${p}`);\n const cnt = this.validRun(x);\n const sumX = (p * (p - 1)) / 2;\n const sumXSqr = (p * (p - 1) * (2 * p - 1)) / 6;\n const div = p * sumXSqr - sumX * sumX;\n const slope = this.col(), icpt = this.col();\n const value = this.node((s, a, b) => {\n const xv = x.v, c = cnt.v, sl = slope.v, ic = icpt.v, v = s.v;\n if (eligible(xv, a, b)) {\n const r = kernels()!.linreg(xv.subarray(0, b), p);\n v.set(r.value);\n sl.set(r.slope);\n ic.set(r.intercept);\n return;\n }\n for (let i = a; i < b; i++) {\n if (c[i]! < p) { sl[i] = NaN_; ic[i] = NaN_; v[i] = NaN_; continue; }\n let sy = 0, sxy = 0;\n for (let j = 0; j < p; j++) {\n const y = xv[i - p + 1 + j]!;\n sy += y;\n sxy += j * y;\n }\n const m = (p * sxy - sumX * sy) / div;\n const bb = (sy - m * sumX) / p;\n sl[i] = m;\n ic[i] = bb;\n v[i] = bb + m * (p - 1);\n }\n });\n return { value, slope: this.alias(slope), intercept: this.alias(icpt) };\n }\n\n /** A node that mirrors an aux column (so it can be returned as an output). */\n alias(c: Col): Node {\n return this.node((s, a, b) => {\n const src = c.v, v = s.v;\n for (let i = a; i < b; i++) v[i] = src[i]!;\n });\n }\n\n // ---- price helpers ----------------------------------------------------------\n\n /** True range: max(h-l, |h-c'|, |l-c'|); the first bar has no previous close, so is absent (TA-Lib TRANGE). */\n tr(): Node {\n const { high, low, close } = this;\n return this.node((s, a, b) => {\n const h = high.v, l = low.v, c = close.v, v = s.v;\n for (let i = a; i < b; i++) {\n if (i === 0) { v[i] = NaN_; continue; }\n const pc = c[i - 1]!;\n const r = h[i]! - l[i]!, u = Math.abs(h[i]! - pc), d = Math.abs(l[i]! - pc);\n v[i] = r > u ? (r > d ? r : d) : u > d ? u : d;\n }\n });\n }\n\n /** True range with the first bar's range as high - low (Wilder; Pine's `ta.tr(true)`). */\n trFirst(): Node {\n const { high, low, close } = this;\n return this.node((s, a, b) => {\n const h = high.v, l = low.v, c = close.v, v = s.v;\n for (let i = a; i < b; i++) {\n const r = h[i]! - l[i]!;\n if (i === 0) { v[i] = r; continue; }\n const pc = c[i - 1]!, u = Math.abs(h[i]! - pc), d = Math.abs(l[i]! - pc);\n v[i] = r > u ? (r > d ? r : d) : u > d ? u : d;\n }\n });\n }\n\n /**\n * Average true range as Wilder defined it: the first true range is high - low, the seed is the\n * mean of true ranges 0..p-1 (first value at bar p-1), then Wilder's smoothing. Not TA-Lib's ATR (TA-Lib skips the first\n * true range, so it starts one bar later and differs by a different seed).\n */\n atr(p: number): Node { return this.rma(this.trFirst(), p); }\n\n /**\n * Bars per year, read from the bars of this graph and from nothing after the bar it is written on (a causal annualisation). Intraday bars: the median number of bars per exchange-clock day over the\n * last {@link BPY_SESSIONS} finished days, times 252 sessions (nights and weekends add no bars). A day or longer between bars: 252 a\n * year for daily bars that leave weekends out, otherwise calendar time (365 days over the median spacing: weekly 52.14,\n * monthly 12.17), the median over the last {@link BPY_COARSE} bars. Constant within a day, so a finished bar's value never changes\n * when later bars arrive or the last bar is revised; absent before the first day has finished (and, for a day or\n * longer, before six bars). The day is cut at `offsetMin` minutes east of UTC: 0 suits every session inside one UTC day\n * (NSE, BSE, MCX, NYSE, LSE).\n */\n barsPerYear(offsetMin = 0): Node {\n const t = this.time, off = offsetMin * 60_000;\n const cnt = this.col();\n return this.node((s, a, b) => {\n const tv = t.v, cv = cnt.v, v = s.v;\n for (let i = a; i < b; i++) {\n const same = i > 0 && Math.floor((tv[i]! + off) / DAY_MS) === Math.floor((tv[i - 1]! + off) / DAY_MS);\n cv[i] = same ? cv[i - 1]! + 1 : 1;\n v[i] = same ? v[i - 1]! : i === 0 ? NaN_ : periodsPerYear(tv, cv, i);\n }\n });\n }\n}\n\nconst DAY_MS = 86_400_000;\nconst TRADING_DAYS = 252;\n/** Finished days whose bar counts the median is taken over (barsPerYear). */\nexport const BPY_SESSIONS = 60;\n/** Bars the spacing and the weekend test are read from when bars are a day or longer (barsPerYear). */\nexport const BPY_COARSE = 120;\n/** WEEKEND_SHARE: two adjacent weekdays holding at most this share of the bars means weekends are left out. */\nconst WEEKEND_SHARE = 0.05;\n\nfunction median(xs: number[]): number {\n xs.sort((p, q) => p - q);\n const m = xs.length >> 1;\n return xs.length % 2 === 0 ? (xs[m - 1]! + xs[m]!) / 2 : xs[m]!;\n}\n\n/** Periods per year at bar i > 0, which starts a new day; `cv[j]` is the number of bars of the day that ends at bar j. */\nfunction periodsPerYear(tv: Float64Array, cv: Float64Array, i: number): number {\n const counts: number[] = [];\n for (let j = i - 1; j >= 0 && counts.length < BPY_SESSIONS; j -= cv[j]!) counts.push(cv[j]!);\n const perDay = median(counts);\n if (perDay >= 2) return perDay * TRADING_DAYS;\n const lo = Math.max(0, i - BPY_COARSE + 1), n = i - lo + 1;\n if (n < 6) return NaN_;\n const gaps: number[] = [];\n for (let k = lo + 1; k <= i; k++) if (tv[k]! > tv[k - 1]!) gaps.push(tv[k]! - tv[k - 1]!);\n if (gaps.length === 0) return NaN_;\n const spacing = median(gaps);\n if (spacing >= DAY_MS && spacing < 1.5 * DAY_MS) {\n const week = [0, 0, 0, 0, 0, 0, 0];\n for (let k = lo; k <= i; k++) week[((Math.floor(tv[k]! / DAY_MS) % 7) + 7) % 7]!++;\n const quiet = Math.min(...week.map((c, d) => c + week[(d + 1) % 7]!));\n if (quiet <= Math.max(WEEKEND_SHARE * n, n >= 7 ? 1 : 0)) return (TRADING_DAYS * DAY_MS) / spacing;\n }\n return (365 * DAY_MS) / spacing;\n}\n\nexport function checkPeriod(p: number): void {\n if (!Number.isInteger(p) || p < 1) throw new RangeError(`period must be a positive integer, got ${p}`);\n}\n","// Authoring helpers for study definitions.\n\nimport type { InputDef, LineStyleName, MarkerShape, PlotDef, StudyDef } from \"./types.js\";\nimport { SOURCE_NAMES } from \"./engine/graph.js\";\n\nexport const int = (key: string, def: number, min = 1, max = 10_000, label = key): InputDef => ({ key, label, type: \"int\", default: def, min, max, step: 1 });\nexport const float = (key: string, def: number, min = -1e9, max = 1e9, step = 0.1, label = key): InputDef => ({ key, label, type: \"float\", default: def, min, max, step });\nexport const bool = (key: string, def: boolean, label = key): InputDef => ({ key, label, type: \"bool\", default: def });\nexport const select = (key: string, def: string, options: readonly string[], label = key): InputDef => ({ key, label, type: \"select\", default: def, options });\nexport const source = (def = \"close\", key = \"source\"): InputDef => ({ key, label: key, type: \"source\", default: def, options: SOURCE_NAMES });\n\nexport const COLORS = {\n blue: \"#2962FF\", orange: \"#FF6D00\", red: \"#F23645\", green: \"#089981\", purple: \"#9C27B0\",\n teal: \"#00897B\", yellow: \"#FBC02D\", pink: \"#E91E63\", gray: \"#787B86\", lime: \"#8BC34A\", cyan: \"#00BCD4\", brown: \"#795548\",\n} as const;\n\nexport const line = (col: string, color: string, o: { title?: string; key?: string; width?: number; style?: LineStyleName; offset?: number; connect?: boolean } = {}): PlotDef => ({\n kind: \"line\", key: o.key ?? col, title: o.title ?? col, col, color, ...(o.width !== undefined && { width: o.width }), ...(o.style && { style: o.style }), ...(o.offset !== undefined && { offset: o.offset }), ...(o.connect && { connect: true }),\n});\nexport const hist = (col: string, color: string, colorDown?: string, o: { title?: string; key?: string } = {}): PlotDef => ({\n kind: \"histogram\", key: o.key ?? col, title: o.title ?? col, col, color, ...(colorDown && { colorDown }),\n});\nexport const areaPlot = (col: string, color: string, o: { title?: string; key?: string } = {}): PlotDef => ({ kind: \"area\", key: o.key ?? col, title: o.title ?? col, col, color });\nexport const band = (key: string, upper: string, lower: string, color: string, fill: string, title = key): PlotDef => ({ kind: \"band\", key, title, upper, lower, color, fill });\nexport const fillBetween = (key: string, a: string, b: string, color: string, title = key): PlotDef => ({ kind: \"fill\", key, title, a, b, color });\nexport const hline = (key: string, value: number | ((p: import(\"./types.js\").Params) => number), color: string = COLORS.gray, style: LineStyleName = \"dashed\"): PlotDef => ({ kind: \"hline\", key, title: key, value, color, style });\nexport const markers = (col: string, shape: MarkerShape, position: \"value\" | \"above\" | \"below\" | \"sign\", color: string, o: { title?: string; key?: string; offset?: number; text?: boolean } = {}): PlotDef => ({\n kind: \"markers\", key: o.key ?? col, title: o.title ?? col, col, shape, position, color, ...(o.offset !== undefined && { offset: o.offset }), ...(o.text && { text: true }),\n});\n\nexport function defineStudy(def: StudyDef): StudyDef {\n return def;\n}\n"],"mappings":"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"}