@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,3457 @@
1
+ import { _ as e, a as t, c as n, d as r, f as i, i as a, l as o, n as s, o as c, p as l, r as u, s as d, t as f, u as p } from "./define-BPvQbaq9.js";
2
+ //#region \0rolldown/runtime.js
3
+ var m = Object.defineProperty, h = (e, t) => {
4
+ let n = {};
5
+ for (var r in e) m(n, r, {
6
+ get: e[r],
7
+ enumerable: !0
8
+ });
9
+ return t || m(n, Symbol.toStringTag, { value: "Module" }), n;
10
+ }, g = [
11
+ "sma",
12
+ "ema",
13
+ "wma",
14
+ "rma",
15
+ "dema",
16
+ "tema",
17
+ "trima",
18
+ "kama",
19
+ "t3"
20
+ ];
21
+ function _(e, t, n, r = 2, i = 30) {
22
+ let a = e.map2(t, e.lag(t, 1), (e, t) => Math.abs(e - t)), o = e.sum(a, n), s = e.lag(t, n), c = 2 / (r + 1), l = 2 / (i + 1), u = e.calc((e) => {
23
+ let n = o.v[e], r = t.v[e], i = s.v[e];
24
+ if (n !== n || r !== r || i !== i) return NaN;
25
+ let a = ((n <= 0 ? 0 : Math.abs(r - i) / n) * (c - l) + l) ** 2, d = e > 0 ? u.v[e - 1] : NaN, f = d === d ? d : t.v[e - 1];
26
+ return f + a * (r - f);
27
+ });
28
+ return u;
29
+ }
30
+ function v(e, t, n, r = .7) {
31
+ let i = e.ema(t, n), a = [i];
32
+ for (let t = 1; t < 6; t++) a.push(i = e.ema(i, n));
33
+ let o = r * r, s = o * r, c = -s, l = 3 * o + 3 * s, u = -6 * o - 3 * r - 3 * s, d = 1 + 3 * r + s + 3 * o, [, , f, p, m, h] = a;
34
+ return e.calc((e) => c * h.v[e] + l * m.v[e] + u * p.v[e] + d * f.v[e]);
35
+ }
36
+ function y(e, t, n) {
37
+ let r = e.ema(t, n), i = e.ema(r, n);
38
+ return e.calc((e) => 2 * r.v[e] - i.v[e]);
39
+ }
40
+ function b(e, t, n) {
41
+ let r = e.ema(t, n), i = e.ema(r, n), a = e.ema(i, n);
42
+ return e.calc((e) => 3 * r.v[e] - 3 * i.v[e] + a.v[e]);
43
+ }
44
+ function x(e, t, n) {
45
+ return n % 2 == 1 ? e.sma(e.sma(t, (n + 1) / 2), (n + 1) / 2) : e.sma(e.sma(t, n / 2), n / 2 + 1);
46
+ }
47
+ function S(e, t, n, r, i) {
48
+ let a = e.validRun(t);
49
+ return e.node((e, o, s) => {
50
+ let c = t.v, l = a.v, u = i.v, d = e.v;
51
+ for (let e = o; e < s; e++) {
52
+ let t = e > 0 ? d[e - 1] : NaN;
53
+ if (t === t && c[e] === c[e]) d[e] = t + r * (c[e] - t);
54
+ else if (u[e] === u[e] && l[e] >= n) {
55
+ let t = 0;
56
+ for (let r = e - n + 1; r <= e; r++) t += c[r];
57
+ d[e] = t / n;
58
+ } else d[e] = NaN;
59
+ }
60
+ });
61
+ }
62
+ function C(e, t, n) {
63
+ let r = e.calc((e) => {
64
+ let i = t.v[e];
65
+ if (i !== i) return NaN;
66
+ let a = e > 0 ? r.v[e - 1] : NaN;
67
+ return a === a ? a + n * (i - a) : i;
68
+ });
69
+ return r;
70
+ }
71
+ function w(e, t, n, r) {
72
+ switch (t) {
73
+ case "sma": return e.sma(n, r);
74
+ case "ema": return e.ema(n, r);
75
+ case "wma": return e.wma(n, r);
76
+ case "rma": return e.rma(n, r);
77
+ case "dema": return y(e, n, r);
78
+ case "tema": return b(e, n, r);
79
+ case "trima": return x(e, n, r);
80
+ case "kama": return _(e, n, r);
81
+ case "t3": return v(e, n, r);
82
+ }
83
+ }
84
+ function T(e, t, n, r, i) {
85
+ return t === "ema" ? S(e, n, r, 2 / (r + 1), i) : w(e, t, n, r);
86
+ }
87
+ //#endregion
88
+ //#region src/studies/overlap.ts
89
+ var E = /* @__PURE__ */ h({
90
+ bbands: () => le,
91
+ bbpb: () => ue,
92
+ bbw: () => de,
93
+ dema: () => re,
94
+ ema: () => te,
95
+ kama: () => oe,
96
+ ma: () => ce,
97
+ midpoint: () => fe,
98
+ midprice: () => pe,
99
+ sma: () => ee,
100
+ t3: () => se,
101
+ tema: () => ie,
102
+ trima: () => ae,
103
+ wma: () => ne
104
+ }), D = (e) => o("length", e, 1, 5e3), ee = a({
105
+ id: "sma",
106
+ name: "Simple Moving Average",
107
+ family: "overlap",
108
+ needs: "value",
109
+ pane: "overlay",
110
+ inputs: [D(9), l()],
111
+ columns: ["sma"],
112
+ plots: [p("sma", f.blue)],
113
+ label: (e) => `${e.length}`,
114
+ build: (e, t) => [e.sma(e.src(t.source), t.length)],
115
+ reference: "TA-Lib SMA"
116
+ }), te = a({
117
+ id: "ema",
118
+ name: "Exponential Moving Average",
119
+ family: "overlap",
120
+ needs: "value",
121
+ pane: "overlay",
122
+ inputs: [D(9), l()],
123
+ columns: ["ema"],
124
+ plots: [p("ema", f.orange)],
125
+ label: (e) => `${e.length}`,
126
+ build: (e, t) => [e.ema(e.src(t.source), t.length)],
127
+ reference: "TA-Lib EMA"
128
+ }), ne = a({
129
+ id: "wma",
130
+ name: "Weighted Moving Average",
131
+ family: "overlap",
132
+ needs: "value",
133
+ pane: "overlay",
134
+ inputs: [D(9), l()],
135
+ columns: ["wma"],
136
+ plots: [p("wma", f.green)],
137
+ label: (e) => `${e.length}`,
138
+ build: (e, t) => [e.wma(e.src(t.source), t.length)],
139
+ reference: "TA-Lib WMA"
140
+ }), re = a({
141
+ id: "dema",
142
+ name: "Double Exponential Moving Average",
143
+ family: "overlap",
144
+ needs: "value",
145
+ pane: "overlay",
146
+ inputs: [D(9), l()],
147
+ columns: ["dema"],
148
+ plots: [p("dema", f.teal)],
149
+ label: (e) => `${e.length}`,
150
+ build: (e, t) => [y(e, e.src(t.source), t.length)],
151
+ reference: "TA-Lib DEMA"
152
+ }), ie = a({
153
+ id: "tema",
154
+ name: "Triple Exponential Moving Average",
155
+ family: "overlap",
156
+ needs: "value",
157
+ pane: "overlay",
158
+ inputs: [D(9), l()],
159
+ columns: ["tema"],
160
+ plots: [p("tema", f.pink)],
161
+ label: (e) => `${e.length}`,
162
+ build: (e, t) => [b(e, e.src(t.source), t.length)],
163
+ reference: "TA-Lib TEMA"
164
+ }), ae = a({
165
+ id: "trima",
166
+ name: "Triangular Moving Average",
167
+ family: "overlap",
168
+ needs: "value",
169
+ pane: "overlay",
170
+ inputs: [D(30), l()],
171
+ columns: ["trima"],
172
+ plots: [p("trima", f.cyan)],
173
+ label: (e) => `${e.length}`,
174
+ build: (e, t) => [x(e, e.src(t.source), t.length)],
175
+ reference: "TA-Lib TRIMA"
176
+ }), oe = a({
177
+ id: "kama",
178
+ name: "Kaufman Adaptive Moving Average",
179
+ family: "overlap",
180
+ needs: "value",
181
+ pane: "overlay",
182
+ inputs: [
183
+ D(10),
184
+ o("fast", 2, 1, 1e3),
185
+ o("slow", 30, 2, 5e3),
186
+ l()
187
+ ],
188
+ columns: ["kama"],
189
+ plots: [p("kama", f.lime)],
190
+ label: (e) => `${e.length}`,
191
+ build: (e, t) => {
192
+ if (t.fast >= t.slow) throw RangeError(`kama: fast (${t.fast}) must be below slow (${t.slow})`);
193
+ return [_(e, e.src(t.source), t.length, t.fast, t.slow)];
194
+ },
195
+ reference: "TA-Lib KAMA (fast/slow limits 2 and 30)"
196
+ }), se = a({
197
+ id: "t3",
198
+ name: "Tillson T3",
199
+ family: "overlap",
200
+ needs: "value",
201
+ pane: "overlay",
202
+ inputs: [
203
+ D(5),
204
+ c("vfactor", .7, 0, 1, .1),
205
+ l()
206
+ ],
207
+ columns: ["t3"],
208
+ plots: [p("t3", f.brown)],
209
+ label: (e) => `${e.length}, ${e.vfactor}`,
210
+ build: (e, t) => [v(e, e.src(t.source), t.length, t.vfactor)],
211
+ reference: "TA-Lib T3"
212
+ }), ce = a({
213
+ id: "ma",
214
+ name: "Moving Average",
215
+ family: "overlap",
216
+ needs: "value",
217
+ pane: "overlay",
218
+ inputs: [
219
+ D(30),
220
+ l(),
221
+ i("type", "sma", g)
222
+ ],
223
+ columns: ["ma"],
224
+ plots: [p("ma", f.blue)],
225
+ label: (e) => `${e.type.toUpperCase()} ${e.length}`,
226
+ build: (e, t) => [w(e, t.type, e.src(t.source), t.length)],
227
+ reference: "TA-Lib MA (types SMA, EMA, WMA, DEMA, TEMA, TRIMA, KAMA, T3; RMA is Wilder's)"
228
+ }), le = a({
229
+ id: "bbands",
230
+ name: "Bollinger Bands",
231
+ family: "overlap",
232
+ needs: "value",
233
+ pane: "overlay",
234
+ inputs: [
235
+ D(20),
236
+ l(),
237
+ c("multUp", 2, 0, 100, .1),
238
+ c("multDn", 2, 0, 100, .1),
239
+ i("maType", "sma", g)
240
+ ],
241
+ columns: [
242
+ "upper",
243
+ "middle",
244
+ "lower"
245
+ ],
246
+ plots: [s("band", "upper", "lower", f.blue, "rgba(41,98,255,0.10)", "Bands"), p("middle", f.orange)],
247
+ label: (e) => `${e.length}, ${e.multUp}`,
248
+ build: (e, t) => {
249
+ let n = e.src(t.source), r = w(e, t.maType, n, t.length), i = e.stdev(n, t.length);
250
+ return [
251
+ e.calc((e) => r.v[e] + t.multUp * i.v[e]),
252
+ r,
253
+ e.calc((e) => r.v[e] - t.multDn * i.v[e])
254
+ ];
255
+ },
256
+ reference: "TA-Lib BBANDS (population standard deviation)"
257
+ }), ue = a({
258
+ id: "bbpb",
259
+ name: "Bollinger Bands %B",
260
+ family: "overlap",
261
+ needs: "value",
262
+ pane: "new",
263
+ inputs: [
264
+ D(20),
265
+ l(),
266
+ c("mult", 2, 0, 100, .1)
267
+ ],
268
+ columns: ["pb"],
269
+ plots: [
270
+ p("pb", f.teal, { title: "%B" }),
271
+ n("upper", 1),
272
+ n("lower", 0),
273
+ n("middle", .5, f.gray, "dotted")
274
+ ],
275
+ label: (e) => `${e.length}, ${e.mult}`,
276
+ build: (e, t) => {
277
+ let n = e.src(t.source), r = e.sma(n, t.length), i = e.stdev(n, t.length);
278
+ return [e.calc((e) => {
279
+ let a = 2 * t.mult * i.v[e];
280
+ return a === 0 ? NaN : (n.v[e] - (r.v[e] - t.mult * i.v[e])) / a;
281
+ })];
282
+ },
283
+ reference: "TradingView Bollinger Bands %B = (source - lower) / (upper - lower)"
284
+ }), de = a({
285
+ id: "bbw",
286
+ name: "Bollinger Bands Width",
287
+ family: "overlap",
288
+ needs: "value",
289
+ pane: "new",
290
+ inputs: [
291
+ D(20),
292
+ l(),
293
+ c("mult", 2, 0, 100, .1)
294
+ ],
295
+ columns: ["bbw"],
296
+ plots: [p("bbw", f.blue, { title: "BBW" })],
297
+ label: (e) => `${e.length}, ${e.mult}`,
298
+ build: (e, t) => {
299
+ let n = e.src(t.source), r = e.sma(n, t.length), i = e.stdev(n, t.length);
300
+ return [e.calc((e) => 2 * t.mult * i.v[e] / r.v[e])];
301
+ },
302
+ reference: "Pine ta.bbw = ((basis + dev) - (basis - dev)) / basis"
303
+ }), fe = a({
304
+ id: "midpoint",
305
+ name: "MidPoint over period",
306
+ family: "overlap",
307
+ needs: "value",
308
+ pane: "overlay",
309
+ inputs: [D(14), l()],
310
+ columns: ["midpoint"],
311
+ plots: [p("midpoint", f.purple)],
312
+ label: (e) => `${e.length}`,
313
+ build: (e, t) => {
314
+ let n = e.src(t.source), r = e.highest(n, t.length), i = e.lowest(n, t.length);
315
+ return [e.calc((e) => (r.v[e] + i.v[e]) / 2)];
316
+ },
317
+ reference: "TA-Lib MIDPOINT"
318
+ }), pe = a({
319
+ id: "midprice",
320
+ name: "Midpoint Price over period",
321
+ family: "overlap",
322
+ needs: "ohlc",
323
+ pane: "overlay",
324
+ inputs: [D(14)],
325
+ columns: ["midprice"],
326
+ plots: [p("midprice", f.purple)],
327
+ label: (e) => `${e.length}`,
328
+ build: (e, t) => {
329
+ let n = e.highest(e.high, t.length), r = e.lowest(e.low, t.length);
330
+ return [e.calc((e) => (n.v[e] + r.v[e]) / 2)];
331
+ },
332
+ reference: "TA-Lib MIDPRICE"
333
+ }), me = /* @__PURE__ */ h({
334
+ adx: () => Ye,
335
+ adxr: () => Xe,
336
+ apo: () => Ee,
337
+ aroon: () => We,
338
+ aroonosc: () => Ge,
339
+ bop: () => Ve,
340
+ cci: () => Be,
341
+ cmo: () => ge,
342
+ dx: () => Ze,
343
+ macd: () => Ae,
344
+ macdext: () => Ne,
345
+ macdfix: () => je,
346
+ mfi: () => He,
347
+ minusDi: () => et,
348
+ minusDm: () => nt,
349
+ mom: () => _e,
350
+ plusDi: () => $e,
351
+ plusDm: () => tt,
352
+ ppo: () => De,
353
+ roc: () => ye,
354
+ rocp: () => be,
355
+ rocr: () => xe,
356
+ rocr100: () => Se,
357
+ rsi: () => he,
358
+ stoch: () => Ie,
359
+ stochf: () => Le,
360
+ stochrsi: () => Re,
361
+ trix: () => Ce,
362
+ ultosc: () => Ue,
363
+ willr: () => ze
364
+ }), O = (e, t = 1) => o("length", e, t, 5e3), he = a({
365
+ id: "rsi",
366
+ name: "Relative Strength Index",
367
+ family: "momentum",
368
+ needs: "value",
369
+ pane: "new",
370
+ inputs: [O(14), l()],
371
+ columns: ["rsi"],
372
+ plots: [
373
+ p("rsi", f.purple),
374
+ n("upper", 70),
375
+ n("lower", 30),
376
+ n("middle", 50, f.gray, "dotted")
377
+ ],
378
+ label: (e) => `${e.length}`,
379
+ build: (e, t) => {
380
+ let n = e.change(e.src(t.source), 1), r = e.rma(e.map(n, (e) => e > 0 ? e : e === e ? 0 : NaN), t.length), i = e.rma(e.map(n, (e) => e < 0 ? -e : e === e ? 0 : NaN), t.length);
381
+ return [e.map2(r, i, (e, t) => e + t === 0 ? 0 : 100 * e / (e + t))];
382
+ },
383
+ reference: "TA-Lib RSI (Wilder smoothing, seeded with the mean of the first `length` changes)"
384
+ }), ge = a({
385
+ id: "cmo",
386
+ name: "Chande Momentum Oscillator",
387
+ family: "momentum",
388
+ needs: "value",
389
+ pane: "new",
390
+ inputs: [
391
+ O(9),
392
+ l(),
393
+ i("method", "sum", ["sum", "wilder"])
394
+ ],
395
+ columns: ["cmo"],
396
+ plots: [
397
+ p("cmo", f.blue),
398
+ n("upper", 50),
399
+ n("lower", -50),
400
+ n("zero", 0, f.gray, "dotted")
401
+ ],
402
+ label: (e) => `${e.length}`,
403
+ build: (e, t) => {
404
+ let n = e.change(e.src(t.source), 1), r = e.map(n, (e) => e > 0 ? e : e === e ? 0 : NaN), i = e.map(n, (e) => e < 0 ? -e : e === e ? 0 : NaN), [a, o] = t.method === "wilder" ? [e.rma(r, t.length), e.rma(i, t.length)] : [e.sum(r, t.length), e.sum(i, t.length)];
405
+ return [e.map2(a, o, (e, t) => e + t === 0 ? 0 : 100 * (e - t) / (e + t))];
406
+ },
407
+ reference: "method sum = TradingView ta.cmo (window sums); method wilder = TA-Lib CMO"
408
+ }), _e = a({
409
+ id: "mom",
410
+ name: "Momentum",
411
+ family: "momentum",
412
+ needs: "value",
413
+ pane: "new",
414
+ inputs: [O(10), l()],
415
+ columns: ["mom"],
416
+ plots: [p("mom", f.blue), n("zero", 0, f.gray, "dotted")],
417
+ label: (e) => `${e.length}`,
418
+ build: (e, t) => [e.change(e.src(t.source), t.length)],
419
+ reference: "TA-Lib MOM"
420
+ }), ve = (e, t, r, i, o) => a({
421
+ id: e,
422
+ name: t,
423
+ family: "momentum",
424
+ needs: "value",
425
+ pane: "new",
426
+ inputs: [O(e === "roc" ? 9 : 10), l()],
427
+ columns: [e],
428
+ plots: [p(e, f.orange), ...o === void 0 ? [] : [n("base", o, f.gray, "dotted")]],
429
+ label: (e) => `${e.length}`,
430
+ build: (e, t) => {
431
+ let n = e.src(t.source), i = e.lag(n, t.length);
432
+ return [e.map2(n, i, (e, t) => t === 0 ? NaN : r(e, t))];
433
+ },
434
+ reference: i
435
+ }), ye = ve("roc", "Rate of Change", (e, t) => (e - t) / t * 100, "TA-Lib ROC = (x / x[n] - 1) * 100", 0), be = ve("rocp", "Rate of Change Percentage", (e, t) => (e - t) / t, "TA-Lib ROCP = (x - x[n]) / x[n]", 0), xe = ve("rocr", "Rate of Change Ratio", (e, t) => e / t, "TA-Lib ROCR = x / x[n]", 1), Se = ve("rocr100", "Rate of Change Ratio 100 scale", (e, t) => e / t * 100, "TA-Lib ROCR100 = x / x[n] * 100", 100), Ce = a({
436
+ id: "trix",
437
+ name: "TRIX",
438
+ family: "momentum",
439
+ needs: "value",
440
+ pane: "new",
441
+ inputs: [O(18), l()],
442
+ columns: ["trix"],
443
+ plots: [p("trix", f.red), n("zero", 0, f.gray, "dotted")],
444
+ label: (e) => `${e.length}`,
445
+ build: (e, t) => {
446
+ let n = e.ema(e.ema(e.ema(e.src(t.source), t.length), t.length), t.length);
447
+ return [e.map2(n, e.lag(n, 1), (e, t) => t === 0 ? NaN : (e / t - 1) * 100)];
448
+ },
449
+ reference: "TA-Lib TRIX = 1-bar ROC (percent) of a triple-smoothed EMA"
450
+ }), we = (e, t = "maType") => i(t, e, g);
451
+ function Te(e, t, n, r, i, a = !1) {
452
+ let o = w(e, i, t, r);
453
+ return [a ? T(e, i, t, n, o) : w(e, i, t, n), o];
454
+ }
455
+ var Ee = a({
456
+ id: "apo",
457
+ name: "Absolute Price Oscillator",
458
+ family: "momentum",
459
+ needs: "value",
460
+ pane: "new",
461
+ inputs: [
462
+ o("fast", 12, 1, 5e3),
463
+ o("slow", 26, 2, 5e3),
464
+ l(),
465
+ we("ema")
466
+ ],
467
+ columns: ["apo"],
468
+ plots: [p("apo", f.blue), n("zero", 0, f.gray, "dotted")],
469
+ label: (e) => `${e.fast}, ${e.slow}`,
470
+ build: (e, t) => {
471
+ if (t.fast >= t.slow) throw RangeError(`apo: fast (${t.fast}) must be below slow (${t.slow})`);
472
+ let [n, r] = Te(e, e.src(t.source), t.fast, t.slow, t.maType);
473
+ return [e.sub(n, r)];
474
+ },
475
+ reference: "TA-Lib APO (fast average starts at the slow average's first bar)"
476
+ }), De = a({
477
+ id: "ppo",
478
+ name: "Percentage Price Oscillator",
479
+ family: "momentum",
480
+ needs: "value",
481
+ pane: "new",
482
+ inputs: [
483
+ o("fast", 12, 1, 5e3),
484
+ o("slow", 26, 2, 5e3),
485
+ o("signal", 9, 1, 5e3),
486
+ l(),
487
+ we("ema")
488
+ ],
489
+ columns: [
490
+ "ppo",
491
+ "signal",
492
+ "histogram"
493
+ ],
494
+ plots: [
495
+ d("histogram", f.green, f.red),
496
+ p("ppo", f.blue),
497
+ p("signal", f.orange)
498
+ ],
499
+ label: (e) => `${e.fast}, ${e.slow}, ${e.signal}`,
500
+ build: (e, t) => {
501
+ if (t.fast >= t.slow) throw RangeError(`ppo: fast (${t.fast}) must be below slow (${t.slow})`);
502
+ let [n, r] = Te(e, e.src(t.source), t.fast, t.slow, t.maType), i = e.map2(n, r, (e, t) => t === 0 ? NaN : (e - t) / t * 100), a = e.ema(i, t.signal);
503
+ return [
504
+ i,
505
+ a,
506
+ e.sub(i, a)
507
+ ];
508
+ },
509
+ reference: "TA-Lib PPO (line only; the signal EMA and histogram follow TradingView's Price Oscillator)"
510
+ }), Oe = [
511
+ "macd",
512
+ "signal",
513
+ "histogram"
514
+ ], ke = [
515
+ d("histogram", f.green, f.red),
516
+ p("macd", f.blue),
517
+ p("signal", f.orange)
518
+ ], Ae = a({
519
+ id: "macd",
520
+ name: "MACD",
521
+ family: "momentum",
522
+ needs: "value",
523
+ pane: "new",
524
+ inputs: [
525
+ o("fast", 12, 1, 5e3),
526
+ o("slow", 26, 2, 5e3),
527
+ o("signal", 9, 1, 5e3),
528
+ l()
529
+ ],
530
+ columns: Oe,
531
+ plots: ke,
532
+ label: (e) => `${e.fast}, ${e.slow}, ${e.signal}`,
533
+ build: (e, t) => {
534
+ if (t.fast >= t.slow) throw RangeError(`macd: fast (${t.fast}) must be below slow (${t.slow})`);
535
+ let [n, r] = Te(e, e.src(t.source), t.fast, t.slow, "ema", !0), i = e.sub(n, r), a = e.ema(i, t.signal);
536
+ return [
537
+ i,
538
+ a,
539
+ e.sub(i, a)
540
+ ];
541
+ },
542
+ reference: "TA-Lib MACD (the fast EMA is seeded at the slow EMA's first bar; TradingView seeds it at bar 0, the difference decays below 1e-9 within ~150 bars)"
543
+ }), je = a({
544
+ id: "macdfix",
545
+ name: "MACD Fix 12/26",
546
+ family: "momentum",
547
+ needs: "value",
548
+ pane: "new",
549
+ inputs: [o("signal", 9, 1, 5e3), l()],
550
+ columns: Oe,
551
+ plots: ke,
552
+ label: (e) => `${e.signal}`,
553
+ build: (e, t) => {
554
+ let n = e.src(t.source), r = e.smooth(n, 26, .075), i = Me(e, n, 12, .15, r), a = e.sub(i, r), o = e.ema(a, t.signal);
555
+ return [
556
+ a,
557
+ o,
558
+ e.sub(a, o)
559
+ ];
560
+ },
561
+ reference: "TA-Lib MACDFIX: fixed 12/26 with smoothing constants 0.15 and 0.075"
562
+ });
563
+ function Me(e, t, n, r, i) {
564
+ return S(e, t, n, r, i);
565
+ }
566
+ var Ne = a({
567
+ id: "macdext",
568
+ name: "MACD with controllable MA type",
569
+ family: "momentum",
570
+ needs: "value",
571
+ pane: "new",
572
+ inputs: [
573
+ o("fast", 12, 1, 5e3),
574
+ o("slow", 26, 2, 5e3),
575
+ o("signal", 9, 1, 5e3),
576
+ l(),
577
+ we("ema", "fastType"),
578
+ we("ema", "slowType"),
579
+ we("ema", "signalType")
580
+ ],
581
+ columns: Oe,
582
+ plots: ke,
583
+ label: (e) => `${e.fast}, ${e.slow}, ${e.signal}`,
584
+ build: (e, t) => {
585
+ if (t.fast >= t.slow) throw RangeError(`macdext: fast (${t.fast}) must be below slow (${t.slow})`);
586
+ let n = e.src(t.source), r = w(e, t.slowType, n, t.slow), i = T(e, t.fastType, n, t.fast, r), a = e.sub(i, r), o = w(e, t.signalType, a, t.signal);
587
+ return [
588
+ a,
589
+ o,
590
+ e.sub(a, o)
591
+ ];
592
+ },
593
+ reference: "TA-Lib MACDEXT"
594
+ });
595
+ function Pe(e, t, n, r, i) {
596
+ let a = e.highest(n, i), o = e.lowest(r, i);
597
+ return e.calc((e) => {
598
+ let n = a.v[e] - o.v[e];
599
+ return n === n ? n === 0 ? 0 : 100 * (t.v[e] - o.v[e]) / n : NaN;
600
+ });
601
+ }
602
+ var Fe = [
603
+ p("k", f.blue, { title: "%K" }),
604
+ p("d", f.orange, { title: "%D" }),
605
+ n("upper", 80),
606
+ n("lower", 20)
607
+ ], Ie = a({
608
+ id: "stoch",
609
+ name: "Stochastic",
610
+ family: "momentum",
611
+ needs: "ohlc",
612
+ pane: "new",
613
+ inputs: [
614
+ o("kLength", 14, 1, 5e3),
615
+ o("kSmooth", 1, 1, 5e3),
616
+ o("dLength", 3, 1, 5e3),
617
+ we("sma", "kType"),
618
+ we("sma", "dType")
619
+ ],
620
+ columns: ["k", "d"],
621
+ plots: Fe,
622
+ label: (e) => `${e.kLength}, ${e.kSmooth}, ${e.dLength}`,
623
+ build: (e, t) => {
624
+ let n = w(e, t.kType, Pe(e, e.close, e.high, e.low, t.kLength), t.kSmooth);
625
+ return [n, w(e, t.dType, n, t.dLength)];
626
+ },
627
+ reference: "TA-Lib STOCH (slow %K = MA of fast %K); defaults are TradingView's 14, 1, 3"
628
+ }), Le = a({
629
+ id: "stochf",
630
+ name: "Stochastic Fast",
631
+ family: "momentum",
632
+ needs: "ohlc",
633
+ pane: "new",
634
+ inputs: [
635
+ o("kLength", 5, 1, 5e3),
636
+ o("dLength", 3, 1, 5e3),
637
+ we("sma", "dType")
638
+ ],
639
+ columns: ["k", "d"],
640
+ plots: Fe,
641
+ label: (e) => `${e.kLength}, ${e.dLength}`,
642
+ build: (e, t) => {
643
+ let n = Pe(e, e.close, e.high, e.low, t.kLength);
644
+ return [n, w(e, t.dType, n, t.dLength)];
645
+ },
646
+ reference: "TA-Lib STOCHF"
647
+ }), Re = a({
648
+ id: "stochrsi",
649
+ name: "Stochastic RSI",
650
+ family: "momentum",
651
+ needs: "value",
652
+ pane: "new",
653
+ inputs: [
654
+ o("rsiLength", 14, 1, 5e3),
655
+ o("stochLength", 14, 1, 5e3),
656
+ o("kSmooth", 3, 1, 5e3),
657
+ o("dSmooth", 3, 1, 5e3),
658
+ l()
659
+ ],
660
+ columns: [
661
+ "raw",
662
+ "k",
663
+ "d"
664
+ ],
665
+ plots: [
666
+ p("k", f.blue, { title: "%K" }),
667
+ p("d", f.orange, { title: "%D" }),
668
+ n("upper", 80),
669
+ n("lower", 20)
670
+ ],
671
+ label: (e) => `${e.rsiLength}, ${e.stochLength}, ${e.kSmooth}, ${e.dSmooth}`,
672
+ build: (e, t) => {
673
+ let n = e.change(e.src(t.source), 1), r = e.rma(e.map(n, (e) => e > 0 ? e : e === e ? 0 : NaN), t.rsiLength), i = e.rma(e.map(n, (e) => e < 0 ? -e : e === e ? 0 : NaN), t.rsiLength), a = e.map2(r, i, (e, t) => e + t === 0 ? 0 : 100 * e / (e + t)), o = Pe(e, a, a, a, t.stochLength), s = e.sma(o, t.kSmooth);
674
+ return [
675
+ o,
676
+ s,
677
+ e.sma(s, t.dSmooth)
678
+ ];
679
+ },
680
+ reference: "TA-Lib STOCHRSI: `raw` = fastk, `k` = fastd with period kSmooth; `d` is TradingView's second smoothing"
681
+ }), ze = a({
682
+ id: "willr",
683
+ name: "Williams %R",
684
+ family: "momentum",
685
+ needs: "ohlc",
686
+ pane: "new",
687
+ inputs: [O(14)],
688
+ columns: ["willr"],
689
+ plots: [
690
+ p("willr", f.purple, { title: "%R" }),
691
+ n("upper", -20),
692
+ n("lower", -80)
693
+ ],
694
+ label: (e) => `${e.length}`,
695
+ build: (e, t) => {
696
+ let n = e.highest(e.high, t.length), r = e.lowest(e.low, t.length);
697
+ return [e.calc((t) => {
698
+ let i = n.v[t] - r.v[t];
699
+ return i !== i || i === 0 ? NaN : -100 * (n.v[t] - e.close.v[t]) / i;
700
+ })];
701
+ },
702
+ reference: "TA-Lib WILLR (a flat range is absent here; TA-Lib reports 0)"
703
+ }), Be = a({
704
+ id: "cci",
705
+ name: "Commodity Channel Index",
706
+ family: "momentum",
707
+ needs: "ohlc",
708
+ pane: "new",
709
+ inputs: [O(20)],
710
+ columns: ["cci"],
711
+ plots: [
712
+ p("cci", f.blue),
713
+ n("upper", 100),
714
+ n("lower", -100)
715
+ ],
716
+ label: (e) => `${e.length}`,
717
+ build: (e, t) => {
718
+ let n = e.src("hlc3"), r = e.sma(n, t.length), i = t.length;
719
+ return [e.calc((e) => {
720
+ let t = r.v[e];
721
+ if (t !== t) return NaN;
722
+ let a = 0;
723
+ for (let r = e - i + 1; r <= e; r++) a += Math.abs(n.v[r] - t);
724
+ return a /= i, a === 0 ? NaN : (n.v[e] - t) / (.015 * a);
725
+ })];
726
+ },
727
+ reference: "TA-Lib CCI (typical price, mean deviation; zero deviation is absent here, TA-Lib reports 0)"
728
+ }), Ve = a({
729
+ id: "bop",
730
+ name: "Balance Of Power",
731
+ family: "momentum",
732
+ needs: "ohlc",
733
+ pane: "new",
734
+ inputs: [],
735
+ columns: ["bop"],
736
+ plots: [p("bop", f.teal), n("zero", 0, f.gray, "dotted")],
737
+ build: (e) => [e.calc((t) => {
738
+ let n = e.high.v[t] - e.low.v[t];
739
+ return n > 0 ? (e.close.v[t] - e.open.v[t]) / n : 0;
740
+ })],
741
+ reference: "TA-Lib BOP = (close - open) / (high - low), 0 on a flat bar"
742
+ }), He = a({
743
+ id: "mfi",
744
+ name: "Money Flow Index",
745
+ family: "momentum",
746
+ needs: "ohlcv",
747
+ pane: "new",
748
+ inputs: [O(14)],
749
+ columns: ["mfi"],
750
+ plots: [
751
+ p("mfi", f.purple),
752
+ n("upper", 80),
753
+ n("lower", 20)
754
+ ],
755
+ label: (e) => `${e.length}`,
756
+ build: (e, t) => {
757
+ let n = e.src("hlc3"), r = e.calc((t) => t === 0 ? NaN : n.v[t] > n.v[t - 1] ? n.v[t] * e.volume.v[t] : 0), i = e.calc((t) => t === 0 ? NaN : n.v[t] < n.v[t - 1] ? n.v[t] * e.volume.v[t] : 0), a = e.sum(r, t.length), o = e.sum(i, t.length);
758
+ return [e.map2(a, o, (e, t) => e + t === 0 ? 0 : 100 * e / (e + t))];
759
+ },
760
+ reference: "TA-Lib MFI"
761
+ }), Ue = a({
762
+ id: "ultosc",
763
+ name: "Ultimate Oscillator",
764
+ family: "momentum",
765
+ needs: "ohlc",
766
+ pane: "new",
767
+ inputs: [
768
+ o("fast", 7, 1, 5e3),
769
+ o("middle", 14, 1, 5e3),
770
+ o("slow", 28, 1, 5e3)
771
+ ],
772
+ columns: ["ultosc"],
773
+ plots: [
774
+ p("ultosc", f.blue),
775
+ n("upper", 70),
776
+ n("lower", 30)
777
+ ],
778
+ label: (e) => `${e.fast}, ${e.middle}, ${e.slow}`,
779
+ build: (e, t) => {
780
+ let [n, r, i] = [
781
+ t.fast,
782
+ t.middle,
783
+ t.slow
784
+ ].sort((e, t) => e - t), a = e.calc((t) => t === 0 ? NaN : e.close.v[t] - Math.min(e.low.v[t], e.close.v[t - 1])), o = e.calc((t) => t === 0 ? NaN : Math.max(e.high.v[t], e.close.v[t - 1]) - Math.min(e.low.v[t], e.close.v[t - 1])), [s, c, l] = [
785
+ e.sum(a, n),
786
+ e.sum(a, r),
787
+ e.sum(a, i)
788
+ ], [u, d, f] = [
789
+ e.sum(o, n),
790
+ e.sum(o, r),
791
+ e.sum(o, i)
792
+ ];
793
+ return [e.calc((e) => {
794
+ let t = s.v[e] / u.v[e], n = c.v[e] / d.v[e], r = l.v[e] / f.v[e];
795
+ return 100 * (4 * t + 2 * n + r) / 7;
796
+ })];
797
+ },
798
+ reference: "TA-Lib ULTOSC (periods sorted ascending, weights 4:2:1)"
799
+ }), We = a({
800
+ id: "aroon",
801
+ name: "Aroon",
802
+ family: "momentum",
803
+ needs: "ohlc",
804
+ pane: "new",
805
+ inputs: [O(14)],
806
+ columns: ["up", "down"],
807
+ plots: [p("up", f.green, { title: "Aroon Up" }), p("down", f.red, { title: "Aroon Down" })],
808
+ label: (e) => `${e.length}`,
809
+ build: (e, t) => {
810
+ let n = e.highestBars(e.high, t.length + 1), r = e.lowestBars(e.low, t.length + 1);
811
+ return [e.map(n, (e) => 100 * (t.length - e) / t.length), e.map(r, (e) => 100 * (t.length - e) / t.length)];
812
+ },
813
+ reference: "TA-Lib AROON (window of length + 1 bars)"
814
+ }), Ge = a({
815
+ id: "aroonosc",
816
+ name: "Aroon Oscillator",
817
+ family: "momentum",
818
+ needs: "ohlc",
819
+ pane: "new",
820
+ inputs: [O(14)],
821
+ columns: ["aroonosc"],
822
+ plots: [p("aroonosc", f.blue), n("zero", 0, f.gray, "dotted")],
823
+ label: (e) => `${e.length}`,
824
+ build: (e, t) => {
825
+ let n = e.highestBars(e.high, t.length + 1), r = e.lowestBars(e.low, t.length + 1);
826
+ return [e.map2(n, r, (e, n) => 100 * (n - e) / t.length)];
827
+ },
828
+ reference: "TA-Lib AROONOSC = Aroon Up - Aroon Down"
829
+ });
830
+ function Ke(e, t, n) {
831
+ let r = e.validRun(t);
832
+ return e.node((e, i, a) => {
833
+ let o = t.v, s = r.v, c = e.v;
834
+ for (let e = i; e < a; e++) {
835
+ let t = s[e];
836
+ if (t === 0) {
837
+ c[e] = NaN;
838
+ continue;
839
+ }
840
+ let r = e > 0 ? c[e - 1] : NaN;
841
+ if (r === r) c[e] = r - r / n + o[e];
842
+ else if (t === n - 1) {
843
+ let n = 0;
844
+ for (let r = e - t + 1; r <= e; r++) n += o[r];
845
+ c[e] = n;
846
+ } else c[e] = NaN;
847
+ }
848
+ });
849
+ }
850
+ function qe(e, t) {
851
+ if (t < 2) throw RangeError(`directional movement needs length >= 2, got ${t}`);
852
+ let { high: n, low: r } = e, i = e.calc((e) => {
853
+ if (e === 0) return NaN;
854
+ let t = n.v[e] - n.v[e - 1], i = r.v[e - 1] - r.v[e];
855
+ return t > 0 && t > i ? t : 0;
856
+ }), a = e.calc((e) => {
857
+ if (e === 0) return NaN;
858
+ let t = n.v[e] - n.v[e - 1], i = r.v[e - 1] - r.v[e];
859
+ return i > 0 && i > t ? i : 0;
860
+ }), o = Ke(e, i, t), s = Ke(e, a, t), c = Ke(e, e.tr(), t), l = e.lag(c, 1), u = (t) => e.calc((e) => l.v[e] === l.v[e] && c.v[e] > 0 ? 100 * t.v[e] / c.v[e] : NaN), d = u(o), f = u(s);
861
+ return {
862
+ sp: o,
863
+ sm: s,
864
+ pdi: d,
865
+ mdi: f,
866
+ dx: e.map2(d, f, (e, t) => e + t === 0 ? NaN : 100 * Math.abs(e - t) / (e + t))
867
+ };
868
+ }
869
+ var Je = [
870
+ p("adx", f.red, { title: "ADX" }),
871
+ p("plusDi", f.blue, { title: "+DI" }),
872
+ p("minusDi", f.orange, { title: "-DI" })
873
+ ], Ye = a({
874
+ id: "adx",
875
+ name: "Average Directional Index",
876
+ family: "momentum",
877
+ needs: "ohlc",
878
+ pane: "new",
879
+ inputs: [O(14, 2)],
880
+ columns: [
881
+ "adx",
882
+ "plusDi",
883
+ "minusDi"
884
+ ],
885
+ plots: Je,
886
+ label: (e) => `${e.length}`,
887
+ build: (e, t) => {
888
+ let n = qe(e, t.length);
889
+ return [
890
+ e.rma(n.dx, t.length),
891
+ n.pdi,
892
+ n.mdi
893
+ ];
894
+ },
895
+ reference: "TA-Lib ADX / PLUS_DI / MINUS_DI (Wilder smoothing seeded as TA-Lib does)"
896
+ }), Xe = a({
897
+ id: "adxr",
898
+ name: "Average Directional Movement Index Rating",
899
+ family: "momentum",
900
+ needs: "ohlc",
901
+ pane: "new",
902
+ inputs: [O(14, 2)],
903
+ columns: ["adxr"],
904
+ plots: [p("adxr", f.red)],
905
+ label: (e) => `${e.length}`,
906
+ build: (e, t) => {
907
+ let n = e.rma(qe(e, t.length).dx, t.length);
908
+ return [e.map2(n, e.lag(n, t.length - 1), (e, t) => (e + t) / 2)];
909
+ },
910
+ reference: "TA-Lib ADXR = (ADX + ADX[length - 1]) / 2"
911
+ }), Ze = a({
912
+ id: "dx",
913
+ name: "Directional Movement Index",
914
+ family: "momentum",
915
+ needs: "ohlc",
916
+ pane: "new",
917
+ inputs: [O(14, 2)],
918
+ columns: ["dx"],
919
+ plots: [p("dx", f.purple)],
920
+ label: (e) => `${e.length}`,
921
+ build: (e, t) => [qe(e, t.length).dx],
922
+ reference: "TA-Lib DX"
923
+ }), Qe = (e, t, n, r) => a({
924
+ id: e,
925
+ name: t,
926
+ family: "momentum",
927
+ needs: "ohlc",
928
+ pane: "new",
929
+ inputs: [O(14, 2)],
930
+ columns: [e.replace("-", "")],
931
+ plots: [p(e.replace("-", ""), r)],
932
+ label: (e) => `${e.length}`,
933
+ build: (e, t) => [n(qe(e, t.length))],
934
+ reference: `TA-Lib ${e.replace("-", "_").toUpperCase()}`
935
+ }), $e = Qe("plus-di", "Plus Directional Indicator", (e) => e.pdi, f.blue), et = Qe("minus-di", "Minus Directional Indicator", (e) => e.mdi, f.orange), tt = Qe("plus-dm", "Plus Directional Movement", (e) => e.sp, f.blue), nt = Qe("minus-dm", "Minus Directional Movement", (e) => e.sm, f.orange), rt = /* @__PURE__ */ h({
936
+ ad: () => at,
937
+ adosc: () => ot,
938
+ obv: () => st
939
+ });
940
+ function it(e) {
941
+ let t = e.calc((n) => {
942
+ let r = e.high.v[n] - e.low.v[n], i = r === 0 ? 0 : (e.close.v[n] - e.low.v[n] - (e.high.v[n] - e.close.v[n])) / r * e.volume.v[n];
943
+ return (n > 0 ? t.v[n - 1] : 0) + i;
944
+ });
945
+ return t;
946
+ }
947
+ var at = a({
948
+ id: "ad",
949
+ name: "Accumulation/Distribution",
950
+ family: "volume",
951
+ needs: "ohlcv",
952
+ pane: "new",
953
+ inputs: [],
954
+ columns: ["ad"],
955
+ plots: [p("ad", f.blue)],
956
+ build: (e) => [it(e)],
957
+ reference: "TA-Lib AD (a flat bar adds 0)"
958
+ }), ot = a({
959
+ id: "adosc",
960
+ name: "Chaikin Oscillator",
961
+ family: "volume",
962
+ needs: "ohlcv",
963
+ pane: "new",
964
+ inputs: [o("fast", 3, 1, 5e3), o("slow", 10, 2, 5e3)],
965
+ columns: ["adosc"],
966
+ plots: [p("adosc", f.purple), n("zero", 0, f.gray, "dotted")],
967
+ label: (e) => `${e.fast}, ${e.slow}`,
968
+ build: (e, t) => {
969
+ if (t.fast >= t.slow) throw RangeError(`adosc: fast (${t.fast}) must be below slow (${t.slow})`);
970
+ let n = it(e), r = C(e, n, 2 / (t.fast + 1)), i = C(e, n, 2 / (t.slow + 1));
971
+ return [e.calc((e) => e >= t.slow - 1 ? r.v[e] - i.v[e] : NaN)];
972
+ },
973
+ reference: "TA-Lib ADOSC: both EMAs are seeded with the first A/D value (TradingView seeds with an SMA; the difference vanishes within ~60 bars)"
974
+ }), st = a({
975
+ id: "obv",
976
+ name: "On Balance Volume",
977
+ family: "volume",
978
+ needs: "ohlcv",
979
+ pane: "new",
980
+ inputs: [],
981
+ columns: ["obv"],
982
+ plots: [p("obv", f.teal)],
983
+ build: (e) => {
984
+ let t = e.calc((n) => {
985
+ if (n === 0) return e.volume.v[0];
986
+ let r = e.close.v[n], i = e.close.v[n - 1];
987
+ return t.v[n - 1] + (r > i ? e.volume.v[n] : r < i ? -e.volume.v[n] : 0);
988
+ });
989
+ return [t];
990
+ },
991
+ reference: "TA-Lib OBV (first value is the first bar's volume)"
992
+ }), ct = /* @__PURE__ */ h({
993
+ atr: () => ut,
994
+ natr: () => dt,
995
+ trange: () => lt
996
+ }), lt = a({
997
+ id: "trange",
998
+ name: "True Range",
999
+ family: "volatility",
1000
+ needs: "ohlc",
1001
+ pane: "new",
1002
+ inputs: [],
1003
+ columns: ["trange"],
1004
+ plots: [p("trange", f.orange)],
1005
+ build: (e) => [e.tr()],
1006
+ reference: "TA-Lib TRANGE"
1007
+ }), ut = a({
1008
+ id: "atr",
1009
+ name: "Average True Range",
1010
+ family: "volatility",
1011
+ needs: "ohlc",
1012
+ pane: "new",
1013
+ inputs: [o("length", 14, 1, 5e3)],
1014
+ columns: ["atr"],
1015
+ plots: [p("atr", f.red)],
1016
+ label: (e) => `${e.length}`,
1017
+ build: (e, t) => [e.atr(t.length)],
1018
+ reference: "TA-Lib ATR (Wilder, seeded with the mean of the first `length` true ranges)"
1019
+ }), dt = a({
1020
+ id: "natr",
1021
+ name: "Normalized Average True Range",
1022
+ family: "volatility",
1023
+ needs: "ohlc",
1024
+ pane: "new",
1025
+ inputs: [o("length", 14, 1, 5e3)],
1026
+ columns: ["natr"],
1027
+ plots: [p("natr", f.red)],
1028
+ label: (e) => `${e.length}`,
1029
+ build: (e, t) => {
1030
+ let n = e.atr(t.length);
1031
+ return [e.calc((t) => 100 * n.v[t] / e.close.v[t])];
1032
+ },
1033
+ reference: "TA-Lib NATR = 100 * ATR / close"
1034
+ }), ft = /* @__PURE__ */ h({
1035
+ avgprice: () => mt,
1036
+ medprice: () => ht,
1037
+ typprice: () => gt,
1038
+ wclprice: () => _t
1039
+ }), pt = (e, t, n, r, i) => a({
1040
+ id: e,
1041
+ name: t,
1042
+ family: "price",
1043
+ needs: "ohlc",
1044
+ pane: "overlay",
1045
+ inputs: [],
1046
+ columns: [e],
1047
+ plots: [p(e, n)],
1048
+ build: (e) => [r(e)],
1049
+ reference: i
1050
+ }), mt = pt("avgprice", "Average Price", f.blue, (e) => e.src("ohlc4"), "TA-Lib AVGPRICE = (O + H + L + C) / 4"), ht = pt("medprice", "Median Price", f.orange, (e) => e.src("hl2"), "TA-Lib MEDPRICE = (H + L) / 2"), gt = pt("typprice", "Typical Price", f.green, (e) => e.src("hlc3"), "TA-Lib TYPPRICE = (H + L + C) / 3"), _t = pt("wclprice", "Weighted Close Price", f.purple, (e) => e.src("hlcc4"), "TA-Lib WCLPRICE = (H + L + 2C) / 4"), vt = /* @__PURE__ */ h({
1051
+ beta: () => Mt,
1052
+ correl: () => jt,
1053
+ linearreg: () => St,
1054
+ linearregAngle: () => Tt,
1055
+ linearregIntercept: () => wt,
1056
+ linearregSlope: () => Ct,
1057
+ stddev: () => Dt,
1058
+ tsf: () => Et,
1059
+ variance: () => Ot
1060
+ }), yt = (e, t = 2) => o("length", e, t, 5e3), bt = 180 / Math.PI, xt = (e, t, n, r, i, o) => a({
1061
+ id: e,
1062
+ name: t,
1063
+ family: "statistic",
1064
+ needs: "value",
1065
+ pane: o,
1066
+ inputs: [yt(14), l()],
1067
+ columns: [e],
1068
+ plots: [p(e, n)],
1069
+ label: (e) => `${e.length}`,
1070
+ build: (e, t) => [r(e.linreg(e.src(t.source), t.length), e)],
1071
+ reference: i
1072
+ }), St = xt("linearreg", "Linear Regression", f.blue, (e) => e.value, "TA-Lib LINEARREG", "overlay"), Ct = xt("linearreg-slope", "Linear Regression Slope", f.orange, (e) => e.slope, "TA-Lib LINEARREG_SLOPE", "new"), wt = xt("linearreg-intercept", "Linear Regression Intercept", f.teal, (e) => e.intercept, "TA-Lib LINEARREG_INTERCEPT", "overlay"), Tt = xt("linearreg-angle", "Linear Regression Angle", f.purple, (e, t) => t.map(e.slope, (e) => Math.atan(e) * bt), "TA-Lib LINEARREG_ANGLE (degrees)", "new"), Et = xt("tsf", "Time Series Forecast", f.pink, (e, t) => t.map2(e.value, e.slope, (e, t) => e + t), "TA-Lib TSF = regression value one bar ahead", "overlay"), Dt = a({
1073
+ id: "stddev",
1074
+ name: "Standard Deviation",
1075
+ family: "statistic",
1076
+ needs: "value",
1077
+ pane: "new",
1078
+ inputs: [
1079
+ yt(5, 1),
1080
+ c("nbdev", 1, 0, 100, .1),
1081
+ l()
1082
+ ],
1083
+ columns: ["stddev"],
1084
+ plots: [p("stddev", f.blue)],
1085
+ label: (e) => `${e.length}`,
1086
+ build: (e, t) => [e.map(e.stdev(e.src(t.source), t.length), (e) => e * t.nbdev)],
1087
+ reference: "TA-Lib STDDEV (population)"
1088
+ }), Ot = a({
1089
+ id: "var",
1090
+ name: "Variance",
1091
+ family: "statistic",
1092
+ needs: "value",
1093
+ pane: "new",
1094
+ inputs: [yt(5, 1), l()],
1095
+ columns: ["var"],
1096
+ plots: [p("var", f.blue)],
1097
+ label: (e) => `${e.length}`,
1098
+ build: (e, t) => [e.variance(e.src(t.source), t.length)],
1099
+ reference: "TA-Lib VAR (population)"
1100
+ }), kt = [...e, "volume"];
1101
+ function At(e, t) {
1102
+ return t === "volume" ? e.volume : e.src(t);
1103
+ }
1104
+ var jt = a({
1105
+ id: "correl",
1106
+ name: "Correlation Coefficient",
1107
+ family: "statistic",
1108
+ needs: "ohlcv",
1109
+ pane: "new",
1110
+ inputs: [
1111
+ yt(30),
1112
+ l("close"),
1113
+ i("source2", "volume", kt)
1114
+ ],
1115
+ columns: ["correl"],
1116
+ plots: [p("correl", f.teal)],
1117
+ label: (e) => `${e.length}`,
1118
+ build: (e, t) => {
1119
+ let n = e.src(t.source), r = At(e, t.source2), i = t.length;
1120
+ return [e.calc((e) => {
1121
+ if (e < i - 1) return NaN;
1122
+ let t = 0, a = 0, o = 0, s = 0, c = 0;
1123
+ for (let l = e - i + 1; l <= e; l++) {
1124
+ let e = n.v[l], i = r.v[l];
1125
+ t += e, a += i, o += e * e, s += i * i, c += e * i;
1126
+ }
1127
+ let l = (i * o - t * t) * (i * s - a * a);
1128
+ return l > 0 ? (i * c - t * a) / Math.sqrt(l) : 0;
1129
+ })];
1130
+ },
1131
+ reference: "TA-Lib CORREL (Pearson; a constant window gives 0 as TA-Lib does)"
1132
+ }), Mt = a({
1133
+ id: "beta",
1134
+ name: "Beta",
1135
+ family: "statistic",
1136
+ needs: "ohlcv",
1137
+ pane: "new",
1138
+ inputs: [
1139
+ yt(5, 1),
1140
+ l("close"),
1141
+ i("source2", "volume", kt)
1142
+ ],
1143
+ columns: ["beta"],
1144
+ plots: [p("beta", f.orange)],
1145
+ label: (e) => `${e.length}`,
1146
+ build: (e, t) => {
1147
+ let n = e.src(t.source), r = At(e, t.source2), i = t.length, a = e.map2(n, e.lag(n, 1), (e, t) => t === 0 ? 0 : (e - t) / t), o = e.map2(r, e.lag(r, 1), (e, t) => t === 0 ? 0 : (e - t) / t);
1148
+ return [e.calc((e) => {
1149
+ if (e < i) return NaN;
1150
+ let t = 0, n = 0, r = 0, s = 0;
1151
+ for (let c = e - i + 1; c <= e; c++) {
1152
+ let e = a.v[c], i = o.v[c];
1153
+ t += e, n += i, r += e * e, s += e * i;
1154
+ }
1155
+ let c = i * r - t * t;
1156
+ return c === 0 ? 0 : (i * s - t * n) / c;
1157
+ })];
1158
+ },
1159
+ reference: "TA-Lib BETA: slope of source2's one-bar returns on source's over `length` returns"
1160
+ }), Nt = /* @__PURE__ */ h({
1161
+ acos: () => Pt,
1162
+ add: () => Xt,
1163
+ asin: () => Ft,
1164
+ atan: () => It,
1165
+ ceil: () => Lt,
1166
+ cos: () => Rt,
1167
+ cosh: () => zt,
1168
+ div: () => $t,
1169
+ exp: () => Bt,
1170
+ floor: () => Vt,
1171
+ ln: () => Ht,
1172
+ log10: () => Ut,
1173
+ max: () => tn,
1174
+ maxindex: () => on,
1175
+ min: () => nn,
1176
+ minindex: () => sn,
1177
+ minmax: () => cn,
1178
+ minmaxindex: () => ln,
1179
+ mult: () => Qt,
1180
+ sin: () => Wt,
1181
+ sinh: () => Gt,
1182
+ sqrt: () => Kt,
1183
+ sub: () => Zt,
1184
+ sum: () => rn,
1185
+ tan: () => qt,
1186
+ tanh: () => Jt
1187
+ }), k = (e, t, n, r = `TA-Lib ${e.toUpperCase()}`) => a({
1188
+ id: e,
1189
+ name: t,
1190
+ family: "math",
1191
+ needs: "value",
1192
+ pane: "new",
1193
+ inputs: [l()],
1194
+ columns: [e],
1195
+ plots: [p(e, f.blue)],
1196
+ build: (e, t) => [e.map(e.src(t.source), (e) => {
1197
+ let t = n(e);
1198
+ return Number.isFinite(t) ? t : NaN;
1199
+ })],
1200
+ reference: r
1201
+ }), Pt = k("acos", "Arc Cosine", Math.acos), Ft = k("asin", "Arc Sine", Math.asin), It = k("atan", "Arc Tangent", Math.atan), Lt = k("ceil", "Ceiling", Math.ceil), Rt = k("cos", "Cosine", Math.cos), zt = k("cosh", "Hyperbolic Cosine", Math.cosh), Bt = k("exp", "Exponential", Math.exp), Vt = k("floor", "Floor", Math.floor), Ht = k("ln", "Natural Log", Math.log), Ut = k("log10", "Log10", Math.log10), Wt = k("sin", "Sine", Math.sin), Gt = k("sinh", "Hyperbolic Sine", Math.sinh), Kt = k("sqrt", "Square Root", Math.sqrt), qt = k("tan", "Tangent", Math.tan), Jt = k("tanh", "Hyperbolic Tangent", Math.tanh), Yt = (e, t, n) => a({
1202
+ id: e,
1203
+ name: t,
1204
+ family: "math",
1205
+ needs: "ohlc",
1206
+ pane: "new",
1207
+ inputs: [l("high"), l("low", "source2")],
1208
+ columns: [e],
1209
+ plots: [p(e, f.orange)],
1210
+ build: (e, t) => [e.map2(e.src(t.source), e.src(t.source2), n)],
1211
+ reference: `TA-Lib ${e.toUpperCase()}`
1212
+ }), Xt = Yt("add", "Vector Arithmetic Add", (e, t) => e + t), Zt = Yt("sub", "Vector Arithmetic Subtraction", (e, t) => e - t), Qt = Yt("mult", "Vector Arithmetic Mult", (e, t) => e * t), $t = Yt("div", "Vector Arithmetic Div", (e, t) => t === 0 ? NaN : e / t), en = (e = 30) => o("length", e, 1, 5e3), tn = a({
1213
+ id: "max",
1214
+ name: "Highest value over a period",
1215
+ family: "math",
1216
+ needs: "value",
1217
+ pane: "overlay",
1218
+ inputs: [en(), l()],
1219
+ columns: ["max"],
1220
+ plots: [p("max", f.green)],
1221
+ label: (e) => `${e.length}`,
1222
+ build: (e, t) => [e.highest(e.src(t.source), t.length)],
1223
+ reference: "TA-Lib MAX"
1224
+ }), nn = a({
1225
+ id: "min",
1226
+ name: "Lowest value over a period",
1227
+ family: "math",
1228
+ needs: "value",
1229
+ pane: "overlay",
1230
+ inputs: [en(), l()],
1231
+ columns: ["min"],
1232
+ plots: [p("min", f.red)],
1233
+ label: (e) => `${e.length}`,
1234
+ build: (e, t) => [e.lowest(e.src(t.source), t.length)],
1235
+ reference: "TA-Lib MIN"
1236
+ }), rn = a({
1237
+ id: "sum",
1238
+ name: "Summation",
1239
+ family: "math",
1240
+ needs: "value",
1241
+ pane: "new",
1242
+ inputs: [en(), l()],
1243
+ columns: ["sum"],
1244
+ plots: [p("sum", f.blue)],
1245
+ label: (e) => `${e.length}`,
1246
+ build: (e, t) => [e.sum(e.src(t.source), t.length)],
1247
+ reference: "TA-Lib SUM"
1248
+ }), an = (e, t) => e.calc((e) => e - t.v[e]), on = a({
1249
+ id: "maxindex",
1250
+ name: "Index of highest value over a period",
1251
+ family: "math",
1252
+ needs: "value",
1253
+ pane: "new",
1254
+ inputs: [en(), l()],
1255
+ columns: ["maxindex"],
1256
+ plots: [p("maxindex", f.green)],
1257
+ label: (e) => `${e.length}`,
1258
+ build: (e, t) => [an(e, e.highestBars(e.src(t.source), t.length, !0))],
1259
+ reference: "TA-Lib MAXINDEX"
1260
+ }), sn = a({
1261
+ id: "minindex",
1262
+ name: "Index of lowest value over a period",
1263
+ family: "math",
1264
+ needs: "value",
1265
+ pane: "new",
1266
+ inputs: [en(), l()],
1267
+ columns: ["minindex"],
1268
+ plots: [p("minindex", f.red)],
1269
+ label: (e) => `${e.length}`,
1270
+ build: (e, t) => [an(e, e.lowestBars(e.src(t.source), t.length))],
1271
+ reference: "TA-Lib MININDEX"
1272
+ }), cn = a({
1273
+ id: "minmax",
1274
+ name: "Lowest and highest values over a period",
1275
+ family: "math",
1276
+ needs: "value",
1277
+ pane: "overlay",
1278
+ inputs: [en(), l()],
1279
+ columns: ["min", "max"],
1280
+ plots: [p("min", f.red), p("max", f.green)],
1281
+ label: (e) => `${e.length}`,
1282
+ build: (e, t) => {
1283
+ let n = e.src(t.source);
1284
+ return [e.lowest(n, t.length), e.highest(n, t.length)];
1285
+ },
1286
+ reference: "TA-Lib MINMAX"
1287
+ }), ln = a({
1288
+ id: "minmaxindex",
1289
+ name: "Indexes of lowest and highest values over a period",
1290
+ family: "math",
1291
+ needs: "value",
1292
+ pane: "new",
1293
+ inputs: [en(), l()],
1294
+ columns: ["minidx", "maxidx"],
1295
+ plots: [p("minidx", f.red), p("maxidx", f.green)],
1296
+ label: (e) => `${e.length}`,
1297
+ build: (e, t) => {
1298
+ let n = e.src(t.source);
1299
+ return [an(e, e.lowestBars(n, t.length)), an(e, e.highestBars(n, t.length, !0))];
1300
+ },
1301
+ reference: "TA-Lib MINMAXINDEX"
1302
+ }), un = /* @__PURE__ */ h({
1303
+ htDcPeriod: () => wn,
1304
+ htDcPhase: () => Tn,
1305
+ htPhasor: () => En,
1306
+ htSine: () => Dn,
1307
+ htTrendMode: () => kn,
1308
+ htTrendline: () => On,
1309
+ mama: () => An
1310
+ }), dn = .0962, fn = .5769, pn = Math.atan(1), mn = 45 / pn, hn = 1 / mn, gn = pn * 8;
1311
+ function _n(e, t, n, r) {
1312
+ return r * (dn * e[t - n] + fn * e[t - n - 2] - fn * e[t - n - 4] - dn * e[t - n - 6]);
1313
+ }
1314
+ function vn(e, t, n) {
1315
+ let r = 3 + n, i = e.col(), a = e.col(), o = e.col(), s = e.col(), c = e.col(), l = e.col(), u = e.col(), d = e.col(), f = e.col(), p = e.col();
1316
+ return {
1317
+ S: r,
1318
+ sm: i,
1319
+ det: a,
1320
+ q1: o,
1321
+ sper: e.node((e, n, m) => {
1322
+ let h = t.v, g = i.v, _ = a.v, v = o.v, y = s.v, b = c.v, x = l.v, S = u.v, C = d.v, w = f.v, T = p.v, E = e.v;
1323
+ for (let e = n; e < m; e++) {
1324
+ if (e < r) {
1325
+ g[e] = _[e] = v[e] = y[e] = b[e] = x[e] = S[e] = C[e] = w[e] = T[e] = E[e] = 0;
1326
+ continue;
1327
+ }
1328
+ let t = T[e - 1], n = .075 * t + .54;
1329
+ g[e] = (4 * h[e] + 3 * h[e - 1] + 2 * h[e - 2] + h[e - 3]) / 10, _[e] = _n(g, e, 0, n), v[e] = _n(_, e, 0, n), y[e] = _n(_, e, 3, n), b[e] = _n(v, e, 0, n);
1330
+ let i = x[e - 1], a = S[e - 1], o = .2 * (v[e] + y[e]) + .8 * i, s = .2 * (_[e - 3] - b[e]) + .8 * a;
1331
+ x[e] = o, S[e] = s;
1332
+ let c = .8 * C[e - 1] + .2 * (s * a + o * i), l = .8 * w[e - 1] + .2 * (s * i - o * a);
1333
+ C[e] = c, w[e] = l;
1334
+ let u = t;
1335
+ l !== 0 && c !== 0 && (u = 360 / (Math.atan(l / c) * mn)), u > 1.5 * t && (u = 1.5 * t), u < .67 * t && (u = .67 * t), u < 6 ? u = 6 : u > 50 && (u = 50), u = .2 * u + .8 * t, T[e] = u, E[e] = .33 * u + .67 * E[e - 1];
1336
+ }
1337
+ })
1338
+ };
1339
+ }
1340
+ function yn(e, t, n) {
1341
+ return e.calc((e) => e >= n ? t.v[e] : NaN);
1342
+ }
1343
+ function bn(e, t) {
1344
+ let { S: n, sm: r, sper: i } = t;
1345
+ return e.node((e, t, a) => {
1346
+ let o = r.v, s = i.v, c = e.v;
1347
+ for (let e = t; e < a; e++) {
1348
+ if (e < n) {
1349
+ c[e] = 0;
1350
+ continue;
1351
+ }
1352
+ let t = Math.floor(s[e] + .5), r = 0, i = 0;
1353
+ for (let n = 0; n < t; n++) {
1354
+ let a = n * gn / t, s = e - n >= 0 ? o[e - n] : 0;
1355
+ r += Math.sin(a) * s, i += Math.cos(a) * s;
1356
+ }
1357
+ let a = c[e - 1];
1358
+ Math.abs(i) > 0 ? a = Math.atan(r / i) * mn : r < 0 ? a -= 90 : r > 0 && (a += 90), a += 90, a += 360 / s[e], i < 0 && (a += 180), a > 315 && (a -= 360), c[e] = a;
1359
+ }
1360
+ });
1361
+ }
1362
+ function xn(e, t, n) {
1363
+ let { S: r, sper: i } = n, a = e.col();
1364
+ return e.node((e, n, o) => {
1365
+ let s = t.v, c = i.v, l = a.v, u = e.v;
1366
+ for (let e = n; e < o; e++) {
1367
+ if (e < r) {
1368
+ l[e] = 0, u[e] = 0;
1369
+ continue;
1370
+ }
1371
+ let t = Math.floor(c[e] + .5), n = 0;
1372
+ for (let r = 0; r < t && e - r >= 0; r++) n += s[e - r];
1373
+ t > 0 && (n /= t), l[e] = n, u[e] = (4 * n + 3 * l[e - 1] + 2 * l[e - 2] + l[e - 3]) / 10;
1374
+ }
1375
+ });
1376
+ }
1377
+ var Sn = 32, Cn = 63, wn = a({
1378
+ id: "ht-dcperiod",
1379
+ name: "Hilbert Transform - Dominant Cycle Period",
1380
+ family: "cycle",
1381
+ needs: "value",
1382
+ pane: "new",
1383
+ inputs: [l()],
1384
+ columns: ["period"],
1385
+ plots: [p("period", f.blue)],
1386
+ build: (e, t) => [yn(e, vn(e, e.src(t.source), 9).sper, Sn)],
1387
+ reference: "TA-Lib HT_DCPERIOD"
1388
+ }), Tn = a({
1389
+ id: "ht-dcphase",
1390
+ name: "Hilbert Transform - Dominant Cycle Phase",
1391
+ family: "cycle",
1392
+ needs: "value",
1393
+ pane: "new",
1394
+ inputs: [l()],
1395
+ columns: ["phase"],
1396
+ plots: [p("phase", f.orange)],
1397
+ build: (e, t) => [yn(e, bn(e, vn(e, e.src(t.source), 34)), Cn)],
1398
+ reference: "TA-Lib HT_DCPHASE"
1399
+ }), En = a({
1400
+ id: "ht-phasor",
1401
+ name: "Hilbert Transform - Phasor Components",
1402
+ family: "cycle",
1403
+ needs: "value",
1404
+ pane: "new",
1405
+ inputs: [l()],
1406
+ columns: ["inphase", "quadrature"],
1407
+ plots: [p("inphase", f.blue), p("quadrature", f.orange)],
1408
+ build: (e, t) => {
1409
+ let n = vn(e, e.src(t.source), 9);
1410
+ return [e.calc((e) => e >= Sn ? n.det.v[e - 3] : NaN), yn(e, n.q1, Sn)];
1411
+ },
1412
+ reference: "TA-Lib HT_PHASOR"
1413
+ }), Dn = a({
1414
+ id: "ht-sine",
1415
+ name: "Hilbert Transform - SineWave",
1416
+ family: "cycle",
1417
+ needs: "value",
1418
+ pane: "new",
1419
+ inputs: [l()],
1420
+ columns: ["sine", "leadsine"],
1421
+ plots: [p("sine", f.blue), p("leadsine", f.orange)],
1422
+ build: (e, t) => {
1423
+ let n = bn(e, vn(e, e.src(t.source), 34));
1424
+ return [e.calc((e) => e >= Cn ? Math.sin(n.v[e] * hn) : NaN), e.calc((e) => e >= Cn ? Math.sin((n.v[e] + 45) * hn) : NaN)];
1425
+ },
1426
+ reference: "TA-Lib HT_SINE"
1427
+ }), On = a({
1428
+ id: "ht-trendline",
1429
+ name: "Hilbert Transform - Instantaneous Trendline",
1430
+ family: "cycle",
1431
+ needs: "value",
1432
+ pane: "overlay",
1433
+ inputs: [l()],
1434
+ columns: ["trendline"],
1435
+ plots: [p("trendline", f.blue)],
1436
+ build: (e, t) => {
1437
+ let n = e.src(t.source);
1438
+ return [yn(e, xn(e, n, vn(e, n, 34)), Cn)];
1439
+ },
1440
+ reference: "TA-Lib HT_TRENDLINE"
1441
+ }), kn = a({
1442
+ id: "ht-trendmode",
1443
+ name: "Hilbert Transform - Trend vs Cycle Mode",
1444
+ family: "cycle",
1445
+ needs: "value",
1446
+ pane: "new",
1447
+ inputs: [l()],
1448
+ columns: ["trendmode"],
1449
+ plots: [d("trendmode", f.green)],
1450
+ build: (e, t) => {
1451
+ let n = e.src(t.source), r = vn(e, n, 34), i = bn(e, r), a = xn(e, n, r), o = e.col(), s = e.col(), c = e.col(), l = e.node((e, t, n) => {
1452
+ let l = r.sm.v, u = r.sper.v, d = i.v, f = a.v, p = o.v, m = s.v, h = c.v, g = e.v;
1453
+ for (let e = t; e < n; e++) {
1454
+ if (e < r.S) {
1455
+ p[e] = m[e] = h[e] = g[e] = 0;
1456
+ continue;
1457
+ }
1458
+ let t = Math.sin(d[e] * hn), n = Math.sin((d[e] + 45) * hn);
1459
+ p[e] = t, m[e] = n;
1460
+ let i = p[e - 1], a = m[e - 1], o = 1, s = h[e - 1];
1461
+ (t > n && i <= a || t < n && i >= a) && (s = 0, o = 0), s += 1, h[e] = s, s < .5 * u[e] && (o = 0);
1462
+ let c = d[e] - d[e - 1];
1463
+ u[e] !== 0 && c > .67 * 360 / u[e] && c < 540 / u[e] && (o = 0);
1464
+ let _ = f[e];
1465
+ _ !== 0 && Math.abs((l[e] - _) / _) >= .015 && (o = 1), g[e] = o;
1466
+ }
1467
+ });
1468
+ return [e.calc((e) => e >= Cn ? l.v[e] : 0)];
1469
+ },
1470
+ reference: "TA-Lib HT_TRENDMODE (0 = cycle mode, 1 = trend mode; 0 during warm-up as in TA-Lib)"
1471
+ }), An = a({
1472
+ id: "mama",
1473
+ name: "MESA Adaptive Moving Average",
1474
+ family: "overlap",
1475
+ needs: "value",
1476
+ pane: "overlay",
1477
+ inputs: [
1478
+ c("fastlimit", .5, .01, .99, .01),
1479
+ c("slowlimit", .05, .01, .99, .01),
1480
+ l()
1481
+ ],
1482
+ columns: ["mama", "fama"],
1483
+ plots: [p("mama", f.blue), p("fama", f.orange)],
1484
+ label: (e) => `${e.fastlimit}, ${e.slowlimit}`,
1485
+ build: (e, t) => {
1486
+ let n = t.fastlimit, r = t.slowlimit, i = e.src(t.source), a = vn(e, i, 9), o = e.col(), s = e.col();
1487
+ return [yn(e, e.node((e, t, c) => {
1488
+ let l = i.v, u = a.det.v, d = a.q1.v, f = o.v, p = s.v, m = e.v;
1489
+ for (let e = t; e < c; e++) {
1490
+ if (e < a.S) {
1491
+ m[e] = f[e] = p[e] = 0;
1492
+ continue;
1493
+ }
1494
+ let t = u[e - 3], i = t === 0 ? 0 : Math.atan(d[e] / t) * mn;
1495
+ p[e] = i;
1496
+ let o = p[e - 1] - i;
1497
+ o < 1 && (o = 1);
1498
+ let s = n;
1499
+ o > 1 && (s = n / o, s < r && (s = r));
1500
+ let c = (1 - s) * m[e - 1] + s * l[e];
1501
+ m[e] = c;
1502
+ let h = s * .5;
1503
+ f[e] = (1 - h) * f[e - 1] + h * c;
1504
+ }
1505
+ }), Sn), yn(e, o, Sn)];
1506
+ },
1507
+ reference: "TA-Lib MAMA"
1508
+ }), jn = /* @__PURE__ */ h({
1509
+ sar: () => Pn,
1510
+ sarext: () => Fn
1511
+ });
1512
+ function Mn(e) {
1513
+ let t = e.high.v, n = e.low.v, r = t[1] - t[0], i = n[0] - n[1];
1514
+ return i > 0 && r < i;
1515
+ }
1516
+ function Nn(e, t) {
1517
+ let n = e.col(), r = e.col(), i = e.col(), a = e.col(), o = e.col();
1518
+ return e.node((s, c, l) => {
1519
+ let u = e.high.v, d = e.low.v, f = n.v, p = r.v, m = i.v, h = a.v, g = o.v, _ = s.v;
1520
+ for (let n = c; n < l; n++) {
1521
+ if (n < 1) {
1522
+ _[n] = NaN;
1523
+ continue;
1524
+ }
1525
+ let r, i, a, o, s, c, l;
1526
+ n === 1 ? (r = t.startValue === 0 ? !Mn(e) : t.startValue > 0, t.startValue === 0 ? r ? (a = u[1], i = d[0]) : (a = d[1], i = u[0]) : t.startValue > 0 ? (a = u[1], i = t.startValue) : (a = d[1], i = Math.abs(t.startValue)), o = t.initLong, s = t.initShort, c = d[1], l = u[1]) : (r = f[n - 1] === 1, i = p[n - 1], a = m[n - 1], o = h[n - 1], s = g[n - 1], c = d[n - 1], l = u[n - 1]);
1527
+ let v = d[n], y = u[n], b;
1528
+ r ? v <= i ? (r = !1, i = a, i < l && (i = l), i < y && (i = y), t.offsetOnReverse !== 0 && (i += i * t.offsetOnReverse), b = t.signed ? -i : i, s = t.initShort, a = v, i += s * (a - i), i < l && (i = l), i < y && (i = y)) : (b = i, y > a && (a = y, o += t.accLong, o > t.maxLong && (o = t.maxLong)), i += o * (a - i), i > c && (i = c), i > v && (i = v)) : y >= i ? (r = !0, i = a, i > c && (i = c), i > v && (i = v), t.offsetOnReverse !== 0 && (i -= i * t.offsetOnReverse), b = i, o = t.initLong, a = y, i += o * (a - i), i > c && (i = c), i > v && (i = v)) : (b = t.signed ? -i : i, v < a && (a = v, s += t.accShort, s > t.maxShort && (s = t.maxShort)), i += s * (a - i), i < l && (i = l), i < y && (i = y)), f[n] = +!!r, p[n] = i, m[n] = a, h[n] = o, g[n] = s, _[n] = b;
1529
+ }
1530
+ });
1531
+ }
1532
+ var A = (e, t) => c(e, t, 0, 100, .01), Pn = a({
1533
+ id: "sar",
1534
+ name: "Parabolic SAR",
1535
+ family: "overlap",
1536
+ needs: "ohlc",
1537
+ pane: "overlay",
1538
+ inputs: [
1539
+ A("start", .02),
1540
+ A("increment", .02),
1541
+ A("maximum", .2)
1542
+ ],
1543
+ columns: ["sar"],
1544
+ plots: [r("sar", "circle", "value", f.blue)],
1545
+ label: (e) => `${e.start}, ${e.increment}, ${e.maximum}`,
1546
+ build: (e, t) => {
1547
+ let n = t.maximum, r = Math.min(t.start, n);
1548
+ return [Nn(e, {
1549
+ startValue: 0,
1550
+ offsetOnReverse: 0,
1551
+ initLong: r,
1552
+ accLong: t.increment,
1553
+ maxLong: n,
1554
+ initShort: r,
1555
+ accShort: t.increment,
1556
+ maxShort: n,
1557
+ signed: !1
1558
+ })];
1559
+ },
1560
+ reference: "TA-Lib SAR (start = increment = acceleration)"
1561
+ }), Fn = a({
1562
+ id: "sarext",
1563
+ name: "Parabolic SAR - Extended",
1564
+ family: "overlap",
1565
+ needs: "ohlc",
1566
+ pane: "overlay",
1567
+ inputs: [
1568
+ c("startvalue", 0, -1e9, 1e9, .1),
1569
+ A("offsetonreverse", 0),
1570
+ A("accelerationinitlong", .02),
1571
+ A("accelerationlong", .02),
1572
+ A("accelerationmaxlong", .2),
1573
+ A("accelerationinitshort", .02),
1574
+ A("accelerationshort", .02),
1575
+ A("accelerationmaxshort", .2)
1576
+ ],
1577
+ columns: ["sarext", "level"],
1578
+ plots: [r("level", "circle", "value", f.blue, { title: "SAR" })],
1579
+ label: () => "sarext is negative when short",
1580
+ build: (e, t) => {
1581
+ let n = t.accelerationmaxlong, r = t.accelerationmaxshort, i = Nn(e, {
1582
+ startValue: t.startvalue,
1583
+ offsetOnReverse: t.offsetonreverse,
1584
+ initLong: Math.min(t.accelerationinitlong, n),
1585
+ accLong: Math.min(t.accelerationlong, n),
1586
+ maxLong: n,
1587
+ initShort: Math.min(t.accelerationinitshort, r),
1588
+ accShort: Math.min(t.accelerationshort, r),
1589
+ maxShort: r,
1590
+ signed: !0
1591
+ });
1592
+ return [i, e.map(i, Math.abs)];
1593
+ },
1594
+ reference: "TA-Lib SAREXT (signed: negative when short)"
1595
+ }), In = /* @__PURE__ */ h({
1596
+ cdl2Crows: () => Xn,
1597
+ cdl3BlackCrows: () => Zn,
1598
+ cdl3Inside: () => Qn,
1599
+ cdl3LineStrike: () => $n,
1600
+ cdl3Outside: () => er,
1601
+ cdl3StarsInSouth: () => tr,
1602
+ cdl3WhiteSoldiers: () => nr,
1603
+ cdlAbandonedBaby: () => rr,
1604
+ cdlAdvanceBlock: () => ir,
1605
+ cdlBeltHold: () => ar,
1606
+ cdlBreakaway: () => or,
1607
+ cdlClosingMarubozu: () => sr,
1608
+ cdlConcealBabySwall: () => cr,
1609
+ cdlCounterAttack: () => lr,
1610
+ cdlDarkCloudCover: () => ur,
1611
+ cdlDoji: () => dr,
1612
+ cdlDojiStar: () => fr,
1613
+ cdlDragonflyDoji: () => pr,
1614
+ cdlEngulfing: () => mr,
1615
+ cdlEveningDojiStar: () => hr,
1616
+ cdlEveningStar: () => gr,
1617
+ cdlGapSideSideWhite: () => _r,
1618
+ cdlGravestoneDoji: () => vr,
1619
+ cdlHammer: () => yr,
1620
+ cdlHangingMan: () => br,
1621
+ cdlHarami: () => xr,
1622
+ cdlHaramiCross: () => Sr,
1623
+ cdlHighWave: () => Cr,
1624
+ cdlHikkake: () => Tr,
1625
+ cdlHikkakeMod: () => Er,
1626
+ cdlHomingPigeon: () => Dr,
1627
+ cdlIdentical3Crows: () => Or,
1628
+ cdlInNeck: () => kr,
1629
+ cdlInvertedHammer: () => Ar,
1630
+ cdlKicking: () => Nr,
1631
+ cdlKickingByLength: () => Pr,
1632
+ cdlLadderBottom: () => Fr,
1633
+ cdlLongLeggedDoji: () => Ir,
1634
+ cdlLongLine: () => Lr,
1635
+ cdlMarubozu: () => Rr,
1636
+ cdlMatHold: () => Br,
1637
+ cdlMatchingLow: () => zr,
1638
+ cdlMorningDojiStar: () => Vr,
1639
+ cdlMorningStar: () => Hr,
1640
+ cdlOnNeck: () => Ur,
1641
+ cdlPiercing: () => Wr,
1642
+ cdlRickshawMan: () => Gr,
1643
+ cdlRiseFall3Methods: () => Kr,
1644
+ cdlSeparatingLines: () => qr,
1645
+ cdlShootingStar: () => Jr,
1646
+ cdlShortLine: () => Yr,
1647
+ cdlSpinningTop: () => Xr,
1648
+ cdlStalledPattern: () => Zr,
1649
+ cdlStickSandwich: () => Qr,
1650
+ cdlTakuri: () => $r,
1651
+ cdlTasukiGap: () => ei,
1652
+ cdlThrusting: () => ti,
1653
+ cdlTriStar: () => ni,
1654
+ cdlUnique3River: () => ri,
1655
+ cdlUpsideGap2Crows: () => ii,
1656
+ cdlXSideGap3Methods: () => ai
1657
+ }), Ln = 0, Rn = 1, zn = 2, j = {
1658
+ rt: Ln,
1659
+ p: 10,
1660
+ f: 1
1661
+ }, M = {
1662
+ rt: Ln,
1663
+ p: 10,
1664
+ f: 1
1665
+ }, N = {
1666
+ rt: Rn,
1667
+ p: 10,
1668
+ f: .1
1669
+ }, P = {
1670
+ rt: Ln,
1671
+ p: 0,
1672
+ f: 1
1673
+ }, Bn = {
1674
+ rt: Ln,
1675
+ p: 0,
1676
+ f: 2
1677
+ }, F = {
1678
+ rt: zn,
1679
+ p: 10,
1680
+ f: 1
1681
+ }, I = {
1682
+ rt: Rn,
1683
+ p: 10,
1684
+ f: .1
1685
+ }, L = {
1686
+ rt: Rn,
1687
+ p: 5,
1688
+ f: .2
1689
+ }, Vn = {
1690
+ rt: Rn,
1691
+ p: 5,
1692
+ f: .6
1693
+ }, R = {
1694
+ rt: Rn,
1695
+ p: 5,
1696
+ f: .05
1697
+ }, z, Hn, Un, Wn;
1698
+ function Gn(e) {
1699
+ z = e.open.v, Hn = e.high.v, Un = e.low.v, Wn = e.close.v;
1700
+ }
1701
+ var B = (e) => z[e], V = (e) => Hn[e], H = (e) => Un[e], U = (e) => Wn[e], W = (e) => Wn[e] >= z[e] ? 1 : -1, G = (e) => Math.abs(Wn[e] - z[e]), K = (e) => Hn[e] - (Wn[e] >= z[e] ? Wn[e] : z[e]), q = (e) => (Wn[e] >= z[e] ? z[e] : Wn[e]) - Un[e];
1702
+ function Kn(e, t) {
1703
+ return e.rt === Ln ? G(t) : e.rt === Rn ? Hn[t] - Un[t] : K(t) + q(t);
1704
+ }
1705
+ function J(e, t, n) {
1706
+ return e.f * (e.p === 0 ? Kn(e, n) : t / e.p) / (e.rt === zn ? 2 : 1);
1707
+ }
1708
+ function qn(e, t, n) {
1709
+ let r = e * t, i = 134217729 * e, a = i - (i - e), o = e - a, s = 134217729 * t, c = s - (s - t), l = t - c, u = a * c - r + a * l + o * c + o * l, d = r + n, f = d - r;
1710
+ return d + (r - (d - f) + (n - f) + u);
1711
+ }
1712
+ function Jn(e, t, n, r) {
1713
+ if (t.p === 0) throw RangeError("a setting without an averaging period has no running total");
1714
+ let i = t.p;
1715
+ return e.node((a, o, s) => {
1716
+ Gn(e);
1717
+ let c = a.v;
1718
+ for (let e = o; e < s; e++) {
1719
+ if (e < r) {
1720
+ c[e] = NaN;
1721
+ continue;
1722
+ }
1723
+ let a = e - n;
1724
+ if (e === r) {
1725
+ let n = 0;
1726
+ for (let e = a - i; e < a; e++) n += Kn(t, e);
1727
+ c[e] = n;
1728
+ } else c[e] = c[e - 1] + (Kn(t, a - 1) - Kn(t, a - 1 - i));
1729
+ }
1730
+ });
1731
+ }
1732
+ function Yn(e, t, n, i) {
1733
+ return a({
1734
+ id: `cdl-${e.toLowerCase()}`,
1735
+ name: t,
1736
+ family: "pattern",
1737
+ needs: "ohlc",
1738
+ pane: "overlay",
1739
+ inputs: n,
1740
+ columns: ["signal"],
1741
+ plots: [r("signal", "arrowUp", "sign", f.blue, { text: !0 })],
1742
+ build: i,
1743
+ reference: `TA-Lib CDL${e}`
1744
+ });
1745
+ }
1746
+ function Y(e, t, n, r, i, a) {
1747
+ return Yn(e, t, a ? [c("penetration", a.pen, 0, 10, .05)] : [], (e, t) => {
1748
+ let o = r.map(([t, r]) => Jn(e, t, r, n)), s = new Float64Array(o.length), c = a ? t.penetration : 0;
1749
+ return [e.node((t, r, a) => {
1750
+ Gn(e);
1751
+ let l = t.v;
1752
+ for (let e = r; e < a; e++) if (e < n) l[e] = NaN;
1753
+ else {
1754
+ for (let t = 0; t < o.length; t++) s[t] = o[t].v[e];
1755
+ l[e] = i(e, s, c);
1756
+ }
1757
+ })];
1758
+ });
1759
+ }
1760
+ var Xn = Y("2CROWS", "Two Crows", 12, [[j, 2]], (e, t) => W(e - 2) === 1 && G(e - 2) > J(j, t[0], e - 2) && W(e - 1) === -1 && Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2)) && W(e) === -1 && B(e) < B(e - 1) && B(e) > U(e - 1) && U(e) > B(e - 2) && U(e) < U(e - 2) ? -100 : 0), Zn = Y("3BLACKCROWS", "Three Black Crows", 13, [
1761
+ [I, 2],
1762
+ [I, 1],
1763
+ [I, 0]
1764
+ ], (e, t) => W(e - 3) === 1 && W(e - 2) === -1 && W(e - 1) === -1 && W(e) === -1 && B(e - 1) < B(e - 2) && B(e - 1) > U(e - 2) && B(e) < B(e - 1) && B(e) > U(e - 1) && V(e - 3) > U(e - 2) && U(e - 2) > U(e - 1) && U(e - 1) > U(e) && q(e - 2) < J(I, t[0], e - 2) && q(e - 1) < J(I, t[1], e - 1) && q(e) < J(I, t[2], e) ? -100 : 0), Qn = Y("3INSIDE", "Three Inside Up/Down", 12, [[j, 2], [M, 1]], (e, t) => Math.max(U(e - 1), B(e - 1)) < Math.max(U(e - 2), B(e - 2)) && Math.min(U(e - 1), B(e - 1)) > Math.min(U(e - 2), B(e - 2)) && (W(e - 2) === 1 && W(e) === -1 && U(e) < B(e - 2) || W(e - 2) === -1 && W(e) === 1 && U(e) > B(e - 2)) && G(e - 2) > J(j, t[0], e - 2) && G(e - 1) <= J(M, t[1], e - 1) ? -W(e - 2) * 100 : 0), $n = Y("3LINESTRIKE", "Three-Line Strike", 8, [[L, 3], [L, 2]], (e, t) => W(e - 3) === W(e - 2) && W(e - 2) === W(e - 1) && W(e) === -W(e - 1) && B(e - 2) >= Math.min(B(e - 3), U(e - 3)) - J(L, t[0], e - 3) && B(e - 2) <= Math.max(B(e - 3), U(e - 3)) + J(L, t[0], e - 3) && B(e - 1) >= Math.min(B(e - 2), U(e - 2)) - J(L, t[1], e - 2) && B(e - 1) <= Math.max(B(e - 2), U(e - 2)) + J(L, t[1], e - 2) && (W(e - 1) === 1 && U(e - 1) > U(e - 2) && U(e - 2) > U(e - 3) && B(e) > U(e - 1) && U(e) < B(e - 3) || W(e - 1) === -1 && U(e - 1) < U(e - 2) && U(e - 2) < U(e - 3) && B(e) < U(e - 1) && U(e) > B(e - 3)) ? W(e - 1) * 100 : 0), er = Y("3OUTSIDE", "Three Outside Up/Down", 3, [], (e) => W(e - 1) === 1 && W(e - 2) === -1 && U(e - 1) > B(e - 2) && B(e - 1) < U(e - 2) && U(e) > U(e - 1) || W(e - 1) === -1 && W(e - 2) === 1 && B(e - 1) > U(e - 2) && U(e - 1) < B(e - 2) && U(e) < U(e - 1) ? W(e - 1) * 100 : 0), tr = Y("3STARSINSOUTH", "Three Stars In The South", 12, [
1765
+ [j, 2],
1766
+ [I, 1],
1767
+ [I, 0],
1768
+ [M, 0]
1769
+ ], (e, t) => W(e - 2) === -1 && W(e - 1) === -1 && W(e) === -1 && G(e - 2) > J(j, t[0], e - 2) && q(e - 2) > J(P, 0, e - 2) && G(e - 1) < G(e - 2) && B(e - 1) > U(e - 2) && B(e - 1) <= V(e - 2) && H(e - 1) < U(e - 2) && H(e - 1) >= H(e - 2) && q(e - 1) > J(I, t[1], e - 1) && G(e) < J(M, t[3], e) && q(e) < J(I, t[2], e) && K(e) < J(I, t[2], e) && H(e) > H(e - 1) && V(e) < V(e - 1) ? 100 : 0), nr = Y("3WHITESOLDIERS", "Three Advancing White Soldiers", 12, [
1770
+ [I, 2],
1771
+ [I, 1],
1772
+ [I, 0],
1773
+ [L, 2],
1774
+ [L, 1],
1775
+ [Vn, 2],
1776
+ [Vn, 1],
1777
+ [M, 0]
1778
+ ], (e, t) => W(e - 2) === 1 && K(e - 2) < J(I, t[0], e - 2) && W(e - 1) === 1 && K(e - 1) < J(I, t[1], e - 1) && W(e) === 1 && K(e) < J(I, t[2], e) && U(e) > U(e - 1) && U(e - 1) > U(e - 2) && B(e - 1) > B(e - 2) && B(e - 1) <= U(e - 2) + J(L, t[3], e - 2) && B(e) > B(e - 1) && B(e) <= U(e - 1) + J(L, t[4], e - 1) && G(e - 1) > G(e - 2) - J(Vn, t[5], e - 2) && G(e) > G(e - 1) - J(Vn, t[6], e - 1) && G(e) > J(M, t[7], e) ? 100 : 0), rr = Y("ABANDONEDBABY", "Abandoned Baby", 12, [
1779
+ [j, 2],
1780
+ [N, 1],
1781
+ [M, 0]
1782
+ ], (e, t, n) => G(e - 2) > J(j, t[0], e - 2) && G(e - 1) <= J(N, t[1], e - 1) && G(e) > J(M, t[2], e) && (W(e - 2) === 1 && W(e) === -1 && U(e) < U(e - 2) - G(e - 2) * n && H(e - 1) > V(e - 2) && V(e) < H(e - 1) || W(e - 2) === -1 && W(e) === 1 && U(e) > qn(G(e - 2), n, U(e - 2)) && V(e - 1) < H(e - 2) && H(e) > V(e - 1)) ? W(e) * 100 : 0, { pen: .3 }), ir = Y("ADVANCEBLOCK", "Advance Block", 12, [
1783
+ [F, 2],
1784
+ [F, 1],
1785
+ [F, 0],
1786
+ [L, 2],
1787
+ [L, 1],
1788
+ [Vn, 2],
1789
+ [Vn, 1],
1790
+ [j, 2]
1791
+ ], (e, t) => W(e - 2) === 1 && W(e - 1) === 1 && W(e) === 1 && U(e) > U(e - 1) && U(e - 1) > U(e - 2) && B(e - 1) > B(e - 2) && B(e - 1) <= U(e - 2) + J(L, t[3], e - 2) && B(e) > B(e - 1) && B(e) <= U(e - 1) + J(L, t[4], e - 1) && G(e - 2) > J(j, t[7], e - 2) && K(e - 2) < J(F, t[0], e - 2) && (G(e - 1) < G(e - 2) - J(Vn, t[5], e - 2) && G(e) < G(e - 1) + J(L, t[4], e - 1) || G(e) < G(e - 1) - J(Vn, t[6], e - 1) || G(e) < G(e - 1) && G(e - 1) < G(e - 2) && (K(e) > J(F, t[2], e) || K(e - 1) > J(F, t[1], e - 1)) || G(e) < G(e - 1) && K(e) > J(P, 0, e)) ? -100 : 0), ar = Y("BELTHOLD", "Belt-hold", 10, [[j, 0], [I, 0]], (e, t) => G(e) > J(j, t[0], e) && (W(e) === 1 && q(e) < J(I, t[1], e) || W(e) === -1 && K(e) < J(I, t[1], e)) ? W(e) * 100 : 0), or = Y("BREAKAWAY", "Breakaway", 14, [[j, 4]], (e, t) => W(e - 4) === W(e - 3) && W(e - 3) === W(e - 1) && W(e - 1) === -W(e) && G(e - 4) > J(j, t[0], e - 4) && (W(e - 4) === -1 && Math.max(B(e - 3), U(e - 3)) < Math.min(B(e - 4), U(e - 4)) && V(e - 2) < V(e - 3) && H(e - 2) < H(e - 3) && V(e - 1) < V(e - 2) && H(e - 1) < H(e - 2) && U(e) > B(e - 3) && U(e) < U(e - 4) || W(e - 4) === 1 && Math.min(B(e - 3), U(e - 3)) > Math.max(B(e - 4), U(e - 4)) && V(e - 2) > V(e - 3) && H(e - 2) > H(e - 3) && V(e - 1) > V(e - 2) && H(e - 1) > H(e - 2) && U(e) < B(e - 3) && U(e) > U(e - 4)) ? W(e) * 100 : 0), sr = Y("CLOSINGMARUBOZU", "Closing Marubozu", 10, [[j, 0], [I, 0]], (e, t) => G(e) > J(j, t[0], e) && (W(e) === 1 && K(e) < J(I, t[1], e) || W(e) === -1 && q(e) < J(I, t[1], e)) ? W(e) * 100 : 0), cr = Y("CONCEALBABYSWALL", "Concealing Baby Swallow", 13, [
1792
+ [I, 3],
1793
+ [I, 2],
1794
+ [I, 1]
1795
+ ], (e, t) => W(e - 3) === -1 && W(e - 2) === -1 && W(e - 1) === -1 && W(e) === -1 && q(e - 3) < J(I, t[0], e - 3) && K(e - 3) < J(I, t[0], e - 3) && q(e - 2) < J(I, t[1], e - 2) && K(e - 2) < J(I, t[1], e - 2) && Math.max(B(e - 1), U(e - 1)) < Math.min(B(e - 2), U(e - 2)) && K(e - 1) > J(I, t[2], e - 1) && V(e - 1) > U(e - 2) && V(e) > V(e - 1) && H(e) < H(e - 1) ? 100 : 0), lr = Y("COUNTERATTACK", "Counterattack", 11, [
1796
+ [R, 1],
1797
+ [j, 1],
1798
+ [j, 0]
1799
+ ], (e, t) => W(e - 1) === -W(e) && G(e - 1) > J(j, t[1], e - 1) && G(e) > J(j, t[2], e) && U(e) <= U(e - 1) + J(R, t[0], e - 1) && U(e) >= U(e - 1) - J(R, t[0], e - 1) ? W(e) * 100 : 0), ur = Y("DARKCLOUDCOVER", "Dark Cloud Cover", 11, [[j, 1]], (e, t, n) => W(e - 1) === 1 && G(e - 1) > J(j, t[0], e - 1) && W(e) === -1 && B(e) > V(e - 1) && U(e) > B(e - 1) && U(e) < U(e - 1) - G(e - 1) * n ? -100 : 0, { pen: .5 }), dr = Y("DOJI", "Doji", 10, [[N, 0]], (e, t) => G(e) <= J(N, t[0], e) ? 100 : 0), fr = Y("DOJISTAR", "Doji Star", 11, [[j, 1], [N, 0]], (e, t) => G(e - 1) > J(j, t[0], e - 1) && G(e) <= J(N, t[1], e) && (W(e - 1) === 1 && Math.min(B(e), U(e)) > Math.max(B(e - 1), U(e - 1)) || W(e - 1) === -1 && Math.max(B(e), U(e)) < Math.min(B(e - 1), U(e - 1))) ? -W(e - 1) * 100 : 0), pr = Y("DRAGONFLYDOJI", "Dragonfly Doji", 10, [[N, 0], [I, 0]], (e, t) => G(e) <= J(N, t[0], e) && K(e) < J(I, t[1], e) && q(e) > J(I, t[1], e) ? 100 : 0), mr = Y("ENGULFING", "Engulfing Pattern", 2, [], (e) => W(e) === 1 && W(e - 1) === -1 && (U(e) >= B(e - 1) && B(e) < U(e - 1) || U(e) > B(e - 1) && B(e) <= U(e - 1)) || W(e) === -1 && W(e - 1) === 1 && (B(e) >= U(e - 1) && U(e) < B(e - 1) || B(e) > U(e - 1) && U(e) <= B(e - 1)) ? B(e) !== U(e - 1) && U(e) !== B(e - 1) ? W(e) * 100 : W(e) * 80 : 0), hr = Y("EVENINGDOJISTAR", "Evening Doji Star", 12, [
1800
+ [j, 2],
1801
+ [N, 1],
1802
+ [M, 0]
1803
+ ], (e, t, n) => W(e - 2) === 1 && W(e) === -1 && Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2)) && U(e) < U(e - 2) - G(e - 2) * n && G(e - 2) > J(j, t[0], e - 2) && G(e - 1) <= J(N, t[1], e - 1) && G(e) > J(M, t[2], e) ? -100 : 0, { pen: .3 }), gr = Y("EVENINGSTAR", "Evening Star", 12, [
1804
+ [j, 2],
1805
+ [M, 1],
1806
+ [M, 0]
1807
+ ], (e, t, n) => W(e - 2) === 1 && W(e) === -1 && Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2)) && U(e) < U(e - 2) - G(e - 2) * n && G(e - 2) > J(j, t[0], e - 2) && G(e - 1) <= J(M, t[1], e - 1) && G(e) > J(M, t[2], e) ? -100 : 0, { pen: .3 }), _r = Y("GAPSIDESIDEWHITE", "Up/Down-gap side-by-side white lines", 7, [[L, 1], [R, 1]], (e, t) => {
1808
+ let n = Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2));
1809
+ return (n && Math.min(B(e), U(e)) > Math.max(B(e - 2), U(e - 2)) || Math.max(B(e - 1), U(e - 1)) < Math.min(B(e - 2), U(e - 2)) && Math.max(B(e), U(e)) < Math.min(B(e - 2), U(e - 2))) && W(e - 1) === 1 && W(e) === 1 && G(e) >= G(e - 1) - J(L, t[0], e - 1) && G(e) <= G(e - 1) + J(L, t[0], e - 1) && B(e) >= B(e - 1) - J(R, t[1], e - 1) && B(e) <= B(e - 1) + J(R, t[1], e - 1) ? n ? 100 : -100 : 0;
1810
+ }), vr = Y("GRAVESTONEDOJI", "Gravestone Doji", 10, [[N, 0], [I, 0]], (e, t) => G(e) <= J(N, t[0], e) && q(e) < J(I, t[1], e) && K(e) > J(I, t[1], e) ? 100 : 0), yr = Y("HAMMER", "Hammer", 11, [
1811
+ [M, 0],
1812
+ [I, 0],
1813
+ [L, 1]
1814
+ ], (e, t) => G(e) < J(M, t[0], e) && q(e) > J(P, 0, e) && K(e) < J(I, t[1], e) && Math.min(U(e), B(e)) <= H(e - 1) + J(L, t[2], e - 1) ? 100 : 0), br = Y("HANGINGMAN", "Hanging Man", 11, [
1815
+ [M, 0],
1816
+ [I, 0],
1817
+ [L, 1]
1818
+ ], (e, t) => G(e) < J(M, t[0], e) && q(e) > J(P, 0, e) && K(e) < J(I, t[1], e) && Math.min(U(e), B(e)) >= V(e - 1) - J(L, t[2], e - 1) ? -100 : 0), xr = Y("HARAMI", "Harami Pattern", 11, [[j, 1], [M, 0]], (e, t) => {
1819
+ if (!(G(e - 1) > J(j, t[0], e - 1) && G(e) <= J(M, t[1], e))) return 0;
1820
+ let n = Math.max(U(e), B(e)), r = Math.min(U(e), B(e)), i = Math.max(U(e - 1), B(e - 1)), a = Math.min(U(e - 1), B(e - 1));
1821
+ return n < i && r > a ? -W(e - 1) * 100 : n <= i && r >= a ? -W(e - 1) * 80 : 0;
1822
+ }), Sr = Y("HARAMICROSS", "Harami Cross Pattern", 11, [[j, 1], [N, 0]], (e, t) => {
1823
+ if (!(G(e - 1) > J(j, t[0], e - 1) && G(e) <= J(N, t[1], e))) return 0;
1824
+ let n = Math.max(U(e), B(e)), r = Math.min(U(e), B(e)), i = Math.max(U(e - 1), B(e - 1)), a = Math.min(U(e - 1), B(e - 1));
1825
+ return n < i && r > a ? -W(e - 1) * 100 : n <= i && r >= a ? -W(e - 1) * 80 : 0;
1826
+ }), Cr = Y("HIGHWAVE", "High-Wave Candle", 10, [[M, 0]], (e, t) => G(e) < J(M, t[0], e) && K(e) > J(Bn, 0, e) && q(e) > J(Bn, 0, e) ? W(e) * 100 : 0);
1827
+ function wr(e, t, n) {
1828
+ let r = n ? 10 : 5, i = r - 3;
1829
+ return Yn(e, t, [], (e) => {
1830
+ let t = n ? Jn(e, L, 2, i) : null, a = e.col(), o = e.col(), s = e.col(), c = e.col();
1831
+ return [e.node((l, u, d) => {
1832
+ Gn(e);
1833
+ let f = l.v, p = a.v, m = o.v, h = s.v, g = c.v;
1834
+ for (let e = u; e < d; e++) {
1835
+ if (e < i) {
1836
+ f[e] = NaN;
1837
+ continue;
1838
+ }
1839
+ let a = e > i ? p[e - 1] : 0, o = e > i ? m[e - 1] : 0, s = e > i ? h[e - 1] : 0, c = e > i ? g[e - 1] : 0, l = 0;
1840
+ (n ? V(e - 2) < V(e - 3) && H(e - 2) > H(e - 3) && V(e - 1) < V(e - 2) && H(e - 1) > H(e - 2) && (V(e) < V(e - 1) && H(e) < H(e - 1) && U(e - 2) <= H(e - 2) + J(L, t.v[e], e - 2) || V(e) > V(e - 1) && H(e) > H(e - 1) && U(e - 2) >= V(e - 2) - J(L, t.v[e], e - 2)) : V(e - 1) < V(e - 2) && H(e - 1) > H(e - 2) && (V(e) < V(e - 1) && H(e) < H(e - 1) || V(e) > V(e - 1) && H(e) > H(e - 1))) ? (o = 100 * (V(e) < V(e - 1) ? 1 : -1), s = V(e - 1), c = H(e - 1), a = 4, l = o) : a > 0 && (o > 0 && U(e) > s || o < 0 && U(e) < c) && (l = o + 100 * (o > 0 ? 1 : -1), a = 0), a > 0 && --a, p[e] = a, m[e] = o, h[e] = s, g[e] = c, f[e] = e >= r ? l : NaN;
1841
+ }
1842
+ })];
1843
+ });
1844
+ }
1845
+ var Tr = wr("HIKKAKE", "Hikkake Pattern", !1), Er = wr("HIKKAKEMOD", "Modified Hikkake Pattern", !0), Dr = Y("HOMINGPIGEON", "Homing Pigeon", 11, [[j, 1], [M, 0]], (e, t) => W(e - 1) === -1 && W(e) === -1 && G(e - 1) > J(j, t[0], e - 1) && G(e) <= J(M, t[1], e) && B(e) < B(e - 1) && U(e) > U(e - 1) ? 100 : 0), Or = Y("IDENTICAL3CROWS", "Identical Three Crows", 12, [
1846
+ [I, 2],
1847
+ [I, 1],
1848
+ [I, 0],
1849
+ [R, 2],
1850
+ [R, 1]
1851
+ ], (e, t) => W(e - 2) === -1 && q(e - 2) < J(I, t[0], e - 2) && W(e - 1) === -1 && q(e - 1) < J(I, t[1], e - 1) && W(e) === -1 && q(e) < J(I, t[2], e) && U(e - 2) > U(e - 1) && U(e - 1) > U(e) && B(e - 1) <= U(e - 2) + J(R, t[3], e - 2) && B(e - 1) >= U(e - 2) - J(R, t[3], e - 2) && B(e) <= U(e - 1) + J(R, t[4], e - 1) && B(e) >= U(e - 1) - J(R, t[4], e - 1) ? -100 : 0), kr = Y("INNECK", "In-Neck Pattern", 11, [[R, 1], [j, 1]], (e, t) => W(e - 1) === -1 && G(e - 1) > J(j, t[1], e - 1) && W(e) === 1 && B(e) < H(e - 1) && U(e) <= U(e - 1) + J(R, t[0], e - 1) && U(e) >= U(e - 1) ? -100 : 0), Ar = Y("INVERTEDHAMMER", "Inverted Hammer", 11, [[M, 0], [I, 0]], (e, t) => Math.max(B(e), U(e)) < Math.min(B(e - 1), U(e - 1)) && G(e) < J(M, t[0], e) && K(e) > J(P, 0, e) && q(e) < J(I, t[1], e) ? 100 : 0);
1852
+ function jr(e, t) {
1853
+ return W(e - 1) === -W(e) && G(e - 1) > J(j, t[2], e - 1) && K(e - 1) < J(I, t[0], e - 1) && q(e - 1) < J(I, t[0], e - 1) && G(e) > J(j, t[3], e) && K(e) < J(I, t[1], e) && q(e) < J(I, t[1], e) && (W(e - 1) === -1 && H(e) > V(e - 1) || W(e - 1) === 1 && V(e) < H(e - 1));
1854
+ }
1855
+ var Mr = [
1856
+ [I, 1],
1857
+ [I, 0],
1858
+ [j, 1],
1859
+ [j, 0]
1860
+ ], Nr = Y("KICKING", "Kicking", 11, Mr, (e, t) => jr(e, t) ? W(e) * 100 : 0), Pr = Y("KICKINGBYLENGTH", "Kicking - bull/bear determined by the longer marubozu", 11, Mr, (e, t) => jr(e, t) ? W(G(e) > G(e - 1) ? e : e - 1) * 100 : 0), Fr = Y("LADDERBOTTOM", "Ladder Bottom", 14, [[I, 1]], (e, t) => W(e - 4) === -1 && W(e - 3) === -1 && W(e - 2) === -1 && B(e - 4) > B(e - 3) && B(e - 3) > B(e - 2) && U(e - 4) > U(e - 3) && U(e - 3) > U(e - 2) && W(e - 1) === -1 && K(e - 1) > J(I, t[0], e - 1) && W(e) === 1 && B(e) > B(e - 1) && U(e) > V(e - 1) ? 100 : 0), Ir = Y("LONGLEGGEDDOJI", "Long Legged Doji", 10, [[N, 0]], (e, t) => G(e) <= J(N, t[0], e) && (q(e) > J(P, 0, e) || K(e) > J(P, 0, e)) ? 100 : 0), Lr = Y("LONGLINE", "Long Line Candle", 10, [[j, 0], [F, 0]], (e, t) => G(e) > J(j, t[0], e) && K(e) < J(F, t[1], e) && q(e) < J(F, t[1], e) ? W(e) * 100 : 0), Rr = Y("MARUBOZU", "Marubozu", 10, [[j, 0], [I, 0]], (e, t) => G(e) > J(j, t[0], e) && K(e) < J(I, t[1], e) && q(e) < J(I, t[1], e) ? W(e) * 100 : 0), zr = Y("MATCHINGLOW", "Matching Low", 6, [[R, 1]], (e, t) => W(e - 1) === -1 && W(e) === -1 && U(e) <= U(e - 1) + J(R, t[0], e - 1) && U(e) >= U(e - 1) - J(R, t[0], e - 1) ? 100 : 0), Br = Y("MATHOLD", "Mat Hold", 14, [
1861
+ [j, 4],
1862
+ [M, 3],
1863
+ [M, 2],
1864
+ [M, 1]
1865
+ ], (e, t, n) => W(e - 4) === 1 && W(e - 3) === -1 && W(e) === 1 && Math.min(B(e - 3), U(e - 3)) > Math.max(B(e - 4), U(e - 4)) && Math.min(B(e - 2), U(e - 2)) < U(e - 4) && Math.min(B(e - 1), U(e - 1)) < U(e - 4) && Math.min(B(e - 2), U(e - 2)) > U(e - 4) - G(e - 4) * n && Math.min(B(e - 1), U(e - 1)) > U(e - 4) - G(e - 4) * n && Math.max(U(e - 2), B(e - 2)) < B(e - 3) && Math.max(U(e - 1), B(e - 1)) < Math.max(U(e - 2), B(e - 2)) && B(e) > U(e - 1) && U(e) > Math.max(Math.max(V(e - 3), V(e - 2)), V(e - 1)) && G(e - 4) > J(j, t[0], e - 4) && G(e - 3) < J(M, t[1], e - 3) && G(e - 2) < J(M, t[2], e - 2) && G(e - 1) < J(M, t[3], e - 1) ? 100 : 0, { pen: .5 }), Vr = Y("MORNINGDOJISTAR", "Morning Doji Star", 12, [
1866
+ [j, 2],
1867
+ [N, 1],
1868
+ [M, 0]
1869
+ ], (e, t, n) => W(e - 2) === -1 && W(e) === 1 && Math.max(B(e - 1), U(e - 1)) < Math.min(B(e - 2), U(e - 2)) && U(e) > qn(G(e - 2), n, U(e - 2)) && G(e - 2) > J(j, t[0], e - 2) && G(e - 1) <= J(N, t[1], e - 1) && G(e) > J(M, t[2], e) ? 100 : 0, { pen: .3 }), Hr = Y("MORNINGSTAR", "Morning Star", 12, [
1870
+ [j, 2],
1871
+ [M, 1],
1872
+ [M, 0]
1873
+ ], (e, t, n) => W(e - 2) === -1 && W(e) === 1 && Math.max(B(e - 1), U(e - 1)) < Math.min(B(e - 2), U(e - 2)) && U(e) > qn(G(e - 2), n, U(e - 2)) && G(e - 2) > J(j, t[0], e - 2) && G(e - 1) <= J(M, t[1], e - 1) && G(e) > J(M, t[2], e) ? 100 : 0, { pen: .3 }), Ur = Y("ONNECK", "On-Neck Pattern", 11, [[R, 1], [j, 1]], (e, t) => W(e - 1) === -1 && G(e - 1) > J(j, t[1], e - 1) && W(e) === 1 && B(e) < H(e - 1) && U(e) <= H(e - 1) + J(R, t[0], e - 1) && U(e) >= H(e - 1) - J(R, t[0], e - 1) ? -100 : 0), Wr = Y("PIERCING", "Piercing Pattern", 11, [[j, 1], [j, 0]], (e, t) => W(e - 1) === -1 && G(e - 1) > J(j, t[0], e - 1) && W(e) === 1 && G(e) > J(j, t[1], e) && B(e) < H(e - 1) && U(e) < B(e - 1) && U(e) > qn(G(e - 1), .5, U(e - 1)) ? 100 : 0), Gr = Y("RICKSHAWMAN", "Rickshaw Man", 10, [[N, 0], [L, 0]], (e, t) => G(e) <= J(N, t[0], e) && q(e) > J(P, 0, e) && K(e) > J(P, 0, e) && Math.min(B(e), U(e)) <= H(e) + (V(e) - H(e)) / 2 + J(L, t[1], e) && Math.max(B(e), U(e)) >= H(e) + (V(e) - H(e)) / 2 - J(L, t[1], e) ? 100 : 0), Kr = Y("RISEFALL3METHODS", "Rising/Falling Three Methods", 14, [
1874
+ [j, 4],
1875
+ [M, 3],
1876
+ [M, 2],
1877
+ [M, 1],
1878
+ [j, 0]
1879
+ ], (e, t) => {
1880
+ let n = W(e - 4);
1881
+ return W(e - 4) === -W(e - 3) && W(e - 3) === W(e - 2) && W(e - 2) === W(e - 1) && W(e - 1) === -W(e) && Math.min(B(e - 3), U(e - 3)) < V(e - 4) && Math.max(B(e - 3), U(e - 3)) > H(e - 4) && Math.min(B(e - 2), U(e - 2)) < V(e - 4) && Math.max(B(e - 2), U(e - 2)) > H(e - 4) && Math.min(B(e - 1), U(e - 1)) < V(e - 4) && Math.max(B(e - 1), U(e - 1)) > H(e - 4) && U(e - 2) * n < U(e - 3) * n && U(e - 1) * n < U(e - 2) * n && B(e) * n > U(e - 1) * n && U(e) * n > U(e - 4) * n && G(e - 4) > J(j, t[0], e - 4) && G(e - 3) < J(M, t[1], e - 3) && G(e - 2) < J(M, t[2], e - 2) && G(e - 1) < J(M, t[3], e - 1) && G(e) > J(j, t[4], e) ? 100 * n : 0;
1882
+ }), qr = Y("SEPARATINGLINES", "Separating Lines", 11, [
1883
+ [I, 0],
1884
+ [j, 0],
1885
+ [R, 1]
1886
+ ], (e, t) => W(e - 1) === -W(e) && B(e) <= B(e - 1) + J(R, t[2], e - 1) && B(e) >= B(e - 1) - J(R, t[2], e - 1) && G(e) > J(j, t[1], e) && (W(e) === 1 && q(e) < J(I, t[0], e) || W(e) === -1 && K(e) < J(I, t[0], e)) ? W(e) * 100 : 0), Jr = Y("SHOOTINGSTAR", "Shooting Star", 11, [[M, 0], [I, 0]], (e, t) => Math.min(B(e), U(e)) > Math.max(B(e - 1), U(e - 1)) && G(e) < J(M, t[0], e) && K(e) > J(P, 0, e) && q(e) < J(I, t[1], e) ? -100 : 0), Yr = Y("SHORTLINE", "Short Line Candle", 10, [[M, 0], [F, 0]], (e, t) => G(e) < J(M, t[0], e) && K(e) < J(F, t[1], e) && q(e) < J(F, t[1], e) ? W(e) * 100 : 0), Xr = Y("SPINNINGTOP", "Spinning Top", 10, [[M, 0]], (e, t) => K(e) > G(e) && q(e) > G(e) && G(e) < J(M, t[0], e) ? W(e) * 100 : 0), Zr = Y("STALLEDPATTERN", "Stalled Pattern", 12, [
1887
+ [j, 2],
1888
+ [j, 1],
1889
+ [M, 0],
1890
+ [I, 1],
1891
+ [L, 2],
1892
+ [L, 1]
1893
+ ], (e, t) => W(e - 2) === 1 && W(e - 1) === 1 && W(e) === 1 && U(e) > U(e - 1) && U(e - 1) > U(e - 2) && G(e - 2) > J(j, t[0], e - 2) && G(e - 1) > J(j, t[1], e - 1) && K(e - 1) < J(I, t[3], e - 1) && B(e - 1) > B(e - 2) && B(e - 1) <= U(e - 2) + J(L, t[4], e - 2) && G(e) < J(M, t[2], e) && B(e) >= U(e - 1) - G(e) - J(L, t[5], e - 1) ? -100 : 0), Qr = Y("STICKSANDWICH", "Stick Sandwich", 7, [[R, 2]], (e, t) => W(e - 2) === -1 && W(e - 1) === 1 && W(e) === -1 && H(e - 1) > U(e - 2) && U(e) <= U(e - 2) + J(R, t[0], e - 2) && U(e) >= U(e - 2) - J(R, t[0], e - 2) ? 100 : 0), $r = Y("TAKURI", "Takuri (Dragonfly Doji with very long lower shadow)", 10, [[N, 0], [I, 0]], (e, t) => G(e) <= J(N, t[0], e) && K(e) < J(I, t[1], e) && q(e) > J(Bn, 0, e) ? 100 : 0), ei = Y("TASUKIGAP", "Tasuki Gap", 7, [[L, 1]], (e, t) => Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2)) && W(e - 1) === 1 && W(e) === -1 && B(e) < U(e - 1) && B(e) > B(e - 1) && U(e) < B(e - 1) && U(e) > Math.max(U(e - 2), B(e - 2)) && Math.abs(G(e - 1) - G(e)) < J(L, t[0], e - 1) || Math.max(B(e - 1), U(e - 1)) < Math.min(B(e - 2), U(e - 2)) && W(e - 1) === -1 && W(e) === 1 && B(e) < B(e - 1) && B(e) > U(e - 1) && U(e) > B(e - 1) && U(e) < Math.min(U(e - 2), B(e - 2)) && Math.abs(G(e - 1) - G(e)) < J(L, t[0], e - 1) ? W(e - 1) * 100 : 0), ti = Y("THRUSTING", "Thrusting Pattern", 11, [[R, 1], [j, 1]], (e, t) => W(e - 1) === -1 && G(e - 1) > J(j, t[1], e - 1) && W(e) === 1 && B(e) < H(e - 1) && U(e) > U(e - 1) + J(R, t[0], e - 1) && U(e) <= qn(G(e - 1), .5, U(e - 1)) ? -100 : 0), ni = Y("TRISTAR", "Tristar Pattern", 12, [[N, 2]], (e, t) => {
1894
+ if (!(G(e - 2) <= J(N, t[0], e - 2) && G(e - 1) <= J(N, t[0], e - 2) && G(e) <= J(N, t[0], e - 2))) return 0;
1895
+ let n = 0;
1896
+ return Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2)) && Math.max(B(e), U(e)) < Math.max(B(e - 1), U(e - 1)) && (n = -100), Math.max(B(e - 1), U(e - 1)) < Math.min(B(e - 2), U(e - 2)) && Math.min(B(e), U(e)) > Math.min(B(e - 1), U(e - 1)) && (n = 100), n;
1897
+ }), ri = Y("UNIQUE3RIVER", "Unique 3 River", 12, [[j, 2], [M, 0]], (e, t) => W(e - 2) === -1 && W(e - 1) === -1 && W(e) === 1 && U(e - 1) > U(e - 2) && B(e - 1) <= B(e - 2) && H(e - 1) < H(e - 2) && B(e) > H(e - 1) && G(e - 2) > J(j, t[0], e - 2) && G(e) < J(M, t[1], e) ? 100 : 0), ii = Y("UPSIDEGAP2CROWS", "Upside Gap Two Crows", 12, [[j, 2], [M, 1]], (e, t) => W(e - 2) === 1 && G(e - 2) > J(j, t[0], e - 2) && W(e - 1) === -1 && G(e - 1) <= J(M, t[1], e - 1) && Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2)) && W(e) === -1 && B(e) > B(e - 1) && U(e) < U(e - 1) && U(e) > U(e - 2) ? -100 : 0), ai = Y("XSIDEGAP3METHODS", "Upside/Downside Gap Three Methods", 2, [], (e) => W(e - 2) === W(e - 1) && W(e - 1) === -W(e) && B(e) < Math.max(U(e - 1), B(e - 1)) && B(e) > Math.min(U(e - 1), B(e - 1)) && U(e) < Math.max(U(e - 2), B(e - 2)) && U(e) > Math.min(U(e - 2), B(e - 2)) && (W(e - 2) === 1 && Math.min(B(e - 1), U(e - 1)) > Math.max(B(e - 2), U(e - 2)) || W(e - 2) === -1 && Math.max(B(e - 1), U(e - 1)) < Math.min(B(e - 2), U(e - 2))) ? W(e - 2) * 100 : 0), oi = /* @__PURE__ */ h({
1898
+ alligator: () => Ni,
1899
+ alma: () => hi,
1900
+ chandeKrollStop: () => Di,
1901
+ donchian: () => Ti,
1902
+ envelopes: () => Si,
1903
+ fractals: () => Li,
1904
+ hma: () => mi,
1905
+ ichimoku: () => ji,
1906
+ keltner: () => Ci,
1907
+ linregChannel: () => Oi,
1908
+ lsma: () => gi,
1909
+ maCross: () => xi,
1910
+ maRibbon: () => bi,
1911
+ mcginley: () => _i,
1912
+ median: () => ki,
1913
+ priceChannel: () => Ei,
1914
+ smma: () => fi,
1915
+ supertrend: () => Mi,
1916
+ vwma: () => pi,
1917
+ zigzag: () => Ri
1918
+ }), X = NaN, Z = (e, t = 1) => o("length", e, t, 5e3), si = (e, t) => {
1919
+ let n = parseInt(e.slice(1), 16);
1920
+ return `rgba(${n >> 16},${n >> 8 & 255},${n & 255},${t})`;
1921
+ };
1922
+ function ci(e) {
1923
+ let { high: t, low: n, close: r } = e;
1924
+ return e.node((e, i, a) => {
1925
+ let o = t.v, s = n.v, c = r.v, l = e.v;
1926
+ for (let e = i; e < a; e++) {
1927
+ let t = o[e] - s[e];
1928
+ if (e === 0) {
1929
+ l[e] = t;
1930
+ continue;
1931
+ }
1932
+ let n = c[e - 1], r = Math.abs(o[e] - n), i = Math.abs(s[e] - n);
1933
+ l[e] = t > r ? t > i ? t : i : r > i ? r : i;
1934
+ }
1935
+ });
1936
+ }
1937
+ var li = (e, t) => e.rma(ci(e), t);
1938
+ function ui(e, t, n) {
1939
+ if (!Number.isInteger(n) || n < 2) throw RangeError(`linreg: period must be an integer >= 2, got ${n}`);
1940
+ let r = e.validRun(t), i = n * (n - 1) / 2, a = n * (n * (n - 1) * (2 * n - 1) / 6) - i * i, o = e.col(), s = e.col();
1941
+ return {
1942
+ value: e.node((e, c, l) => {
1943
+ let u = t.v, d = r.v, f = o.v, p = s.v, m = e.v;
1944
+ for (let e = c; e < l; e++) {
1945
+ if (d[e] < n) {
1946
+ f[e] = X, p[e] = X, m[e] = X;
1947
+ continue;
1948
+ }
1949
+ let t = 0, r = 0;
1950
+ for (let i = 0; i < n; i++) {
1951
+ let a = u[e - n + 1 + i];
1952
+ t += a, r += i * a;
1953
+ }
1954
+ let o = (n * r - i * t) / a, s = (t - o * i) / n;
1955
+ f[e] = o, p[e] = s, m[e] = s + o * (n - 1);
1956
+ }
1957
+ }),
1958
+ slope: o,
1959
+ intercept: s
1960
+ };
1961
+ }
1962
+ var di = (e, t, n, r) => t === "ema" ? e.ema(n, r) : e.sma(n, r), fi = a({
1963
+ id: "smma",
1964
+ name: "Smoothed Moving Average",
1965
+ family: "tv",
1966
+ needs: "value",
1967
+ pane: "overlay",
1968
+ inputs: [Z(7), l()],
1969
+ columns: ["smma"],
1970
+ plots: [p("smma", f.teal)],
1971
+ label: (e) => `${e.length}`,
1972
+ build: (e, t) => [e.rma(e.src(t.source), t.length)],
1973
+ reference: "TradingView Smoothed Moving Average: smma := na(smma[1]) ? ta.sma(src, n) : (smma[1] * (n - 1) + src) / n"
1974
+ }), pi = a({
1975
+ id: "vwma",
1976
+ name: "Volume Weighted Moving Average",
1977
+ family: "tv",
1978
+ needs: "ohlcv",
1979
+ pane: "overlay",
1980
+ inputs: [Z(20), l()],
1981
+ columns: ["vwma"],
1982
+ plots: [p("vwma", f.purple)],
1983
+ label: (e) => `${e.length}`,
1984
+ build: (e, t) => [e.div(e.sum(e.mul(e.src(t.source), e.volume), t.length), e.sum(e.volume, t.length))],
1985
+ reference: "Pine ta.vwma(src, n) = ta.sma(src * volume, n) / ta.sma(volume, n)"
1986
+ }), mi = a({
1987
+ id: "hma",
1988
+ name: "Hull Moving Average",
1989
+ family: "tv",
1990
+ needs: "value",
1991
+ pane: "overlay",
1992
+ inputs: [Z(9, 2), l()],
1993
+ columns: ["hma"],
1994
+ plots: [p("hma", f.pink)],
1995
+ label: (e) => `${e.length}`,
1996
+ build: (e, t) => {
1997
+ let n = e.src(t.source), r = Math.floor(t.length / 2), i = Math.round(Math.sqrt(t.length)), a = e.map2(e.wma(n, r), e.wma(n, t.length), (e, t) => 2 * e - t);
1998
+ return [e.wma(a, i)];
1999
+ },
2000
+ reference: "Pine ta.hma(src, n) = ta.wma(2 * ta.wma(src, n / 2) - ta.wma(src, n), round(sqrt(n))), with n / 2 truncated to an int"
2001
+ }), hi = a({
2002
+ id: "alma",
2003
+ name: "Arnaud Legoux Moving Average",
2004
+ family: "tv",
2005
+ needs: "value",
2006
+ pane: "overlay",
2007
+ inputs: [
2008
+ Z(9),
2009
+ c("offset", .85, 0, 1, .05),
2010
+ c("sigma", 6, .1, 100, .5),
2011
+ l()
2012
+ ],
2013
+ columns: ["alma"],
2014
+ plots: [p("alma", f.blue)],
2015
+ label: (e) => `${e.length}, ${e.offset}, ${e.sigma}`,
2016
+ build: (e, t) => {
2017
+ let n = t.length, r = Math.floor(t.offset * (n - 1)), i = n / t.sigma, a = new Float64Array(n), o = 0;
2018
+ for (let e = 0; e < n; e++) a[e] = Math.exp(-((e - r) ** 2) / (2 * i * i)), o += a[e];
2019
+ let s = e.src(t.source), c = e.validRun(s);
2020
+ return [e.node((e, t, r) => {
2021
+ let i = s.v, l = c.v, u = e.v;
2022
+ for (let e = t; e < r; e++) {
2023
+ if (l[e] < n) {
2024
+ u[e] = X;
2025
+ continue;
2026
+ }
2027
+ let t = 0;
2028
+ for (let r = 0; r < n; r++) t += i[e - n + 1 + r] * a[r];
2029
+ u[e] = t / o;
2030
+ }
2031
+ })];
2032
+ },
2033
+ reference: "Pine ta.alma(src, n, offset, sigma): m = floor(offset * (n - 1)), s = n / sigma, w_k = exp(-(k - m)^2 / (2 s^2)), sum(src[n-1-k] * w_k) / sum(w_k)"
2034
+ }), gi = a({
2035
+ id: "lsma",
2036
+ name: "Least Squares Moving Average",
2037
+ family: "tv",
2038
+ needs: "value",
2039
+ pane: "overlay",
2040
+ inputs: [
2041
+ Z(25, 2),
2042
+ o("offset", 0, -5e3, 5e3),
2043
+ l()
2044
+ ],
2045
+ columns: ["lsma"],
2046
+ plots: [p("lsma", f.orange)],
2047
+ label: (e) => `${e.length}, ${e.offset}`,
2048
+ build: (e, t) => {
2049
+ let n = ui(e, e.src(t.source), t.length);
2050
+ return [e.map2(n.value, n.slope, (e, n) => e - t.offset * n)];
2051
+ },
2052
+ reference: "TradingView Least Squares Moving Average = Pine ta.linreg(src, n, offset); offset 0 equals TA-Lib LINEARREG"
2053
+ }), _i = a({
2054
+ id: "mcginley",
2055
+ name: "McGinley Dynamic",
2056
+ family: "tv",
2057
+ needs: "value",
2058
+ pane: "overlay",
2059
+ inputs: [Z(14), l()],
2060
+ columns: ["mcginley"],
2061
+ plots: [p("mcginley", f.green)],
2062
+ label: (e) => `${e.length}`,
2063
+ build: (e, t) => {
2064
+ let n = t.length, r = e.src(t.source), i = e.ema(r, n);
2065
+ return [e.node((e, t, a) => {
2066
+ let o = r.v, s = i.v, c = e.v;
2067
+ for (let e = t; e < a; e++) {
2068
+ let t = e > 0 ? c[e - 1] : X;
2069
+ c[e] = t === t ? t + (o[e] - t) / (n * (o[e] / t) ** 4) : s[e];
2070
+ }
2071
+ })];
2072
+ },
2073
+ reference: "TradingView McGinley Dynamic: mg := na(mg[1]) ? ta.ema(src, n) : mg[1] + (src - mg[1]) / (n * (src / mg[1])^4)"
2074
+ }), vi = [
2075
+ f.blue,
2076
+ f.teal,
2077
+ f.green,
2078
+ f.lime,
2079
+ f.yellow,
2080
+ f.orange,
2081
+ f.red,
2082
+ f.pink
2083
+ ], yi = vi.map((e, t) => `ma${t + 1}`), bi = a({
2084
+ id: "ma-ribbon",
2085
+ name: "Moving Average Ribbon",
2086
+ family: "tv",
2087
+ needs: "value",
2088
+ pane: "overlay",
2089
+ inputs: [
2090
+ o("first", 20, 1, 5e3, "first"),
2091
+ o("step", 5, 1, 1e3, "step"),
2092
+ l()
2093
+ ],
2094
+ columns: yi,
2095
+ plots: yi.map((e, t) => p(e, vi[t], {
2096
+ title: `MA ${t + 1}`,
2097
+ width: 1
2098
+ })),
2099
+ label: (e) => `${e.first}, ${e.step}`,
2100
+ build: (e, t) => {
2101
+ let n = t.first + 7 * t.step;
2102
+ if (n > 5e3) throw RangeError(`ma-ribbon: the 8th period ${n} exceeds 5000`);
2103
+ let r = e.src(t.source);
2104
+ return yi.map((n, i) => e.sma(r, t.first + i * t.step));
2105
+ },
2106
+ reference: "Moving Average Ribbon: eight simple moving averages of periods first, first + step, ... first + 7 * step (default 20..55 step 5)"
2107
+ }), xi = a({
2108
+ id: "ma-cross",
2109
+ name: "Moving Average Cross",
2110
+ family: "tv",
2111
+ needs: "value",
2112
+ pane: "overlay",
2113
+ inputs: [
2114
+ i("type", "sma", ["sma", "ema"]),
2115
+ o("fast", 9, 1, 5e3),
2116
+ o("slow", 21, 1, 5e3),
2117
+ l()
2118
+ ],
2119
+ columns: [
2120
+ "fast",
2121
+ "slow",
2122
+ "crossUp",
2123
+ "crossDown"
2124
+ ],
2125
+ plots: [
2126
+ p("fast", f.blue, { title: "Fast MA" }),
2127
+ p("slow", f.orange, { title: "Slow MA" }),
2128
+ r("crossUp", "circle", "value", f.green, { title: "Cross up" }),
2129
+ r("crossDown", "circle", "value", f.red, { title: "Cross down" })
2130
+ ],
2131
+ label: (e) => `${e.type}, ${e.fast}, ${e.slow}`,
2132
+ build: (e, t) => {
2133
+ let n = e.src(t.source), r = di(e, t.type, n, t.fast), i = di(e, t.type, n, t.slow);
2134
+ return [
2135
+ r,
2136
+ i,
2137
+ e.calc((e) => e > 0 && r.v[e] > i.v[e] && r.v[e - 1] <= i.v[e - 1] ? r.v[e] : X),
2138
+ e.calc((e) => e > 0 && r.v[e] < i.v[e] && r.v[e - 1] >= i.v[e - 1] ? r.v[e] : X)
2139
+ ];
2140
+ },
2141
+ reference: "TradingView Moving Average Cross: two moving averages, circles where ta.crossover / ta.crossunder(fast, slow) is true"
2142
+ }), Si = a({
2143
+ id: "envelopes",
2144
+ name: "Moving Average Envelopes",
2145
+ family: "tv",
2146
+ needs: "value",
2147
+ pane: "overlay",
2148
+ inputs: [
2149
+ Z(20),
2150
+ c("percent", 10, 0, 100, .5),
2151
+ i("basis", "sma", ["sma", "ema"]),
2152
+ l()
2153
+ ],
2154
+ columns: [
2155
+ "basis",
2156
+ "upper",
2157
+ "lower"
2158
+ ],
2159
+ plots: [p("basis", f.orange, { title: "Basis" }), s("band", "upper", "lower", f.blue, si(f.blue, .08), "Envelope")],
2160
+ label: (e) => `${e.length}, ${e.percent}, ${e.basis}`,
2161
+ build: (e, t) => {
2162
+ let n = di(e, t.basis, e.src(t.source), t.length), r = t.percent / 100;
2163
+ return [
2164
+ n,
2165
+ e.map(n, (e) => e * (1 + r)),
2166
+ e.map(n, (e) => e * (1 - r))
2167
+ ];
2168
+ },
2169
+ reference: "TradingView Envelope: basis = sma|ema(src, n), upper = basis * (1 + percent / 100), lower = basis * (1 - percent / 100)"
2170
+ }), Ci = a({
2171
+ id: "keltner",
2172
+ name: "Keltner Channels",
2173
+ family: "tv",
2174
+ needs: "ohlc",
2175
+ pane: "overlay",
2176
+ inputs: [
2177
+ Z(20),
2178
+ c("mult", 2, 0, 100, .25),
2179
+ o("atrLength", 10, 1, 5e3),
2180
+ u("useEma", !0),
2181
+ l()
2182
+ ],
2183
+ columns: [
2184
+ "basis",
2185
+ "upper",
2186
+ "lower"
2187
+ ],
2188
+ plots: [p("basis", f.blue, { title: "Basis" }), s("band", "upper", "lower", f.blue, si(f.blue, .08), "Channel")],
2189
+ label: (e) => `${e.length}, ${e.mult}, ${e.atrLength}`,
2190
+ build: (e, t) => {
2191
+ let n = e.src(t.source), r = t.useEma ? e.ema(n, t.length) : e.sma(n, t.length), i = e.map(li(e, t.atrLength), (e) => e * t.mult);
2192
+ return [
2193
+ r,
2194
+ e.add(r, i),
2195
+ e.sub(r, i)
2196
+ ];
2197
+ },
2198
+ reference: "TradingView Keltner Channels (ATR band style): basis = ema|sma(src, n), bands = basis +- mult * ta.atr(atrLength)"
2199
+ });
2200
+ function wi(e, t) {
2201
+ let n = e.highest(e.high, t), r = e.lowest(e.low, t);
2202
+ return {
2203
+ upper: n,
2204
+ lower: r,
2205
+ mid: e.map2(n, r, (e, t) => (e + t) / 2)
2206
+ };
2207
+ }
2208
+ var Ti = a({
2209
+ id: "donchian",
2210
+ name: "Donchian Channels",
2211
+ family: "tv",
2212
+ needs: "ohlc",
2213
+ pane: "overlay",
2214
+ inputs: [Z(20)],
2215
+ columns: [
2216
+ "upper",
2217
+ "lower",
2218
+ "basis"
2219
+ ],
2220
+ plots: [s("band", "upper", "lower", f.blue, si(f.blue, .08), "Channel"), p("basis", f.orange, { title: "Basis" })],
2221
+ label: (e) => `${e.length}`,
2222
+ build: (e, t) => {
2223
+ let n = wi(e, t.length);
2224
+ return [
2225
+ n.upper,
2226
+ n.lower,
2227
+ n.mid
2228
+ ];
2229
+ },
2230
+ reference: "TradingView Donchian Channels: upper = ta.highest(high, n), lower = ta.lowest(low, n), basis = (upper + lower) / 2; equals TA-Lib MAX(high), MIN(low), MIDPRICE"
2231
+ }), Ei = a({
2232
+ id: "price-channel",
2233
+ name: "Price Channel",
2234
+ family: "tv",
2235
+ needs: "ohlc",
2236
+ pane: "overlay",
2237
+ inputs: [Z(20)],
2238
+ columns: [
2239
+ "upper",
2240
+ "lower",
2241
+ "center"
2242
+ ],
2243
+ plots: [
2244
+ p("upper", f.green, { title: "Highest high" }),
2245
+ p("lower", f.red, { title: "Lowest low" }),
2246
+ p("center", f.gray, {
2247
+ title: "Center",
2248
+ style: "dashed"
2249
+ })
2250
+ ],
2251
+ label: (e) => `${e.length}`,
2252
+ build: (e, t) => {
2253
+ let n = wi(e, t.length);
2254
+ return [
2255
+ n.upper,
2256
+ n.lower,
2257
+ n.mid
2258
+ ];
2259
+ },
2260
+ reference: "Price Channel: highest high and lowest low of the last n bars with their midline; equals TA-Lib MAX(high), MIN(low), MIDPRICE"
2261
+ }), Di = a({
2262
+ id: "chande-kroll-stop",
2263
+ name: "Chande Kroll Stop",
2264
+ family: "tv",
2265
+ needs: "ohlc",
2266
+ pane: "overlay",
2267
+ inputs: [
2268
+ o("p", 10, 1, 5e3),
2269
+ c("x", 1, 0, 100, .25),
2270
+ o("q", 9, 1, 5e3)
2271
+ ],
2272
+ columns: ["stopShort", "stopLong"],
2273
+ plots: [p("stopShort", f.red, { title: "Stop short" }), p("stopLong", f.green, { title: "Stop long" })],
2274
+ label: (e) => `${e.p}, ${e.x}, ${e.q}`,
2275
+ build: (e, t) => {
2276
+ let n = e.map(li(e, t.p), (e) => e * t.x), r = e.sub(e.highest(e.high, t.p), n), i = e.add(e.lowest(e.low, t.p), n);
2277
+ return [e.highest(r, t.q), e.lowest(i, t.q)];
2278
+ },
2279
+ reference: "TradingView Chande Kroll Stop: first_high = ta.highest(high, p) - x * ta.atr(p); first_low = ta.lowest(low, p) + x * ta.atr(p); stop_short = ta.highest(first_high, q); stop_long = ta.lowest(first_low, q)"
2280
+ }), Oi = a({
2281
+ id: "linreg-channel",
2282
+ name: "Linear Regression Channel",
2283
+ family: "tv",
2284
+ needs: "value",
2285
+ pane: "overlay",
2286
+ inputs: [
2287
+ Z(100, 2),
2288
+ c("upperDev", 2, 0, 100, .25),
2289
+ c("lowerDev", 2, 0, 100, .25),
2290
+ l()
2291
+ ],
2292
+ columns: [
2293
+ "base",
2294
+ "upper",
2295
+ "lower"
2296
+ ],
2297
+ plots: [p("base", f.orange, { title: "Base" }), s("band", "upper", "lower", f.blue, si(f.blue, .08), "Channel")],
2298
+ label: (e) => `${e.length}, ${e.upperDev}, ${e.lowerDev}`,
2299
+ build: (e, t) => {
2300
+ let n = t.length, r = e.src(t.source), i = ui(e, r, n), a = e.node((e, t, a) => {
2301
+ let o = r.v, s = i.slope.v, c = i.intercept.v, l = e.v;
2302
+ for (let e = t; e < a; e++) {
2303
+ let t = s[e], r = c[e];
2304
+ if (t !== t) {
2305
+ l[e] = X;
2306
+ continue;
2307
+ }
2308
+ let i = 0;
2309
+ for (let a = 0; a < n; a++) {
2310
+ let s = o[e - n + 1 + a] - (r + t * a);
2311
+ i += s * s;
2312
+ }
2313
+ l[e] = Math.sqrt(i / n);
2314
+ }
2315
+ });
2316
+ return [
2317
+ i.value,
2318
+ e.map2(i.value, a, (e, n) => e + t.upperDev * n),
2319
+ e.map2(i.value, a, (e, n) => e - t.lowerDev * n)
2320
+ ];
2321
+ },
2322
+ reference: "TradingView Linear Regression Channel: base = linear regression value at the newest bar over n bars (Pine ta.linreg(src, n, 0)), bands = base +- deviation * population stdev of the residuals. TradingView draws the tool as one anchored segment between two chosen bars; this study is the rolling per-bar form (each bar's own n-bar fit, newest point), not the anchored line."
2323
+ }), ki = a({
2324
+ id: "median",
2325
+ name: "Median",
2326
+ family: "tv",
2327
+ needs: "ohlc",
2328
+ pane: "overlay",
2329
+ inputs: [
2330
+ Z(3),
2331
+ o("atrLength", 14, 1, 5e3),
2332
+ c("mult", 2, 0, 100, .25),
2333
+ l("hl2")
2334
+ ],
2335
+ columns: [
2336
+ "median",
2337
+ "upper",
2338
+ "lower"
2339
+ ],
2340
+ plots: [p("median", f.blue, { title: "Median" }), s("band", "upper", "lower", f.gray, si(f.gray, .08), "ATR band")],
2341
+ label: (e) => `${e.length}, ${e.atrLength}, ${e.mult}`,
2342
+ build: (e, t) => {
2343
+ let n = t.length, r = e.src(t.source), i = e.validRun(r), a = e.node((e, t, a) => {
2344
+ let o = r.v, s = i.v, c = e.v, l = new Float64Array(n);
2345
+ for (let e = t; e < a; e++) if (s[e] < n) c[e] = X;
2346
+ else {
2347
+ for (let t = 0; t < n; t++) l[t] = o[e - n + 1 + t];
2348
+ l.sort(), c[e] = n % 2 == 1 ? l[(n - 1) / 2] : (l[n / 2 - 1] + l[n / 2]) / 2;
2349
+ }
2350
+ }), o = e.map(li(e, t.atrLength), (e) => e * t.mult);
2351
+ return [
2352
+ a,
2353
+ e.add(a, o),
2354
+ e.sub(a, o)
2355
+ ];
2356
+ },
2357
+ reference: "TradingView Median: rolling median of src (hl2) over n bars with an ATR band, median +- mult * ta.atr(atrLength). The band construction follows the task's definition; an even n takes the mean of the two middle values."
2358
+ }), Ai = 26, ji = a({
2359
+ id: "ichimoku",
2360
+ name: "Ichimoku Cloud",
2361
+ family: "tv",
2362
+ needs: "ohlc",
2363
+ pane: "overlay",
2364
+ inputs: [
2365
+ o("conversion", 9, 1, 5e3),
2366
+ o("base", 26, 1, 5e3),
2367
+ o("spanB", 52, 1, 5e3)
2368
+ ],
2369
+ columns: [
2370
+ "conversion",
2371
+ "base",
2372
+ "spanA",
2373
+ "spanB",
2374
+ "lagging"
2375
+ ],
2376
+ plots: [
2377
+ p("conversion", f.blue, { title: "Conversion line" }),
2378
+ p("base", f.red, { title: "Base line" }),
2379
+ t("cloud", "spanA", "spanB", f.green, "Cloud"),
2380
+ p("spanA", f.green, {
2381
+ title: "Leading span A",
2382
+ offset: 25
2383
+ }),
2384
+ p("spanB", f.orange, {
2385
+ title: "Leading span B",
2386
+ offset: 25
2387
+ }),
2388
+ p("lagging", f.purple, {
2389
+ title: "Lagging span",
2390
+ offset: -25
2391
+ })
2392
+ ],
2393
+ label: (e) => `${e.conversion}, ${e.base}, ${e.spanB}, ${Ai}`,
2394
+ build: (e, t) => {
2395
+ let n = wi(e, t.conversion).mid, r = wi(e, t.base).mid;
2396
+ return [
2397
+ n,
2398
+ r,
2399
+ e.map2(n, r, (e, t) => (e + t) / 2),
2400
+ wi(e, t.spanB).mid,
2401
+ e.map(e.close, (e) => e)
2402
+ ];
2403
+ },
2404
+ reference: "TradingView Ichimoku Cloud: donchian(n) = (ta.highest(high, n) + ta.lowest(low, n)) / 2; conversion = donchian(9), base = donchian(26), span A = (conversion + base) / 2, span B = donchian(52), lagging = close; leading spans plotted with offset displacement - 1 = 25, the lagging span with -25 (TradingView's own plot offsets for displacement 26). Columns hold the undisplaced values."
2405
+ }), Mi = a({
2406
+ id: "supertrend",
2407
+ name: "Supertrend",
2408
+ family: "tv",
2409
+ needs: "ohlc",
2410
+ pane: "overlay",
2411
+ inputs: [o("atrLength", 10, 1, 5e3), c("factor", 3, .1, 100, .1)],
2412
+ columns: [
2413
+ "up",
2414
+ "down",
2415
+ "direction"
2416
+ ],
2417
+ plots: [p("up", f.green, { title: "Up trend" }), p("down", f.red, { title: "Down trend" })],
2418
+ label: (e) => `${e.factor}, ${e.atrLength}`,
2419
+ build: (e, t) => {
2420
+ let { high: n, low: r, close: i } = e, a = li(e, t.atrLength), o = e.col(), s = e.col(), c = e.col(), l = e.col(), u = e.node((e, u, d) => {
2421
+ let f = n.v, p = r.v, m = i.v, h = a.v, g = o.v, _ = s.v, v = c.v, y = l.v;
2422
+ for (let n = u; n < d; n++) {
2423
+ let r = h[n];
2424
+ if (r !== r) {
2425
+ g[n] = X, _[n] = X, v[n] = X, y[n] = X, e.v[n] = X;
2426
+ continue;
2427
+ }
2428
+ let i = (f[n] + p[n]) / 2, a = i - t.factor * r, o = i + t.factor * r, s = n === 0 || g[n - 1] !== g[n - 1];
2429
+ if (!s) {
2430
+ let e = g[n - 1], t = _[n - 1], r = m[n - 1];
2431
+ a = a > e || r < e ? a : e, o = o < t || r > t ? o : t;
2432
+ }
2433
+ let c;
2434
+ c = s ? 1 : y[n - 1] === _[n - 1] ? m[n] > o ? -1 : 1 : m[n] < a ? 1 : -1, g[n] = a, _[n] = o, v[n] = c, y[n] = c === -1 ? a : o, e.v[n] = c;
2435
+ }
2436
+ });
2437
+ return [
2438
+ e.calc((e) => c.v[e] === -1 ? l.v[e] : X),
2439
+ e.calc((e) => c.v[e] === 1 ? l.v[e] : X),
2440
+ u
2441
+ ];
2442
+ },
2443
+ reference: "Pine ta.supertrend(factor, atrPeriod): bands hl2 +- factor * ta.atr; direction is Pine's: -1 = uptrend (line below price, column `up`), 1 = downtrend (line above price, column `down`)"
2444
+ }), Ni = a({
2445
+ id: "alligator",
2446
+ name: "Williams Alligator",
2447
+ family: "tv",
2448
+ needs: "ohlc",
2449
+ pane: "overlay",
2450
+ inputs: [
2451
+ o("jawLength", 13, 1, 5e3),
2452
+ o("teethLength", 8, 1, 5e3),
2453
+ o("lipsLength", 5, 1, 5e3),
2454
+ l("hl2")
2455
+ ],
2456
+ columns: [
2457
+ "jaw",
2458
+ "teeth",
2459
+ "lips"
2460
+ ],
2461
+ plots: [
2462
+ p("jaw", f.blue, {
2463
+ title: "Jaw",
2464
+ offset: 8
2465
+ }),
2466
+ p("teeth", f.red, {
2467
+ title: "Teeth",
2468
+ offset: 5
2469
+ }),
2470
+ p("lips", f.green, {
2471
+ title: "Lips",
2472
+ offset: 3
2473
+ })
2474
+ ],
2475
+ label: (e) => `${e.jawLength}, ${e.teethLength}, ${e.lipsLength}`,
2476
+ build: (e, t) => {
2477
+ let n = e.src(t.source);
2478
+ return [
2479
+ e.rma(n, t.jawLength),
2480
+ e.rma(n, t.teethLength),
2481
+ e.rma(n, t.lipsLength)
2482
+ ];
2483
+ },
2484
+ reference: "TradingView Williams Alligator: jaw = smma(hl2, 13) shifted 8 bars, teeth = smma(hl2, 8) shifted 5, lips = smma(hl2, 5) shifted 3 (the shifts are fixed plot offsets, not inputs)"
2485
+ }), Pi = 2, Fi = 4;
2486
+ function Ii(e, t, n) {
2487
+ let r = Pi;
2488
+ return e.node((e, i, a) => {
2489
+ let o = t.v, s = e.v;
2490
+ for (let e = i; e < a; e++) {
2491
+ s[e] = X;
2492
+ let t = e - r;
2493
+ if (t < 0) continue;
2494
+ let i = o[t], a = (e) => n ? e < i : e > i, c = !0;
2495
+ for (let e = 1; e <= r && c; e++) c = a(o[t + e]);
2496
+ if (!c) continue;
2497
+ let l = 0;
2498
+ for (; l <= Fi && t - 1 - l >= 0 && o[t - 1 - l] === i;) l++;
2499
+ let u = t - 1 - l;
2500
+ l <= Fi && u >= 0 && a(o[u]) && (s[e] = i);
2501
+ }
2502
+ });
2503
+ }
2504
+ var Li = a({
2505
+ id: "fractals",
2506
+ name: "Williams Fractals",
2507
+ family: "tv",
2508
+ needs: "ohlc",
2509
+ pane: "overlay",
2510
+ inputs: [],
2511
+ columns: ["up", "down"],
2512
+ plots: [r("up", "triangleUp", "above", f.green, {
2513
+ title: "Up fractal",
2514
+ offset: -2
2515
+ }), r("down", "triangleDown", "below", f.red, {
2516
+ title: "Down fractal",
2517
+ offset: -2
2518
+ })],
2519
+ build: (e) => [Ii(e, e.high, !0), Ii(e, e.low, !1)],
2520
+ reference: "TradingView Williams Fractals (n = 2): high[n] strictly above the n bars after it, and above the bars before it allowing up to four tied equal highs followed by a strictly lower one; mirrored for lows. Confirmed n bars late."
2521
+ }), Ri = a({
2522
+ id: "zigzag",
2523
+ name: "ZigZag",
2524
+ family: "tv",
2525
+ needs: "ohlc",
2526
+ pane: "overlay",
2527
+ inputs: [c("deviation", 5, .01, 100, .5), o("depth", 10, 1, 5e3)],
2528
+ columns: [
2529
+ "price",
2530
+ "back",
2531
+ "live",
2532
+ "liveBack"
2533
+ ],
2534
+ plots: [{
2535
+ kind: "zigzag",
2536
+ key: "zigzag",
2537
+ title: "ZigZag",
2538
+ price: "price",
2539
+ back: "back",
2540
+ color: f.blue,
2541
+ width: 2
2542
+ }],
2543
+ label: (e) => `${e.deviation}, ${e.depth}`,
2544
+ build: (e, t) => {
2545
+ let { high: n, low: r } = e, i = t.deviation / 100, a = t.depth, o = e.col(), s = e.col(), c = e.col(), l = e.col(), u = e.col(), d = e.col(), f = e.col(), p = e.col(), m = e.col(), h = e.col(), g = e.col();
2546
+ return [
2547
+ e.node((e, t, _) => {
2548
+ let v = n.v, y = r.v, b = e.v;
2549
+ for (let e = t; e < _; e++) {
2550
+ let t = 0, n = X, r = X, _ = X, x = v[e], S = e, C = y[e], w = e;
2551
+ e > 0 && (t = o.v[e - 1], n = s.v[e - 1], r = c.v[e - 1], _ = l.v[e - 1], x = u.v[e - 1], S = d.v[e - 1], C = f.v[e - 1], w = p.v[e - 1]);
2552
+ let T = X, E = X;
2553
+ t === 0 ? (v[e] > x && (x = v[e], S = e), y[e] < C && (C = y[e], w = e), S > w && x >= C * (1 + i) ? (T = C, E = e - w, _ = w, t = 1, n = x, r = S) : w > S && C <= x * (1 - i) && (T = x, E = e - S, _ = S, t = -1, n = C, r = w)) : t === 1 ? v[e] > n ? (n = v[e], r = e) : y[e] <= n * (1 - i) && e - _ >= a && (T = n, E = e - r, _ = r, t = -1, n = y[e], r = e) : y[e] < n ? (n = y[e], r = e) : v[e] >= n * (1 + i) && e - _ >= a && (T = n, E = e - r, _ = r, t = 1, n = v[e], r = e), o.v[e] = t, s.v[e] = n, c.v[e] = r, l.v[e] = _, u.v[e] = x, d.v[e] = S, f.v[e] = C, p.v[e] = w, b[e] = T, m.v[e] = E, h.v[e] = t === 0 ? X : n, g.v[e] = t === 0 ? X : e - r;
2554
+ }
2555
+ }),
2556
+ e.alias(m),
2557
+ e.alias(h),
2558
+ e.alias(g)
2559
+ ];
2560
+ },
2561
+ reference: "ZigZag as defined in this file's header: percentage-reversal pivots on high/low with a minimum spacing in bars, confirmed causally"
2562
+ }), zi = /* @__PURE__ */ h({
2563
+ accelerator: () => sa,
2564
+ awesome: () => oa,
2565
+ bullBearPower: () => ia,
2566
+ choppiness: () => $i,
2567
+ connorsRsi: () => Qi,
2568
+ coppock: () => Zi,
2569
+ dpo: () => la,
2570
+ fisher: () => qi,
2571
+ kst: () => Ji,
2572
+ massIndex: () => ca,
2573
+ rankCorr: () => ra,
2574
+ rviVigor: () => ea,
2575
+ rviVolatility: () => ta,
2576
+ schaffTc: () => ua,
2577
+ smiErgodic: () => na,
2578
+ stochTv: () => da,
2579
+ tsi: () => Yi,
2580
+ vortex: () => Xi
2581
+ }), Q = NaN;
2582
+ function Bi(e, t, n) {
2583
+ return e.node((e, r, i) => {
2584
+ let a = t.v, o = e.v;
2585
+ for (let e = r; e < i; e++) {
2586
+ let t = e >= n ? a[e - n] : Q;
2587
+ o[e] = t === 0 ? Q : 100 * (a[e] - t) / t;
2588
+ }
2589
+ });
2590
+ }
2591
+ function Vi(e, t, n) {
2592
+ let r = e.change(t, 1), i = e.map(r, (e) => e > 0 ? e : e === e ? 0 : Q), a = e.map(r, (e) => e < 0 ? -e : e === e ? 0 : Q), o = e.rma(i, n), s = e.rma(a, n);
2593
+ return e.map2(o, s, (e, t) => e !== e || t !== t ? Q : t === 0 ? 100 : e === 0 ? 0 : 100 - 100 / (1 + e / t));
2594
+ }
2595
+ function Hi(e, t, n, r) {
2596
+ return e.ema(e.ema(t, n), r);
2597
+ }
2598
+ function Ui(e, t) {
2599
+ return e.calc((e) => e >= 3 ? (t.v[e] + 2 * t.v[e - 1] + 2 * t.v[e - 2] + t.v[e - 3]) / 6 : Q);
2600
+ }
2601
+ function Wi(e) {
2602
+ let { high: t, low: n, close: r } = e;
2603
+ return e.calc((e) => {
2604
+ let i = t.v[e], a = n.v[e];
2605
+ if (e === 0) return i - a;
2606
+ let o = r.v[e - 1];
2607
+ return Math.max(i - a, Math.abs(i - o), Math.abs(a - o));
2608
+ });
2609
+ }
2610
+ function Gi(e, t) {
2611
+ let n = e.change(t, 1);
2612
+ return {
2613
+ up: e.map2(t, n, (e, t) => t > 0 ? e : Q),
2614
+ down: e.map2(t, n, (e, t) => t <= 0 ? e : Q)
2615
+ };
2616
+ }
2617
+ function Ki(e, t, n) {
2618
+ let r = e.highest(t, n), i = e.lowest(t, n);
2619
+ return e.node((e, n, a) => {
2620
+ let o = t.v, s = r.v, c = i.v, l = e.v;
2621
+ for (let e = n; e < a; e++) {
2622
+ let t = s[e], n = c[e];
2623
+ t !== t || n !== n ? l[e] = Q : l[e] = t > n ? 100 * (o[e] - n) / (t - n) : e > 0 ? l[e - 1] : Q;
2624
+ }
2625
+ });
2626
+ }
2627
+ var qi = a({
2628
+ id: "fisher",
2629
+ name: "Fisher Transform",
2630
+ family: "tv",
2631
+ needs: "ohlc",
2632
+ pane: "new",
2633
+ inputs: [o("length", 9, 1, 5e3)],
2634
+ columns: ["fisher", "trigger"],
2635
+ plots: [
2636
+ p("fisher", f.blue),
2637
+ p("trigger", f.orange),
2638
+ n("zero", 0, f.gray, "dotted")
2639
+ ],
2640
+ label: (e) => `${e.length}`,
2641
+ build: (e, t) => {
2642
+ let n = e.src("hl2"), r = e.highest(n, t.length), i = e.lowest(n, t.length), a = e.node((e, t, a) => {
2643
+ let o = n.v, s = r.v, c = i.v, l = e.v;
2644
+ for (let e = t; e < a; e++) {
2645
+ let t = s[e], n = c[e];
2646
+ if (!(t > n)) {
2647
+ l[e] = Q;
2648
+ continue;
2649
+ }
2650
+ let r = e > 0 && l[e - 1] === l[e - 1] ? l[e - 1] : 0, i = .66 * ((o[e] - n) / (t - n) - .5) + .67 * r;
2651
+ l[e] = i > .99 ? .999 : i < -.99 ? -.999 : i;
2652
+ }
2653
+ }), o = e.node((e, t, n) => {
2654
+ let r = a.v, i = e.v;
2655
+ for (let e = t; e < n; e++) {
2656
+ let t = r[e];
2657
+ if (t !== t) {
2658
+ i[e] = Q;
2659
+ continue;
2660
+ }
2661
+ let n = e > 0 && i[e - 1] === i[e - 1] ? i[e - 1] : 0;
2662
+ i[e] = .5 * Math.log((1 + t) / (1 - t)) + .5 * n;
2663
+ }
2664
+ });
2665
+ return [o, e.lag(o, 1)];
2666
+ },
2667
+ reference: "TradingView 'Fisher Transform' (Pine v5): value = round(0.66 ((hl2 - lowest) / (highest - lowest) - 0.5) + 0.67 nz(value[1])), fish = 0.5 ln((1 + value) / (1 - value)) + 0.5 nz(fish[1]); trigger = fish[1]"
2668
+ }), Ji = a({
2669
+ id: "kst",
2670
+ name: "Know Sure Thing",
2671
+ family: "tv",
2672
+ needs: "value",
2673
+ pane: "new",
2674
+ inputs: [
2675
+ o("roc1", 10, 1, 5e3),
2676
+ o("roc2", 15, 1, 5e3),
2677
+ o("roc3", 20, 1, 5e3),
2678
+ o("roc4", 30, 1, 5e3),
2679
+ o("sma1", 10, 1, 5e3),
2680
+ o("sma2", 10, 1, 5e3),
2681
+ o("sma3", 10, 1, 5e3),
2682
+ o("sma4", 15, 1, 5e3),
2683
+ o("signal", 9, 1, 5e3),
2684
+ l()
2685
+ ],
2686
+ columns: ["kst", "signal"],
2687
+ plots: [
2688
+ p("kst", f.green),
2689
+ p("signal", f.red),
2690
+ n("zero", 0, f.gray, "dotted")
2691
+ ],
2692
+ label: (e) => `${e.roc1} ${e.roc2} ${e.roc3} ${e.roc4} ${e.sma1} ${e.sma2} ${e.sma3} ${e.sma4} ${e.signal}`,
2693
+ build: (e, t) => {
2694
+ let n = e.src(t.source), r = [
2695
+ 1,
2696
+ 2,
2697
+ 3,
2698
+ 4
2699
+ ].map((r) => e.sma(Bi(e, n, t[`roc${r}`]), t[`sma${r}`])), i = e.calc((e) => r[0].v[e] + 2 * r[1].v[e] + 3 * r[2].v[e] + 4 * r[3].v[e]);
2700
+ return [i, e.sma(i, t.signal)];
2701
+ },
2702
+ reference: "TradingView 'Know Sure Thing': kst = sma(roc(c,10),10) + 2 sma(roc(c,15),10) + 3 sma(roc(c,20),10) + 4 sma(roc(c,30),15); signal = sma(kst, 9)"
2703
+ }), Yi = a({
2704
+ id: "tsi",
2705
+ name: "True Strength Index",
2706
+ family: "tv",
2707
+ needs: "value",
2708
+ pane: "new",
2709
+ inputs: [
2710
+ o("long", 25, 1, 5e3),
2711
+ o("short", 13, 1, 5e3),
2712
+ o("signal", 13, 1, 5e3),
2713
+ l()
2714
+ ],
2715
+ columns: ["tsi", "signal"],
2716
+ plots: [
2717
+ p("tsi", f.blue),
2718
+ p("signal", f.red),
2719
+ n("zero", 0, f.gray, "dotted")
2720
+ ],
2721
+ label: (e) => `${e.long} ${e.short} ${e.signal}`,
2722
+ build: (e, t) => {
2723
+ let n = e.change(e.src(t.source), 1), r = Hi(e, n, t.long, t.short), i = Hi(e, e.abs(n), t.long, t.short), a = e.mul(e.div(r, i), 100);
2724
+ return [a, e.ema(a, t.signal)];
2725
+ },
2726
+ reference: "TradingView 'True Strength Index' (Pine v5): 100 ema(ema(change(src), long), short) / ema(ema(abs(change(src)), long), short); signal = ema(tsi, 13)"
2727
+ }), Xi = a({
2728
+ id: "vortex",
2729
+ name: "Vortex Indicator",
2730
+ family: "tv",
2731
+ needs: "ohlc",
2732
+ pane: "new",
2733
+ inputs: [o("length", 14, 2, 5e3)],
2734
+ columns: ["viPlus", "viMinus"],
2735
+ plots: [p("viPlus", f.blue, { title: "VI+" }), p("viMinus", f.red, { title: "VI-" })],
2736
+ label: (e) => `${e.length}`,
2737
+ build: (e, t) => {
2738
+ let { high: n, low: r } = e, i = e.calc((e) => e >= 1 ? Math.abs(n.v[e] - r.v[e - 1]) : Q), a = e.calc((e) => e >= 1 ? Math.abs(r.v[e] - n.v[e - 1]) : Q), o = e.sum(Wi(e), t.length);
2739
+ return [e.div(e.sum(i, t.length), o), e.div(e.sum(a, t.length), o)];
2740
+ },
2741
+ reference: "TradingView 'Vortex Indicator' (Pine v5): VI+ = sum(|high - low[1]|, n) / sum(atr(1), n); VI- = sum(|low - high[1]|, n) / sum(atr(1), n)"
2742
+ }), Zi = a({
2743
+ id: "coppock",
2744
+ name: "Coppock Curve",
2745
+ family: "tv",
2746
+ needs: "value",
2747
+ pane: "new",
2748
+ inputs: [
2749
+ o("length", 10, 1, 5e3, "WMA length"),
2750
+ o("longRoc", 14, 1, 5e3, "Long ROC length"),
2751
+ o("shortRoc", 11, 1, 5e3, "Short ROC length"),
2752
+ l()
2753
+ ],
2754
+ columns: ["coppock"],
2755
+ plots: [p("coppock", f.blue), n("zero", 0, f.gray, "dotted")],
2756
+ label: (e) => `${e.length} ${e.longRoc} ${e.shortRoc}`,
2757
+ build: (e, t) => {
2758
+ let n = e.src(t.source);
2759
+ return [e.wma(e.add(Bi(e, n, t.longRoc), Bi(e, n, t.shortRoc)), t.length)];
2760
+ },
2761
+ reference: "TradingView 'Coppock Curve' (Pine v5): wma(roc(src, 14) + roc(src, 11), 10)"
2762
+ }), Qi = a({
2763
+ id: "connors-rsi",
2764
+ name: "Connors RSI",
2765
+ family: "tv",
2766
+ needs: "value",
2767
+ pane: "new",
2768
+ inputs: [
2769
+ o("rsiLength", 3, 1, 5e3),
2770
+ o("updownLength", 2, 1, 5e3),
2771
+ o("rocLength", 100, 1, 5e3),
2772
+ l()
2773
+ ],
2774
+ columns: ["crsi"],
2775
+ plots: [
2776
+ p("crsi", f.blue),
2777
+ n("upper", 70),
2778
+ n("lower", 30),
2779
+ n("middle", 50, f.gray, "dotted")
2780
+ ],
2781
+ label: (e) => `${e.rsiLength} ${e.updownLength} ${e.rocLength}`,
2782
+ build: (e, t) => {
2783
+ let n = e.src(t.source), r = Vi(e, n, t.rsiLength), i = Vi(e, e.node((e, t, r) => {
2784
+ let i = n.v, a = e.v;
2785
+ for (let e = t; e < r; e++) {
2786
+ if (e === 0 || i[e] !== i[e] || i[e - 1] !== i[e - 1]) {
2787
+ a[e] = Q;
2788
+ continue;
2789
+ }
2790
+ let t = a[e - 1] === a[e - 1] ? a[e - 1] : 0, n = i[e], r = i[e - 1];
2791
+ a[e] = n === r ? 0 : n > r ? t <= 0 ? 1 : t + 1 : t >= 0 ? -1 : t - 1;
2792
+ }
2793
+ }), t.updownLength), a = Bi(e, n, 1), o = e.validRun(a), s = e.node((e, n, r) => {
2794
+ let i = a.v, s = o.v, c = e.v;
2795
+ for (let e = n; e < r; e++) {
2796
+ if (s[e] < t.rocLength + 1) {
2797
+ c[e] = Q;
2798
+ continue;
2799
+ }
2800
+ let n = 0;
2801
+ for (let r = 1; r <= t.rocLength; r++) i[e - r] <= i[e] && n++;
2802
+ c[e] = 100 * n / t.rocLength;
2803
+ }
2804
+ });
2805
+ return [e.calc((e) => (r.v[e] + i.v[e] + s.v[e]) / 3)];
2806
+ },
2807
+ reference: "TradingView 'Connors RSI' (Pine v5): avg(rsi(src, 3), rsi(updown streak, 2), percentrank(roc(src, 1), 100)); the first bar has no streak (absent)"
2808
+ }), $i = a({
2809
+ id: "choppiness",
2810
+ name: "Choppiness Index",
2811
+ family: "tv",
2812
+ needs: "ohlc",
2813
+ pane: "new",
2814
+ inputs: [o("length", 14, 2, 5e3)],
2815
+ columns: ["chop"],
2816
+ plots: [
2817
+ p("chop", f.blue),
2818
+ n("upper", 61.8, f.gray, "dashed"),
2819
+ n("lower", 38.2, f.gray, "dashed")
2820
+ ],
2821
+ label: (e) => `${e.length}`,
2822
+ build: (e, t) => {
2823
+ let n = e.sum(Wi(e), t.length), r = e.sub(e.highest(e.high, t.length), e.lowest(e.low, t.length)), i = e.div(n, r), a = 100 / Math.log10(t.length);
2824
+ return [e.map(i, (e) => e > 0 ? a * Math.log10(e) : Q)];
2825
+ },
2826
+ reference: "TradingView 'Choppiness Index' (Pine v5): 100 log10(sum(atr(1), n) / (highest(high, n) - lowest(low, n))) / log10(n)"
2827
+ }), ea = a({
2828
+ id: "rvi-vigor",
2829
+ name: "Relative Vigor Index",
2830
+ family: "tv",
2831
+ needs: "ohlc",
2832
+ pane: "new",
2833
+ inputs: [o("length", 10, 1, 5e3)],
2834
+ columns: ["rvi", "signal"],
2835
+ plots: [p("rvi", f.green), p("signal", f.red)],
2836
+ label: (e) => `${e.length}`,
2837
+ build: (e, t) => {
2838
+ let n = e.sma(Ui(e, e.sub(e.close, e.open)), t.length), r = e.sma(Ui(e, e.sub(e.high, e.low)), t.length), i = e.div(n, r);
2839
+ return [i, Ui(e, i)];
2840
+ },
2841
+ reference: "TradingView 'Relative Vigor Index' (Pine v5): rvi = sma(swma(close - open), n) / sma(swma(high - low), n); signal = swma(rvi)"
2842
+ }), ta = a({
2843
+ id: "rvi-volatility",
2844
+ name: "Relative Volatility Index",
2845
+ family: "tv",
2846
+ needs: "value",
2847
+ pane: "new",
2848
+ inputs: [
2849
+ o("length", 10, 2, 5e3, "StdDev length"),
2850
+ o("smoothing", 14, 1, 5e3),
2851
+ i("ma", "ema", ["ema", "rma"], "Smoothing"),
2852
+ l()
2853
+ ],
2854
+ columns: ["rvi"],
2855
+ plots: [
2856
+ p("rvi", f.purple),
2857
+ n("upper", 80),
2858
+ n("lower", 20),
2859
+ n("middle", 50, f.gray, "dotted")
2860
+ ],
2861
+ label: (e) => `${e.length} ${e.smoothing}`,
2862
+ build: (e, t) => {
2863
+ let n = e.src(t.source), r = e.stdev(n, t.length), i = e.change(n, 1), a = e.map2(i, r, (e, t) => e !== e || t !== t ? Q : e <= 0 ? 0 : t), o = e.map2(i, r, (e, t) => e !== e || t !== t ? Q : e > 0 ? 0 : t), s = (n) => t.ma === "rma" ? e.rma(n, t.smoothing) : e.ema(n, t.smoothing), c = s(a), l = s(o);
2864
+ return [e.mul(e.div(c, e.add(c, l)), 100)];
2865
+ },
2866
+ reference: "TradingView 'Relative Volatility Index' (Pine v5): upper = ema(change(src) <= 0 ? 0 : stdev(src, 10), 14), lower = ema(change(src) > 0 ? 0 : stdev, 14), rvi = 100 upper / (upper + lower); ma 'rma' gives Dorsey's Wilder form"
2867
+ }), na = a({
2868
+ id: "smi-ergodic",
2869
+ name: "SMI Ergodic Indicator/Oscillator",
2870
+ family: "tv",
2871
+ needs: "value",
2872
+ pane: "new",
2873
+ inputs: [
2874
+ o("longLength", 5, 1, 5e3),
2875
+ o("shortLength", 20, 1, 5e3),
2876
+ o("signal", 5, 1, 5e3),
2877
+ l()
2878
+ ],
2879
+ columns: [
2880
+ "erg",
2881
+ "signal",
2882
+ "osc"
2883
+ ],
2884
+ plots: [
2885
+ d("osc", f.gray, f.gray, { title: "Oscillator" }),
2886
+ p("erg", f.blue, { title: "SMI Ergodic" }),
2887
+ p("signal", f.red),
2888
+ n("zero", 0, f.gray, "dotted")
2889
+ ],
2890
+ label: (e) => `${e.longLength} ${e.shortLength} ${e.signal}`,
2891
+ build: (e, t) => {
2892
+ let n = e.change(e.src(t.source), 1), r = e.mul(e.div(Hi(e, n, t.longLength, t.shortLength), Hi(e, e.abs(n), t.longLength, t.shortLength)), 100), i = e.ema(r, t.signal);
2893
+ return [
2894
+ r,
2895
+ i,
2896
+ e.sub(r, i)
2897
+ ];
2898
+ },
2899
+ reference: "TradingView 'SMI Ergodic Indicator/Oscillator' (Pine v5): erg = 100 ema(ema(change, long 5), short 20) / ema(ema(abs(change), 5), 20); signal = ema(erg, 5); oscillator = erg - signal"
2900
+ }), ra = a({
2901
+ id: "rank-corr",
2902
+ name: "Rank Correlation vs Time",
2903
+ family: "tv",
2904
+ needs: "value",
2905
+ pane: "new",
2906
+ inputs: [o("length", 14, 2, 500), l()],
2907
+ columns: ["rho"],
2908
+ plots: [p("rho", f.teal), n("zero", 0, f.gray, "dotted")],
2909
+ label: (e) => `${e.length}`,
2910
+ build: (e, t) => {
2911
+ let n = e.src(t.source), r = e.validRun(n), i = t.length, a = (i + 1) / 2, o = i * (i * i - 1) / 12;
2912
+ return [e.node((e, t, s) => {
2913
+ let c = n.v, l = r.v, u = e.v;
2914
+ for (let e = t; e < s; e++) {
2915
+ if (l[e] < i) {
2916
+ u[e] = Q;
2917
+ continue;
2918
+ }
2919
+ let t = e - i + 1, n = 0, r = 0;
2920
+ for (let e = 0; e < i; e++) {
2921
+ let o = c[t + e], s = 0, l = 0;
2922
+ for (let n = 0; n < i; n++) {
2923
+ let r = c[t + n];
2924
+ r < o ? s++ : r === o && n !== e && l++;
2925
+ }
2926
+ let u = 1 + s + l / 2;
2927
+ n += (u - a) * (e + 1 - a), r += (u - a) * (u - a);
2928
+ }
2929
+ let s = Math.sqrt(r * o);
2930
+ u[e] = s > 0 ? Math.max(-1, Math.min(1, n / s)) : Q;
2931
+ }
2932
+ })];
2933
+ },
2934
+ reference: "Spearman's rho of the source against the bar index over a rolling window (not a TradingView built-in): Pearson correlation of the ranks, tied source values take the mean rank; a window of all equal values is absent"
2935
+ }), ia = a({
2936
+ id: "bull-bear-power",
2937
+ name: "Bull Bear Power",
2938
+ family: "tv",
2939
+ needs: "ohlc",
2940
+ pane: "new",
2941
+ inputs: [o("length", 13, 1, 5e3), l()],
2942
+ columns: ["bull", "bear"],
2943
+ plots: [
2944
+ d("bull", f.green, f.green, { title: "Bull Power" }),
2945
+ d("bear", f.red, f.red, { title: "Bear Power" }),
2946
+ n("zero", 0, f.gray, "dotted")
2947
+ ],
2948
+ label: (e) => `${e.length}`,
2949
+ build: (e, t) => {
2950
+ let n = e.ema(e.src(t.source), t.length);
2951
+ return [e.sub(e.high, n), e.sub(e.low, n)];
2952
+ },
2953
+ reference: "Elder Ray (TradingView 'Bull Bear Power'): bull = high - ema(close, 13), bear = low - ema(close, 13)"
2954
+ });
2955
+ function aa(e, t, n) {
2956
+ let r = e.src("hl2");
2957
+ return e.sub(e.sma(r, t), e.sma(r, n));
2958
+ }
2959
+ var oa = a({
2960
+ id: "awesome",
2961
+ name: "Awesome Oscillator",
2962
+ family: "tv",
2963
+ needs: "ohlc",
2964
+ pane: "new",
2965
+ inputs: [o("fast", 5, 1, 5e3), o("slow", 34, 2, 5e3)],
2966
+ columns: [
2967
+ "ao",
2968
+ "up",
2969
+ "down"
2970
+ ],
2971
+ plots: [d("up", f.green, void 0, { title: "AO rising" }), d("down", f.red, void 0, { title: "AO falling" })],
2972
+ label: () => "",
2973
+ build: (e, t) => {
2974
+ if (t.fast >= t.slow) throw RangeError(`awesome: fast (${t.fast}) must be below slow (${t.slow})`);
2975
+ let n = aa(e, t.fast, t.slow), { up: r, down: i } = Gi(e, n);
2976
+ return [
2977
+ n,
2978
+ r,
2979
+ i
2980
+ ];
2981
+ },
2982
+ reference: "TradingView 'Awesome Oscillator': sma(hl2, 5) - sma(hl2, 34); bar green when above the previous bar's value, red otherwise"
2983
+ }), sa = a({
2984
+ id: "accelerator",
2985
+ name: "Accelerator Oscillator",
2986
+ family: "tv",
2987
+ needs: "ohlc",
2988
+ pane: "new",
2989
+ inputs: [
2990
+ o("fast", 5, 1, 5e3),
2991
+ o("slow", 34, 2, 5e3),
2992
+ o("signal", 5, 1, 5e3)
2993
+ ],
2994
+ columns: [
2995
+ "ac",
2996
+ "up",
2997
+ "down"
2998
+ ],
2999
+ plots: [d("up", f.green, void 0, { title: "AC rising" }), d("down", f.red, void 0, { title: "AC falling" })],
3000
+ label: () => "",
3001
+ build: (e, t) => {
3002
+ if (t.fast >= t.slow) throw RangeError(`accelerator: fast (${t.fast}) must be below slow (${t.slow})`);
3003
+ let n = aa(e, t.fast, t.slow), r = e.sub(n, e.sma(n, t.signal)), { up: i, down: a } = Gi(e, r);
3004
+ return [
3005
+ r,
3006
+ i,
3007
+ a
3008
+ ];
3009
+ },
3010
+ reference: "Bill Williams / TradingView 'Accelerator Oscillator': AO - sma(AO, 5); bar green when above the previous bar's value, red otherwise"
3011
+ }), ca = a({
3012
+ id: "mass-index",
3013
+ name: "Mass Index",
3014
+ family: "tv",
3015
+ needs: "ohlc",
3016
+ pane: "new",
3017
+ inputs: [o("length", 10, 1, 5e3, "Sum length"), o("emaLength", 9, 1, 5e3)],
3018
+ columns: ["mi"],
3019
+ plots: [p("mi", f.blue)],
3020
+ label: (e) => `${e.length}`,
3021
+ build: (e, t) => {
3022
+ let n = e.ema(e.sub(e.high, e.low), t.emaLength), r = e.ema(n, t.emaLength);
3023
+ return [e.sum(e.div(n, r), t.length)];
3024
+ },
3025
+ reference: "TradingView 'Mass Index' (Pine v5): sum(ema(high - low, 9) / ema(ema(high - low, 9), 9), length), length 10 (Dorsey's 25 via the input)"
3026
+ }), la = a({
3027
+ id: "dpo",
3028
+ name: "Detrended Price Oscillator",
3029
+ family: "tv",
3030
+ needs: "value",
3031
+ pane: "new",
3032
+ inputs: [
3033
+ o("length", 21, 1, 5e3),
3034
+ u("centered", !1),
3035
+ l()
3036
+ ],
3037
+ columns: ["dpo"],
3038
+ plots: [p("dpo", f.teal), n("zero", 0, f.gray, "dotted")],
3039
+ label: (e) => `${e.length}`,
3040
+ build: (e, t) => {
3041
+ let n = e.src(t.source), r = Math.floor(t.length / 2) + 1, i = e.sma(n, t.length);
3042
+ return [t.centered ? e.calc((e) => e >= r ? n.v[e - r] - i.v[e] : Q) : e.calc((e) => e >= r ? n.v[e] - i.v[e - r] : Q)];
3043
+ },
3044
+ reference: "TradingView 'Detrended Price Oscillator' (Pine v5): barsback = floor(n/2) + 1; dpo = src - sma(src, n)[barsback]; centered: src[barsback] - sma(src, n), which TradingView draws shifted back by barsback bars (here the value stays on the bar that computes it)"
3045
+ }), ua = a({
3046
+ id: "schaff-tc",
3047
+ name: "Schaff Trend Cycle",
3048
+ family: "tv",
3049
+ needs: "value",
3050
+ pane: "new",
3051
+ inputs: [
3052
+ o("fast", 23, 1, 5e3),
3053
+ o("slow", 50, 2, 5e3),
3054
+ o("cycle", 10, 2, 5e3),
3055
+ o("d1", 3, 1, 5e3),
3056
+ o("d2", 3, 1, 5e3),
3057
+ l()
3058
+ ],
3059
+ columns: ["stc"],
3060
+ plots: [
3061
+ p("stc", f.blue),
3062
+ n("upper", 75),
3063
+ n("lower", 25)
3064
+ ],
3065
+ label: (e) => `${e.fast} ${e.slow} ${e.cycle}`,
3066
+ build: (e, t) => {
3067
+ let n = e.src(t.source), r = e.sub(e.ema(n, t.fast), e.ema(n, t.slow)), i = e.ema(Ki(e, r, t.cycle), t.d1), a = e.ema(Ki(e, i, t.cycle), t.d2);
3068
+ return [e.map(a, (e) => e > 100 ? 100 : e < 0 ? 0 : e)];
3069
+ },
3070
+ reference: "TradingView 'Schaff Trend Cycle' (reproduced from the published script, not fetched): macd = ema(src,23) - ema(src,50); k = stoch(macd,10); d = ema(k,3); kd = stoch(d,10); stc = clamp(ema(kd,3), 0, 100); a flat range carries the last stoch (fixnan) and warm-up stays absent instead of nz-ed to 0"
3071
+ }), da = a({
3072
+ id: "stoch-tv",
3073
+ name: "Stochastic",
3074
+ family: "tv",
3075
+ needs: "ohlc",
3076
+ pane: "new",
3077
+ inputs: [
3078
+ o("kLength", 14, 1, 5e3, "%K length"),
3079
+ o("kSmooth", 1, 1, 5e3, "%K smoothing"),
3080
+ o("dLength", 3, 1, 5e3, "%D smoothing")
3081
+ ],
3082
+ columns: ["k", "d"],
3083
+ plots: [
3084
+ p("k", f.blue, { title: "%K" }),
3085
+ p("d", f.orange, { title: "%D" }),
3086
+ n("upper", 80),
3087
+ n("lower", 20),
3088
+ n("middle", 50, f.gray, "dotted")
3089
+ ],
3090
+ label: (e) => `${e.kLength} ${e.kSmooth} ${e.dLength}`,
3091
+ build: (e, t) => {
3092
+ let n = e.highest(e.high, t.kLength), r = e.lowest(e.low, t.kLength), i = e.mul(e.div(e.sub(e.close, r), e.sub(n, r)), 100), a = e.sma(i, t.kSmooth);
3093
+ return [a, e.sma(a, t.dLength)];
3094
+ },
3095
+ reference: "TradingView 'Stochastic' (Pine v5): k = sma(stoch(close, high, low, 14), 1), d = sma(k, 3); TA-Lib STOCH with fastk 14 / slowk sma 1 / slowd sma 3 (TA-Lib gives 0 on a flat range, here it is absent)"
3096
+ }), fa = /* @__PURE__ */ h({
3097
+ adr: () => Pa,
3098
+ anchoredVwap: () => Oa,
3099
+ chaikinMf: () => Ta,
3100
+ elderForce: () => Ca,
3101
+ eom: () => wa,
3102
+ histVol: () => Na,
3103
+ klinger: () => Ea,
3104
+ netVolume: () => Sa,
3105
+ pivotPoints: () => Ma,
3106
+ pvt: () => xa,
3107
+ volume: () => ya,
3108
+ volumeOsc: () => ba,
3109
+ vwap: () => Da
3110
+ }), $ = NaN, pa = 864e5;
3111
+ function ma(e) {
3112
+ let t = e + 719468, n = Math.floor(t / 146097), r = t - n * 146097, i = Math.floor((r - Math.floor(r / 1460) + Math.floor(r / 36524) - Math.floor(r / 146096)) / 365), a = r - (365 * i + Math.floor(i / 4) - Math.floor(i / 100)), o = Math.floor((5 * a + 2) / 153), s = o < 10 ? o + 3 : o - 9;
3113
+ return [i + n * 400 + +(s <= 2), s - 1];
3114
+ }
3115
+ function ha(e, t, n) {
3116
+ let r = e.time, i = n * 6e4;
3117
+ return e.calc((e) => {
3118
+ let n = Math.floor((r.v[e] + i) / pa);
3119
+ switch (t) {
3120
+ case "day": return n;
3121
+ case "week": return Math.floor((n + 3) / 7);
3122
+ case "month": {
3123
+ let [e, t] = ma(n);
3124
+ return e * 12 + t;
3125
+ }
3126
+ case "year": return ma(n)[0];
3127
+ }
3128
+ });
3129
+ }
3130
+ function ga(e, t, n, r = () => !0) {
3131
+ return e.node((e, i, a) => {
3132
+ let o = e.v;
3133
+ for (let e = i; e < a; e++) r(e) ? o[e] = (n(e) ? 0 : o[e - 1]) + t(e) : o[e] = $;
3134
+ });
3135
+ }
3136
+ function _a(e, t, n, r, i) {
3137
+ let a = e.calc((e) => n.v[e] > 0 ? t.v[e] / n.v[e] : $), o = e.calc((e) => {
3138
+ let t = a.v[e], i = r.v[e] / n.v[e] - t * t;
3139
+ return t === t ? i > 0 ? Math.sqrt(i) : 0 : $;
3140
+ });
3141
+ return [
3142
+ a,
3143
+ e.calc((e) => a.v[e] + i * o.v[e]),
3144
+ e.calc((e) => a.v[e] - i * o.v[e])
3145
+ ];
3146
+ }
3147
+ var va = o("utcOffsetMinutes", 0, -720, 840, "UTC offset (minutes)"), ya = a({
3148
+ id: "volume",
3149
+ name: "Volume",
3150
+ family: "tv",
3151
+ needs: "ohlcv",
3152
+ pane: "new",
3153
+ inputs: [o("maLength", 20, 1, 5e3, "MA length")],
3154
+ columns: [
3155
+ "volume",
3156
+ "up",
3157
+ "down",
3158
+ "ma"
3159
+ ],
3160
+ plots: [
3161
+ d("up", f.green, void 0, { title: "Volume (up)" }),
3162
+ d("down", f.red, void 0, { title: "Volume (down)" }),
3163
+ p("ma", f.yellow, { title: "Volume MA" })
3164
+ ],
3165
+ label: (e) => `${e.maLength}`,
3166
+ build: (e, t) => {
3167
+ let { volume: n, open: r, close: i } = e, a = e.calc((e) => i.v[e] > r.v[e] ? n.v[e] : $), o = e.calc((e) => i.v[e] > r.v[e] ? $ : n.v[e]);
3168
+ return [
3169
+ e.calc((e) => n.v[e]),
3170
+ a,
3171
+ o,
3172
+ e.sma(n, t.maLength)
3173
+ ];
3174
+ },
3175
+ reference: "TradingView Volume: histogram of volume, green when close > open, red otherwise; MA is ta.sma(volume, 20). Verified against TA-Lib SMA for the MA."
3176
+ }), ba = a({
3177
+ id: "volume-osc",
3178
+ name: "Volume Oscillator",
3179
+ family: "tv",
3180
+ needs: "ohlcv",
3181
+ pane: "new",
3182
+ inputs: [o("short", 5, 1, 5e3, "Short length"), o("long", 10, 1, 5e3, "Long length")],
3183
+ columns: ["osc"],
3184
+ plots: [p("osc", f.blue, { title: "Volume Oscillator" })],
3185
+ label: (e) => `${e.short}, ${e.long}`,
3186
+ build: (e, t) => {
3187
+ let n = e.ema(e.volume, t.short), r = e.ema(e.volume, t.long);
3188
+ return [e.map2(n, r, (e, t) => t === 0 ? $ : 100 * (e - t) / t)];
3189
+ },
3190
+ reference: "TradingView Volume Oscillator: 100 * (ta.ema(volume, 5) - ta.ema(volume, 10)) / ta.ema(volume, 10). Equals TA-Lib PPO(volume, 5, 10, EMA)."
3191
+ }), xa = a({
3192
+ id: "pvt",
3193
+ name: "Price Volume Trend",
3194
+ family: "tv",
3195
+ needs: "ohlcv",
3196
+ pane: "new",
3197
+ inputs: [],
3198
+ columns: ["pvt"],
3199
+ plots: [p("pvt", f.blue, { title: "PVT" })],
3200
+ build: (e) => {
3201
+ let { close: t, volume: n } = e, r = e.calc((e) => e === 0 ? $ : (t.v[e] - t.v[e - 1]) / t.v[e - 1] * n.v[e]);
3202
+ return [ga(e, (e) => r.v[e], (e) => e <= 1, (e) => e >= 1)];
3203
+ },
3204
+ reference: "Pine ta.pvt = ta.cum(ta.change(close) / close[1] * volume)"
3205
+ }), Sa = a({
3206
+ id: "net-volume",
3207
+ name: "Net Volume",
3208
+ family: "tv",
3209
+ needs: "ohlcv",
3210
+ pane: "new",
3211
+ inputs: [],
3212
+ columns: ["netVolume"],
3213
+ plots: [d("netVolume", f.green, f.red, { title: "Net Volume" })],
3214
+ build: (e) => {
3215
+ let { close: t, volume: n } = e;
3216
+ return [e.calc((e) => {
3217
+ if (e === 0) return $;
3218
+ let r = t.v[e] - t.v[e - 1];
3219
+ return r > 0 ? n.v[e] : r < 0 ? -n.v[e] : 0;
3220
+ })];
3221
+ },
3222
+ reference: "TradingView Net Volume: volume signed by the sign of ta.change(close) (zero on an unchanged close)"
3223
+ }), Ca = a({
3224
+ id: "elder-force",
3225
+ name: "Elder's Force Index",
3226
+ family: "tv",
3227
+ needs: "ohlcv",
3228
+ pane: "new",
3229
+ inputs: [o("length", 13, 1, 5e3)],
3230
+ columns: ["efi"],
3231
+ plots: [p("efi", f.red, { title: "EFI" })],
3232
+ label: (e) => `${e.length}`,
3233
+ build: (e, t) => {
3234
+ let { close: n, volume: r } = e, i = e.calc((e) => e === 0 ? $ : (n.v[e] - n.v[e - 1]) * r.v[e]);
3235
+ return [e.ema(i, t.length)];
3236
+ },
3237
+ reference: "TradingView Elder's Force Index: ta.ema(ta.change(close) * volume, 13)"
3238
+ }), wa = a({
3239
+ id: "eom",
3240
+ name: "Ease of Movement",
3241
+ family: "tv",
3242
+ needs: "ohlcv",
3243
+ pane: "new",
3244
+ inputs: [o("length", 14, 1, 5e3), o("divisor", 1e4, 1, 1e9)],
3245
+ columns: ["eom"],
3246
+ plots: [p("eom", f.teal, { title: "EOM" })],
3247
+ label: (e) => `${e.length}`,
3248
+ build: (e, t) => {
3249
+ let { high: n, low: r, volume: i } = e, a = e.src("hl2"), o = e.calc((e) => e === 0 ? $ : t.divisor * (a.v[e] - a.v[e - 1]) * (n.v[e] - r.v[e]));
3250
+ return [e.sma(e.div(o, i), t.length)];
3251
+ },
3252
+ reference: "TradingView Ease of Movement: ta.sma(10000 * ta.change(hl2) * (high - low) / volume, 14); zero volume is absent"
3253
+ }), Ta = a({
3254
+ id: "chaikin-mf",
3255
+ name: "Chaikin Money Flow",
3256
+ family: "tv",
3257
+ needs: "ohlcv",
3258
+ pane: "new",
3259
+ inputs: [o("length", 20, 1, 5e3)],
3260
+ columns: ["cmf"],
3261
+ plots: [p("cmf", f.green, { title: "CMF" })],
3262
+ label: (e) => `${e.length}`,
3263
+ build: (e, t) => {
3264
+ let { high: n, low: r, close: i, volume: a } = e, o = e.calc((e) => {
3265
+ let t = n.v[e], o = r.v[e], s = i.v[e];
3266
+ return t === o ? 0 : (2 * s - o - t) / (t - o) * a.v[e];
3267
+ });
3268
+ return [e.div(e.sum(o, t.length), e.sum(a, t.length))];
3269
+ },
3270
+ reference: "TradingView Chaikin Money Flow: sum(ad, 20) / sum(volume, 20), ad = (2*close - low - high) / (high - low) * volume (0 when high == low)"
3271
+ }), Ea = a({
3272
+ id: "klinger",
3273
+ name: "Klinger Oscillator",
3274
+ family: "tv",
3275
+ needs: "ohlcv",
3276
+ pane: "new",
3277
+ inputs: [
3278
+ o("fast", 34, 1, 5e3),
3279
+ o("slow", 55, 1, 5e3),
3280
+ o("signal", 13, 1, 5e3)
3281
+ ],
3282
+ columns: ["kvo", "signal"],
3283
+ plots: [p("kvo", f.blue, { title: "KVO" }), p("signal", f.green, { title: "Signal" })],
3284
+ label: (e) => `${e.fast}, ${e.slow}, ${e.signal}`,
3285
+ build: (e, t) => {
3286
+ let n = e.src("hlc3"), r = e.volume, i = e.calc((e) => e === 0 ? $ : n.v[e] - n.v[e - 1] >= 0 ? r.v[e] : -r.v[e]), a = e.sub(e.ema(i, t.fast), e.ema(i, t.slow));
3287
+ return [a, e.ema(a, t.signal)];
3288
+ },
3289
+ reference: "TradingView Klinger Oscillator: sv = ta.change(hlc3) >= 0 ? volume : -volume; kvo = ta.ema(sv, 34) - ta.ema(sv, 55); signal = ta.ema(kvo, 13)"
3290
+ }), Da = a({
3291
+ id: "vwap",
3292
+ name: "VWAP",
3293
+ family: "tv",
3294
+ needs: "ohlcv",
3295
+ pane: "overlay",
3296
+ inputs: [
3297
+ i("anchor", "session", [
3298
+ "session",
3299
+ "week",
3300
+ "month",
3301
+ "year"
3302
+ ]),
3303
+ l("hlc3"),
3304
+ c("bandMult", 1, 0, 100, .1, "Band multiplier"),
3305
+ va
3306
+ ],
3307
+ columns: [
3308
+ "vwap",
3309
+ "upper",
3310
+ "lower"
3311
+ ],
3312
+ plots: [p("vwap", f.blue, { title: "VWAP" }), s("bands", "upper", "lower", f.green, "rgba(8,153,129,0.1)", "VWAP bands")],
3313
+ label: (e) => `${e.anchor}`,
3314
+ build: (e, t) => {
3315
+ let n = ha(e, t.anchor === "session" ? "day" : t.anchor, t.utcOffsetMinutes), r = e.src(t.source), i = e.volume, a = (e) => e === 0 || n.v[e] !== n.v[e - 1], o = ga(e, (e) => i.v[e], a);
3316
+ return _a(e, ga(e, (e) => r.v[e] * i.v[e], a), o, ga(e, (e) => r.v[e] * r.v[e] * i.v[e], a), t.bandMult);
3317
+ },
3318
+ reference: "Pine ta.vwap(hlc3, anchor, stdev_mult 1): cumulative sum(src*volume) / sum(volume) restarting at each session/week/month/year; bands = vwap +/- mult * sqrt(sum(volume*src^2)/sum(volume) - vwap^2). Session = calendar day in the exchange time zone."
3319
+ }), Oa = a({
3320
+ id: "anchored-vwap",
3321
+ name: "Anchored VWAP",
3322
+ family: "tv",
3323
+ needs: "ohlcv",
3324
+ pane: "overlay",
3325
+ inputs: [
3326
+ c("anchorTime", 0, 0, 0x38d7ea4c68000, 1, "Anchor time (UTC ms)"),
3327
+ l("hlc3"),
3328
+ c("bandMult", 1, 0, 100, .1, "Band multiplier")
3329
+ ],
3330
+ columns: [
3331
+ "vwap",
3332
+ "upper",
3333
+ "lower"
3334
+ ],
3335
+ plots: [p("vwap", f.orange, { title: "Anchored VWAP" }), s("bands", "upper", "lower", f.orange, "rgba(255,109,0,0.1)", "Anchored VWAP bands")],
3336
+ build: (e, t) => {
3337
+ let n = e.time, r = e.src(t.source), i = e.volume, a = (e) => n.v[e] >= t.anchorTime, o = (e) => e === 0 || !a(e - 1), s = ga(e, (e) => i.v[e], o, a);
3338
+ return _a(e, ga(e, (e) => r.v[e] * i.v[e], o, a), s, ga(e, (e) => r.v[e] * r.v[e] * i.v[e], o, a), t.bandMult);
3339
+ },
3340
+ reference: "TradingView Anchored VWAP: VWAP (hlc3) accumulated from the first bar at or after the anchor time, with stdev bands; earlier bars are absent"
3341
+ }), ka = [
3342
+ "p",
3343
+ "r1",
3344
+ "r2",
3345
+ "r3",
3346
+ "r4",
3347
+ "s1",
3348
+ "s2",
3349
+ "s3",
3350
+ "s4"
3351
+ ];
3352
+ function Aa(e, t, n, r, i) {
3353
+ let a = {
3354
+ p: $,
3355
+ r1: $,
3356
+ r2: $,
3357
+ r3: $,
3358
+ r4: $,
3359
+ s1: $,
3360
+ s2: $,
3361
+ s3: $,
3362
+ s4: $
3363
+ }, o = n - r;
3364
+ if (e === "dm") {
3365
+ let e = i < t ? n + 2 * r + i : i > t ? 2 * n + r + i : n + r + 2 * i;
3366
+ return a.p = e / 4, a.r1 = e / 2 - r, a.s1 = e / 2 - n, a;
3367
+ }
3368
+ if (e === "woodie") {
3369
+ let e = (n + r + 2 * i) / 4;
3370
+ return a.p = e, a.r1 = 2 * e - r, a.s1 = 2 * e - n, a.r2 = e + o, a.s2 = e - o, a.r3 = n + 2 * o, a.s3 = r - 2 * o, a.r4 = a.r3 + o, a.s4 = a.s3 - o, a;
3371
+ }
3372
+ if (e === "camarilla") return a.p = (n + r + i) / 3, a.r1 = i + o * 1.1 / 12, a.r2 = i + o * 1.1 / 6, a.r3 = i + o * 1.1 / 4, a.r4 = i + o * 1.1 / 2, a.s1 = i - o * 1.1 / 12, a.s2 = i - o * 1.1 / 6, a.s3 = i - o * 1.1 / 4, a.s4 = i - o * 1.1 / 2, a;
3373
+ let s = (n + r + i) / 3;
3374
+ return a.p = s, e === "fibonacci" ? (a.r1 = s + .382 * o, a.r2 = s + .618 * o, a.r3 = s + o, a.s1 = s - .382 * o, a.s2 = s - .618 * o, a.s3 = s - o) : e === "classic" ? (a.r1 = 2 * s - r, a.s1 = 2 * s - n, a.r2 = s + o, a.s2 = s - o, a.r3 = s + 2 * o, a.s3 = s - 2 * o, a.r4 = s + 3 * o, a.s4 = s - 3 * o) : (a.r1 = 2 * s - r, a.s1 = 2 * s - n, a.r2 = s + o, a.s2 = s - o, a.r3 = 2 * s + n - 2 * r, a.s3 = 2 * s - (2 * n - r), a.r4 = 3 * s + n - 3 * r, a.s4 = 3 * s - (3 * n - r)), a;
3375
+ }
3376
+ var ja = {
3377
+ p: f.gray,
3378
+ r1: f.red,
3379
+ r2: f.red,
3380
+ r3: f.red,
3381
+ r4: f.red,
3382
+ s1: f.green,
3383
+ s2: f.green,
3384
+ s3: f.green,
3385
+ s4: f.green
3386
+ }, Ma = a({
3387
+ id: "pivot-points",
3388
+ name: "Pivot Points Standard",
3389
+ family: "tv",
3390
+ needs: "ohlc",
3391
+ pane: "overlay",
3392
+ inputs: [
3393
+ i("kind", "standard", [
3394
+ "standard",
3395
+ "fibonacci",
3396
+ "woodie",
3397
+ "classic",
3398
+ "dm",
3399
+ "camarilla"
3400
+ ]),
3401
+ i("period", "day", [
3402
+ "day",
3403
+ "week",
3404
+ "month",
3405
+ "year"
3406
+ ]),
3407
+ va
3408
+ ],
3409
+ columns: [...ka],
3410
+ plots: ka.map((e) => p(e, ja[e], {
3411
+ title: e.toUpperCase(),
3412
+ width: 1
3413
+ })),
3414
+ label: (e) => `${e.kind} ${e.period}`,
3415
+ build: (e, t) => {
3416
+ let n = ha(e, t.period, t.utcOffsetMinutes), { open: r, high: i, low: a, close: o } = e, s = e.col(), c = e.col(), l = e.col(), u = e.col(), d = e.col(), f = e.col(), p = e.col(), m = e.col();
3417
+ return e.node((e, t, h) => {
3418
+ for (let e = t; e < h; e++) e === 0 || n.v[e] !== n.v[e - 1] ? (e === 0 ? (d.v[e] = $, f.v[e] = $, p.v[e] = $, m.v[e] = $) : (d.v[e] = s.v[e - 1], f.v[e] = c.v[e - 1], p.v[e] = l.v[e - 1], m.v[e] = u.v[e - 1]), s.v[e] = r.v[e], c.v[e] = i.v[e], l.v[e] = a.v[e]) : (d.v[e] = d.v[e - 1], f.v[e] = f.v[e - 1], p.v[e] = p.v[e - 1], m.v[e] = m.v[e - 1], s.v[e] = s.v[e - 1], c.v[e] = Math.max(c.v[e - 1], i.v[e]), l.v[e] = Math.min(l.v[e - 1], a.v[e])), u.v[e] = o.v[e];
3419
+ }), ka.map((n) => e.calc((e) => f.v[e] === f.v[e] ? Aa(t.kind, d.v[e], f.v[e], p.v[e], m.v[e])[n] : $));
3420
+ },
3421
+ reference: "TradingView Pivot Points Standard (Traditional, Fibonacci, Woodie, Classic, DM, Camarilla) from the previous completed period's open/high/low/close; constant over the current period, absent in the first"
3422
+ }), Na = a({
3423
+ id: "hist-vol",
3424
+ name: "Historical Volatility",
3425
+ family: "tv",
3426
+ needs: "value",
3427
+ pane: "new",
3428
+ inputs: [
3429
+ o("length", 10, 2, 5e3),
3430
+ o("annual", 252, 1, 1e4, "Periods per year"),
3431
+ o("periodDays", 1, 1, 1e4, "Days per bar")
3432
+ ],
3433
+ columns: ["hv"],
3434
+ plots: [p("hv", f.blue, { title: "HV" })],
3435
+ label: (e) => `${e.length}`,
3436
+ build: (e, t) => {
3437
+ let n = e.close, r = e.calc((e) => e === 0 ? $ : Math.log(n.v[e] / n.v[e - 1])), i = 100 * Math.sqrt(t.annual / t.periodDays);
3438
+ return [e.map(e.stdev(r, t.length), (e) => e * i)];
3439
+ },
3440
+ reference: "TradingView Historical Volatility: 100 * ta.stdev(ln(close/close[1]), 10) * sqrt(annual / periodDays); ta.stdev is the population deviation (biased). annual defaults to 252 trading days (TradingView's script uses 365)."
3441
+ }), Pa = a({
3442
+ id: "adr",
3443
+ name: "Average Day Range",
3444
+ family: "tv",
3445
+ needs: "ohlc",
3446
+ pane: "new",
3447
+ inputs: [o("length", 14, 1, 5e3)],
3448
+ columns: ["adr"],
3449
+ plots: [p("adr", f.orange, { title: "ADR" })],
3450
+ label: (e) => `${e.length}`,
3451
+ build: (e, t) => [e.sma(e.sub(e.high, e.low), t.length)],
3452
+ reference: "TradingView Average Day Range: ta.sma(high - low, 14) on the chart's bars"
3453
+ });
3454
+ //#endregion
3455
+ export { pi as $, vt as $n, ce as $r, Zr as $t, da as A, Ht as An, nt as Ar, Er as At, mi as B, Wt as Bn, he as Br, Rr as Bt, Ji as C, It as Cn, ge as Cr, vr as Ct, ta as D, $t as Dn, je as Dr, Sr as Dt, ea as E, zt as En, Ne as Er, xr as Et, hi as F, nn as Fn, De as Fr, Nr as Ft, xi as G, qt as Gn, Ue as Gr, Ur as Gt, Ci as H, Kt as Hn, Le as Hr, zr as Ht, Di as I, sn as In, ye as Ir, Pr as It, ki as J, jt as Jn, ue as Jr, Kr as Jt, bi as K, Jt as Kn, ze as Kr, Wr as Kt, Ti as L, cn as Ln, be as Lr, Fr as Lt, zi as M, Nt as Mn, me as Mr, Or as Mt, Xi as N, tn as Nn, $e as Nr, kr as Nt, ua as O, Bt as On, He as Or, Cr as Ot, Ni as P, on as Pn, tt as Pr, Ar as Pt, oi as Q, Ct as Qn, oe as Qr, Xr as Qt, Si as R, ln as Rn, xe as Rr, Ir as Rt, qi as S, Ft as Sn, Be as Sr, _r as St, ra as T, Rt as Tn, Ae as Tr, br as Tt, Oi as U, Zt as Un, Re as Ur, Vr as Ut, ji as V, Gt as Vn, Ie as Vr, Br as Vt, gi as W, rn as Wn, Ce as Wr, Hr as Wt, fi as X, Tt as Xn, re as Xr, Jr as Xt, Ei as Y, St as Yn, de as Yr, qr as Yt, Mi as Z, wt as Zn, te as Zr, Yr as Zt, ia as _, kn as _n, Xe as _r, fr as _t, wa as a, ie as ai, ri as an, ft as ar, er as at, Zi as b, Pt as bn, Ge as br, hr as bt, Sa as c, In as cn, ut as cr, rr as ct, fa as d, Fn as dn, ct as dr, or as dt, fe as ei, Qr as en, Dt as er, Ri as et, ya as f, un as fn, at as fr, sr as ft, oa as g, Dn as gn, Ye as gr, dr as gt, sa as h, En as hn, rt as hr, ur as ht, Ca as i, se as ii, ni as in, ht as ir, $n as it, Yi as j, Ut as jn, _e as jr, Dr as jt, na as k, Vt as kn, et as kr, Tr as kt, Ma as l, Pn as ln, dt as lr, ir as lt, Da as m, Tn as mn, st as mr, lr as mt, Oa as n, E as ni, ei as nn, Ot as nr, Zn as nt, Na as o, ae as oi, ii as on, gt as or, tr as ot, ba as p, wn as pn, ot as pr, cr as pt, _i as q, Mt as qn, le as qr, Gr as qt, Ta as r, ee as ri, ti as rn, mt as rr, Qn as rt, Ea as s, ne as si, ai as sn, _t as sr, nr as st, Pa as t, pe as ti, $r as tn, Et as tr, Xn as tt, xa as u, jn as un, lt as ur, ar as ut, $i as v, On as vn, Ee as vr, pr as vt, ca as w, Lt as wn, Ze as wr, yr as wt, la as x, Xt as xn, Ve as xr, gr as xt, Qi as y, An as yn, We as yr, mr as yt, Li as z, Qt as zn, Se as zr, Lr as zt };
3456
+
3457
+ //# sourceMappingURL=tv-volume-7hh6ajKt.js.map