@alphacharts/indicators 0.0.0-stage → 0.1.0

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 +95 -2
  3. package/dist/all-DeXJJd7D.js +21 -0
  4. package/dist/all-DeXJJd7D.js.map +1 -0
  5. package/dist/all.js +10 -0
  6. package/dist/all.js.map +1 -0
  7. package/dist/assets/worker-BrUuzTIJ.js +2 -0
  8. package/dist/assets/worker-BrUuzTIJ.js.map +1 -0
  9. package/dist/define-BPvQbaq9.js +472 -0
  10. package/dist/define-BPvQbaq9.js.map +1 -0
  11. package/dist/index.js +593 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/registry-CYZuqhXX.js +49 -0
  14. package/dist/registry-CYZuqhXX.js.map +1 -0
  15. package/dist/runner-DBP0M8z3.js +229 -0
  16. package/dist/runner-DBP0M8z3.js.map +1 -0
  17. package/dist/studies.js +1 -0
  18. package/dist/tv-volume-7hh6ajKt.js +3457 -0
  19. package/dist/tv-volume-7hh6ajKt.js.map +1 -0
  20. package/dist/types/all.d.ts +3 -0
  21. package/dist/types/chart/studies.d.ts +165 -0
  22. package/dist/types/define.d.ts +46 -0
  23. package/dist/types/engine/graph.d.ts +101 -0
  24. package/dist/types/engine/kernels.d.ts +9 -0
  25. package/dist/types/engine/study.d.ts +31 -0
  26. package/dist/types/index.d.ts +12 -0
  27. package/dist/types/registry.d.ts +7 -0
  28. package/dist/types/runner.d.ts +82 -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 +14 -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 +133 -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 +69 -3
