@alphacharts/indicators 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -2
  3. package/dist/all-_xzUPrL7.js +21 -0
  4. package/dist/all-_xzUPrL7.js.map +1 -0
  5. package/dist/all.js +10 -0
  6. package/dist/all.js.map +1 -0
  7. package/dist/define-XUgQMhSl.js +687 -0
  8. package/dist/define-XUgQMhSl.js.map +1 -0
  9. package/dist/index.js +744 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/registry-DdYYyZN_.js +53 -0
  12. package/dist/registry-DdYYyZN_.js.map +1 -0
  13. package/dist/runner-B53M0IsJ.js +237 -0
  14. package/dist/runner-B53M0IsJ.js.map +1 -0
  15. package/dist/studies.js +1 -0
  16. package/dist/tv-volume-BYSbfrVk.js +3454 -0
  17. package/dist/tv-volume-BYSbfrVk.js.map +1 -0
  18. package/dist/types/all.d.ts +3 -0
  19. package/dist/types/chart/marker-floor.d.ts +9 -0
  20. package/dist/types/chart/studies.d.ts +192 -0
  21. package/dist/types/define.d.ts +46 -0
  22. package/dist/types/engine/feed.d.ts +88 -0
  23. package/dist/types/engine/graph.d.ts +136 -0
  24. package/dist/types/engine/kernels.d.ts +9 -0
  25. package/dist/types/engine/study.d.ts +40 -0
  26. package/dist/types/index.d.ts +15 -0
  27. package/dist/types/registry.d.ts +7 -0
  28. package/dist/types/runner.d.ts +91 -0
  29. package/dist/types/studies/all.d.ts +2 -0
  30. package/dist/types/studies/cycle.d.ts +7 -0
  31. package/dist/types/studies/index.d.ts +13 -0
  32. package/dist/types/studies/ma.d.ts +26 -0
  33. package/dist/types/studies/math.d.ts +28 -0
  34. package/dist/types/studies/momentum.d.ts +30 -0
  35. package/dist/types/studies/overlap.d.ts +14 -0
  36. package/dist/types/studies/patterns.d.ts +62 -0
  37. package/dist/types/studies/price.d.ts +6 -0
  38. package/dist/types/studies/sar.d.ts +2 -0
  39. package/dist/types/studies/statistic.d.ts +9 -0
  40. package/dist/types/studies/tv-osc.d.ts +18 -0
  41. package/dist/types/studies/tv-trend.d.ts +20 -0
  42. package/dist/types/studies/tv-volume.d.ts +15 -0
  43. package/dist/types/studies/volatility.d.ts +3 -0
  44. package/dist/types/studies/volume.d.ts +3 -0
  45. package/dist/types/types.d.ts +169 -0
  46. package/dist/types/wasm.d.ts +2 -0
  47. package/dist/types/worker.d.ts +1 -0
  48. package/dist/worker.js +8 -0
  49. package/dist/worker.js.map +1 -0
  50. package/package.json +72 -3
