@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,687 @@
1
+ //#region src/engine/feed.ts
2
+ var e = [
3
+ "open",
4
+ "high",
5
+ "low",
6
+ "close",
7
+ "volume"
8
+ ], t = class {
9
+ graph = new p();
10
+ align = "same";
11
+ spanMs = 0;
12
+ cur = 0;
13
+ get n() {
14
+ return this.graph.n;
15
+ }
16
+ load(t, r, i = "outside series") {
17
+ n(r, i);
18
+ let a = t.time.length;
19
+ for (let n of e) {
20
+ if (!(t[n] instanceof Float64Array)) throw TypeError(`${i}: ${n} must be a Float64Array`);
21
+ if (t[n].length !== a) throw RangeError(`${i}: ${n} has ${t[n].length} rows, time has ${a}`);
22
+ }
23
+ for (let e = 0; e < a; e++) {
24
+ if (!Number.isFinite(t.time[e])) throw RangeError(`${i}: time at row ${e} is not a finite number`);
25
+ if (e > 0 && !(t.time[e] > t.time[e - 1])) throw RangeError(`${i}: times must be strictly increasing (row ${e})`);
26
+ }
27
+ let o = this.graph;
28
+ o.clear(), o.reserve(a), o.time.v.set(t.time);
29
+ for (let n of e) o[n].v.set(t[n]);
30
+ o.n = a, o.run(0, a), this.cur = 0, this.align = r.align, this.spanMs = r.spanMs;
31
+ }
32
+ configure(e, t = "outside series") {
33
+ n(e, t), this.align = e.align, this.spanMs = e.spanMs;
34
+ }
35
+ apply(t, n = "outside series") {
36
+ let r = this.graph, i = r.n;
37
+ if (!Number.isFinite(t.time)) throw RangeError(`${n}: bar time is not a finite number`);
38
+ if (i > 0 && t.time < r.time.v[i - 1]) throw RangeError(`${n}: bar time ${t.time} is earlier than the last bar ${r.time.v[i - 1]}; load the series again instead`);
39
+ let a = i > 0 && t.time === r.time.v[i - 1], o = a ? i - 1 : i;
40
+ a || (r.reserve(i + 1), r.n = i + 1), r.time.v[o] = t.time;
41
+ for (let n of e) r[n].v[o] = t[n];
42
+ return r.run(o, o + 1), a ? "revised" : "appended";
43
+ }
44
+ snapshot() {
45
+ let e = this.graph, t = e.n;
46
+ return {
47
+ time: e.time.v.slice(0, t),
48
+ open: e.open.v.slice(0, t),
49
+ high: e.high.v.slice(0, t),
50
+ low: e.low.v.slice(0, t),
51
+ close: e.close.v.slice(0, t),
52
+ volume: e.volume.v.slice(0, t)
53
+ };
54
+ }
55
+ lookup(e) {
56
+ let t = this.graph.n;
57
+ if (t === 0 || e !== e) return -1;
58
+ let n = this.graph.time.v, r = this.align === "same" ? e : e - this.spanMs, i = this.cur < t ? this.cur : t - 1;
59
+ if (n[i] <= r) for (; i + 1 < t && n[i + 1] <= r;) i++;
60
+ else {
61
+ let e = 0, t = i;
62
+ for (; e < t;) {
63
+ let i = e + t >>> 1;
64
+ n[i] <= r ? e = i + 1 : t = i;
65
+ }
66
+ if (i = e - 1, i < 0) return -1;
67
+ }
68
+ return this.cur = i, this.align === "same" ? n[i] === e ? i : -1 : i;
69
+ }
70
+ value(e, t) {
71
+ return t < 0 ? NaN : this.graph[e].v[t];
72
+ }
73
+ };
74
+ function n(e, t) {
75
+ if (e.align !== "same" && e.align !== "closed") throw RangeError(`${t}: align must be "same" or "closed", got ${String(e.align)}`);
76
+ if (e.align === "closed" && !(Number.isFinite(e.spanMs) && e.spanMs > 0)) throw RangeError(`${t}: a "closed" feed needs spanMs > 0, got ${String(e.spanMs)}`);
77
+ }
78
+ function r(e, t, n) {
79
+ let r = new Float64Array(n.length);
80
+ for (let i = 0; i < n.length; i++) r[i] = e.value(t, e.lookup(n[i]));
81
+ return r;
82
+ }
83
+ function i(e, t, r) {
84
+ n(r, "outside series");
85
+ let i = e.length, a = t.length, o = {
86
+ align: r.align,
87
+ chartBars: i
88
+ };
89
+ if (i === 0 || a === 0) return {
90
+ ...o,
91
+ matched: 0,
92
+ reason: "empty",
93
+ offsetMs: null,
94
+ message: i === 0 ? "The chart has no bars." : "The outside series has no bars."
95
+ };
96
+ let s = 0, c = 0;
97
+ for (let n = 0; n < i; n++) {
98
+ let i = e[n];
99
+ if (r.align === "same") {
100
+ for (; c < a && t[c] < i;) c++;
101
+ c < a && t[c] === i && s++;
102
+ } else {
103
+ let e = i - r.spanMs;
104
+ for (; c < a && t[c] <= e;) c++;
105
+ c > 0 && s++;
106
+ }
107
+ }
108
+ if (s === i) return {
109
+ ...o,
110
+ matched: s,
111
+ reason: "complete",
112
+ offsetMs: null,
113
+ message: "Every chart bar sees a bar of the outside series."
114
+ };
115
+ if (s > 0) return {
116
+ ...o,
117
+ matched: s,
118
+ reason: "partial",
119
+ offsetMs: null,
120
+ message: `${i - s} of ${i} chart bars have no bar of the outside series and are blank (a missing bar is never filled).`
121
+ };
122
+ if (r.align === "closed") return {
123
+ ...o,
124
+ matched: s,
125
+ reason: "no-finished-bar",
126
+ offsetMs: null,
127
+ message: "No bar of the outside series has finished by any chart bar, so every value is blank."
128
+ };
129
+ let l = (t[0] - e[0]) % r.spanMs;
130
+ l > r.spanMs / 2 ? l -= r.spanMs : l <= -r.spanMs / 2 && (l += r.spanMs);
131
+ let u = Math.round(Math.abs(l) / 6e4), d = l === 0 ? "its bars never fall at the same time as the chart's (the two do not trade at the same times)" : `its bars open ${u} minute${u === 1 ? "" : "s"} ${l > 0 ? "after" : "before"} the chart's`;
132
+ return {
133
+ ...o,
134
+ matched: s,
135
+ reason: "different-clock",
136
+ offsetMs: l,
137
+ message: `No chart bar has a bar of the outside series at exactly its time, so every value is blank: ${d}. 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.`
138
+ };
139
+ }
140
+ //#endregion
141
+ //#region src/engine/kernels.ts
142
+ var a = null;
143
+ function o(e) {
144
+ a = e;
145
+ }
146
+ function s() {
147
+ return a;
148
+ }
149
+ function c(e, t, n) {
150
+ if (!a || t !== 0 || n < 4096) return !1;
151
+ for (let t = 0; t < n; t++) if (e[t] !== e[t]) return !1;
152
+ return !0;
153
+ }
154
+ //#endregion
155
+ //#region src/engine/graph.ts
156
+ var l = class {
157
+ v;
158
+ constructor(e) {
159
+ this.v = new Float64Array(e).fill(NaN);
160
+ }
161
+ }, u = class extends l {
162
+ run = () => {};
163
+ }, d = [
164
+ "close",
165
+ "open",
166
+ "high",
167
+ "low",
168
+ "hl2",
169
+ "hlc3",
170
+ "ohlc4",
171
+ "hlcc4"
172
+ ], f = NaN, p = class {
173
+ n = 0;
174
+ cap = 0;
175
+ cols = [];
176
+ nodes = [];
177
+ time;
178
+ open;
179
+ high;
180
+ low;
181
+ close;
182
+ volume;
183
+ sources = /* @__PURE__ */ new Map();
184
+ feeds = /* @__PURE__ */ new Map();
185
+ constructor(e = 0) {
186
+ 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();
187
+ }
188
+ col() {
189
+ let e = new l(this.cap);
190
+ return this.cols.push(e), e;
191
+ }
192
+ reserve(e) {
193
+ if (e <= this.cap) return;
194
+ let t = Math.max(e, Math.ceil(this.cap * 1.5), 256);
195
+ for (let e of this.cols) {
196
+ let n = new Float64Array(t).fill(f);
197
+ n.set(e.v.subarray(0, Math.min(this.n, e.v.length))), e.v = n;
198
+ }
199
+ this.cap = t;
200
+ }
201
+ run(e, t) {
202
+ if (t > this.cap) throw RangeError(`graph.run: ${t} bars exceed the reserved ${this.cap}`);
203
+ for (let n of this.nodes) n.run(e, t);
204
+ }
205
+ clear() {
206
+ for (let e of this.cols) e.v.fill(f, 0, this.n);
207
+ this.n = 0;
208
+ }
209
+ adopt(e, t) {
210
+ if (e.length !== this.cols.length) throw RangeError(`graph.adopt: ${e.length} columns, expected ${this.cols.length}`);
211
+ this.cols.forEach((t, n) => t.v = e[n]), this.cap = e[0]?.length ?? 0, this.n = t;
212
+ }
213
+ node(e) {
214
+ let t = new u(this.cap);
215
+ return t.run = (n, r) => e(t, n, r), this.cols.push(t), this.nodes.push(t), t;
216
+ }
217
+ calc(e) {
218
+ return this.node((t, n, r) => {
219
+ let i = t.v;
220
+ for (let t = n; t < r; t++) i[t] = e(t);
221
+ });
222
+ }
223
+ val(e) {
224
+ return typeof e == "number" ? () => e : (t) => e.v[t];
225
+ }
226
+ src(e) {
227
+ let t = this.sources.get(e);
228
+ if (t) return t;
229
+ let { open: n, high: r, low: i, close: a } = this, o;
230
+ switch (e) {
231
+ case "close":
232
+ o = this.map(a, (e) => e);
233
+ break;
234
+ case "open":
235
+ o = this.map(n, (e) => e);
236
+ break;
237
+ case "high":
238
+ o = this.map(r, (e) => e);
239
+ break;
240
+ case "low":
241
+ o = this.map(i, (e) => e);
242
+ break;
243
+ case "hl2":
244
+ o = this.node((e, t, n) => {
245
+ let a = r.v, o = i.v, s = e.v;
246
+ for (let e = t; e < n; e++) s[e] = (a[e] + o[e]) / 2;
247
+ });
248
+ break;
249
+ case "hlc3":
250
+ o = this.node((e, t, n) => {
251
+ let o = r.v, s = i.v, c = a.v, l = e.v;
252
+ for (let e = t; e < n; e++) l[e] = (o[e] + s[e] + c[e]) / 3;
253
+ });
254
+ break;
255
+ case "ohlc4":
256
+ o = this.node((e, t, o) => {
257
+ let s = n.v, c = r.v, l = i.v, u = a.v, d = e.v;
258
+ for (let e = t; e < o; e++) d[e] = (s[e] + c[e] + l[e] + u[e]) / 4;
259
+ });
260
+ break;
261
+ case "hlcc4":
262
+ o = this.node((e, t, n) => {
263
+ let o = r.v, s = i.v, c = a.v, l = e.v;
264
+ for (let e = t; e < n; e++) l[e] = (o[e] + s[e] + 2 * c[e]) / 4;
265
+ });
266
+ break;
267
+ default: throw RangeError(`unknown source "${String(e)}"`);
268
+ }
269
+ return this.sources.set(e, o), o;
270
+ }
271
+ feed(e) {
272
+ let n = this.feeds.get(e);
273
+ return n || this.feeds.set(e, n = new t()), n;
274
+ }
275
+ external(e, t) {
276
+ return this.joined(e, t);
277
+ }
278
+ joined(e, t) {
279
+ let n = this.feed(e), r = this.time;
280
+ return this.node((i, a, o) => {
281
+ let s = r.v, c = i.v, l = this.feeds.get(e) ?? n, u = typeof t == "string" ? l.graph[t] : t;
282
+ for (let e = a; e < o; e++) {
283
+ let t = l.lookup(s[e]);
284
+ c[e] = t < 0 ? f : u.v[t];
285
+ }
286
+ });
287
+ }
288
+ map(e, t) {
289
+ return this.node((n, r, i) => {
290
+ let a = e.v, o = n.v;
291
+ for (let e = r; e < i; e++) o[e] = t(a[e]);
292
+ });
293
+ }
294
+ map2(e, t, n) {
295
+ let r = this.val(e), i = this.val(t);
296
+ return this.node((e, t, a) => {
297
+ let o = e.v;
298
+ for (let e = t; e < a; e++) o[e] = n(r(e), i(e));
299
+ });
300
+ }
301
+ add(e, t) {
302
+ return this.map2(e, t, (e, t) => e + t);
303
+ }
304
+ sub(e, t) {
305
+ return this.map2(e, t, (e, t) => e - t);
306
+ }
307
+ mul(e, t) {
308
+ return this.map2(e, t, (e, t) => e * t);
309
+ }
310
+ div(e, t) {
311
+ return this.map2(e, t, (e, t) => t === 0 ? f : e / t);
312
+ }
313
+ max2(e, t) {
314
+ return this.map2(e, t, (e, t) => e !== e || t !== t ? f : e > t ? e : t);
315
+ }
316
+ min2(e, t) {
317
+ return this.map2(e, t, (e, t) => e !== e || t !== t ? f : e < t ? e : t);
318
+ }
319
+ abs(e) {
320
+ return this.map(e, Math.abs);
321
+ }
322
+ neg(e) {
323
+ return this.map(e, (e) => -e);
324
+ }
325
+ lag(e, t) {
326
+ return this.node((n, r, i) => {
327
+ let a = e.v, o = n.v;
328
+ for (let e = r; e < i; e++) o[e] = e >= t ? a[e - t] : f;
329
+ });
330
+ }
331
+ change(e, t = 1) {
332
+ return this.node((n, r, i) => {
333
+ let a = e.v, o = n.v;
334
+ for (let e = r; e < i; e++) o[e] = e >= t ? a[e] - a[e - t] : f;
335
+ });
336
+ }
337
+ validRun(e) {
338
+ return this.node((t, n, r) => {
339
+ let i = e.v, a = t.v;
340
+ for (let e = n; e < r; e++) a[e] = i[e] === i[e] ? (e > 0 ? a[e - 1] : 0) + 1 : 0;
341
+ });
342
+ }
343
+ sum(e, t) {
344
+ if (y(t), t === 1) return this.map(e, (e) => e);
345
+ let n = this.validRun(e), r = this.col();
346
+ return this.node((i, a, o) => {
347
+ let l = e.v, u = n.v, d = r.v, p = i.v;
348
+ if (c(l, a, o)) {
349
+ let e = s().sumState(l.subarray(0, o), t);
350
+ p.set(e.sum), d.set(e.state);
351
+ } else for (let e = a; e < o; e++) {
352
+ let n = u[e];
353
+ if (n === 0) {
354
+ d[e] = 0, p[e] = f;
355
+ continue;
356
+ }
357
+ let r = (n > 1 ? d[e - 1] : 0) + l[e];
358
+ n > t && (r -= l[e - t]), d[e] = r, p[e] = n >= t ? r : f;
359
+ }
360
+ });
361
+ }
362
+ sma(e, t) {
363
+ let n = this.sum(e, t);
364
+ return this.map(n, (e) => e / t);
365
+ }
366
+ smooth(e, t, n) {
367
+ y(t);
368
+ let r = this.validRun(e);
369
+ return this.node((i, a, o) => {
370
+ let s = e.v, c = r.v, l = i.v;
371
+ for (let e = a; e < o; e++) {
372
+ let r = c[e];
373
+ if (r === 0) {
374
+ l[e] = f;
375
+ continue;
376
+ }
377
+ let i = e > 0 ? l[e - 1] : f;
378
+ if (i === i) l[e] = i + n * (s[e] - i);
379
+ else if (r >= t) {
380
+ let n = 0;
381
+ for (let r = e - t + 1; r <= e; r++) n += s[r];
382
+ l[e] = n / t;
383
+ } else l[e] = f;
384
+ }
385
+ });
386
+ }
387
+ ema(e, t) {
388
+ return this.smooth(e, t, 2 / (t + 1));
389
+ }
390
+ rma(e, t) {
391
+ return this.smooth(e, t, 1 / t);
392
+ }
393
+ wma(e, t) {
394
+ y(t);
395
+ let n = this.validRun(e), r = this.col(), i = this.col(), a = t * (t + 1) / 2;
396
+ return this.node((o, s, c) => {
397
+ let l = e.v, u = n.v, d = r.v, p = i.v, m = o.v;
398
+ for (let e = s; e < c; e++) {
399
+ let n = u[e];
400
+ if (n === 0) {
401
+ d[e] = 0, p[e] = 0, m[e] = f;
402
+ continue;
403
+ }
404
+ let r = l[e];
405
+ if (n < t) d[e] = (n > 1 ? d[e - 1] : 0) + r, p[e] = (n > 1 ? p[e - 1] : 0) + n * r, m[e] = f;
406
+ else if (n === t) d[e] = (n > 1 ? d[e - 1] : 0) + r, p[e] = (n > 1 ? p[e - 1] : 0) + t * r, m[e] = p[e] / a;
407
+ else {
408
+ let n = d[e - 1];
409
+ p[e] = p[e - 1] - n + t * r, d[e] = n - l[e - t] + r, m[e] = p[e] / a;
410
+ }
411
+ }
412
+ });
413
+ }
414
+ highest(e, t) {
415
+ return this.extreme(e, t, !0, !1);
416
+ }
417
+ lowest(e, t) {
418
+ return this.extreme(e, t, !1, !1);
419
+ }
420
+ highestBars(e, t, n = !1) {
421
+ return this.extreme(e, t, !0, !0, n);
422
+ }
423
+ lowestBars(e, t, n = !1) {
424
+ return this.extreme(e, t, !1, !0, n);
425
+ }
426
+ extreme(e, t, n, r, i = !1) {
427
+ y(t);
428
+ let a = this.validRun(e);
429
+ return this.node((o, l, u) => {
430
+ let d = e.v, p = a.v, m = o.v;
431
+ if (!i && c(d, l, u)) {
432
+ let e = s(), i = d.subarray(0, u);
433
+ m.set(r ? n ? e.highestBars(i, t) : e.lowestBars(i, t) : n ? e.highest(i, t) : e.lowest(i, t));
434
+ } else for (let e = l; e < u; e++) {
435
+ if (p[e] < t) {
436
+ m[e] = f;
437
+ continue;
438
+ }
439
+ let a = d[e], o = 0;
440
+ for (let r = 1; r < t; r++) {
441
+ let t = d[e - r];
442
+ (n ? i ? t >= a : t > a : i ? t <= a : t < a) && (a = t, o = r);
443
+ }
444
+ m[e] = r ? o : a;
445
+ }
446
+ });
447
+ }
448
+ variance(e, t, n = !1) {
449
+ if (y(t), n && t < 2) throw RangeError(`sample variance needs a period of at least 2, got ${t}`);
450
+ let r = this.sma(e, t), i = n ? t / (t - 1) : 1;
451
+ return this.node((a, o, l) => {
452
+ let u = e.v, d = r.v, p = a.v;
453
+ if (c(u, o, l)) {
454
+ if (p.set(s().variance(u.subarray(0, l), t)), n) for (let e = 0; e < l; e++) p[e] = p[e] * i;
455
+ } else for (let e = o; e < l; e++) {
456
+ let r = d[e];
457
+ if (r !== r) {
458
+ p[e] = f;
459
+ continue;
460
+ }
461
+ let i = 0;
462
+ for (let n = e - t + 1; n <= e; n++) {
463
+ let e = u[n] - r;
464
+ i += e * e;
465
+ }
466
+ p[e] = n ? i / (t - 1) : i / t;
467
+ }
468
+ });
469
+ }
470
+ stdev(e, t, n = !1) {
471
+ return this.map(this.variance(e, t, n), Math.sqrt);
472
+ }
473
+ linreg(e, t) {
474
+ if (!Number.isInteger(t) || t < 2) throw RangeError(`linreg: period must be an integer >= 2, got ${t}`);
475
+ let n = this.validRun(e), r = t * (t - 1) / 2, i = t * (t * (t - 1) * (2 * t - 1) / 6) - r * r, a = this.col(), o = this.col();
476
+ return {
477
+ value: this.node((l, u, d) => {
478
+ let p = e.v, m = n.v, h = a.v, g = o.v, _ = l.v;
479
+ if (c(p, u, d)) {
480
+ let e = s().linreg(p.subarray(0, d), t);
481
+ _.set(e.value), h.set(e.slope), g.set(e.intercept);
482
+ } else for (let e = u; e < d; e++) {
483
+ if (m[e] < t) {
484
+ h[e] = f, g[e] = f, _[e] = f;
485
+ continue;
486
+ }
487
+ let n = 0, a = 0;
488
+ for (let r = 0; r < t; r++) {
489
+ let i = p[e - t + 1 + r];
490
+ n += i, a += r * i;
491
+ }
492
+ let o = (t * a - r * n) / i, s = (n - o * r) / t;
493
+ h[e] = o, g[e] = s, _[e] = s + o * (t - 1);
494
+ }
495
+ }),
496
+ slope: this.alias(a),
497
+ intercept: this.alias(o)
498
+ };
499
+ }
500
+ alias(e) {
501
+ return this.node((t, n, r) => {
502
+ let i = e.v, a = t.v;
503
+ for (let e = n; e < r; e++) a[e] = i[e];
504
+ });
505
+ }
506
+ tr() {
507
+ let { high: e, low: t, close: n } = this;
508
+ return this.node((r, i, a) => {
509
+ let o = e.v, s = t.v, c = n.v, l = r.v;
510
+ for (let e = i; e < a; e++) {
511
+ if (e === 0) {
512
+ l[e] = f;
513
+ continue;
514
+ }
515
+ let t = c[e - 1], n = o[e] - s[e], r = Math.abs(o[e] - t), i = Math.abs(s[e] - t);
516
+ l[e] = n > r ? n > i ? n : i : r > i ? r : i;
517
+ }
518
+ });
519
+ }
520
+ trFirst() {
521
+ let { high: e, low: t, close: n } = this;
522
+ return this.node((r, i, a) => {
523
+ let o = e.v, s = t.v, c = n.v, l = r.v;
524
+ for (let e = i; e < a; e++) {
525
+ let t = o[e] - s[e];
526
+ if (e === 0) {
527
+ l[e] = t;
528
+ continue;
529
+ }
530
+ let n = c[e - 1], r = Math.abs(o[e] - n), i = Math.abs(s[e] - n);
531
+ l[e] = t > r ? t > i ? t : i : r > i ? r : i;
532
+ }
533
+ });
534
+ }
535
+ atr(e) {
536
+ return this.rma(this.trFirst(), e);
537
+ }
538
+ barsPerYear(e = 0) {
539
+ let t = this.time, n = e * 6e4, r = this.col();
540
+ return this.node((e, i, a) => {
541
+ let o = t.v, s = r.v, c = e.v;
542
+ for (let e = i; e < a; e++) {
543
+ let t = e > 0 && Math.floor((o[e] + n) / m) === Math.floor((o[e - 1] + n) / m);
544
+ s[e] = t ? s[e - 1] + 1 : 1, c[e] = t ? c[e - 1] : e === 0 ? f : v(o, s, e);
545
+ }
546
+ });
547
+ }
548
+ }, m = 864e5, h = 252, g = .05;
549
+ function _(e) {
550
+ e.sort((e, t) => e - t);
551
+ let t = e.length >> 1;
552
+ return e.length % 2 == 0 ? (e[t - 1] + e[t]) / 2 : e[t];
553
+ }
554
+ function v(e, t, n) {
555
+ let r = [];
556
+ for (let e = n - 1; e >= 0 && r.length < 60; e -= t[e]) r.push(t[e]);
557
+ let i = _(r);
558
+ if (i >= 2) return i * h;
559
+ let a = Math.max(0, n - 120 + 1), o = n - a + 1;
560
+ if (o < 6) return f;
561
+ let s = [];
562
+ for (let t = a + 1; t <= n; t++) e[t] > e[t - 1] && s.push(e[t] - e[t - 1]);
563
+ if (s.length === 0) return f;
564
+ let c = _(s);
565
+ if (c >= m && c < 1.5 * m) {
566
+ let t = [
567
+ 0,
568
+ 0,
569
+ 0,
570
+ 0,
571
+ 0,
572
+ 0,
573
+ 0
574
+ ];
575
+ for (let r = a; r <= n; r++) t[(Math.floor(e[r] / m) % 7 + 7) % 7]++;
576
+ if (Math.min(...t.map((e, n) => e + t[(n + 1) % 7])) <= Math.max(g * o, +(o >= 7))) return h * m / c;
577
+ }
578
+ return 365 * m / c;
579
+ }
580
+ function y(e) {
581
+ if (!Number.isInteger(e) || e < 1) throw RangeError(`period must be a positive integer, got ${e}`);
582
+ }
583
+ //#endregion
584
+ //#region src/define.ts
585
+ var b = (e, t, n = 1, r = 1e4, i = e) => ({
586
+ key: e,
587
+ label: i,
588
+ type: "int",
589
+ default: t,
590
+ min: n,
591
+ max: r,
592
+ step: 1
593
+ }), x = (e, t, n = -1e9, r = 1e9, i = .1, a = e) => ({
594
+ key: e,
595
+ label: a,
596
+ type: "float",
597
+ default: t,
598
+ min: n,
599
+ max: r,
600
+ step: i
601
+ }), S = (e, t, n = e) => ({
602
+ key: e,
603
+ label: n,
604
+ type: "bool",
605
+ default: t
606
+ }), C = (e, t, n, r = e) => ({
607
+ key: e,
608
+ label: r,
609
+ type: "select",
610
+ default: t,
611
+ options: n
612
+ }), w = (e = "close", t = "source") => ({
613
+ key: t,
614
+ label: t,
615
+ type: "source",
616
+ default: e,
617
+ options: d
618
+ }), T = {
619
+ blue: "#2962FF",
620
+ orange: "#FF6D00",
621
+ red: "#F23645",
622
+ green: "#089981",
623
+ purple: "#9C27B0",
624
+ teal: "#00897B",
625
+ yellow: "#FBC02D",
626
+ pink: "#E91E63",
627
+ gray: "#787B86",
628
+ lime: "#8BC34A",
629
+ cyan: "#00BCD4",
630
+ brown: "#795548"
631
+ }, E = (e, t, n = {}) => ({
632
+ kind: "line",
633
+ key: n.key ?? e,
634
+ title: n.title ?? e,
635
+ col: e,
636
+ color: t,
637
+ ...n.width !== void 0 && { width: n.width },
638
+ ...n.style && { style: n.style },
639
+ ...n.offset !== void 0 && { offset: n.offset },
640
+ ...n.connect && { connect: !0 }
641
+ }), D = (e, t, n, r = {}) => ({
642
+ kind: "histogram",
643
+ key: r.key ?? e,
644
+ title: r.title ?? e,
645
+ col: e,
646
+ color: t,
647
+ ...n && { colorDown: n }
648
+ }), O = (e, t, n, r, i, a = e) => ({
649
+ kind: "band",
650
+ key: e,
651
+ title: a,
652
+ upper: t,
653
+ lower: n,
654
+ color: r,
655
+ fill: i
656
+ }), k = (e, t, n, r, i = e) => ({
657
+ kind: "fill",
658
+ key: e,
659
+ title: i,
660
+ a: t,
661
+ b: n,
662
+ color: r
663
+ }), A = (e, t, n = T.gray, r = "dashed") => ({
664
+ kind: "hline",
665
+ key: e,
666
+ title: e,
667
+ value: t,
668
+ color: n,
669
+ style: r
670
+ }), j = (e, t, n, r, i = {}) => ({
671
+ kind: "markers",
672
+ key: i.key ?? e,
673
+ title: i.title ?? e,
674
+ col: e,
675
+ shape: t,
676
+ position: n,
677
+ color: r,
678
+ ...i.offset !== void 0 && { offset: i.offset },
679
+ ...i.text && { text: !0 }
680
+ });
681
+ function M(e) {
682
+ return e;
683
+ }
684
+ //#endregion
685
+ export { r as S, d as _, k as a, t as b, A as c, j as d, C as f, u as g, p as h, M as i, b as l, l as m, O as n, x as o, w as p, S as r, D as s, T as t, E as u, o as v, i as x, e as y };
686
+
687
+ //# sourceMappingURL=define-XUgQMhSl.js.map