@alphacharts/indicators 0.1.0 → 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.
- package/README.md +19 -8
- package/dist/{all-DeXJJd7D.js → all-_xzUPrL7.js} +9 -9
- package/dist/{all-DeXJJd7D.js.map → all-_xzUPrL7.js.map} +1 -1
- package/dist/all.js +2 -2
- package/dist/define-XUgQMhSl.js +687 -0
- package/dist/define-XUgQMhSl.js.map +1 -0
- package/dist/index.js +269 -118
- package/dist/index.js.map +1 -1
- package/dist/{registry-CYZuqhXX.js → registry-DdYYyZN_.js} +5 -1
- package/dist/registry-DdYYyZN_.js.map +1 -0
- package/dist/{runner-DBP0M8z3.js → runner-B53M0IsJ.js} +15 -7
- package/dist/runner-B53M0IsJ.js.map +1 -0
- package/dist/studies.js +1 -1
- package/dist/{tv-volume-7hh6ajKt.js → tv-volume-BYSbfrVk.js} +197 -200
- package/dist/tv-volume-BYSbfrVk.js.map +1 -0
- package/dist/types/chart/marker-floor.d.ts +9 -0
- package/dist/types/chart/studies.d.ts +29 -2
- package/dist/types/engine/feed.d.ts +88 -0
- package/dist/types/engine/graph.d.ts +37 -2
- package/dist/types/engine/study.d.ts +9 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/runner.d.ts +11 -2
- package/dist/types/studies/tv-volume.d.ts +1 -0
- package/dist/types/types.d.ts +40 -4
- package/dist/worker.js +2 -2
- package/package.json +8 -5
- package/dist/assets/worker-BrUuzTIJ.js +0 -2
- package/dist/assets/worker-BrUuzTIJ.js.map +0 -1
- package/dist/define-BPvQbaq9.js +0 -472
- package/dist/define-BPvQbaq9.js.map +0 -1
- package/dist/registry-CYZuqhXX.js.map +0 -1
- package/dist/runner-DBP0M8z3.js.map +0 -1
- package/dist/tv-volume-7hh6ajKt.js.map +0 -1
package/dist/define-BPvQbaq9.js
DELETED
|
@@ -1,472 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry-CYZuqhXX.js","names":["studies","registerStudy","prev","def","validateDef","registerStudies","d","defs","getStudy","id","listStudies","cols","keys","need","c","key","p"],"sources":["../src/registry.ts"],"sourcesContent":["// Study registry. Studies are plain objects, so an app that imports only what it\n// uses (`import { rsi } from \"@alphacharts/indicators/studies\"`) ships only that;\n// the registry holds the ones an app registers by id (`registerStudies`).\n\nimport type { StudyDef } from \"./types.js\";\n\nconst studies = new Map<string, StudyDef>();\n\nexport function registerStudy(def: StudyDef): void {\n const prev = studies.get(def.id);\n if (prev === def) return;\n if (prev) throw new Error(`alphacharts: study \"${def.id}\" is already registered with a different definition`);\n validateDef(def);\n studies.set(def.id, def);\n}\n\nexport function registerStudies(defs: readonly StudyDef[]): void {\n for (const d of defs) registerStudy(d);\n}\n\nexport function getStudy(id: string): StudyDef {\n const d = studies.get(id);\n if (!d) throw new Error(`alphacharts: unknown study \"${id}\" (register it with registerStudy)`);\n return d;\n}\n\nexport function listStudies(): StudyDef[] {\n return [...studies.values()];\n}\n\n/** Catch an inconsistent definition when it is registered, not when it is drawn. */\nexport function validateDef(def: StudyDef): void {\n const cols = new Set(def.columns);\n if (cols.size !== def.columns.length) throw new Error(`${def.id}: duplicate column names`);\n const keys = new Set<string>();\n const need = (c: string, key: string) => {\n if (!cols.has(c)) throw new Error(`${def.id}: plot \"${key}\" uses unknown column \"${c}\"`);\n };\n for (const p of def.plots) {\n if (keys.has(p.key)) throw new Error(`${def.id}: duplicate plot key \"${p.key}\"`);\n keys.add(p.key);\n switch (p.kind) {\n case \"line\": case \"histogram\": case \"area\": case \"markers\": need(p.col, p.key); break;\n case \"band\": need(p.upper, p.key); need(p.lower, p.key); break;\n case \"fill\": need(p.a, p.key); need(p.b, p.key); break;\n case \"zigzag\": need(p.price, p.key); need(p.back, p.key); break;\n case \"hline\": break;\n }\n }\n}\n"],"mappings":";AAMA,IAAMA,oBAAU,IAAI,IAAsB;AAE1C,SAAgBC,EAAc,GAAqB;CACjD,IAAMC,IAAOF,EAAQ,IAAIG,EAAI,EAAE;CAC/B,IAAID,MAASC,GACb;MAAID,GAAM,MAAU,MAAM,uBAAuBC,EAAI,GAAG,oDAAoD;EAE5G,AADAC,EAAYD,CAAG,GACfH,EAAQ,IAAIG,EAAI,IAAIA,CAAG;CAFqF;AAG9G;AAEA,SAAgBE,EAAgB,GAAiC;CAC/D,KAAK,IAAMC,KAAKC,GAAM,EAAcD,CAAC;AACvC;AAEA,SAAgBE,EAAS,GAAsB;CAC7C,IAAMF,IAAIN,EAAQ,IAAIS,CAAE;CACxB,IAAI,CAACH,GAAG,MAAU,MAAM,+BAA+BG,EAAG,mCAAmC;CAC7F,OAAOH;AACT;AAEA,SAAgBI,IAA0B;CACxC,OAAO,CAAC,GAAGV,EAAQ,OAAO,CAAC;AAC7B;AAGA,SAAgBI,EAAY,GAAqB;CAC/C,IAAMO,IAAO,IAAI,IAAIR,EAAI,OAAO;CAChC,IAAIQ,EAAK,SAASR,EAAI,QAAQ,QAAQ,MAAU,MAAM,GAAGA,EAAI,GAAG,yBAAyB;CACzF,IAAMS,oBAAO,IAAI,IAAY,GACvBC,KAAQ,GAAW,MAAgB;EACvC,IAAI,CAACF,EAAK,IAAIG,CAAC,GAAG,MAAU,MAAM,GAAGX,EAAI,GAAG,UAAUY,EAAI,yBAAyBD,EAAE,EAAE;CACzF;CACA,KAAK,IAAME,KAAKb,EAAI,OAAO;EACzB,IAAIS,EAAK,IAAII,EAAE,GAAG,GAAG,MAAU,MAAM,GAAGb,EAAI,GAAG,wBAAwBa,EAAE,IAAI,EAAE;EAE/E,QADAJ,EAAK,IAAII,EAAE,GAAG,GACNA,EAAE,MAAV;GACE,KAAK;GAAQ,KAAK;GAAa,KAAK;GAAQ,KAAK;IAAW,EAAKA,EAAE,KAAKA,EAAE,GAAG;IAAG;GAChF,KAAK;IAA8B,AAAtBH,EAAKG,EAAE,OAAOA,EAAE,GAAG,GAAGH,EAAKG,EAAE,OAAOA,EAAE,GAAG;IAAG;GACzD,KAAK;IAA0B,AAAlBH,EAAKG,EAAE,GAAGA,EAAE,GAAG,GAAGH,EAAKG,EAAE,GAAGA,EAAE,GAAG;IAAG;GACjD,KAAK,UAAgC,AAAtBH,EAAKG,EAAE,OAAOA,EAAE,GAAG,GAAGH,EAAKG,EAAE,MAAMA,EAAE,GAAG;EAEzD;CACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner-DBP0M8z3.js","names":["SOURCE_NAMES","Graph","resolveParams","out","known","def","i","k","given","inp","v","checkInput","where","id","opts","StudyEngine","params","g","d","n","a","chunk","cancelled","pause","b","need","chk","name","runStudy","e","c","CHUNK","CancelledError","yieldNow","r","InlineRunner","req","WorkerRunner","worker","isBuiltin","m","p","err","transfer","serveWorker","data","find","buffers","createRunner","factory","builtinIds"],"sources":["../src/engine/study.ts","../src/runner.ts"],"sourcesContent":["// Running a study definition: parameter validation, the streaming engine and\n// the one-shot batch function the worker uses.\n\nimport { Graph, SOURCE_NAMES, type Col } from \"./graph.js\";\nimport type { BarColumns, BarInput, InputDef, InputValue, Params, StudyDef } from \"../types.js\";\n\n/** Validate `given` against the study's inputs and fill defaults. Throws on anything unknown or out of range. */\nexport function resolveParams(def: StudyDef, given: Readonly<Record<string, InputValue>> = {}): Params {\n const out: Record<string, InputValue> = {};\n const known = new Set(def.inputs.map((i) => i.key));\n for (const k of Object.keys(given)) if (!known.has(k)) throw new RangeError(`${def.id}: unknown input \"${k}\" (known: ${[...known].join(\", \") || \"none\"})`);\n for (const inp of def.inputs) {\n const v = given[inp.key] ?? inp.default;\n checkInput(def.id, inp, v);\n out[inp.key] = v;\n }\n return out;\n}\n\nfunction checkInput(id: string, inp: InputDef, v: InputValue): void {\n const where = `${id}.${inp.key}`;\n switch (inp.type) {\n case \"int\":\n case \"float\": {\n if (typeof v !== \"number\" || !Number.isFinite(v)) throw new TypeError(`${where}: expected a finite number, got ${String(v)}`);\n if (inp.type === \"int\" && !Number.isInteger(v)) throw new RangeError(`${where}: expected an integer, got ${v}`);\n if (inp.min !== undefined && v < inp.min) throw new RangeError(`${where}: ${v} is below the minimum ${inp.min}`);\n if (inp.max !== undefined && v > inp.max) throw new RangeError(`${where}: ${v} is above the maximum ${inp.max}`);\n return;\n }\n case \"bool\":\n if (typeof v !== \"boolean\") throw new TypeError(`${where}: expected a boolean, got ${String(v)}`);\n return;\n case \"source\":\n case \"select\": {\n const opts = inp.type === \"source\" ? (inp.options ?? SOURCE_NAMES) : inp.options;\n if (typeof v !== \"string\" || !opts?.includes(v)) throw new RangeError(`${where}: \"${String(v)}\" is not one of ${opts?.join(\", \") ?? \"(none)\"}`);\n }\n }\n}\n\n/** A study bound to parameters and a graph: appends, revises and batch-loads bars. */\nexport class StudyEngine {\n readonly graph: Graph;\n readonly outputs: readonly Col[];\n readonly params: Params;\n\n constructor(readonly def: StudyDef, params: Readonly<Record<string, InputValue>> = {}) {\n this.params = resolveParams(def, params);\n this.graph = new Graph();\n this.outputs = def.build(this.graph, this.params);\n if (this.outputs.length !== def.columns.length) throw new Error(`${def.id}: build returned ${this.outputs.length} columns, declared ${def.columns.length}`);\n }\n\n get length(): number {\n return this.graph.n;\n }\n\n /** Replace all bars and compute. */\n load(d: BarColumns): void {\n const g = this.graph;\n const n = d.time.length;\n this.requireColumns(d);\n g.clear();\n g.reserve(n);\n g.time.v.set(d.time);\n g.close.v.set(d.close);\n if (d.open) g.open.v.set(d.open);\n if (d.high) g.high.v.set(d.high);\n if (d.low) g.low.v.set(d.low);\n if (d.volume) g.volume.v.set(d.volume);\n g.n = n;\n g.run(0, n);\n }\n\n /**\n * Like `load`, but evaluates in chunks of `chunk` bars and awaits `pause()`\n * between them, so a runner can service cancel messages. Stops quietly and\n * returns false when `cancelled()` turns true.\n */\n async loadChunked(d: BarColumns, chunk: number, pause: () => Promise<void>, cancelled: () => boolean): Promise<boolean> {\n const g = this.graph;\n const n = d.time.length;\n this.requireColumns(d);\n g.clear();\n g.reserve(n);\n g.time.v.set(d.time);\n g.close.v.set(d.close);\n if (d.open) g.open.v.set(d.open);\n if (d.high) g.high.v.set(d.high);\n if (d.low) g.low.v.set(d.low);\n if (d.volume) g.volume.v.set(d.volume);\n g.n = n;\n for (let a = 0; a < n; a += chunk) {\n if (cancelled()) return false;\n g.run(a, Math.min(n, a + chunk));\n await pause();\n }\n return !cancelled();\n }\n\n /** Append a bar (time later than the last). */\n push(b: BarInput): void {\n const g = this.graph;\n const i = g.n;\n if (i > 0 && !(b.time > g.time.v[i - 1]!)) throw new RangeError(`push: time ${b.time} is not after the last bar ${g.time.v[i - 1]}`);\n g.reserve(i + 1);\n this.write(i, b);\n g.n = i + 1;\n g.run(i, i + 1);\n }\n\n /** Replace the last bar (a tick revision). */\n reviseLast(b: BarInput): void {\n const g = this.graph;\n const i = g.n - 1;\n if (i < 0) throw new RangeError(\"reviseLast: no bars\");\n if (b.time !== g.time.v[i]) throw new RangeError(`reviseLast: time ${b.time} differs from the last bar ${g.time.v[i]}`);\n this.write(i, b);\n g.run(i, i + 1);\n }\n\n /** Output column `k` as a view over the bars loaded (valid until the next push that grows the graph). */\n column(k: number): Float64Array {\n return this.outputs[k]!.v.subarray(0, this.graph.n);\n }\n\n private write(i: number, b: BarInput): void {\n const g = this.graph;\n g.time.v[i] = b.time;\n g.open.v[i] = b.open;\n g.high.v[i] = b.high;\n g.low.v[i] = b.low;\n g.close.v[i] = b.close;\n g.volume.v[i] = b.volume;\n }\n\n private requireColumns(d: BarColumns): void {\n const n = d.time.length;\n const need = this.def.needs;\n const chk = (name: string, a: Float64Array | undefined) => {\n if (!a) throw new TypeError(`${this.def.id} needs ${name} bars`);\n if (a.length !== n) throw new RangeError(`${this.def.id}: ${name} has ${a.length} rows, time has ${n}`);\n };\n chk(\"close\", d.close);\n if (need !== \"value\") for (const k of [\"open\", \"high\", \"low\"] as const) chk(k, d[k]);\n if (need === \"ohlcv\") chk(\"volume\", d.volume);\n }\n}\n\n/** One-shot: run a study over columns and return its output columns (copies, length n). */\nexport function runStudy(def: StudyDef, params: Readonly<Record<string, InputValue>>, d: BarColumns): Float64Array[] {\n const e = new StudyEngine(def, params);\n e.load(d);\n return e.outputs.map((c) => c.v.slice(0, e.length));\n}\n","// Running a study's batch computation off the UI thread.\n//\n// Protocol (structured clone; the arrays are transferred, never copied):\n// main -> worker { type: \"run\", id, studyId, params, bars } bars: BarColumns\n// { type: \"cancel\", id }\n// worker -> main { type: \"result\", id, n, buffers } every graph column, in registration order\n// { type: \"cancelled\", id }\n// { type: \"error\", id, message }\n// The worker evaluates in chunks and yields between them, so a cancel message\n// is serviced within one chunk. Only built-in studies (looked up by id in the\n// worker's own registry) run in a worker; a study defined at runtime does not\n// exist there, so `createRunner` callers use InlineRunner for it (`canRun`).\n\nimport { StudyEngine } from \"./engine/study.js\";\nimport type { BarColumns, InputValue, StudyDef } from \"./types.js\";\n\nexport const CHUNK = 1 << 16;\n\nexport interface RunRequest {\n studyId: string;\n params: Readonly<Record<string, InputValue>>;\n /** Transferred to the runner when it is a worker: do not use afterwards. */\n bars: BarColumns;\n}\n\nexport interface RunResult {\n n: number;\n /** All graph columns (inputs, state, outputs), in registration order. */\n buffers: Float64Array[];\n}\n\nexport class CancelledError extends Error {\n constructor() {\n super(\"study run cancelled\");\n this.name = \"CancelledError\";\n }\n}\n\nexport interface StudyRunner {\n /** Whether this runner can evaluate `def` (a worker only knows built-ins). */\n canRun(def: StudyDef): boolean;\n /** Rejects with CancelledError when `cancel(handle)` is called first. */\n run(def: StudyDef, req: RunRequest): { promise: Promise<RunResult>; cancel(): void };\n dispose(): void;\n}\n\nconst yieldNow = (): Promise<void> => new Promise((r) => setTimeout(r, 0));\n\n/** Main-thread fallback: same chunked evaluation, same cancellation. */\nexport class InlineRunner implements StudyRunner {\n canRun(): boolean {\n return true;\n }\n run(def: StudyDef, req: RunRequest) {\n let cancelled = false;\n const promise = (async (): Promise<RunResult> => {\n const e = new StudyEngine(def, req.params);\n const done = await e.loadChunked(req.bars, CHUNK, yieldNow, () => cancelled);\n if (!done) throw new CancelledError();\n return { n: e.length, buffers: e.graph.cols.map((c) => c.v) };\n })();\n return { promise, cancel: () => void (cancelled = true) };\n }\n dispose(): void {}\n}\n\nexport interface WorkerLike {\n postMessage(msg: unknown, transfer?: Transferable[]): void;\n addEventListener(type: \"message\", fn: (e: { data: unknown }) => void): void;\n addEventListener(type: \"error\", fn: (e: { message?: string }) => void): void;\n terminate(): void;\n}\n\ntype WorkerReply =\n | { type: \"result\"; id: number; n: number; buffers: Float64Array[] }\n | { type: \"cancelled\"; id: number }\n | { type: \"error\"; id: number; message: string };\n\n/** Runs built-in studies in a Web Worker. `isBuiltin` says which ids the worker knows. */\nexport class WorkerRunner implements StudyRunner {\n private nextId = 1;\n /** Set once the worker has failed: later runs reject at once instead of waiting on a dead worker. */\n private dead: Error | null = null;\n private readonly pending = new Map<number, { resolve(r: RunResult): void; reject(e: Error): void }>();\n\n constructor(private readonly worker: WorkerLike, private readonly isBuiltin: (def: StudyDef) => boolean) {\n worker.addEventListener(\"message\", (e) => {\n const m = e.data as WorkerReply;\n const p = this.pending.get(m.id);\n if (!p) return;\n this.pending.delete(m.id);\n if (m.type === \"result\") p.resolve({ n: m.n, buffers: m.buffers });\n else if (m.type === \"cancelled\") p.reject(new CancelledError());\n else p.reject(new Error(`study worker: ${m.message}`));\n });\n worker.addEventListener(\"error\", (e) => {\n const err = new Error(`study worker failed: ${e.message ?? \"unknown error\"}`);\n this.dead = err;\n for (const p of this.pending.values()) p.reject(err);\n this.pending.clear();\n });\n }\n\n canRun(def: StudyDef): boolean {\n return this.isBuiltin(def);\n }\n\n run(def: StudyDef, req: RunRequest) {\n if (this.dead) return { promise: Promise.reject(this.dead), cancel: () => {} };\n const id = this.nextId++;\n const promise = new Promise<RunResult>((resolve, reject) => {\n this.pending.set(id, { resolve, reject });\n const b = req.bars;\n const transfer = [b.time, b.close, b.open, b.high, b.low, b.volume].filter((a): a is Float64Array => !!a).map((a) => a.buffer);\n this.worker.postMessage({ type: \"run\", id, studyId: def.id, params: req.params, bars: b }, transfer);\n });\n return { promise, cancel: () => this.worker.postMessage({ type: \"cancel\", id }) };\n }\n\n dispose(): void {\n this.worker.terminate();\n const err = new CancelledError();\n for (const p of this.pending.values()) p.reject(err);\n this.pending.clear();\n }\n}\n\n/** Worker-side message handler: wire it to `self.onmessage` (see worker.ts). */\nexport function serveWorker(\n post: (msg: WorkerReply, transfer?: Transferable[]) => void,\n find: (id: string) => StudyDef | undefined,\n): (data: unknown) => void {\n const cancelled = new Set<number>();\n return (data) => {\n const m = data as { type: string; id: number; studyId?: string; params?: Record<string, InputValue>; bars?: BarColumns };\n if (m.type === \"cancel\") {\n cancelled.add(m.id);\n return;\n }\n if (m.type !== \"run\") return;\n void (async () => {\n try {\n const def = find(m.studyId!);\n if (!def) throw new Error(`unknown study \"${m.studyId}\"`);\n const e = new StudyEngine(def, m.params ?? {});\n const done = await e.loadChunked(m.bars!, CHUNK, yieldNow, () => cancelled.has(m.id));\n if (!done) {\n post({ type: \"cancelled\", id: m.id });\n return;\n }\n const buffers = e.graph.cols.map((c) => c.v);\n post({ type: \"result\", id: m.id, n: e.length, buffers }, buffers.map((b) => b.buffer));\n } catch (err) {\n post({ type: \"error\", id: m.id, message: err instanceof Error ? err.message : String(err) });\n } finally {\n cancelled.delete(m.id);\n }\n })();\n };\n}\n\n/**\n * A worker runner when Workers exist and start, otherwise the inline fallback.\n * `factory` creates the worker (default: dist/worker.js next to this module).\n */\nexport function createRunner(builtinIds: ReadonlySet<string>, factory?: () => WorkerLike): StudyRunner {\n try {\n if (typeof Worker === \"undefined\" && !factory) return new InlineRunner();\n const w = factory ? factory() : (new Worker(new URL(\"./worker.js\", import.meta.url), { type: \"module\" }) as unknown as WorkerLike);\n return new WorkerRunner(w, (d) => builtinIds.has(d.id));\n } catch {\n return new InlineRunner();\n }\n}\n"],"mappings":"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"}
|