@@ -0,0 +1,472 @@
1
+ //#region src/engine/kernels.ts
2
+ var e = null;
3
+ function t(t) {
4
+ e = t;
5
+ }
6
+ function n() {
7
+ return e;
8
+ }
9
+ function r(t, n, r) {
10
+ if (!e || n !== 0 || r < 4096) return !1;
11
+ for (let e = 0; e < r; e++) if (t[e] !== t[e]) return !1;
12
+ return !0;
13
+ }
14
+ //#endregion
15
+ //#region src/engine/graph.ts
16
+ var i = class {
17
+ v;
18
+ constructor(e) {
19
+ this.v = new Float64Array(e).fill(NaN);
20
+ }
21
+ }, a = class extends i {
22
+ run = () => {};
23
+ }, o = [
24
+ "close",
25
+ "open",
26
+ "high",
27
+ "low",
28
+ "hl2",
29
+ "hlc3",
30
+ "ohlc4",
31
+ "hlcc4"
32
+ ], s = NaN, c = class {
33
+ n = 0;
34
+ cap = 0;
35
+ cols = [];
36
+ nodes = [];
37
+ time;
38
+ open;
39
+ high;
40
+ low;
41
+ close;
42
+ volume;
43
+ sources = /* @__PURE__ */ new Map();
44
+ constructor(e = 0) {
45
+ this.cap = e, this.time = this.col(), this.open = this.col(), this.high = this.col(), this.low = this.col(), this.close = this.col(), this.volume = this.col();
46
+ }
47
+ col() {
48
+ let e = new i(this.cap);
49
+ return this.cols.push(e), e;
50
+ }
51
+ reserve(e) {
52
+ if (e <= this.cap) return;
53
+ let t = Math.max(e, Math.ceil(this.cap * 1.5), 256);
54
+ for (let e of this.cols) {
55
+ let n = new Float64Array(t).fill(s);
56
+ n.set(e.v.subarray(0, Math.min(this.n, e.v.length))), e.v = n;
57
+ }
58
+ this.cap = t;
59
+ }
60
+ run(e, t) {
61
+ if (t > this.cap) throw RangeError(`graph.run: ${t} bars exceed the reserved ${this.cap}`);
62
+ for (let n of this.nodes) n.run(e, t);
63
+ }
64
+ clear() {
65
+ for (let e of this.cols) e.v.fill(s, 0, this.n);
66
+ this.n = 0;
67
+ }
68
+ adopt(e, t) {
69
+ if (e.length !== this.cols.length) throw RangeError(`graph.adopt: ${e.length} columns, expected ${this.cols.length}`);
70
+ this.cols.forEach((t, n) => t.v = e[n]), this.cap = e[0]?.length ?? 0, this.n = t;
71
+ }
72
+ node(e) {
73
+ let t = new a(this.cap);
74
+ return t.run = (n, r) => e(t, n, r), this.cols.push(t), this.nodes.push(t), t;
75
+ }
76
+ calc(e) {
77
+ return this.node((t, n, r) => {
78
+ let i = t.v;
79
+ for (let t = n; t < r; t++) i[t] = e(t);
80
+ });
81
+ }
82
+ val(e) {
83
+ return typeof e == "number" ? () => e : (t) => e.v[t];
84
+ }
85
+ src(e) {
86
+ let t = this.sources.get(e);
87
+ if (t) return t;
88
+ let { open: n, high: r, low: i, close: a } = this, o;
89
+ switch (e) {
90
+ case "close":
91
+ o = this.map(a, (e) => e);
92
+ break;
93
+ case "open":
94
+ o = this.map(n, (e) => e);
95
+ break;
96
+ case "high":
97
+ o = this.map(r, (e) => e);
98
+ break;
99
+ case "low":
100
+ o = this.map(i, (e) => e);
101
+ break;
102
+ case "hl2":
103
+ o = this.node((e, t, n) => {
104
+ let a = r.v, o = i.v, s = e.v;
105
+ for (let e = t; e < n; e++) s[e] = (a[e] + o[e]) / 2;
106
+ });
107
+ break;
108
+ case "hlc3":
109
+ o = this.node((e, t, n) => {
110
+ let o = r.v, s = i.v, c = a.v, l = e.v;
111
+ for (let e = t; e < n; e++) l[e] = (o[e] + s[e] + c[e]) / 3;
112
+ });
113
+ break;
114
+ case "ohlc4":
115
+ o = this.node((e, t, o) => {
116
+ let s = n.v, c = r.v, l = i.v, u = a.v, d = e.v;
117
+ for (let e = t; e < o; e++) d[e] = (s[e] + c[e] + l[e] + u[e]) / 4;
118
+ });
119
+ break;
120
+ case "hlcc4":
121
+ o = this.node((e, t, n) => {
122
+ let o = r.v, s = i.v, c = a.v, l = e.v;
123
+ for (let e = t; e < n; e++) l[e] = (o[e] + s[e] + 2 * c[e]) / 4;
124
+ });
125
+ break;
126
+ default: throw RangeError(`unknown source "${String(e)}"`);
127
+ }
128
+ return this.sources.set(e, o), o;
129
+ }
130
+ map(e, t) {
131
+ return this.node((n, r, i) => {
132
+ let a = e.v, o = n.v;
133
+ for (let e = r; e < i; e++) o[e] = t(a[e]);
134
+ });
135
+ }
136
+ map2(e, t, n) {
137
+ let r = this.val(e), i = this.val(t);
138
+ return this.node((e, t, a) => {
139
+ let o = e.v;
140
+ for (let e = t; e < a; e++) o[e] = n(r(e), i(e));
141
+ });
142
+ }
143
+ add(e, t) {
144
+ return this.map2(e, t, (e, t) => e + t);
145
+ }
146
+ sub(e, t) {
147
+ return this.map2(e, t, (e, t) => e - t);
148
+ }
149
+ mul(e, t) {
150
+ return this.map2(e, t, (e, t) => e * t);
151
+ }
152
+ div(e, t) {
153
+ return this.map2(e, t, (e, t) => t === 0 ? s : e / t);
154
+ }
155
+ max2(e, t) {
156
+ return this.map2(e, t, (e, t) => e !== e || t !== t ? s : e > t ? e : t);
157
+ }
158
+ min2(e, t) {
159
+ return this.map2(e, t, (e, t) => e !== e || t !== t ? s : e < t ? e : t);
160
+ }
161
+ abs(e) {
162
+ return this.map(e, Math.abs);
163
+ }
164
+ neg(e) {
165
+ return this.map(e, (e) => -e);
166
+ }
167
+ lag(e, t) {
168
+ return this.node((n, r, i) => {
169
+ let a = e.v, o = n.v;
170
+ for (let e = r; e < i; e++) o[e] = e >= t ? a[e - t] : s;
171
+ });
172
+ }
173
+ change(e, t = 1) {
174
+ return this.node((n, r, i) => {
175
+ let a = e.v, o = n.v;
176
+ for (let e = r; e < i; e++) o[e] = e >= t ? a[e] - a[e - t] : s;
177
+ });
178
+ }
179
+ validRun(e) {
180
+ return this.node((t, n, r) => {
181
+ let i = e.v, a = t.v;
182
+ for (let e = n; e < r; e++) a[e] = i[e] === i[e] ? (e > 0 ? a[e - 1] : 0) + 1 : 0;
183
+ });
184
+ }
185
+ sum(e, t) {
186
+ if (l(t), t === 1) return this.map(e, (e) => e);
187
+ let i = this.validRun(e), a = this.col();
188
+ return this.node((o, c, l) => {
189
+ let u = e.v, d = i.v, f = a.v, p = o.v;
190
+ if (r(u, c, l)) {
191
+ let e = n().sumState(u.subarray(0, l), t);
192
+ p.set(e.sum), f.set(e.state);
193
+ } else for (let e = c; e < l; e++) {
194
+ let n = d[e];
195
+ if (n === 0) {
196
+ f[e] = 0, p[e] = s;
197
+ continue;
198
+ }
199
+ let r = (n > 1 ? f[e - 1] : 0) + u[e];
200
+ n > t && (r -= u[e - t]), f[e] = r, p[e] = n >= t ? r : s;
201
+ }
202
+ });
203
+ }
204
+ sma(e, t) {
205
+ let n = this.sum(e, t);
206
+ return this.map(n, (e) => e / t);
207
+ }
208
+ smooth(e, t, n) {
209
+ l(t);
210
+ let r = this.validRun(e);
211
+ return this.node((i, a, o) => {
212
+ let c = e.v, l = r.v, u = i.v;
213
+ for (let e = a; e < o; e++) {
214
+ let r = l[e];
215
+ if (r === 0) {
216
+ u[e] = s;
217
+ continue;
218
+ }
219
+ let i = e > 0 ? u[e - 1] : s;
220
+ if (i === i) u[e] = i + n * (c[e] - i);
221
+ else if (r >= t) {
222
+ let n = 0;
223
+ for (let r = e - t + 1; r <= e; r++) n += c[r];
224
+ u[e] = n / t;
225
+ } else u[e] = s;
226
+ }
227
+ });
228
+ }
229
+ ema(e, t) {
230
+ return this.smooth(e, t, 2 / (t + 1));
231
+ }
232
+ rma(e, t) {
233
+ return this.smooth(e, t, 1 / t);
234
+ }
235
+ wma(e, t) {
236
+ l(t);
237
+ let n = this.validRun(e), r = this.col(), i = this.col(), a = t * (t + 1) / 2;
238
+ return this.node((o, c, l) => {
239
+ let u = e.v, d = n.v, f = r.v, p = i.v, m = o.v;
240
+ for (let e = c; e < l; e++) {
241
+ let n = d[e];
242
+ if (n === 0) {
243
+ f[e] = 0, p[e] = 0, m[e] = s;
244
+ continue;
245
+ }
246
+ let r = u[e];
247
+ if (n < t) f[e] = (n > 1 ? f[e - 1] : 0) + r, p[e] = (n > 1 ? p[e - 1] : 0) + n * r, m[e] = s;
248
+ else if (n === t) f[e] = (n > 1 ? f[e - 1] : 0) + r, p[e] = (n > 1 ? p[e - 1] : 0) + t * r, m[e] = p[e] / a;
249
+ else {
250
+ let n = f[e - 1];
251
+ p[e] = p[e - 1] - n + t * r, f[e] = n - u[e - t] + r, m[e] = p[e] / a;
252
+ }
253
+ }
254
+ });
255
+ }
256
+ highest(e, t) {
257
+ return this.extreme(e, t, !0, !1);
258
+ }
259
+ lowest(e, t) {
260
+ return this.extreme(e, t, !1, !1);
261
+ }
262
+ highestBars(e, t, n = !1) {
263
+ return this.extreme(e, t, !0, !0, n);
264
+ }
265
+ lowestBars(e, t, n = !1) {
266
+ return this.extreme(e, t, !1, !0, n);
267
+ }
268
+ extreme(e, t, i, a, o = !1) {
269
+ l(t);
270
+ let c = this.validRun(e);
271
+ return this.node((l, u, d) => {
272
+ let f = e.v, p = c.v, m = l.v;
273
+ if (!o && r(f, u, d)) {
274
+ let e = n(), r = f.subarray(0, d);
275
+ m.set(a ? i ? e.highestBars(r, t) : e.lowestBars(r, t) : i ? e.highest(r, t) : e.lowest(r, t));
276
+ } else for (let e = u; e < d; e++) {
277
+ if (p[e] < t) {
278
+ m[e] = s;
279
+ continue;
280
+ }
281
+ let n = f[e], r = 0;
282
+ for (let a = 1; a < t; a++) {
283
+ let t = f[e - a];
284
+ (i ? o ? t >= n : t > n : o ? t <= n : t < n) && (n = t, r = a);
285
+ }
286
+ m[e] = a ? r : n;
287
+ }
288
+ });
289
+ }
290
+ variance(e, t) {
291
+ l(t);
292
+ let i = this.sma(e, t);
293
+ return this.node((a, o, c) => {
294
+ let l = e.v, u = i.v, d = a.v;
295
+ if (r(l, o, c)) d.set(n().variance(l.subarray(0, c), t));
296
+ else for (let e = o; e < c; e++) {
297
+ let n = u[e];
298
+ if (n !== n) {
299
+ d[e] = s;
300
+ continue;
301
+ }
302
+ let r = 0;
303
+ for (let i = e - t + 1; i <= e; i++) {
304
+ let e = l[i] - n;
305
+ r += e * e;
306
+ }
307
+ d[e] = r / t;
308
+ }
309
+ });
310
+ }
311
+ stdev(e, t) {
312
+ return this.map(this.variance(e, t), Math.sqrt);
313
+ }
314
+ linreg(e, t) {
315
+ if (!Number.isInteger(t) || t < 2) throw RangeError(`linreg: period must be an integer >= 2, got ${t}`);
316
+ let i = this.validRun(e), a = t * (t - 1) / 2, o = t * (t * (t - 1) * (2 * t - 1) / 6) - a * a, c = this.col(), l = this.col();
317
+ return {
318
+ value: this.node((u, d, f) => {
319
+ let p = e.v, m = i.v, h = c.v, g = l.v, _ = u.v;
320
+ if (r(p, d, f)) {
321
+ let e = n().linreg(p.subarray(0, f), t);
322
+ _.set(e.value), h.set(e.slope), g.set(e.intercept);
323
+ } else for (let e = d; e < f; e++) {
324
+ if (m[e] < t) {
325
+ h[e] = s, g[e] = s, _[e] = s;
326
+ continue;
327
+ }
328
+ let n = 0, r = 0;
329
+ for (let i = 0; i < t; i++) {
330
+ let a = p[e - t + 1 + i];
331
+ n += a, r += i * a;
332
+ }
333
+ let i = (t * r - a * n) / o, c = (n - i * a) / t;
334
+ h[e] = i, g[e] = c, _[e] = c + i * (t - 1);
335
+ }
336
+ }),
337
+ slope: this.alias(c),
338
+ intercept: this.alias(l)
339
+ };
340
+ }
341
+ alias(e) {
342
+ return this.node((t, n, r) => {
343
+ let i = e.v, a = t.v;
344
+ for (let e = n; e < r; e++) a[e] = i[e];
345
+ });
346
+ }
347
+ tr() {
348
+ let { high: e, low: t, close: n } = this;
349
+ return this.node((r, i, a) => {
350
+ let o = e.v, c = t.v, l = n.v, u = r.v;
351
+ for (let e = i; e < a; e++) {
352
+ if (e === 0) {
353
+ u[e] = s;
354
+ continue;
355
+ }
356
+ let t = l[e - 1], n = o[e] - c[e], r = Math.abs(o[e] - t), i = Math.abs(c[e] - t);
357
+ u[e] = n > r ? n > i ? n : i : r > i ? r : i;
358
+ }
359
+ });
360
+ }
361
+ atr(e) {
362
+ return this.rma(this.tr(), e);
363
+ }
364
+ };
365
+ function l(e) {
366
+ if (!Number.isInteger(e) || e < 1) throw RangeError(`period must be a positive integer, got ${e}`);
367
+ }
368
+ //#endregion
369
+ //#region src/define.ts
370
+ var u = (e, t, n = 1, r = 1e4, i = e) => ({
371
+ key: e,
372
+ label: i,
373
+ type: "int",
374
+ default: t,
375
+ min: n,
376
+ max: r,
377
+ step: 1
378
+ }), d = (e, t, n = -1e9, r = 1e9, i = .1, a = e) => ({
379
+ key: e,
380
+ label: a,
381
+ type: "float",
382
+ default: t,
383
+ min: n,
384
+ max: r,
385
+ step: i
386
+ }), f = (e, t, n = e) => ({
387
+ key: e,
388
+ label: n,
389
+ type: "bool",
390
+ default: t
391
+ }), p = (e, t, n, r = e) => ({
392
+ key: e,
393
+ label: r,
394
+ type: "select",
395
+ default: t,
396
+ options: n
397
+ }), m = (e = "close", t = "source") => ({
398
+ key: t,
399
+ label: t,
400
+ type: "source",
401
+ default: e,
402
+ options: o
403
+ }), h = {
404
+ blue: "#2962FF",
405
+ orange: "#FF6D00",
406
+ red: "#F23645",
407
+ green: "#089981",
408
+ purple: "#9C27B0",
409
+ teal: "#00897B",
410
+ yellow: "#FBC02D",
411
+ pink: "#E91E63",
412
+ gray: "#787B86",
413
+ lime: "#8BC34A",
414
+ cyan: "#00BCD4",
415
+ brown: "#795548"
416
+ }, g = (e, t, n = {}) => ({
417
+ kind: "line",
418
+ key: n.key ?? e,
419
+ title: n.title ?? e,
420
+ col: e,
421
+ color: t,
422
+ ...n.width !== void 0 && { width: n.width },
423
+ ...n.style && { style: n.style },
424
+ ...n.offset !== void 0 && { offset: n.offset },
425
+ ...n.connect && { connect: !0 }
426
+ }), _ = (e, t, n, r = {}) => ({
427
+ kind: "histogram",
428
+ key: r.key ?? e,
429
+ title: r.title ?? e,
430
+ col: e,
431
+ color: t,
432
+ ...n && { colorDown: n }
433
+ }), v = (e, t, n, r, i, a = e) => ({
434
+ kind: "band",
435
+ key: e,
436
+ title: a,
437
+ upper: t,
438
+ lower: n,
439
+ color: r,
440
+ fill: i
441
+ }), y = (e, t, n, r, i = e) => ({
442
+ kind: "fill",
443
+ key: e,
444
+ title: i,
445
+ a: t,
446
+ b: n,
447
+ color: r
448
+ }), b = (e, t, n = h.gray, r = "dashed") => ({
449
+ kind: "hline",
450
+ key: e,
451
+ title: e,
452
+ value: t,
453
+ color: n,
454
+ style: r
455
+ }), x = (e, t, n, r, i = {}) => ({
456
+ kind: "markers",
457
+ key: i.key ?? e,
458
+ title: i.title ?? e,
459
+ col: e,
460
+ shape: t,
461
+ position: n,
462
+ color: r,
463
+ ...i.offset !== void 0 && { offset: i.offset },
464
+ ...i.text && { text: !0 }
465
+ });
466
+ function S(e) {
467
+ return e;
468
+ }
469
+ //#endregion
470
+ export { o as _, y as a, b as c, x as d, p as f, a as g, c as h, S as i, u as l, i as m, v as n, d as o, m as p, f as r, _ as s, h as t, g as u, t as v };
471
+
472
+ //# sourceMappingURL=define-BPvQbaq9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-BPvQbaq9.js","names":["active","setKernels","k","kernels","eligible","from","to","i","x","Col","cap","Node","SOURCE_NAMES","NaN_","Graph","c","n","next","nd","buffers","body","a","b","v","fn","r","hit","name","close","open","high","low","h","l","s","o","xv","f","fx","fy","y","p","q","checkPeriod","cnt","acc","t","sm","prev","alpha","j","S","W","den","sv","wv","x1","s0","oldest","xs","bars","isMax","best","at","m","mv","mean","d","sumX","div","slope","icpt","sl","ic","sy","sxy","bb","src","pc","u","int","key","def","float","bool","select","source","COLORS","line","col","hist","colorDown","band","fillBetween","hline","markers","defineStudy"],"sources":["../src/engine/kernels.ts","../src/engine/graph.ts","../src/define.ts"],"sourcesContent":["// 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 { 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\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 // ---- 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 */\n variance(x: Col, p: number): Node {\n checkPeriod(p);\n const m = this.sma(x, p);\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 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] = t / p;\n }\n });\n }\n\n stdev(x: Col, p: number): Node { return this.map(this.variance(x, p), 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 atr(p: number): Node { return this.rma(this.tr(), p); }\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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"}