@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.
- package/LICENSE +21 -0
- package/README.md +106 -2
- package/dist/all-_xzUPrL7.js +21 -0
- package/dist/all-_xzUPrL7.js.map +1 -0
- package/dist/all.js +10 -0
- package/dist/all.js.map +1 -0
- package/dist/define-XUgQMhSl.js +687 -0
- package/dist/define-XUgQMhSl.js.map +1 -0
- package/dist/index.js +744 -0
- package/dist/index.js.map +1 -0
- package/dist/registry-DdYYyZN_.js +53 -0
- package/dist/registry-DdYYyZN_.js.map +1 -0
- package/dist/runner-B53M0IsJ.js +237 -0
- package/dist/runner-B53M0IsJ.js.map +1 -0
- package/dist/studies.js +1 -0
- package/dist/tv-volume-BYSbfrVk.js +3454 -0
- package/dist/tv-volume-BYSbfrVk.js.map +1 -0
- package/dist/types/all.d.ts +3 -0
- package/dist/types/chart/marker-floor.d.ts +9 -0
- package/dist/types/chart/studies.d.ts +192 -0
- package/dist/types/define.d.ts +46 -0
- package/dist/types/engine/feed.d.ts +88 -0
- package/dist/types/engine/graph.d.ts +136 -0
- package/dist/types/engine/kernels.d.ts +9 -0
- package/dist/types/engine/study.d.ts +40 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/registry.d.ts +7 -0
- package/dist/types/runner.d.ts +91 -0
- package/dist/types/studies/all.d.ts +2 -0
- package/dist/types/studies/cycle.d.ts +7 -0
- package/dist/types/studies/index.d.ts +13 -0
- package/dist/types/studies/ma.d.ts +26 -0
- package/dist/types/studies/math.d.ts +28 -0
- package/dist/types/studies/momentum.d.ts +30 -0
- package/dist/types/studies/overlap.d.ts +14 -0
- package/dist/types/studies/patterns.d.ts +62 -0
- package/dist/types/studies/price.d.ts +6 -0
- package/dist/types/studies/sar.d.ts +2 -0
- package/dist/types/studies/statistic.d.ts +9 -0
- package/dist/types/studies/tv-osc.d.ts +18 -0
- package/dist/types/studies/tv-trend.d.ts +20 -0
- package/dist/types/studies/tv-volume.d.ts +15 -0
- package/dist/types/studies/volatility.d.ts +3 -0
- package/dist/types/studies/volume.d.ts +3 -0
- package/dist/types/types.d.ts +169 -0
- package/dist/types/wasm.d.ts +2 -0
- package/dist/types/worker.d.ts +1 -0
- package/dist/worker.js +8 -0
- package/dist/worker.js.map +1 -0
- 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
|