@@ -0,0 +1,3454 @@
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-XUgQMhSl.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 ? 100 : 100 * e / (e + t))];
382
+ },
383
+ reference: "TA-Lib RSI arithmetic (Wilder smoothing, seeded with the mean of the first `length` changes). A flat opening (average gain and loss both 0, RS = 0/0) is 100, the convention of charting packages; TA-Lib reports 0 there"
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 ? 100 : 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. The RSI inside is this package's (a flat opening is 100, see rsi)"
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: "Wilder's ATR (not TA-Lib's): true range of bar 0 is high - low, seeded with the mean of true ranges 0..length-1 (first value at bar length-1), then Wilder smoothing. TA-Lib skips the first true range and starts one bar later"
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: "NATR = 100 * ATR / close, on Wilder's ATR (not TA-Lib's, see atr)"
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: () => ji,
1899
+ alma: () => pi,
1900
+ chandeKrollStop: () => Ti,
1901
+ donchian: () => Ci,
1902
+ envelopes: () => bi,
1903
+ fractals: () => Fi,
1904
+ hma: () => fi,
1905
+ ichimoku: () => ki,
1906
+ keltner: () => xi,
1907
+ linregChannel: () => Ei,
1908
+ lsma: () => mi,
1909
+ maCross: () => yi,
1910
+ maRibbon: () => vi,
1911
+ mcginley: () => hi,
1912
+ median: () => Di,
1913
+ priceChannel: () => wi,
1914
+ smma: () => ui,
1915
+ supertrend: () => Ai,
1916
+ vwma: () => di,
1917
+ zigzag: () => Ii
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, t, n) {
1923
+ if (!Number.isInteger(n) || n < 2) throw RangeError(`linreg: period must be an integer >= 2, got ${n}`);
1924
+ 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();
1925
+ return {
1926
+ value: e.node((e, c, l) => {
1927
+ let u = t.v, d = r.v, f = o.v, p = s.v, m = e.v;
1928
+ for (let e = c; e < l; e++) {
1929
+ if (d[e] < n) {
1930
+ f[e] = X, p[e] = X, m[e] = X;
1931
+ continue;
1932
+ }
1933
+ let t = 0, r = 0;
1934
+ for (let i = 0; i < n; i++) {
1935
+ let a = u[e - n + 1 + i];
1936
+ t += a, r += i * a;
1937
+ }
1938
+ let o = (n * r - i * t) / a, s = (t - o * i) / n;
1939
+ f[e] = o, p[e] = s, m[e] = s + o * (n - 1);
1940
+ }
1941
+ }),
1942
+ slope: o,
1943
+ intercept: s
1944
+ };
1945
+ }
1946
+ var li = (e, t, n, r) => t === "ema" ? e.ema(n, r) : e.sma(n, r), ui = a({
1947
+ id: "smma",
1948
+ name: "Smoothed Moving Average",
1949
+ family: "tv",
1950
+ needs: "value",
1951
+ pane: "overlay",
1952
+ inputs: [Z(7), l()],
1953
+ columns: ["smma"],
1954
+ plots: [p("smma", f.teal)],
1955
+ label: (e) => `${e.length}`,
1956
+ build: (e, t) => [e.rma(e.src(t.source), t.length)],
1957
+ reference: "TradingView Smoothed Moving Average: smma := na(smma[1]) ? ta.sma(src, n) : (smma[1] * (n - 1) + src) / n"
1958
+ }), di = a({
1959
+ id: "vwma",
1960
+ name: "Volume Weighted Moving Average",
1961
+ family: "tv",
1962
+ needs: "ohlcv",
1963
+ pane: "overlay",
1964
+ inputs: [Z(20), l()],
1965
+ columns: ["vwma"],
1966
+ plots: [p("vwma", f.purple)],
1967
+ label: (e) => `${e.length}`,
1968
+ build: (e, t) => [e.div(e.sum(e.mul(e.src(t.source), e.volume), t.length), e.sum(e.volume, t.length))],
1969
+ reference: "Pine ta.vwma(src, n) = ta.sma(src * volume, n) / ta.sma(volume, n)"
1970
+ }), fi = a({
1971
+ id: "hma",
1972
+ name: "Hull Moving Average",
1973
+ family: "tv",
1974
+ needs: "value",
1975
+ pane: "overlay",
1976
+ inputs: [Z(9, 2), l()],
1977
+ columns: ["hma"],
1978
+ plots: [p("hma", f.pink)],
1979
+ label: (e) => `${e.length}`,
1980
+ build: (e, t) => {
1981
+ 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);
1982
+ return [e.wma(a, i)];
1983
+ },
1984
+ 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"
1985
+ }), pi = a({
1986
+ id: "alma",
1987
+ name: "Arnaud Legoux Moving Average",
1988
+ family: "tv",
1989
+ needs: "value",
1990
+ pane: "overlay",
1991
+ inputs: [
1992
+ Z(9),
1993
+ c("offset", .85, 0, 1, .05),
1994
+ c("sigma", 6, .1, 100, .5),
1995
+ l()
1996
+ ],
1997
+ columns: ["alma"],
1998
+ plots: [p("alma", f.blue)],
1999
+ label: (e) => `${e.length}, ${e.offset}, ${e.sigma}`,
2000
+ build: (e, t) => {
2001
+ let n = t.length, r = Math.floor(t.offset * (n - 1)), i = n / t.sigma, a = new Float64Array(n), o = 0;
2002
+ for (let e = 0; e < n; e++) a[e] = Math.exp(-((e - r) ** 2) / (2 * i * i)), o += a[e];
2003
+ let s = e.src(t.source), c = e.validRun(s);
2004
+ return [e.node((e, t, r) => {
2005
+ let i = s.v, l = c.v, u = e.v;
2006
+ for (let e = t; e < r; e++) {
2007
+ if (l[e] < n) {
2008
+ u[e] = X;
2009
+ continue;
2010
+ }
2011
+ let t = 0;
2012
+ for (let r = 0; r < n; r++) t += i[e - n + 1 + r] * a[r];
2013
+ u[e] = t / o;
2014
+ }
2015
+ })];
2016
+ },
2017
+ 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)"
2018
+ }), mi = a({
2019
+ id: "lsma",
2020
+ name: "Least Squares Moving Average",
2021
+ family: "tv",
2022
+ needs: "value",
2023
+ pane: "overlay",
2024
+ inputs: [
2025
+ Z(25, 2),
2026
+ o("offset", 0, -5e3, 5e3),
2027
+ l()
2028
+ ],
2029
+ columns: ["lsma"],
2030
+ plots: [p("lsma", f.orange)],
2031
+ label: (e) => `${e.length}, ${e.offset}`,
2032
+ build: (e, t) => {
2033
+ let n = ci(e, e.src(t.source), t.length);
2034
+ return [e.map2(n.value, n.slope, (e, n) => e - t.offset * n)];
2035
+ },
2036
+ reference: "TradingView Least Squares Moving Average = Pine ta.linreg(src, n, offset); offset 0 equals TA-Lib LINEARREG"
2037
+ }), hi = a({
2038
+ id: "mcginley",
2039
+ name: "McGinley Dynamic",
2040
+ family: "tv",
2041
+ needs: "value",
2042
+ pane: "overlay",
2043
+ inputs: [Z(14), l()],
2044
+ columns: ["mcginley"],
2045
+ plots: [p("mcginley", f.green)],
2046
+ label: (e) => `${e.length}`,
2047
+ build: (e, t) => {
2048
+ let n = t.length, r = e.src(t.source), i = e.ema(r, n);
2049
+ return [e.node((e, t, a) => {
2050
+ let o = r.v, s = i.v, c = e.v;
2051
+ for (let e = t; e < a; e++) {
2052
+ let t = e > 0 ? c[e - 1] : X;
2053
+ c[e] = t === t ? t + (o[e] - t) / (n * (o[e] / t) ** 4) : s[e];
2054
+ }
2055
+ })];
2056
+ },
2057
+ reference: "TradingView McGinley Dynamic: mg := na(mg[1]) ? ta.ema(src, n) : mg[1] + (src - mg[1]) / (n * (src / mg[1])^4)"
2058
+ }), gi = [
2059
+ f.blue,
2060
+ f.teal,
2061
+ f.green,
2062
+ f.lime,
2063
+ f.yellow,
2064
+ f.orange,
2065
+ f.red,
2066
+ f.pink
2067
+ ], _i = gi.map((e, t) => `ma${t + 1}`), vi = a({
2068
+ id: "ma-ribbon",
2069
+ name: "Moving Average Ribbon",
2070
+ family: "tv",
2071
+ needs: "value",
2072
+ pane: "overlay",
2073
+ inputs: [
2074
+ o("first", 20, 1, 5e3, "first"),
2075
+ o("step", 5, 1, 1e3, "step"),
2076
+ l()
2077
+ ],
2078
+ columns: _i,
2079
+ plots: _i.map((e, t) => p(e, gi[t], {
2080
+ title: `MA ${t + 1}`,
2081
+ width: 1
2082
+ })),
2083
+ label: (e) => `${e.first}, ${e.step}`,
2084
+ build: (e, t) => {
2085
+ let n = t.first + 7 * t.step;
2086
+ if (n > 5e3) throw RangeError(`ma-ribbon: the 8th period ${n} exceeds 5000`);
2087
+ let r = e.src(t.source);
2088
+ return _i.map((n, i) => e.sma(r, t.first + i * t.step));
2089
+ },
2090
+ reference: "Moving Average Ribbon: eight simple moving averages of periods first, first + step, ... first + 7 * step (default 20..55 step 5)"
2091
+ }), yi = a({
2092
+ id: "ma-cross",
2093
+ name: "Moving Average Cross",
2094
+ family: "tv",
2095
+ needs: "value",
2096
+ pane: "overlay",
2097
+ inputs: [
2098
+ i("type", "sma", ["sma", "ema"]),
2099
+ o("fast", 9, 1, 5e3),
2100
+ o("slow", 21, 1, 5e3),
2101
+ l()
2102
+ ],
2103
+ columns: [
2104
+ "fast",
2105
+ "slow",
2106
+ "crossUp",
2107
+ "crossDown"
2108
+ ],
2109
+ plots: [
2110
+ p("fast", f.blue, { title: "Fast MA" }),
2111
+ p("slow", f.orange, { title: "Slow MA" }),
2112
+ r("crossUp", "circle", "value", f.green, { title: "Cross up" }),
2113
+ r("crossDown", "circle", "value", f.red, { title: "Cross down" })
2114
+ ],
2115
+ label: (e) => `${e.type}, ${e.fast}, ${e.slow}`,
2116
+ build: (e, t) => {
2117
+ let n = e.src(t.source), r = li(e, t.type, n, t.fast), i = li(e, t.type, n, t.slow);
2118
+ return [
2119
+ r,
2120
+ i,
2121
+ e.calc((e) => e > 0 && r.v[e] > i.v[e] && r.v[e - 1] <= i.v[e - 1] ? r.v[e] : X),
2122
+ e.calc((e) => e > 0 && r.v[e] < i.v[e] && r.v[e - 1] >= i.v[e - 1] ? r.v[e] : X)
2123
+ ];
2124
+ },
2125
+ reference: "TradingView Moving Average Cross: two moving averages, circles where ta.crossover / ta.crossunder(fast, slow) is true"
2126
+ }), bi = a({
2127
+ id: "envelopes",
2128
+ name: "Moving Average Envelopes",
2129
+ family: "tv",
2130
+ needs: "value",
2131
+ pane: "overlay",
2132
+ inputs: [
2133
+ Z(20),
2134
+ c("percent", 10, 0, 100, .5),
2135
+ i("basis", "sma", ["sma", "ema"]),
2136
+ l()
2137
+ ],
2138
+ columns: [
2139
+ "basis",
2140
+ "upper",
2141
+ "lower"
2142
+ ],
2143
+ plots: [p("basis", f.orange, { title: "Basis" }), s("band", "upper", "lower", f.blue, si(f.blue, .08), "Envelope")],
2144
+ label: (e) => `${e.length}, ${e.percent}, ${e.basis}`,
2145
+ build: (e, t) => {
2146
+ let n = li(e, t.basis, e.src(t.source), t.length), r = t.percent / 100;
2147
+ return [
2148
+ n,
2149
+ e.map(n, (e) => e * (1 + r)),
2150
+ e.map(n, (e) => e * (1 - r))
2151
+ ];
2152
+ },
2153
+ reference: "TradingView Envelope: basis = sma|ema(src, n), upper = basis * (1 + percent / 100), lower = basis * (1 - percent / 100)"
2154
+ }), xi = a({
2155
+ id: "keltner",
2156
+ name: "Keltner Channels",
2157
+ family: "tv",
2158
+ needs: "ohlc",
2159
+ pane: "overlay",
2160
+ inputs: [
2161
+ Z(20),
2162
+ c("mult", 2, 0, 100, .25),
2163
+ o("atrLength", 10, 1, 5e3),
2164
+ u("useEma", !0),
2165
+ l()
2166
+ ],
2167
+ columns: [
2168
+ "basis",
2169
+ "upper",
2170
+ "lower"
2171
+ ],
2172
+ plots: [p("basis", f.blue, { title: "Basis" }), s("band", "upper", "lower", f.blue, si(f.blue, .08), "Channel")],
2173
+ label: (e) => `${e.length}, ${e.mult}, ${e.atrLength}`,
2174
+ build: (e, t) => {
2175
+ let n = e.src(t.source), r = t.useEma ? e.ema(n, t.length) : e.sma(n, t.length), i = e.map(e.atr(t.atrLength), (e) => e * t.mult);
2176
+ return [
2177
+ r,
2178
+ e.add(r, i),
2179
+ e.sub(r, i)
2180
+ ];
2181
+ },
2182
+ reference: "TradingView Keltner Channels (ATR band style): basis = ema|sma(src, n), bands = basis +- mult * ta.atr(atrLength)"
2183
+ });
2184
+ function Si(e, t) {
2185
+ let n = e.highest(e.high, t), r = e.lowest(e.low, t);
2186
+ return {
2187
+ upper: n,
2188
+ lower: r,
2189
+ mid: e.map2(n, r, (e, t) => (e + t) / 2)
2190
+ };
2191
+ }
2192
+ var Ci = a({
2193
+ id: "donchian",
2194
+ name: "Donchian Channels",
2195
+ family: "tv",
2196
+ needs: "ohlc",
2197
+ pane: "overlay",
2198
+ inputs: [Z(20)],
2199
+ columns: [
2200
+ "upper",
2201
+ "lower",
2202
+ "basis"
2203
+ ],
2204
+ plots: [s("band", "upper", "lower", f.blue, si(f.blue, .08), "Channel"), p("basis", f.orange, { title: "Basis" })],
2205
+ label: (e) => `${e.length}`,
2206
+ build: (e, t) => {
2207
+ let n = Si(e, t.length);
2208
+ return [
2209
+ n.upper,
2210
+ n.lower,
2211
+ n.mid
2212
+ ];
2213
+ },
2214
+ 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"
2215
+ }), wi = a({
2216
+ id: "price-channel",
2217
+ name: "Price Channel",
2218
+ family: "tv",
2219
+ needs: "ohlc",
2220
+ pane: "overlay",
2221
+ inputs: [Z(20)],
2222
+ columns: [
2223
+ "upper",
2224
+ "lower",
2225
+ "center"
2226
+ ],
2227
+ plots: [
2228
+ p("upper", f.green, { title: "Highest high" }),
2229
+ p("lower", f.red, { title: "Lowest low" }),
2230
+ p("center", f.gray, {
2231
+ title: "Center",
2232
+ style: "dashed"
2233
+ })
2234
+ ],
2235
+ label: (e) => `${e.length}`,
2236
+ build: (e, t) => {
2237
+ let n = Si(e, t.length);
2238
+ return [
2239
+ n.upper,
2240
+ n.lower,
2241
+ n.mid
2242
+ ];
2243
+ },
2244
+ reference: "Price Channel: highest high and lowest low of the last n bars with their midline; equals TA-Lib MAX(high), MIN(low), MIDPRICE"
2245
+ }), Ti = a({
2246
+ id: "chande-kroll-stop",
2247
+ name: "Chande Kroll Stop",
2248
+ family: "tv",
2249
+ needs: "ohlc",
2250
+ pane: "overlay",
2251
+ inputs: [
2252
+ o("p", 10, 1, 5e3),
2253
+ c("x", 1, 0, 100, .25),
2254
+ o("q", 9, 1, 5e3)
2255
+ ],
2256
+ columns: ["stopShort", "stopLong"],
2257
+ plots: [p("stopShort", f.red, { title: "Stop short" }), p("stopLong", f.green, { title: "Stop long" })],
2258
+ label: (e) => `${e.p}, ${e.x}, ${e.q}`,
2259
+ build: (e, t) => {
2260
+ let n = e.map(e.atr(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);
2261
+ return [e.highest(r, t.q), e.lowest(i, t.q)];
2262
+ },
2263
+ 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)"
2264
+ }), Ei = a({
2265
+ id: "linreg-channel",
2266
+ name: "Linear Regression Channel",
2267
+ family: "tv",
2268
+ needs: "value",
2269
+ pane: "overlay",
2270
+ inputs: [
2271
+ Z(100, 2),
2272
+ c("upperDev", 2, 0, 100, .25),
2273
+ c("lowerDev", 2, 0, 100, .25),
2274
+ l()
2275
+ ],
2276
+ columns: [
2277
+ "base",
2278
+ "upper",
2279
+ "lower"
2280
+ ],
2281
+ plots: [p("base", f.orange, { title: "Base" }), s("band", "upper", "lower", f.blue, si(f.blue, .08), "Channel")],
2282
+ label: (e) => `${e.length}, ${e.upperDev}, ${e.lowerDev}`,
2283
+ build: (e, t) => {
2284
+ let n = t.length, r = e.src(t.source), i = ci(e, r, n), a = e.node((e, t, a) => {
2285
+ let o = r.v, s = i.slope.v, c = i.intercept.v, l = e.v;
2286
+ for (let e = t; e < a; e++) {
2287
+ let t = s[e], r = c[e];
2288
+ if (t !== t) {
2289
+ l[e] = X;
2290
+ continue;
2291
+ }
2292
+ let i = 0;
2293
+ for (let a = 0; a < n; a++) {
2294
+ let s = o[e - n + 1 + a] - (r + t * a);
2295
+ i += s * s;
2296
+ }
2297
+ l[e] = Math.sqrt(i / n);
2298
+ }
2299
+ });
2300
+ return [
2301
+ i.value,
2302
+ e.map2(i.value, a, (e, n) => e + t.upperDev * n),
2303
+ e.map2(i.value, a, (e, n) => e - t.lowerDev * n)
2304
+ ];
2305
+ },
2306
+ 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."
2307
+ }), Di = a({
2308
+ id: "median",
2309
+ name: "Median",
2310
+ family: "tv",
2311
+ needs: "ohlc",
2312
+ pane: "overlay",
2313
+ inputs: [
2314
+ Z(3),
2315
+ o("atrLength", 14, 1, 5e3),
2316
+ c("mult", 2, 0, 100, .25),
2317
+ l("hl2")
2318
+ ],
2319
+ columns: [
2320
+ "median",
2321
+ "upper",
2322
+ "lower"
2323
+ ],
2324
+ plots: [p("median", f.blue, { title: "Median" }), s("band", "upper", "lower", f.gray, si(f.gray, .08), "ATR band")],
2325
+ label: (e) => `${e.length}, ${e.atrLength}, ${e.mult}`,
2326
+ build: (e, t) => {
2327
+ let n = t.length, r = e.src(t.source), i = e.validRun(r), a = e.node((e, t, a) => {
2328
+ let o = r.v, s = i.v, c = e.v, l = new Float64Array(n);
2329
+ for (let e = t; e < a; e++) if (s[e] < n) c[e] = X;
2330
+ else {
2331
+ for (let t = 0; t < n; t++) l[t] = o[e - n + 1 + t];
2332
+ l.sort(), c[e] = n % 2 == 1 ? l[(n - 1) / 2] : (l[n / 2 - 1] + l[n / 2]) / 2;
2333
+ }
2334
+ }), o = e.map(e.atr(t.atrLength), (e) => e * t.mult);
2335
+ return [
2336
+ a,
2337
+ e.add(a, o),
2338
+ e.sub(a, o)
2339
+ ];
2340
+ },
2341
+ 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."
2342
+ }), Oi = 26, ki = a({
2343
+ id: "ichimoku",
2344
+ name: "Ichimoku Cloud",
2345
+ family: "tv",
2346
+ needs: "ohlc",
2347
+ pane: "overlay",
2348
+ inputs: [
2349
+ o("conversion", 9, 1, 5e3),
2350
+ o("base", 26, 1, 5e3),
2351
+ o("spanB", 52, 1, 5e3)
2352
+ ],
2353
+ columns: [
2354
+ "conversion",
2355
+ "base",
2356
+ "spanA",
2357
+ "spanB",
2358
+ "lagging"
2359
+ ],
2360
+ plots: [
2361
+ p("conversion", f.blue, { title: "Conversion line" }),
2362
+ p("base", f.red, { title: "Base line" }),
2363
+ t("cloud", "spanA", "spanB", f.green, "Cloud"),
2364
+ p("spanA", f.green, {
2365
+ title: "Leading span A",
2366
+ offset: 25
2367
+ }),
2368
+ p("spanB", f.orange, {
2369
+ title: "Leading span B",
2370
+ offset: 25
2371
+ }),
2372
+ p("lagging", f.purple, {
2373
+ title: "Lagging span",
2374
+ offset: -25
2375
+ })
2376
+ ],
2377
+ label: (e) => `${e.conversion}, ${e.base}, ${e.spanB}, ${Oi}`,
2378
+ build: (e, t) => {
2379
+ let n = Si(e, t.conversion).mid, r = Si(e, t.base).mid;
2380
+ return [
2381
+ n,
2382
+ r,
2383
+ e.map2(n, r, (e, t) => (e + t) / 2),
2384
+ Si(e, t.spanB).mid,
2385
+ e.map(e.close, (e) => e)
2386
+ ];
2387
+ },
2388
+ 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."
2389
+ }), Ai = a({
2390
+ id: "supertrend",
2391
+ name: "Supertrend",
2392
+ family: "tv",
2393
+ needs: "ohlc",
2394
+ pane: "overlay",
2395
+ inputs: [o("atrLength", 10, 1, 5e3), c("factor", 3, .1, 100, .1)],
2396
+ columns: [
2397
+ "up",
2398
+ "down",
2399
+ "direction"
2400
+ ],
2401
+ plots: [p("up", f.green, { title: "Up trend" }), p("down", f.red, { title: "Down trend" })],
2402
+ label: (e) => `${e.factor}, ${e.atrLength}`,
2403
+ build: (e, t) => {
2404
+ let { high: n, low: r, close: i } = e, a = e.atr(t.atrLength), o = e.col(), s = e.col(), c = e.col(), l = e.col(), u = e.node((e, u, d) => {
2405
+ let f = n.v, p = r.v, m = i.v, h = a.v, g = o.v, _ = s.v, v = c.v, y = l.v;
2406
+ for (let n = u; n < d; n++) {
2407
+ let r = h[n];
2408
+ if (r !== r) {
2409
+ g[n] = X, _[n] = X, v[n] = X, y[n] = X, e.v[n] = X;
2410
+ continue;
2411
+ }
2412
+ 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];
2413
+ if (!s) {
2414
+ let e = g[n - 1], t = _[n - 1], r = m[n - 1];
2415
+ a = a > e || r < e ? a : e, o = o < t || r > t ? o : t;
2416
+ }
2417
+ let c;
2418
+ 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;
2419
+ }
2420
+ });
2421
+ return [
2422
+ e.calc((e) => c.v[e] === -1 ? l.v[e] : X),
2423
+ e.calc((e) => c.v[e] === 1 ? l.v[e] : X),
2424
+ u
2425
+ ];
2426
+ },
2427
+ 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`)"
2428
+ }), ji = a({
2429
+ id: "alligator",
2430
+ name: "Williams Alligator",
2431
+ family: "tv",
2432
+ needs: "ohlc",
2433
+ pane: "overlay",
2434
+ inputs: [
2435
+ o("jawLength", 13, 1, 5e3),
2436
+ o("teethLength", 8, 1, 5e3),
2437
+ o("lipsLength", 5, 1, 5e3),
2438
+ l("hl2")
2439
+ ],
2440
+ columns: [
2441
+ "jaw",
2442
+ "teeth",
2443
+ "lips"
2444
+ ],
2445
+ plots: [
2446
+ p("jaw", f.blue, {
2447
+ title: "Jaw",
2448
+ offset: 8
2449
+ }),
2450
+ p("teeth", f.red, {
2451
+ title: "Teeth",
2452
+ offset: 5
2453
+ }),
2454
+ p("lips", f.green, {
2455
+ title: "Lips",
2456
+ offset: 3
2457
+ })
2458
+ ],
2459
+ label: (e) => `${e.jawLength}, ${e.teethLength}, ${e.lipsLength}`,
2460
+ build: (e, t) => {
2461
+ let n = e.src(t.source);
2462
+ return [
2463
+ e.rma(n, t.jawLength),
2464
+ e.rma(n, t.teethLength),
2465
+ e.rma(n, t.lipsLength)
2466
+ ];
2467
+ },
2468
+ 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)"
2469
+ }), Mi = 2, Ni = 4;
2470
+ function Pi(e, t, n) {
2471
+ let r = Mi;
2472
+ return e.node((e, i, a) => {
2473
+ let o = t.v, s = e.v;
2474
+ for (let e = i; e < a; e++) {
2475
+ s[e] = X;
2476
+ let t = e - r;
2477
+ if (t < 0) continue;
2478
+ let i = o[t], a = (e) => n ? e < i : e > i, c = !0;
2479
+ for (let e = 1; e <= r && c; e++) c = a(o[t + e]);
2480
+ if (!c) continue;
2481
+ let l = 0;
2482
+ for (; l <= Ni && t - 1 - l >= 0 && o[t - 1 - l] === i;) l++;
2483
+ let u = t - 1 - l;
2484
+ l <= Ni && u >= 0 && a(o[u]) && (s[e] = i);
2485
+ }
2486
+ });
2487
+ }
2488
+ var Fi = a({
2489
+ id: "fractals",
2490
+ name: "Williams Fractals",
2491
+ family: "tv",
2492
+ needs: "ohlc",
2493
+ pane: "overlay",
2494
+ inputs: [],
2495
+ columns: ["up", "down"],
2496
+ plots: [r("up", "triangleUp", "above", f.green, {
2497
+ title: "Up fractal",
2498
+ offset: -2
2499
+ }), r("down", "triangleDown", "below", f.red, {
2500
+ title: "Down fractal",
2501
+ offset: -2
2502
+ })],
2503
+ build: (e) => [Pi(e, e.high, !0), Pi(e, e.low, !1)],
2504
+ 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."
2505
+ }), Ii = a({
2506
+ id: "zigzag",
2507
+ name: "ZigZag",
2508
+ family: "tv",
2509
+ needs: "ohlc",
2510
+ pane: "overlay",
2511
+ inputs: [c("deviation", 5, .01, 100, .5), o("depth", 10, 1, 5e3)],
2512
+ columns: [
2513
+ "price",
2514
+ "back",
2515
+ "live",
2516
+ "liveBack"
2517
+ ],
2518
+ plots: [{
2519
+ kind: "zigzag",
2520
+ key: "zigzag",
2521
+ title: "ZigZag",
2522
+ price: "price",
2523
+ back: "back",
2524
+ color: f.blue,
2525
+ width: 2
2526
+ }],
2527
+ label: (e) => `${e.deviation}, ${e.depth}`,
2528
+ build: (e, t) => {
2529
+ 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();
2530
+ return [
2531
+ e.node((e, t, _) => {
2532
+ let v = n.v, y = r.v, b = e.v;
2533
+ for (let e = t; e < _; e++) {
2534
+ let t = 0, n = X, r = X, _ = X, x = v[e], S = e, C = y[e], w = e;
2535
+ 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]);
2536
+ let T = X, E = X;
2537
+ 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;
2538
+ }
2539
+ }),
2540
+ e.alias(m),
2541
+ e.alias(h),
2542
+ e.alias(g)
2543
+ ];
2544
+ },
2545
+ reference: "ZigZag as defined in this file's header: percentage-reversal pivots on high/low with a minimum spacing in bars, confirmed causally"
2546
+ }), Li = /* @__PURE__ */ h({
2547
+ accelerator: () => aa,
2548
+ awesome: () => ia,
2549
+ bullBearPower: () => na,
2550
+ choppiness: () => Zi,
2551
+ connorsRsi: () => Xi,
2552
+ coppock: () => Yi,
2553
+ dpo: () => sa,
2554
+ fisher: () => Gi,
2555
+ kst: () => Ki,
2556
+ massIndex: () => oa,
2557
+ rankCorr: () => ta,
2558
+ rviVigor: () => Qi,
2559
+ rviVolatility: () => $i,
2560
+ schaffTc: () => ca,
2561
+ smiErgodic: () => ea,
2562
+ stochTv: () => la,
2563
+ tsi: () => qi,
2564
+ vortex: () => Ji
2565
+ }), Q = NaN;
2566
+ function Ri(e, t, n) {
2567
+ return e.node((e, r, i) => {
2568
+ let a = t.v, o = e.v;
2569
+ for (let e = r; e < i; e++) {
2570
+ let t = e >= n ? a[e - n] : Q;
2571
+ o[e] = t === 0 ? Q : 100 * (a[e] - t) / t;
2572
+ }
2573
+ });
2574
+ }
2575
+ function zi(e, t, n) {
2576
+ 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);
2577
+ return e.map2(o, s, (e, t) => e !== e || t !== t ? Q : t === 0 ? 100 : e === 0 ? 0 : 100 - 100 / (1 + e / t));
2578
+ }
2579
+ function Bi(e, t, n, r) {
2580
+ return e.ema(e.ema(t, n), r);
2581
+ }
2582
+ function Vi(e, t) {
2583
+ 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);
2584
+ }
2585
+ function Hi(e) {
2586
+ let { high: t, low: n, close: r } = e;
2587
+ return e.calc((e) => {
2588
+ let i = t.v[e], a = n.v[e];
2589
+ if (e === 0) return i - a;
2590
+ let o = r.v[e - 1];
2591
+ return Math.max(i - a, Math.abs(i - o), Math.abs(a - o));
2592
+ });
2593
+ }
2594
+ function Ui(e, t) {
2595
+ let n = e.change(t, 1);
2596
+ return {
2597
+ up: e.map2(t, n, (e, t) => t > 0 ? e : Q),
2598
+ down: e.map2(t, n, (e, t) => t <= 0 ? e : Q)
2599
+ };
2600
+ }
2601
+ function Wi(e, t, n) {
2602
+ let r = e.highest(t, n), i = e.lowest(t, n);
2603
+ return e.node((e, n, a) => {
2604
+ let o = t.v, s = r.v, c = i.v, l = e.v;
2605
+ for (let e = n; e < a; e++) {
2606
+ let t = s[e], n = c[e];
2607
+ t !== t || n !== n ? l[e] = Q : l[e] = t > n ? 100 * (o[e] - n) / (t - n) : e > 0 ? l[e - 1] : Q;
2608
+ }
2609
+ });
2610
+ }
2611
+ var Gi = a({
2612
+ id: "fisher",
2613
+ name: "Fisher Transform",
2614
+ family: "tv",
2615
+ needs: "ohlc",
2616
+ pane: "new",
2617
+ inputs: [o("length", 9, 1, 5e3)],
2618
+ columns: ["fisher", "trigger"],
2619
+ plots: [
2620
+ p("fisher", f.blue),
2621
+ p("trigger", f.orange),
2622
+ n("zero", 0, f.gray, "dotted")
2623
+ ],
2624
+ label: (e) => `${e.length}`,
2625
+ build: (e, t) => {
2626
+ let n = e.src("hl2"), r = e.highest(n, t.length), i = e.lowest(n, t.length), a = e.node((e, t, a) => {
2627
+ let o = n.v, s = r.v, c = i.v, l = e.v;
2628
+ for (let e = t; e < a; e++) {
2629
+ let t = s[e], n = c[e];
2630
+ if (!(t > n)) {
2631
+ l[e] = Q;
2632
+ continue;
2633
+ }
2634
+ let r = e > 0 && l[e - 1] === l[e - 1] ? l[e - 1] : 0, i = .66 * ((o[e] - n) / (t - n) - .5) + .67 * r;
2635
+ l[e] = i > .99 ? .999 : i < -.99 ? -.999 : i;
2636
+ }
2637
+ }), o = e.node((e, t, n) => {
2638
+ let r = a.v, i = e.v;
2639
+ for (let e = t; e < n; e++) {
2640
+ let t = r[e];
2641
+ if (t !== t) {
2642
+ i[e] = Q;
2643
+ continue;
2644
+ }
2645
+ let n = e > 0 && i[e - 1] === i[e - 1] ? i[e - 1] : 0;
2646
+ i[e] = .5 * Math.log((1 + t) / (1 - t)) + .5 * n;
2647
+ }
2648
+ });
2649
+ return [o, e.lag(o, 1)];
2650
+ },
2651
+ 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]"
2652
+ }), Ki = a({
2653
+ id: "kst",
2654
+ name: "Know Sure Thing",
2655
+ family: "tv",
2656
+ needs: "value",
2657
+ pane: "new",
2658
+ inputs: [
2659
+ o("roc1", 10, 1, 5e3),
2660
+ o("roc2", 15, 1, 5e3),
2661
+ o("roc3", 20, 1, 5e3),
2662
+ o("roc4", 30, 1, 5e3),
2663
+ o("sma1", 10, 1, 5e3),
2664
+ o("sma2", 10, 1, 5e3),
2665
+ o("sma3", 10, 1, 5e3),
2666
+ o("sma4", 15, 1, 5e3),
2667
+ o("signal", 9, 1, 5e3),
2668
+ l()
2669
+ ],
2670
+ columns: ["kst", "signal"],
2671
+ plots: [
2672
+ p("kst", f.green),
2673
+ p("signal", f.red),
2674
+ n("zero", 0, f.gray, "dotted")
2675
+ ],
2676
+ label: (e) => `${e.roc1} ${e.roc2} ${e.roc3} ${e.roc4} ${e.sma1} ${e.sma2} ${e.sma3} ${e.sma4} ${e.signal}`,
2677
+ build: (e, t) => {
2678
+ let n = e.src(t.source), r = [
2679
+ 1,
2680
+ 2,
2681
+ 3,
2682
+ 4
2683
+ ].map((r) => e.sma(Ri(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]);
2684
+ return [i, e.sma(i, t.signal)];
2685
+ },
2686
+ 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)"
2687
+ }), qi = a({
2688
+ id: "tsi",
2689
+ name: "True Strength Index",
2690
+ family: "tv",
2691
+ needs: "value",
2692
+ pane: "new",
2693
+ inputs: [
2694
+ o("long", 25, 1, 5e3),
2695
+ o("short", 13, 1, 5e3),
2696
+ o("signal", 13, 1, 5e3),
2697
+ l()
2698
+ ],
2699
+ columns: ["tsi", "signal"],
2700
+ plots: [
2701
+ p("tsi", f.blue),
2702
+ p("signal", f.red),
2703
+ n("zero", 0, f.gray, "dotted")
2704
+ ],
2705
+ label: (e) => `${e.long} ${e.short} ${e.signal}`,
2706
+ build: (e, t) => {
2707
+ let n = e.change(e.src(t.source), 1), r = Bi(e, n, t.long, t.short), i = Bi(e, e.abs(n), t.long, t.short), a = e.mul(e.div(r, i), 100);
2708
+ return [a, e.ema(a, t.signal)];
2709
+ },
2710
+ 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)"
2711
+ }), Ji = a({
2712
+ id: "vortex",
2713
+ name: "Vortex Indicator",
2714
+ family: "tv",
2715
+ needs: "ohlc",
2716
+ pane: "new",
2717
+ inputs: [o("length", 14, 2, 5e3)],
2718
+ columns: ["viPlus", "viMinus"],
2719
+ plots: [p("viPlus", f.blue, { title: "VI+" }), p("viMinus", f.red, { title: "VI-" })],
2720
+ label: (e) => `${e.length}`,
2721
+ build: (e, t) => {
2722
+ 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(Hi(e), t.length);
2723
+ return [e.div(e.sum(i, t.length), o), e.div(e.sum(a, t.length), o)];
2724
+ },
2725
+ 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)"
2726
+ }), Yi = a({
2727
+ id: "coppock",
2728
+ name: "Coppock Curve",
2729
+ family: "tv",
2730
+ needs: "value",
2731
+ pane: "new",
2732
+ inputs: [
2733
+ o("length", 10, 1, 5e3, "WMA length"),
2734
+ o("longRoc", 14, 1, 5e3, "Long ROC length"),
2735
+ o("shortRoc", 11, 1, 5e3, "Short ROC length"),
2736
+ l()
2737
+ ],
2738
+ columns: ["coppock"],
2739
+ plots: [p("coppock", f.blue), n("zero", 0, f.gray, "dotted")],
2740
+ label: (e) => `${e.length} ${e.longRoc} ${e.shortRoc}`,
2741
+ build: (e, t) => {
2742
+ let n = e.src(t.source);
2743
+ return [e.wma(e.add(Ri(e, n, t.longRoc), Ri(e, n, t.shortRoc)), t.length)];
2744
+ },
2745
+ reference: "TradingView 'Coppock Curve' (Pine v5): wma(roc(src, 14) + roc(src, 11), 10)"
2746
+ }), Xi = a({
2747
+ id: "connors-rsi",
2748
+ name: "Connors RSI",
2749
+ family: "tv",
2750
+ needs: "value",
2751
+ pane: "new",
2752
+ inputs: [
2753
+ o("rsiLength", 3, 1, 5e3),
2754
+ o("updownLength", 2, 1, 5e3),
2755
+ o("rocLength", 100, 1, 5e3),
2756
+ l()
2757
+ ],
2758
+ columns: ["crsi"],
2759
+ plots: [
2760
+ p("crsi", f.blue),
2761
+ n("upper", 70),
2762
+ n("lower", 30),
2763
+ n("middle", 50, f.gray, "dotted")
2764
+ ],
2765
+ label: (e) => `${e.rsiLength} ${e.updownLength} ${e.rocLength}`,
2766
+ build: (e, t) => {
2767
+ let n = e.src(t.source), r = zi(e, n, t.rsiLength), i = zi(e, e.node((e, t, r) => {
2768
+ let i = n.v, a = e.v;
2769
+ for (let e = t; e < r; e++) {
2770
+ if (e === 0 || i[e] !== i[e] || i[e - 1] !== i[e - 1]) {
2771
+ a[e] = Q;
2772
+ continue;
2773
+ }
2774
+ let t = a[e - 1] === a[e - 1] ? a[e - 1] : 0, n = i[e], r = i[e - 1];
2775
+ a[e] = n === r ? 0 : n > r ? t <= 0 ? 1 : t + 1 : t >= 0 ? -1 : t - 1;
2776
+ }
2777
+ }), t.updownLength), a = Ri(e, n, 1), o = e.validRun(a), s = e.node((e, n, r) => {
2778
+ let i = a.v, s = o.v, c = e.v;
2779
+ for (let e = n; e < r; e++) {
2780
+ if (s[e] < t.rocLength + 1) {
2781
+ c[e] = Q;
2782
+ continue;
2783
+ }
2784
+ let n = 0;
2785
+ for (let r = 1; r <= t.rocLength; r++) i[e - r] <= i[e] && n++;
2786
+ c[e] = 100 * n / t.rocLength;
2787
+ }
2788
+ });
2789
+ return [e.calc((e) => (r.v[e] + i.v[e] + s.v[e]) / 3)];
2790
+ },
2791
+ 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)"
2792
+ }), Zi = a({
2793
+ id: "choppiness",
2794
+ name: "Choppiness Index",
2795
+ family: "tv",
2796
+ needs: "ohlc",
2797
+ pane: "new",
2798
+ inputs: [o("length", 14, 2, 5e3)],
2799
+ columns: ["chop"],
2800
+ plots: [
2801
+ p("chop", f.blue),
2802
+ n("upper", 61.8, f.gray, "dashed"),
2803
+ n("lower", 38.2, f.gray, "dashed")
2804
+ ],
2805
+ label: (e) => `${e.length}`,
2806
+ build: (e, t) => {
2807
+ let n = e.sum(Hi(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);
2808
+ return [e.map(i, (e) => e > 0 ? a * Math.log10(e) : Q)];
2809
+ },
2810
+ reference: "TradingView 'Choppiness Index' (Pine v5): 100 log10(sum(atr(1), n) / (highest(high, n) - lowest(low, n))) / log10(n)"
2811
+ }), Qi = a({
2812
+ id: "rvi-vigor",
2813
+ name: "Relative Vigor Index",
2814
+ family: "tv",
2815
+ needs: "ohlc",
2816
+ pane: "new",
2817
+ inputs: [o("length", 10, 1, 5e3)],
2818
+ columns: ["rvi", "signal"],
2819
+ plots: [p("rvi", f.green), p("signal", f.red)],
2820
+ label: (e) => `${e.length}`,
2821
+ build: (e, t) => {
2822
+ let n = e.sma(Vi(e, e.sub(e.close, e.open)), t.length), r = e.sma(Vi(e, e.sub(e.high, e.low)), t.length), i = e.div(n, r);
2823
+ return [i, Vi(e, i)];
2824
+ },
2825
+ reference: "TradingView 'Relative Vigor Index' (Pine v5): rvi = sma(swma(close - open), n) / sma(swma(high - low), n); signal = swma(rvi)"
2826
+ }), $i = a({
2827
+ id: "rvi-volatility",
2828
+ name: "Relative Volatility Index",
2829
+ family: "tv",
2830
+ needs: "value",
2831
+ pane: "new",
2832
+ inputs: [
2833
+ o("length", 10, 2, 5e3, "StdDev length"),
2834
+ o("smoothing", 14, 1, 5e3),
2835
+ i("ma", "ema", ["ema", "rma"], "Smoothing"),
2836
+ l()
2837
+ ],
2838
+ columns: ["rvi"],
2839
+ plots: [
2840
+ p("rvi", f.purple),
2841
+ n("upper", 80),
2842
+ n("lower", 20),
2843
+ n("middle", 50, f.gray, "dotted")
2844
+ ],
2845
+ label: (e) => `${e.length} ${e.smoothing}`,
2846
+ build: (e, t) => {
2847
+ 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);
2848
+ return [e.mul(e.div(c, e.add(c, l)), 100)];
2849
+ },
2850
+ 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"
2851
+ }), ea = a({
2852
+ id: "smi-ergodic",
2853
+ name: "SMI Ergodic Indicator/Oscillator",
2854
+ family: "tv",
2855
+ needs: "value",
2856
+ pane: "new",
2857
+ inputs: [
2858
+ o("longLength", 5, 1, 5e3),
2859
+ o("shortLength", 20, 1, 5e3),
2860
+ o("signal", 5, 1, 5e3),
2861
+ l()
2862
+ ],
2863
+ columns: [
2864
+ "erg",
2865
+ "signal",
2866
+ "osc"
2867
+ ],
2868
+ plots: [
2869
+ d("osc", f.gray, f.gray, { title: "Oscillator" }),
2870
+ p("erg", f.blue, { title: "SMI Ergodic" }),
2871
+ p("signal", f.red),
2872
+ n("zero", 0, f.gray, "dotted")
2873
+ ],
2874
+ label: (e) => `${e.longLength} ${e.shortLength} ${e.signal}`,
2875
+ build: (e, t) => {
2876
+ let n = e.change(e.src(t.source), 1), r = e.mul(e.div(Bi(e, n, t.longLength, t.shortLength), Bi(e, e.abs(n), t.longLength, t.shortLength)), 100), i = e.ema(r, t.signal);
2877
+ return [
2878
+ r,
2879
+ i,
2880
+ e.sub(r, i)
2881
+ ];
2882
+ },
2883
+ 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"
2884
+ }), ta = a({
2885
+ id: "rank-corr",
2886
+ name: "Rank Correlation vs Time",
2887
+ family: "tv",
2888
+ needs: "value",
2889
+ pane: "new",
2890
+ inputs: [o("length", 14, 2, 500), l()],
2891
+ columns: ["rho"],
2892
+ plots: [p("rho", f.teal), n("zero", 0, f.gray, "dotted")],
2893
+ label: (e) => `${e.length}`,
2894
+ build: (e, t) => {
2895
+ let n = e.src(t.source), r = e.validRun(n), i = t.length, a = (i + 1) / 2, o = i * (i * i - 1) / 12;
2896
+ return [e.node((e, t, s) => {
2897
+ let c = n.v, l = r.v, u = e.v;
2898
+ for (let e = t; e < s; e++) {
2899
+ if (l[e] < i) {
2900
+ u[e] = Q;
2901
+ continue;
2902
+ }
2903
+ let t = e - i + 1, n = 0, r = 0;
2904
+ for (let e = 0; e < i; e++) {
2905
+ let o = c[t + e], s = 0, l = 0;
2906
+ for (let n = 0; n < i; n++) {
2907
+ let r = c[t + n];
2908
+ r < o ? s++ : r === o && n !== e && l++;
2909
+ }
2910
+ let u = 1 + s + l / 2;
2911
+ n += (u - a) * (e + 1 - a), r += (u - a) * (u - a);
2912
+ }
2913
+ let s = Math.sqrt(r * o);
2914
+ u[e] = s > 0 ? Math.max(-1, Math.min(1, n / s)) : Q;
2915
+ }
2916
+ })];
2917
+ },
2918
+ 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"
2919
+ }), na = a({
2920
+ id: "bull-bear-power",
2921
+ name: "Bull Bear Power",
2922
+ family: "tv",
2923
+ needs: "ohlc",
2924
+ pane: "new",
2925
+ inputs: [o("length", 13, 1, 5e3), l()],
2926
+ columns: ["bull", "bear"],
2927
+ plots: [
2928
+ d("bull", f.green, f.green, { title: "Bull Power" }),
2929
+ d("bear", f.red, f.red, { title: "Bear Power" }),
2930
+ n("zero", 0, f.gray, "dotted")
2931
+ ],
2932
+ label: (e) => `${e.length}`,
2933
+ build: (e, t) => {
2934
+ let n = e.ema(e.src(t.source), t.length);
2935
+ return [e.sub(e.high, n), e.sub(e.low, n)];
2936
+ },
2937
+ reference: "Elder Ray (TradingView 'Bull Bear Power'): bull = high - ema(close, 13), bear = low - ema(close, 13)"
2938
+ });
2939
+ function ra(e, t, n) {
2940
+ let r = e.src("hl2");
2941
+ return e.sub(e.sma(r, t), e.sma(r, n));
2942
+ }
2943
+ var ia = a({
2944
+ id: "awesome",
2945
+ name: "Awesome Oscillator",
2946
+ family: "tv",
2947
+ needs: "ohlc",
2948
+ pane: "new",
2949
+ inputs: [o("fast", 5, 1, 5e3), o("slow", 34, 2, 5e3)],
2950
+ columns: [
2951
+ "ao",
2952
+ "up",
2953
+ "down"
2954
+ ],
2955
+ plots: [d("up", f.green, void 0, { title: "AO rising" }), d("down", f.red, void 0, { title: "AO falling" })],
2956
+ label: () => "",
2957
+ build: (e, t) => {
2958
+ if (t.fast >= t.slow) throw RangeError(`awesome: fast (${t.fast}) must be below slow (${t.slow})`);
2959
+ let n = ra(e, t.fast, t.slow), { up: r, down: i } = Ui(e, n);
2960
+ return [
2961
+ n,
2962
+ r,
2963
+ i
2964
+ ];
2965
+ },
2966
+ reference: "TradingView 'Awesome Oscillator': sma(hl2, 5) - sma(hl2, 34); bar green when above the previous bar's value, red otherwise"
2967
+ }), aa = a({
2968
+ id: "accelerator",
2969
+ name: "Accelerator Oscillator",
2970
+ family: "tv",
2971
+ needs: "ohlc",
2972
+ pane: "new",
2973
+ inputs: [
2974
+ o("fast", 5, 1, 5e3),
2975
+ o("slow", 34, 2, 5e3),
2976
+ o("signal", 5, 1, 5e3)
2977
+ ],
2978
+ columns: [
2979
+ "ac",
2980
+ "up",
2981
+ "down"
2982
+ ],
2983
+ plots: [d("up", f.green, void 0, { title: "AC rising" }), d("down", f.red, void 0, { title: "AC falling" })],
2984
+ label: () => "",
2985
+ build: (e, t) => {
2986
+ if (t.fast >= t.slow) throw RangeError(`accelerator: fast (${t.fast}) must be below slow (${t.slow})`);
2987
+ let n = ra(e, t.fast, t.slow), r = e.sub(n, e.sma(n, t.signal)), { up: i, down: a } = Ui(e, r);
2988
+ return [
2989
+ r,
2990
+ i,
2991
+ a
2992
+ ];
2993
+ },
2994
+ reference: "Bill Williams / TradingView 'Accelerator Oscillator': AO - sma(AO, 5); bar green when above the previous bar's value, red otherwise"
2995
+ }), oa = a({
2996
+ id: "mass-index",
2997
+ name: "Mass Index",
2998
+ family: "tv",
2999
+ needs: "ohlc",
3000
+ pane: "new",
3001
+ inputs: [o("length", 10, 1, 5e3, "Sum length"), o("emaLength", 9, 1, 5e3)],
3002
+ columns: ["mi"],
3003
+ plots: [p("mi", f.blue)],
3004
+ label: (e) => `${e.length}`,
3005
+ build: (e, t) => {
3006
+ let n = e.ema(e.sub(e.high, e.low), t.emaLength), r = e.ema(n, t.emaLength);
3007
+ return [e.sum(e.div(n, r), t.length)];
3008
+ },
3009
+ 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)"
3010
+ }), sa = a({
3011
+ id: "dpo",
3012
+ name: "Detrended Price Oscillator",
3013
+ family: "tv",
3014
+ needs: "value",
3015
+ pane: "new",
3016
+ inputs: [
3017
+ o("length", 21, 1, 5e3),
3018
+ u("centered", !1),
3019
+ l()
3020
+ ],
3021
+ columns: ["dpo"],
3022
+ plots: [p("dpo", f.teal), n("zero", 0, f.gray, "dotted")],
3023
+ label: (e) => `${e.length}`,
3024
+ build: (e, t) => {
3025
+ let n = e.src(t.source), r = Math.floor(t.length / 2) + 1, i = e.sma(n, t.length);
3026
+ 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)];
3027
+ },
3028
+ 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)"
3029
+ }), ca = a({
3030
+ id: "schaff-tc",
3031
+ name: "Schaff Trend Cycle",
3032
+ family: "tv",
3033
+ needs: "value",
3034
+ pane: "new",
3035
+ inputs: [
3036
+ o("fast", 23, 1, 5e3),
3037
+ o("slow", 50, 2, 5e3),
3038
+ o("cycle", 10, 2, 5e3),
3039
+ o("d1", 3, 1, 5e3),
3040
+ o("d2", 3, 1, 5e3),
3041
+ l()
3042
+ ],
3043
+ columns: ["stc"],
3044
+ plots: [
3045
+ p("stc", f.blue),
3046
+ n("upper", 75),
3047
+ n("lower", 25)
3048
+ ],
3049
+ label: (e) => `${e.fast} ${e.slow} ${e.cycle}`,
3050
+ build: (e, t) => {
3051
+ let n = e.src(t.source), r = e.sub(e.ema(n, t.fast), e.ema(n, t.slow)), i = e.ema(Wi(e, r, t.cycle), t.d1), a = e.ema(Wi(e, i, t.cycle), t.d2);
3052
+ return [e.map(a, (e) => e > 100 ? 100 : e < 0 ? 0 : e)];
3053
+ },
3054
+ 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"
3055
+ }), la = a({
3056
+ id: "stoch-tv",
3057
+ name: "Stochastic",
3058
+ family: "tv",
3059
+ needs: "ohlc",
3060
+ pane: "new",
3061
+ inputs: [
3062
+ o("kLength", 14, 1, 5e3, "%K length"),
3063
+ o("kSmooth", 1, 1, 5e3, "%K smoothing"),
3064
+ o("dLength", 3, 1, 5e3, "%D smoothing")
3065
+ ],
3066
+ columns: ["k", "d"],
3067
+ plots: [
3068
+ p("k", f.blue, { title: "%K" }),
3069
+ p("d", f.orange, { title: "%D" }),
3070
+ n("upper", 80),
3071
+ n("lower", 20),
3072
+ n("middle", 50, f.gray, "dotted")
3073
+ ],
3074
+ label: (e) => `${e.kLength} ${e.kSmooth} ${e.dLength}`,
3075
+ build: (e, t) => {
3076
+ 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);
3077
+ return [a, e.sma(a, t.dLength)];
3078
+ },
3079
+ 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)"
3080
+ }), ua = /* @__PURE__ */ h({
3081
+ adr: () => Ma,
3082
+ anchoredVwap: () => Ea,
3083
+ barsPerYear: () => Na,
3084
+ chaikinMf: () => Ca,
3085
+ elderForce: () => xa,
3086
+ eom: () => Sa,
3087
+ histVol: () => ja,
3088
+ klinger: () => wa,
3089
+ netVolume: () => ba,
3090
+ pivotPoints: () => Aa,
3091
+ pvt: () => ya,
3092
+ volume: () => _a,
3093
+ volumeOsc: () => va,
3094
+ vwap: () => Ta
3095
+ }), $ = NaN, da = 864e5;
3096
+ function fa(e) {
3097
+ 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;
3098
+ return [i + n * 400 + +(s <= 2), s - 1];
3099
+ }
3100
+ function pa(e, t, n) {
3101
+ let r = e.time, i = n * 6e4;
3102
+ return e.calc((e) => {
3103
+ let n = Math.floor((r.v[e] + i) / da);
3104
+ switch (t) {
3105
+ case "day": return n;
3106
+ case "week": return Math.floor((n + 3) / 7);
3107
+ case "month": {
3108
+ let [e, t] = fa(n);
3109
+ return e * 12 + t;
3110
+ }
3111
+ case "year": return fa(n)[0];
3112
+ }
3113
+ });
3114
+ }
3115
+ function ma(e, t, n, r = () => !0) {
3116
+ return e.node((e, i, a) => {
3117
+ let o = e.v;
3118
+ for (let e = i; e < a; e++) r(e) ? o[e] = (n(e) ? 0 : o[e - 1]) + t(e) : o[e] = $;
3119
+ });
3120
+ }
3121
+ function ha(e, t, n, r, i) {
3122
+ let a = e.calc((e) => n.v[e] > 0 ? t.v[e] / n.v[e] : $), o = e.calc((e) => {
3123
+ let t = a.v[e], i = r.v[e] / n.v[e] - t * t;
3124
+ return t === t ? i > 0 ? Math.sqrt(i) : 0 : $;
3125
+ });
3126
+ return [
3127
+ a,
3128
+ e.calc((e) => a.v[e] + i * o.v[e]),
3129
+ e.calc((e) => a.v[e] - i * o.v[e])
3130
+ ];
3131
+ }
3132
+ var ga = o("utcOffsetMinutes", 0, -720, 840, "UTC offset (minutes)"), _a = a({
3133
+ id: "volume",
3134
+ name: "Volume",
3135
+ family: "tv",
3136
+ needs: "ohlcv",
3137
+ pane: "new",
3138
+ inputs: [o("maLength", 20, 1, 5e3, "MA length")],
3139
+ columns: [
3140
+ "volume",
3141
+ "up",
3142
+ "down",
3143
+ "ma"
3144
+ ],
3145
+ plots: [
3146
+ d("up", f.green, void 0, { title: "Volume (up)" }),
3147
+ d("down", f.red, void 0, { title: "Volume (down)" }),
3148
+ p("ma", f.yellow, { title: "Volume MA" })
3149
+ ],
3150
+ label: (e) => `${e.maLength}`,
3151
+ build: (e, t) => {
3152
+ 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]);
3153
+ return [
3154
+ e.calc((e) => n.v[e]),
3155
+ a,
3156
+ o,
3157
+ e.sma(n, t.maLength)
3158
+ ];
3159
+ },
3160
+ 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."
3161
+ }), va = a({
3162
+ id: "volume-osc",
3163
+ name: "Volume Oscillator",
3164
+ family: "tv",
3165
+ needs: "ohlcv",
3166
+ pane: "new",
3167
+ inputs: [o("short", 5, 1, 5e3, "Short length"), o("long", 10, 1, 5e3, "Long length")],
3168
+ columns: ["osc"],
3169
+ plots: [p("osc", f.blue, { title: "Volume Oscillator" })],
3170
+ label: (e) => `${e.short}, ${e.long}`,
3171
+ build: (e, t) => {
3172
+ let n = e.ema(e.volume, t.short), r = e.ema(e.volume, t.long);
3173
+ return [e.map2(n, r, (e, t) => t === 0 ? $ : 100 * (e - t) / t)];
3174
+ },
3175
+ 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)."
3176
+ }), ya = a({
3177
+ id: "pvt",
3178
+ name: "Price Volume Trend",
3179
+ family: "tv",
3180
+ needs: "ohlcv",
3181
+ pane: "new",
3182
+ inputs: [],
3183
+ columns: ["pvt"],
3184
+ plots: [p("pvt", f.blue, { title: "PVT" })],
3185
+ build: (e) => {
3186
+ 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]);
3187
+ return [ma(e, (e) => r.v[e], (e) => e <= 1, (e) => e >= 1)];
3188
+ },
3189
+ reference: "Pine ta.pvt = ta.cum(ta.change(close) / close[1] * volume)"
3190
+ }), ba = a({
3191
+ id: "net-volume",
3192
+ name: "Net Volume",
3193
+ family: "tv",
3194
+ needs: "ohlcv",
3195
+ pane: "new",
3196
+ inputs: [],
3197
+ columns: ["netVolume"],
3198
+ plots: [d("netVolume", f.green, f.red, { title: "Net Volume" })],
3199
+ build: (e) => {
3200
+ let { close: t, volume: n } = e;
3201
+ return [e.calc((e) => {
3202
+ if (e === 0) return $;
3203
+ let r = t.v[e] - t.v[e - 1];
3204
+ return r > 0 ? n.v[e] : r < 0 ? -n.v[e] : 0;
3205
+ })];
3206
+ },
3207
+ reference: "TradingView Net Volume: volume signed by the sign of ta.change(close) (zero on an unchanged close)"
3208
+ }), xa = a({
3209
+ id: "elder-force",
3210
+ name: "Elder's Force Index",
3211
+ family: "tv",
3212
+ needs: "ohlcv",
3213
+ pane: "new",
3214
+ inputs: [o("length", 13, 1, 5e3)],
3215
+ columns: ["efi"],
3216
+ plots: [p("efi", f.red, { title: "EFI" })],
3217
+ label: (e) => `${e.length}`,
3218
+ build: (e, t) => {
3219
+ let { close: n, volume: r } = e, i = e.calc((e) => e === 0 ? $ : (n.v[e] - n.v[e - 1]) * r.v[e]);
3220
+ return [e.ema(i, t.length)];
3221
+ },
3222
+ reference: "TradingView Elder's Force Index: ta.ema(ta.change(close) * volume, 13)"
3223
+ }), Sa = a({
3224
+ id: "eom",
3225
+ name: "Ease of Movement",
3226
+ family: "tv",
3227
+ needs: "ohlcv",
3228
+ pane: "new",
3229
+ inputs: [o("length", 14, 1, 5e3), o("divisor", 1e4, 1, 1e9)],
3230
+ columns: ["eom"],
3231
+ plots: [p("eom", f.teal, { title: "EOM" })],
3232
+ label: (e) => `${e.length}`,
3233
+ build: (e, t) => {
3234
+ 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]));
3235
+ return [e.sma(e.div(o, i), t.length)];
3236
+ },
3237
+ reference: "TradingView Ease of Movement: ta.sma(10000 * ta.change(hl2) * (high - low) / volume, 14); zero volume is absent"
3238
+ }), Ca = a({
3239
+ id: "chaikin-mf",
3240
+ name: "Chaikin Money Flow",
3241
+ family: "tv",
3242
+ needs: "ohlcv",
3243
+ pane: "new",
3244
+ inputs: [o("length", 20, 1, 5e3)],
3245
+ columns: ["cmf"],
3246
+ plots: [p("cmf", f.green, { title: "CMF" })],
3247
+ label: (e) => `${e.length}`,
3248
+ build: (e, t) => {
3249
+ let { high: n, low: r, close: i, volume: a } = e, o = e.calc((e) => {
3250
+ let t = n.v[e], o = r.v[e], s = i.v[e];
3251
+ return t === o ? 0 : (2 * s - o - t) / (t - o) * a.v[e];
3252
+ });
3253
+ return [e.div(e.sum(o, t.length), e.sum(a, t.length))];
3254
+ },
3255
+ reference: "TradingView Chaikin Money Flow: sum(ad, 20) / sum(volume, 20), ad = (2*close - low - high) / (high - low) * volume (0 when high == low)"
3256
+ }), wa = a({
3257
+ id: "klinger",
3258
+ name: "Klinger Oscillator",
3259
+ family: "tv",
3260
+ needs: "ohlcv",
3261
+ pane: "new",
3262
+ inputs: [
3263
+ o("fast", 34, 1, 5e3),
3264
+ o("slow", 55, 1, 5e3),
3265
+ o("signal", 13, 1, 5e3)
3266
+ ],
3267
+ columns: ["kvo", "signal"],
3268
+ plots: [p("kvo", f.blue, { title: "KVO" }), p("signal", f.green, { title: "Signal" })],
3269
+ label: (e) => `${e.fast}, ${e.slow}, ${e.signal}`,
3270
+ build: (e, t) => {
3271
+ 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));
3272
+ return [a, e.ema(a, t.signal)];
3273
+ },
3274
+ 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)"
3275
+ }), Ta = a({
3276
+ id: "vwap",
3277
+ name: "Session VWAP",
3278
+ family: "tv",
3279
+ needs: "ohlcv",
3280
+ pane: "overlay",
3281
+ inputs: [
3282
+ i("anchor", "session", [
3283
+ "session",
3284
+ "week",
3285
+ "month",
3286
+ "year"
3287
+ ]),
3288
+ l("hlc3"),
3289
+ c("bandMult", 1, 0, 100, .1, "Band multiplier"),
3290
+ ga
3291
+ ],
3292
+ columns: [
3293
+ "vwap",
3294
+ "upper",
3295
+ "lower"
3296
+ ],
3297
+ plots: [p("vwap", f.blue, { title: "Session VWAP" }), s("bands", "upper", "lower", f.green, "rgba(8,153,129,0.1)", "Session VWAP bands")],
3298
+ label: (e) => `${e.anchor}`,
3299
+ build: (e, t) => {
3300
+ let n = pa(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 = ma(e, (e) => i.v[e], a);
3301
+ return ha(e, ma(e, (e) => r.v[e] * i.v[e], a), o, ma(e, (e) => r.v[e] * r.v[e] * i.v[e], a), t.bandMult);
3302
+ },
3303
+ 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. It restarts at each session, which is what a trader means by VWAP intraday; it is never a running average over the whole chart (use anchored-vwap for a start you choose)."
3304
+ }), Ea = a({
3305
+ id: "anchored-vwap",
3306
+ name: "Anchored VWAP",
3307
+ family: "tv",
3308
+ needs: "ohlcv",
3309
+ pane: "overlay",
3310
+ inputs: [
3311
+ c("anchorTime", 0, 0, 0x38d7ea4c68000, 1, "Anchor time (UTC ms)"),
3312
+ l("hlc3"),
3313
+ c("bandMult", 1, 0, 100, .1, "Band multiplier")
3314
+ ],
3315
+ columns: [
3316
+ "vwap",
3317
+ "upper",
3318
+ "lower"
3319
+ ],
3320
+ plots: [p("vwap", f.orange, { title: "Anchored VWAP" }), s("bands", "upper", "lower", f.orange, "rgba(255,109,0,0.1)", "Anchored VWAP bands")],
3321
+ build: (e, t) => {
3322
+ 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 = ma(e, (e) => i.v[e], o, a);
3323
+ return ha(e, ma(e, (e) => r.v[e] * i.v[e], o, a), s, ma(e, (e) => r.v[e] * r.v[e] * i.v[e], o, a), t.bandMult);
3324
+ },
3325
+ reference: "TradingView Anchored VWAP: VWAP (hlc3) accumulated from the first bar at or after the anchor time, with stdev bands; earlier bars are absent"
3326
+ }), Da = [
3327
+ "p",
3328
+ "r1",
3329
+ "r2",
3330
+ "r3",
3331
+ "r4",
3332
+ "s1",
3333
+ "s2",
3334
+ "s3",
3335
+ "s4"
3336
+ ];
3337
+ function Oa(e, t, n, r, i) {
3338
+ let a = {
3339
+ p: $,
3340
+ r1: $,
3341
+ r2: $,
3342
+ r3: $,
3343
+ r4: $,
3344
+ s1: $,
3345
+ s2: $,
3346
+ s3: $,
3347
+ s4: $
3348
+ }, o = n - r;
3349
+ if (e === "dm") {
3350
+ let e = i < t ? n + 2 * r + i : i > t ? 2 * n + r + i : n + r + 2 * i;
3351
+ return a.p = e / 4, a.r1 = e / 2 - r, a.s1 = e / 2 - n, a;
3352
+ }
3353
+ if (e === "woodie") {
3354
+ let e = (n + r + 2 * i) / 4;
3355
+ 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;
3356
+ }
3357
+ 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;
3358
+ let s = (n + r + i) / 3;
3359
+ 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;
3360
+ }
3361
+ var ka = {
3362
+ p: f.gray,
3363
+ r1: f.red,
3364
+ r2: f.red,
3365
+ r3: f.red,
3366
+ r4: f.red,
3367
+ s1: f.green,
3368
+ s2: f.green,
3369
+ s3: f.green,
3370
+ s4: f.green
3371
+ }, Aa = a({
3372
+ id: "pivot-points",
3373
+ name: "Pivot Points Standard",
3374
+ family: "tv",
3375
+ needs: "ohlc",
3376
+ pane: "overlay",
3377
+ inputs: [
3378
+ i("kind", "standard", [
3379
+ "standard",
3380
+ "fibonacci",
3381
+ "woodie",
3382
+ "classic",
3383
+ "dm",
3384
+ "camarilla"
3385
+ ]),
3386
+ i("period", "day", [
3387
+ "day",
3388
+ "week",
3389
+ "month",
3390
+ "year"
3391
+ ]),
3392
+ ga
3393
+ ],
3394
+ columns: [...Da],
3395
+ plots: Da.map((e) => p(e, ka[e], {
3396
+ title: e.toUpperCase(),
3397
+ width: 1
3398
+ })),
3399
+ label: (e) => `${e.kind} ${e.period}`,
3400
+ build: (e, t) => {
3401
+ let n = pa(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();
3402
+ return e.node((e, t, h) => {
3403
+ 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];
3404
+ }), Da.map((n) => e.calc((e) => f.v[e] === f.v[e] ? Oa(t.kind, d.v[e], f.v[e], p.v[e], m.v[e])[n] : $));
3405
+ },
3406
+ 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"
3407
+ }), ja = a({
3408
+ id: "hist-vol",
3409
+ name: "Historical Volatility",
3410
+ family: "tv",
3411
+ needs: "value",
3412
+ pane: "new",
3413
+ inputs: [
3414
+ o("length", 10, 2, 5e3),
3415
+ o("annual", 252, 1, 1e4, "Periods per year"),
3416
+ o("periodDays", 1, 1, 1e4, "Days per bar")
3417
+ ],
3418
+ columns: ["hv"],
3419
+ plots: [p("hv", f.blue, { title: "HV" })],
3420
+ label: (e) => `${e.length}`,
3421
+ build: (e, t) => {
3422
+ 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);
3423
+ return [e.map(e.stdev(r, t.length), (e) => e * i)];
3424
+ },
3425
+ 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)."
3426
+ }), Ma = a({
3427
+ id: "adr",
3428
+ name: "Average Day Range",
3429
+ family: "tv",
3430
+ needs: "ohlc",
3431
+ pane: "new",
3432
+ inputs: [o("length", 14, 1, 5e3)],
3433
+ columns: ["adr"],
3434
+ plots: [p("adr", f.orange, { title: "ADR" })],
3435
+ label: (e) => `${e.length}`,
3436
+ build: (e, t) => [e.sma(e.sub(e.high, e.low), t.length)],
3437
+ reference: "TradingView Average Day Range: ta.sma(high - low, 14) on the chart's bars"
3438
+ }), Na = a({
3439
+ id: "bars-per-year",
3440
+ name: "Bars per year",
3441
+ family: "tv",
3442
+ needs: "value",
3443
+ pane: "new",
3444
+ inputs: [l(), ga],
3445
+ columns: ["barsPerYear"],
3446
+ plots: [p("barsPerYear", f.gray, { title: "Bars per year" })],
3447
+ label: (e) => `${e.utcOffsetMinutes}`,
3448
+ build: (e, t) => [e.barsPerYear(t.utcOffsetMinutes)],
3449
+ reference: "Annualisation made causal: intraday = median bars per exchange-clock day over the last 60 finished days x 252; bars of a day or longer = 252 for a daily series without weekends, else 365 days / median spacing. Constant within a day; absent before the first day has finished. Use it for sqrt(bars per year) in Sharpe and annualised volatility instead of a typed number"
3450
+ });
3451
+ //#endregion
3452
+ export { oi as $, Ct as $n, oe as $r, Xr as $t, ea as A, Vt as An, et as Ar, Tr as At, Fi as B, Qt as Bn, Se as Br, Lr as Bt, Gi as C, Ft as Cn, Be as Cr, _r as Ct, Qi as D, zt as Dn, Ne as Dr, xr as Dt, ta as E, Rt as En, Ae as Er, br as Et, ji as F, on as Fn, tt as Fr, Ar as Ft, mi as G, rn as Gn, Ce as Gr, Hr as Gt, ki as H, Gt as Hn, Ie as Hr, Br as Ht, pi as I, nn as In, De as Ir, Nr as It, hi as J, Mt as Jn, le as Jr, Gr as Jt, yi as K, qt as Kn, Ue as Kr, Ur as Kt, Ti as L, sn as Ln, ye as Lr, Pr as Lt, qi as M, Ut as Mn, _e as Mr, Dr as Mt, Li as N, Nt as Nn, me as Nr, Or as Nt, $i as O, $t as On, je as Or, Sr as Ot, Ji as P, tn as Pn, $e as Pr, kr as Pt, Ai as Q, wt as Qn, te as Qr, Yr as Qt, Ci as R, cn as Rn, be as Rr, Fr as Rt, sa as S, Xt as Sn, Ve as Sr, gr as St, oa as T, Lt as Tn, Ze as Tr, yr as Tt, xi as U, Kt as Un, Le as Ur, zr as Ut, fi as V, Wt as Vn, he as Vr, Rr as Vt, Ei as W, Zt as Wn, Re as Wr, Vr as Wt, wi as X, St as Xn, de as Xr, qr as Xt, Di as Y, jt as Yn, ue as Yr, Kr as Yt, ui as Z, Tt as Zn, re as Zr, Jr as Zt, ia as _, Dn as _n, Ye as _r, dr as _t, xa as a, se as ai, ni as an, ht as ar, $n as at, Xi as b, An as bn, We as br, mr as bt, wa as c, ne as ci, ai as cn, _t as cr, nr as ct, ya as d, jn as dn, lt as dr, ar as dt, ce as ei, Zr as en, vt as er, di as et, ua as f, Fn as fn, ct as fr, or as ft, aa as g, En as gn, rt as gr, ur as gt, Ta as h, Tn as hn, st as hr, lr as ht, Ca as i, ee as ii, ti as in, mt as ir, Qn as it, la as j, Ht as jn, nt as jr, Er as jt, ca as k, Bt as kn, He as kr, Cr as kt, ba as l, In as ln, ut as lr, rr as lt, va as m, wn as mn, ot as mr, cr as mt, Ea as n, pe as ni, $r as nn, Et as nr, Xn as nt, Sa as o, ie as oi, ri as on, ft as or, er as ot, _a as p, un as pn, at as pr, sr as pt, vi as q, Jt as qn, ze as qr, Wr as qt, Na as r, E as ri, ei as rn, Ot as rr, Zn as rt, ja as s, ae as si, ii as sn, gt as sr, tr as st, Ma as t, fe as ti, Qr as tn, Dt as tr, Ii as tt, Aa as u, Pn as un, dt as ur, ir as ut, na as v, kn as vn, Xe as vr, fr as vt, Ki as w, It as wn, ge as wr, vr as wt, Yi as x, Pt as xn, Ge as xr, hr as xt, Zi as y, On as yn, Ee as yr, pr as yt, bi as z, ln as zn, xe as zr, Ir as zt };
3453
+
3454
+ //# sourceMappingURL=tv-volume-BYSbfrVk.js.map