oakscriptjs 0.11.0 → 0.11.2
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/dist/cjs/array/index.d.ts +8 -2
- package/dist/cjs/array/index.d.ts.map +1 -1
- package/dist/cjs/array/index.js +2 -1
- package/dist/cjs/array/index.js.map +2 -2
- package/dist/cjs/box/index.js +6 -6
- package/dist/cjs/box/index.js.map +2 -2
- package/dist/cjs/callsite/index.d.ts.map +1 -1
- package/dist/cjs/callsite/index.js +6 -3
- package/dist/cjs/callsite/index.js.map +2 -2
- package/dist/cjs/drawing/registry.d.ts +15 -6
- package/dist/cjs/drawing/registry.d.ts.map +1 -1
- package/dist/cjs/drawing/registry.js +16 -2
- package/dist/cjs/drawing/registry.js.map +2 -2
- package/dist/cjs/index.d.ts +4 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/input.d.ts +9 -1
- package/dist/cjs/input.d.ts.map +1 -1
- package/dist/cjs/input.js +16 -0
- package/dist/cjs/input.js.map +2 -2
- package/dist/cjs/label/index.js +3 -3
- package/dist/cjs/label/index.js.map +2 -2
- package/dist/cjs/line/index.d.ts +10 -27
- package/dist/cjs/line/index.d.ts.map +1 -1
- package/dist/cjs/line/index.js +10 -27
- package/dist/cjs/line/index.js.map +2 -2
- package/dist/cjs/linefill/index.d.ts +3 -0
- package/dist/cjs/linefill/index.d.ts.map +1 -1
- package/dist/cjs/linefill/index.js +15 -1
- package/dist/cjs/linefill/index.js.map +3 -3
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +1 -1
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +2 -2
- package/dist/cjs/runtime/index.d.ts +1 -1
- package/dist/cjs/runtime/index.d.ts.map +1 -1
- package/dist/cjs/runtime/index.js +1 -0
- package/dist/cjs/runtime/index.js.map +2 -2
- package/dist/cjs/runtime/inputs.d.ts +9 -0
- package/dist/cjs/runtime/inputs.d.ts.map +1 -1
- package/dist/cjs/runtime/inputs.js +8 -0
- package/dist/cjs/runtime/inputs.js.map +2 -2
- package/dist/cjs/runtime/types.d.ts +1 -1
- package/dist/cjs/runtime/types.d.ts.map +1 -1
- package/dist/cjs/runtime/types.js.map +1 -1
- package/dist/cjs/script/index.d.ts +66 -13
- package/dist/cjs/script/index.d.ts.map +1 -1
- package/dist/cjs/script/index.js +139 -35
- package/dist/cjs/script/index.js.map +3 -3
- package/dist/cjs/security/other.d.ts +92 -0
- package/dist/cjs/security/other.d.ts.map +1 -0
- package/dist/cjs/security/other.js +164 -0
- package/dist/cjs/security/other.js.map +7 -0
- package/dist/cjs/session/bars.d.ts +10 -1
- package/dist/cjs/session/bars.d.ts.map +1 -1
- package/dist/cjs/session/bars.js +16 -2
- package/dist/cjs/session/bars.js.map +2 -2
- package/dist/cjs/session/calendar.d.ts +4 -1
- package/dist/cjs/session/calendar.d.ts.map +1 -1
- package/dist/cjs/session/calendar.js +12 -7
- package/dist/cjs/session/calendar.js.map +2 -2
- package/dist/cjs/session/context.d.ts +22 -5
- package/dist/cjs/session/context.d.ts.map +1 -1
- package/dist/cjs/session/context.js +67 -6
- package/dist/cjs/session/context.js.map +2 -2
- package/dist/cjs/str/floatingdecimal.d.ts +31 -0
- package/dist/cjs/str/floatingdecimal.d.ts.map +1 -0
- package/dist/cjs/str/floatingdecimal.js +298 -0
- package/dist/cjs/str/floatingdecimal.js.map +7 -0
- package/dist/cjs/str/index.d.ts +4 -3
- package/dist/cjs/str/index.d.ts.map +1 -1
- package/dist/cjs/str/index.js +1 -1
- package/dist/cjs/str/index.js.map +2 -2
- package/dist/cjs/str/numberformat.d.ts +6 -4
- package/dist/cjs/str/numberformat.d.ts.map +1 -1
- package/dist/cjs/str/numberformat.js +3 -2
- package/dist/cjs/str/numberformat.js.map +2 -2
- package/dist/cjs/ta/index.d.ts +64 -45
- package/dist/cjs/ta/index.d.ts.map +1 -1
- package/dist/cjs/ta/index.js +140 -126
- package/dist/cjs/ta/index.js.map +3 -3
- package/dist/cjs/ta/limits.d.ts +11 -0
- package/dist/cjs/ta/limits.d.ts.map +1 -1
- package/dist/cjs/ta/limits.js +15 -1
- package/dist/cjs/ta/limits.js.map +2 -2
- package/dist/cjs/ta/running-sum.js +1 -1
- package/dist/cjs/ta/running-sum.js.map +2 -2
- package/dist/cjs/ta-series.d.ts +1 -1
- package/dist/cjs/ta-series.d.ts.map +1 -1
- package/dist/cjs/ta-series.js +1 -1
- package/dist/cjs/ta-series.js.map +2 -2
- package/dist/cjs/table/index.d.ts +10 -3
- package/dist/cjs/table/index.d.ts.map +1 -1
- package/dist/cjs/table/index.js +11 -1
- package/dist/cjs/table/index.js.map +3 -3
- package/dist/cjs/time/session.d.ts +9 -0
- package/dist/cjs/time/session.d.ts.map +1 -1
- package/dist/cjs/time/session.js +42 -14
- package/dist/cjs/time/session.js.map +3 -3
- package/dist/cjs/time/timezone.d.ts +6 -1
- package/dist/cjs/time/timezone.d.ts.map +1 -1
- package/dist/cjs/time/timezone.js +2 -2
- package/dist/cjs/time/timezone.js.map +2 -2
- package/dist/cjs/types/metadata.d.ts +1 -1
- package/dist/cjs/types/metadata.d.ts.map +1 -1
- package/dist/cjs/types/metadata.js.map +1 -1
- package/dist/esm/array/index.d.ts +8 -2
- package/dist/esm/array/index.d.ts.map +1 -1
- package/dist/esm/array/index.js +12 -3
- package/dist/esm/array/index.js.map +1 -1
- package/dist/esm/box/index.js +6 -6
- package/dist/esm/box/index.js.map +1 -1
- package/dist/esm/callsite/index.d.ts.map +1 -1
- package/dist/esm/callsite/index.js +6 -3
- package/dist/esm/callsite/index.js.map +1 -1
- package/dist/esm/drawing/registry.d.ts +15 -6
- package/dist/esm/drawing/registry.d.ts.map +1 -1
- package/dist/esm/drawing/registry.js +30 -7
- package/dist/esm/drawing/registry.js.map +1 -1
- package/dist/esm/index.d.ts +4 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +8 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input.d.ts +9 -1
- package/dist/esm/input.d.ts.map +1 -1
- package/dist/esm/input.js +16 -0
- package/dist/esm/input.js.map +1 -1
- package/dist/esm/label/index.js +3 -3
- package/dist/esm/label/index.js.map +1 -1
- package/dist/esm/line/index.d.ts +10 -27
- package/dist/esm/line/index.d.ts.map +1 -1
- package/dist/esm/line/index.js +20 -64
- package/dist/esm/line/index.js.map +1 -1
- package/dist/esm/linefill/index.d.ts +3 -0
- package/dist/esm/linefill/index.d.ts.map +1 -1
- package/dist/esm/linefill/index.js +20 -1
- package/dist/esm/linefill/index.js.map +1 -1
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js +1 -1
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -1
- package/dist/esm/runtime/index.d.ts +1 -1
- package/dist/esm/runtime/index.d.ts.map +1 -1
- package/dist/esm/runtime/index.js +1 -1
- package/dist/esm/runtime/index.js.map +1 -1
- package/dist/esm/runtime/inputs.d.ts +9 -0
- package/dist/esm/runtime/inputs.d.ts.map +1 -1
- package/dist/esm/runtime/inputs.js +15 -0
- package/dist/esm/runtime/inputs.js.map +1 -1
- package/dist/esm/runtime/types.d.ts +1 -1
- package/dist/esm/runtime/types.d.ts.map +1 -1
- package/dist/esm/script/index.d.ts +66 -13
- package/dist/esm/script/index.d.ts.map +1 -1
- package/dist/esm/script/index.js +187 -54
- package/dist/esm/script/index.js.map +1 -1
- package/dist/esm/security/other.d.ts +92 -0
- package/dist/esm/security/other.d.ts.map +1 -0
- package/dist/esm/security/other.js +211 -0
- package/dist/esm/security/other.js.map +1 -0
- package/dist/esm/session/bars.d.ts +10 -1
- package/dist/esm/session/bars.d.ts.map +1 -1
- package/dist/esm/session/bars.js +26 -1
- package/dist/esm/session/bars.js.map +1 -1
- package/dist/esm/session/calendar.d.ts +4 -1
- package/dist/esm/session/calendar.d.ts.map +1 -1
- package/dist/esm/session/calendar.js +23 -7
- package/dist/esm/session/calendar.js.map +1 -1
- package/dist/esm/session/context.d.ts +22 -5
- package/dist/esm/session/context.d.ts.map +1 -1
- package/dist/esm/session/context.js +86 -10
- package/dist/esm/session/context.js.map +1 -1
- package/dist/esm/str/floatingdecimal.d.ts +31 -0
- package/dist/esm/str/floatingdecimal.d.ts.map +1 -0
- package/dist/esm/str/floatingdecimal.js +272 -0
- package/dist/esm/str/floatingdecimal.js.map +1 -0
- package/dist/esm/str/index.d.ts +4 -3
- package/dist/esm/str/index.d.ts.map +1 -1
- package/dist/esm/str/index.js +6 -5
- package/dist/esm/str/index.js.map +1 -1
- package/dist/esm/str/numberformat.d.ts +6 -4
- package/dist/esm/str/numberformat.d.ts.map +1 -1
- package/dist/esm/str/numberformat.js +9 -5
- package/dist/esm/str/numberformat.js.map +1 -1
- package/dist/esm/ta/index.d.ts +64 -45
- package/dist/esm/ta/index.d.ts.map +1 -1
- package/dist/esm/ta/index.js +198 -228
- package/dist/esm/ta/index.js.map +1 -1
- package/dist/esm/ta/limits.d.ts +11 -0
- package/dist/esm/ta/limits.d.ts.map +1 -1
- package/dist/esm/ta/limits.js +27 -2
- package/dist/esm/ta/limits.js.map +1 -1
- package/dist/esm/ta/running-sum.js +1 -1
- package/dist/esm/ta/running-sum.js.map +1 -1
- package/dist/esm/ta-series.d.ts +1 -1
- package/dist/esm/ta-series.d.ts.map +1 -1
- package/dist/esm/ta-series.js +2 -1
- package/dist/esm/ta-series.js.map +1 -1
- package/dist/esm/table/index.d.ts +10 -3
- package/dist/esm/table/index.d.ts.map +1 -1
- package/dist/esm/table/index.js +23 -3
- package/dist/esm/table/index.js.map +1 -1
- package/dist/esm/time/session.d.ts +9 -0
- package/dist/esm/time/session.d.ts.map +1 -1
- package/dist/esm/time/session.js +53 -15
- package/dist/esm/time/session.js.map +1 -1
- package/dist/esm/time/timezone.d.ts +6 -1
- package/dist/esm/time/timezone.d.ts.map +1 -1
- package/dist/esm/time/timezone.js +8 -2
- package/dist/esm/time/timezone.js.map +1 -1
- package/dist/esm/types/metadata.d.ts +1 -1
- package/dist/esm/types/metadata.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/array/index.ts +11 -3
- package/src/box/index.ts +6 -6
- package/src/callsite/index.ts +6 -3
- package/src/drawing/registry.ts +30 -7
- package/src/index.ts +16 -3
- package/src/input.ts +18 -1
- package/src/label/index.ts +3 -3
- package/src/line/index.ts +20 -68
- package/src/linefill/index.ts +20 -1
- package/src/runtime/adapters/SimpleInputAdapter.ts +1 -1
- package/src/runtime/index.ts +1 -0
- package/src/runtime/inputs.ts +16 -0
- package/src/runtime/types.ts +1 -1
- package/src/script/index.ts +262 -58
- package/src/security/other.ts +269 -0
- package/src/session/bars.ts +24 -1
- package/src/session/calendar.ts +26 -7
- package/src/session/context.ts +104 -10
- package/src/str/floatingdecimal.ts +268 -0
- package/src/str/index.ts +6 -5
- package/src/str/numberformat.ts +11 -6
- package/src/ta/index.ts +200 -225
- package/src/ta/limits.ts +28 -1
- package/src/ta/running-sum.ts +1 -1
- package/src/ta-series.ts +3 -2
- package/src/table/index.ts +22 -3
- package/src/time/session.ts +58 -16
- package/src/time/timezone.ts +9 -2
- package/src/types/metadata.ts +1 -1
package/dist/cjs/ta/index.js
CHANGED
|
@@ -102,6 +102,7 @@ function sma(source, length) {
|
|
|
102
102
|
return (0, import_running_sum.runningSum)(source, len).map((sum) => sum / len);
|
|
103
103
|
}
|
|
104
104
|
function ema(source, length) {
|
|
105
|
+
(0, import_limits.checkPositiveLength)("ema", length, 0);
|
|
105
106
|
const result = [];
|
|
106
107
|
const len = Math.floor(length);
|
|
107
108
|
const multiplier = 2 / (len + 1);
|
|
@@ -134,6 +135,16 @@ function ema(source, length) {
|
|
|
134
135
|
return result;
|
|
135
136
|
}
|
|
136
137
|
function rsi(source, length) {
|
|
138
|
+
if (typeof length !== "number") {
|
|
139
|
+
return Array.from(source, (xv, i) => {
|
|
140
|
+
const x = xv ?? NaN;
|
|
141
|
+
const y = length[i] ?? NaN;
|
|
142
|
+
if ((0, import_compare.eq)(y, 0)) return 100;
|
|
143
|
+
if ((0, import_compare.eq)(x, 0)) return 0;
|
|
144
|
+
return 100 - 100 / (1 + x / y);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
(0, import_limits.checkPositiveLength)("rsi", length, 0, "y");
|
|
137
148
|
const result = [];
|
|
138
149
|
const changes = [];
|
|
139
150
|
for (let i = 1; i < source.length; i++) {
|
|
@@ -189,7 +200,7 @@ function lastValues(source, i, length) {
|
|
|
189
200
|
const values = [];
|
|
190
201
|
for (let j = i; j >= 0 && values.length < length; j--) {
|
|
191
202
|
const x = source[j];
|
|
192
|
-
if (
|
|
203
|
+
if (Number.isFinite(x)) values.push(x);
|
|
193
204
|
}
|
|
194
205
|
return values.length === length ? values : null;
|
|
195
206
|
}
|
|
@@ -237,7 +248,7 @@ function keptValues(source) {
|
|
|
237
248
|
const last = new Int32Array(source.length);
|
|
238
249
|
for (let i = 0; i < source.length; i++) {
|
|
239
250
|
const x = source[i];
|
|
240
|
-
if (
|
|
251
|
+
if (Number.isFinite(x)) {
|
|
241
252
|
values.push(x);
|
|
242
253
|
bars.push(i);
|
|
243
254
|
}
|
|
@@ -306,6 +317,7 @@ function crossunder(series1, series2) {
|
|
|
306
317
|
return crossTest(series1, series2, (a, b, pa, pb) => a < b && pa >= pb);
|
|
307
318
|
}
|
|
308
319
|
function change(source, length = 1) {
|
|
320
|
+
(0, import_limits.checkPositiveLength)("change", length, 0);
|
|
309
321
|
const result = [];
|
|
310
322
|
for (let i = 0; i < source.length; i++) {
|
|
311
323
|
if (i < length) {
|
|
@@ -347,6 +359,7 @@ function tr(handle_na = false, high, low, close) {
|
|
|
347
359
|
return result;
|
|
348
360
|
}
|
|
349
361
|
function atr(length, high, low, close) {
|
|
362
|
+
(0, import_limits.checkPositiveLength)("atr->rma", length, 0);
|
|
350
363
|
if (!high || !low || !close) {
|
|
351
364
|
throw new Error(
|
|
352
365
|
"ta.atr() requires high, low, and close series. Either pass them explicitly or use createContext({ chart: { high, low, close } }) for implicit data."
|
|
@@ -402,6 +415,7 @@ function supertrend(factor, atrPeriod, high, low, close, wicks = false) {
|
|
|
402
415
|
return [supertrendValues, directions];
|
|
403
416
|
}
|
|
404
417
|
function rma(source, length) {
|
|
418
|
+
(0, import_limits.checkPositiveLength)("rma", length, 0);
|
|
405
419
|
const result = [];
|
|
406
420
|
const len = Math.floor(length);
|
|
407
421
|
let firstValidIndex = -1;
|
|
@@ -439,6 +453,7 @@ function wmaAdd(a, b) {
|
|
|
439
453
|
function wma(source, length) {
|
|
440
454
|
const result = [];
|
|
441
455
|
const fixed = typeof length === "number" ? Math.floor(length) : NaN;
|
|
456
|
+
if (typeof length === "number") (0, import_limits.checkPositiveLength)("wma", fixed, 0);
|
|
442
457
|
const filled = [];
|
|
443
458
|
let last = NaN;
|
|
444
459
|
let count = 0;
|
|
@@ -451,6 +466,7 @@ function wma(source, length) {
|
|
|
451
466
|
}
|
|
452
467
|
filled.push(last);
|
|
453
468
|
const len = typeof length === "number" ? fixed : Math.floor(length[i]);
|
|
469
|
+
if (typeof length !== "number") (0, import_limits.checkPositiveLength)("wma", len, i);
|
|
454
470
|
if (isNa || !(len >= 1) || count < len) {
|
|
455
471
|
result.push(NaN);
|
|
456
472
|
continue;
|
|
@@ -502,18 +518,21 @@ function monotonic(source, length, step) {
|
|
|
502
518
|
for (let i = 0; i < source.length; i++) {
|
|
503
519
|
const v = source[i];
|
|
504
520
|
const prev = i > 0 ? source[i - 1] : NaN;
|
|
505
|
-
if (
|
|
521
|
+
if (Number.isFinite(v) && Number.isFinite(prev)) count = step(v, prev) ? count + 1 : 0;
|
|
506
522
|
result.push(count >= length);
|
|
507
523
|
}
|
|
508
524
|
return result;
|
|
509
525
|
}
|
|
510
526
|
function rising(source, length) {
|
|
527
|
+
(0, import_limits.checkPositiveLength)("rising", length, 0);
|
|
511
528
|
return monotonic(source, length, import_compare.gt);
|
|
512
529
|
}
|
|
513
530
|
function falling(source, length) {
|
|
531
|
+
(0, import_limits.checkPositiveLength)("falling", length, 0);
|
|
514
532
|
return monotonic(source, length, import_compare.lt);
|
|
515
533
|
}
|
|
516
534
|
function roc(source, length) {
|
|
535
|
+
(0, import_limits.checkPositiveLength)("roc", length, 0);
|
|
517
536
|
const result = [];
|
|
518
537
|
for (let i = 0; i < source.length; i++) {
|
|
519
538
|
if (i < length) {
|
|
@@ -531,6 +550,7 @@ function roc(source, length) {
|
|
|
531
550
|
return result;
|
|
532
551
|
}
|
|
533
552
|
function mom(source, length) {
|
|
553
|
+
(0, import_limits.checkPositiveLength)("mom", length, 0);
|
|
534
554
|
const result = [];
|
|
535
555
|
for (let i = 0; i < source.length; i++) {
|
|
536
556
|
if (i < length) {
|
|
@@ -546,6 +566,7 @@ function mom(source, length) {
|
|
|
546
566
|
return result;
|
|
547
567
|
}
|
|
548
568
|
function dev(source, length) {
|
|
569
|
+
(0, import_limits.checkPositiveLength)("dev", length, 0);
|
|
549
570
|
const len = Math.floor(length);
|
|
550
571
|
return sma(source, len).map((mean, i) => {
|
|
551
572
|
if (i < len - 1 || Number.isNaN(mean)) return NaN;
|
|
@@ -568,6 +589,7 @@ function varianceOf(source, length, biased, name) {
|
|
|
568
589
|
return (0, import_running_sum.runningVariance)(source, len, biased);
|
|
569
590
|
}
|
|
570
591
|
function median(source, length) {
|
|
592
|
+
(0, import_limits.checkPositiveLength)("median", length, 0);
|
|
571
593
|
const len = Math.floor(length);
|
|
572
594
|
const n = source.length;
|
|
573
595
|
const out = new Array(n).fill(NaN);
|
|
@@ -588,7 +610,7 @@ function median(source, length) {
|
|
|
588
610
|
const mid = Math.floor(len / 2);
|
|
589
611
|
for (let i = 0; i < n; i++) {
|
|
590
612
|
const x = source[i];
|
|
591
|
-
if (
|
|
613
|
+
if (Number.isFinite(x)) {
|
|
592
614
|
kept[count++] = x;
|
|
593
615
|
sorted.splice(bound(x, false), 0, x);
|
|
594
616
|
if (count > len) sorted.splice(bound(kept[count - 1 - len], true) - 1, 1);
|
|
@@ -604,6 +626,7 @@ function swma(source) {
|
|
|
604
626
|
);
|
|
605
627
|
}
|
|
606
628
|
function vwma(source, length, volume) {
|
|
629
|
+
(0, import_limits.checkPositiveLength)("vwma->sma", length, 0);
|
|
607
630
|
if (!volume) {
|
|
608
631
|
throw new Error(
|
|
609
632
|
"ta.vwma() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
|
|
@@ -626,6 +649,7 @@ function vwma(source, length, volume) {
|
|
|
626
649
|
return result;
|
|
627
650
|
}
|
|
628
651
|
function linreg(source, length, offset = 0) {
|
|
652
|
+
(0, import_limits.checkPositiveLength)("linreg", length, 0);
|
|
629
653
|
const result = [];
|
|
630
654
|
const len = Math.floor(length);
|
|
631
655
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -663,6 +687,7 @@ function linreg(source, length, offset = 0) {
|
|
|
663
687
|
return result;
|
|
664
688
|
}
|
|
665
689
|
function correlation(source1, source2, length) {
|
|
690
|
+
(0, import_limits.checkPositiveLength)("correlation", length, 0);
|
|
666
691
|
const product = Array.from({ length: source1.length }, (_, i) => {
|
|
667
692
|
const v1 = source1[i];
|
|
668
693
|
const v2 = source2[i];
|
|
@@ -682,10 +707,11 @@ function correlation(source1, source2, length) {
|
|
|
682
707
|
});
|
|
683
708
|
}
|
|
684
709
|
function percentrank(source, length) {
|
|
710
|
+
(0, import_limits.checkPositiveLength)("percentrank", length, 0);
|
|
685
711
|
const result = [];
|
|
686
712
|
for (let i = 0; i < source.length; i++) {
|
|
687
713
|
const currentValue = source[i];
|
|
688
|
-
if (i < length
|
|
714
|
+
if (i < length) {
|
|
689
715
|
result.push(NaN);
|
|
690
716
|
continue;
|
|
691
717
|
}
|
|
@@ -698,6 +724,7 @@ function percentrank(source, length) {
|
|
|
698
724
|
return result;
|
|
699
725
|
}
|
|
700
726
|
function cci(source, length) {
|
|
727
|
+
(0, import_limits.checkPositiveLength)("cci", length, 0);
|
|
701
728
|
const smaValues = sma(source, length);
|
|
702
729
|
const devValues = dev(source, length);
|
|
703
730
|
let last = 0;
|
|
@@ -709,20 +736,21 @@ function cci(source, length) {
|
|
|
709
736
|
});
|
|
710
737
|
}
|
|
711
738
|
function stoch(source, high, low, length) {
|
|
739
|
+
(0, import_limits.checkPositiveLength)("stoch->highest", length, 0);
|
|
712
740
|
const result = [];
|
|
713
741
|
const lowestValues = lowest(low, length);
|
|
714
742
|
const highestValues = highest(high, length);
|
|
715
743
|
let previous = NaN;
|
|
716
744
|
for (let i = 0; i < source.length; i++) {
|
|
717
|
-
const value = source[i];
|
|
718
745
|
const lo = lowestValues[i];
|
|
719
|
-
const
|
|
720
|
-
if (!Number.isNaN(
|
|
746
|
+
const k = 100 * (source[i] - lo) / (highestValues[i] - lo);
|
|
747
|
+
if (!Number.isNaN(k)) previous = k;
|
|
721
748
|
result.push(previous);
|
|
722
749
|
}
|
|
723
750
|
return result;
|
|
724
751
|
}
|
|
725
752
|
function mfi(source, length, volume) {
|
|
753
|
+
(0, import_limits.checkPositiveLength)("mfi", length, 0);
|
|
726
754
|
if (!volume) {
|
|
727
755
|
throw new Error(
|
|
728
756
|
"ta.mfi() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
|
|
@@ -749,6 +777,7 @@ function mfi(source, length, volume) {
|
|
|
749
777
|
});
|
|
750
778
|
}
|
|
751
779
|
function hma(source, length) {
|
|
780
|
+
(0, import_limits.checkPositiveLength)("hma", length, 0);
|
|
752
781
|
const halfLength = Math.floor(length / 2);
|
|
753
782
|
const sqrtLength = Math.floor(Math.sqrt(length));
|
|
754
783
|
const wmaHalf = wma(source, halfLength);
|
|
@@ -932,6 +961,7 @@ function dmi(diLength, adxSmoothing, high, low, close) {
|
|
|
932
961
|
return [plusDI, minusDI, adx];
|
|
933
962
|
}
|
|
934
963
|
function tsi(source, shortLength, longLength) {
|
|
964
|
+
(0, import_limits.checkPositiveLength)("tsi->ema", shortLength, 0);
|
|
935
965
|
const momentum = [];
|
|
936
966
|
for (let i = 0; i < source.length; i++) {
|
|
937
967
|
if (i === 0) {
|
|
@@ -949,6 +979,7 @@ function tsi(source, shortLength, longLength) {
|
|
|
949
979
|
});
|
|
950
980
|
}
|
|
951
981
|
function cmo(source, length) {
|
|
982
|
+
(0, import_limits.checkPositiveLength)("cmo", length, 0);
|
|
952
983
|
const up = [];
|
|
953
984
|
const down = [];
|
|
954
985
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -961,6 +992,7 @@ function cmo(source, length) {
|
|
|
961
992
|
return sm1.map((s1, i) => 100 * (s1 - sm2[i]) / (s1 + sm2[i]));
|
|
962
993
|
}
|
|
963
994
|
function kc(source, length, mult, useTrueRange = true, high, low, close) {
|
|
995
|
+
(0, import_limits.checkPositiveLength)("kc", length, 0);
|
|
964
996
|
const middle = ema(source, length);
|
|
965
997
|
let range2;
|
|
966
998
|
if (useTrueRange) {
|
|
@@ -987,6 +1019,7 @@ function kc(source, length, mult, useTrueRange = true, high, low, close) {
|
|
|
987
1019
|
return [middle, upper, lower];
|
|
988
1020
|
}
|
|
989
1021
|
function bbw(source, length, mult) {
|
|
1022
|
+
(0, import_limits.checkPositiveLength)("bbw", length, 0);
|
|
990
1023
|
const [basis, upper, lower] = bb(source, length, mult);
|
|
991
1024
|
const result = [];
|
|
992
1025
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -1000,6 +1033,7 @@ function bbw(source, length, mult) {
|
|
|
1000
1033
|
return result;
|
|
1001
1034
|
}
|
|
1002
1035
|
function wpr(high, low, close, length = 14) {
|
|
1036
|
+
(0, import_limits.checkPositiveLength)("wpr", length, 0);
|
|
1003
1037
|
const highs = highest(high, length);
|
|
1004
1038
|
const lows = lowest(low, length);
|
|
1005
1039
|
return Array.from({ length: close.length }, (_, i) => {
|
|
@@ -1041,6 +1075,7 @@ function vwap(source, volume, anchor, stdev_mult) {
|
|
|
1041
1075
|
return stdev_mult === void 0 ? mid : [mid, upper, lower];
|
|
1042
1076
|
}
|
|
1043
1077
|
function alma(source, length = 9, offset = 0.85, sigma = 6, floor = false) {
|
|
1078
|
+
(0, import_limits.checkPositiveLength)("alma", length, 0);
|
|
1044
1079
|
const result = [];
|
|
1045
1080
|
const m = floor ? Math.floor(offset * (length - 1)) : offset * (length - 1);
|
|
1046
1081
|
const s = length / sigma;
|
|
@@ -1080,6 +1115,7 @@ function kcw(source, length = 20, mult = 2, useTrueRange = true, high, low, clos
|
|
|
1080
1115
|
return result;
|
|
1081
1116
|
}
|
|
1082
1117
|
function range(source, length) {
|
|
1118
|
+
(0, import_limits.checkPositiveLength)("range", length, 0);
|
|
1083
1119
|
return source.map((_, i) => {
|
|
1084
1120
|
const values = lastValues(source, i, length);
|
|
1085
1121
|
return values ? Math.max(...values) - Math.min(...values) : NaN;
|
|
@@ -1094,18 +1130,19 @@ function lowestbars(source, length) {
|
|
|
1094
1130
|
function max(source) {
|
|
1095
1131
|
let best = NaN;
|
|
1096
1132
|
return source.map((x) => {
|
|
1097
|
-
if (
|
|
1133
|
+
if (Number.isFinite(x) && !(x <= best)) best = x;
|
|
1098
1134
|
return best;
|
|
1099
1135
|
});
|
|
1100
1136
|
}
|
|
1101
1137
|
function min(source) {
|
|
1102
1138
|
let best = NaN;
|
|
1103
1139
|
return source.map((x) => {
|
|
1104
|
-
if (
|
|
1140
|
+
if (Number.isFinite(x) && !(x >= best)) best = x;
|
|
1105
1141
|
return best;
|
|
1106
1142
|
});
|
|
1107
1143
|
}
|
|
1108
1144
|
function cog(source, length = 10) {
|
|
1145
|
+
(0, import_limits.checkPositiveLength)("cog", length, 0);
|
|
1109
1146
|
const len = Math.floor(length);
|
|
1110
1147
|
return (0, import_running_sum.runningSum)(source, len).map((sum, i) => {
|
|
1111
1148
|
if (i < len - 1 || Number.isNaN(sum) || sum === 0) return NaN;
|
|
@@ -1115,12 +1152,13 @@ function cog(source, length = 10) {
|
|
|
1115
1152
|
});
|
|
1116
1153
|
}
|
|
1117
1154
|
function mode(source, length) {
|
|
1155
|
+
(0, import_limits.checkPositiveLength)("mode", length, 0);
|
|
1118
1156
|
const result = [];
|
|
1119
1157
|
const len = Math.floor(length);
|
|
1120
1158
|
const seen = [];
|
|
1121
1159
|
for (let i = 0; i < source.length; i++) {
|
|
1122
1160
|
const v = source[i];
|
|
1123
|
-
if (
|
|
1161
|
+
if (Number.isFinite(v)) seen.push(v);
|
|
1124
1162
|
if (seen.length < len) {
|
|
1125
1163
|
result.push(NaN);
|
|
1126
1164
|
continue;
|
|
@@ -1147,6 +1185,7 @@ function mode(source, length) {
|
|
|
1147
1185
|
return result;
|
|
1148
1186
|
}
|
|
1149
1187
|
function percentile_linear_interpolation(source, length, percentage) {
|
|
1188
|
+
(0, import_limits.checkPositiveLength)("percentile_linear_interpolation", length, 0);
|
|
1150
1189
|
return sortedWindow(source, length, (s) => {
|
|
1151
1190
|
const pos = percentage / 100 * length - 0.5;
|
|
1152
1191
|
if (pos <= 0) return s[0];
|
|
@@ -1175,10 +1214,12 @@ function sortedWindow(source, length, fn) {
|
|
|
1175
1214
|
return result;
|
|
1176
1215
|
}
|
|
1177
1216
|
function percentile_nearest_rank(source, length, percentage) {
|
|
1217
|
+
(0, import_limits.checkPositiveLength)("percentile_nearest_rank", length, 0);
|
|
1178
1218
|
const rank = Math.min(length, Math.max(1, Math.ceil(percentage / 100 * length)));
|
|
1179
1219
|
return sortedWindow(source, length, (s) => s[rank - 1]);
|
|
1180
1220
|
}
|
|
1181
1221
|
function rci(source, length) {
|
|
1222
|
+
(0, import_limits.checkPositiveLength)("rci", length, 0);
|
|
1182
1223
|
const len = Math.floor(length);
|
|
1183
1224
|
const result = [];
|
|
1184
1225
|
const ring = new Array(len + 1).fill(0);
|
|
@@ -1232,132 +1273,105 @@ function rci(source, length) {
|
|
|
1232
1273
|
}
|
|
1233
1274
|
function pivot_point_levels(type, anchor, developing = false, high, low, close, open) {
|
|
1234
1275
|
const typeStr = typeof type === "string" ? type : String(type[0]);
|
|
1235
|
-
const isDeveloping = typeof developing === "boolean" ? developing : developing[0];
|
|
1276
|
+
const isDeveloping = typeof developing === "boolean" ? developing : Boolean(developing[0]);
|
|
1236
1277
|
if (typeStr === "Woodie" && isDeveloping) {
|
|
1237
|
-
throw new Error(
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
if (isDeveloping && lastAnchorIndex >= 0) {
|
|
1257
|
-
h = high ? Math.max(...high.slice(lastAnchorIndex, i + 1).filter((v) => !isNaN(v))) : NaN;
|
|
1258
|
-
l = low ? Math.min(...low.slice(lastAnchorIndex, i + 1).filter((v) => !isNaN(v))) : NaN;
|
|
1259
|
-
c = close ? close[i] : NaN;
|
|
1260
|
-
o = open && lastAnchorIndex >= 0 ? open[lastAnchorIndex] : NaN;
|
|
1261
|
-
} else {
|
|
1262
|
-
h = lastH;
|
|
1263
|
-
l = lastL;
|
|
1264
|
-
c = lastC;
|
|
1265
|
-
o = lastO;
|
|
1266
|
-
}
|
|
1267
|
-
const levels = calculatePivotLevels(typeStr, h, l, c, o);
|
|
1268
|
-
for (let j = 0; j < 11; j++) {
|
|
1269
|
-
results[j].push(levels[j]);
|
|
1278
|
+
throw new Error(
|
|
1279
|
+
'Error on bar 0: The `developing` parameter of the `ta.pivot_point_levels()` cannot be `true` when `type` is "Woodie".'
|
|
1280
|
+
);
|
|
1281
|
+
}
|
|
1282
|
+
const n = anchor.length;
|
|
1283
|
+
for (const [s, name] of [[high, "High"], [low, "Low"], [close, "Close"], [open, "Open"]]) {
|
|
1284
|
+
if (s && s.length !== n) throw new Error(`${name} series length mismatch`);
|
|
1285
|
+
}
|
|
1286
|
+
const at = (s, i) => s ? s[i] ?? NaN : NaN;
|
|
1287
|
+
const results = Array.from({ length: 11 }, () => new Array(n));
|
|
1288
|
+
let curH = NaN, curL = NaN, curO = NaN;
|
|
1289
|
+
let prevH = NaN, prevL = NaN, prevC = NaN, prevO = NaN;
|
|
1290
|
+
let anchored = false;
|
|
1291
|
+
for (let i = 0; i < n; i++) {
|
|
1292
|
+
const h = at(high, i), l = at(low, i);
|
|
1293
|
+
if (i === 0) {
|
|
1294
|
+
curH = h;
|
|
1295
|
+
curL = l;
|
|
1296
|
+
curO = at(open, i);
|
|
1270
1297
|
}
|
|
1298
|
+
if (anchor[i]) {
|
|
1299
|
+
prevH = curH;
|
|
1300
|
+
prevL = curL;
|
|
1301
|
+
prevC = i > 0 ? at(close, i - 1) : NaN;
|
|
1302
|
+
prevO = curO;
|
|
1303
|
+
curH = h;
|
|
1304
|
+
curL = l;
|
|
1305
|
+
curO = at(open, i);
|
|
1306
|
+
anchored = true;
|
|
1307
|
+
} else if (i > 0) {
|
|
1308
|
+
if (h > curH || Number.isNaN(curH)) curH = h;
|
|
1309
|
+
if (l < curL || Number.isNaN(curL)) curL = l;
|
|
1310
|
+
}
|
|
1311
|
+
const levels = isDeveloping ? pivotLevels(typeStr, curH, curL, at(close, i), curO, at(close, i)) : anchored ? pivotLevels(typeStr, prevH, prevL, prevC, prevO, curO) : NA_LEVELS;
|
|
1312
|
+
for (let k = 0; k < 11; k++) results[k][i] = levels[k];
|
|
1271
1313
|
}
|
|
1272
1314
|
return results;
|
|
1273
1315
|
}
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
const levels = Array(11).fill(NaN);
|
|
1279
|
-
let P;
|
|
1280
|
-
switch (type) {
|
|
1281
|
-
case "Traditional":
|
|
1282
|
-
case "Fibonacci":
|
|
1283
|
-
case "Classic":
|
|
1284
|
-
P = (h + l + c) / 3;
|
|
1285
|
-
break;
|
|
1286
|
-
case "Woodie":
|
|
1287
|
-
P = (h + l + 2 * c) / 4;
|
|
1288
|
-
break;
|
|
1289
|
-
case "DM":
|
|
1290
|
-
P = (h + l + c) / 3;
|
|
1291
|
-
break;
|
|
1292
|
-
case "Camarilla":
|
|
1293
|
-
P = (h + l + c) / 3;
|
|
1294
|
-
break;
|
|
1295
|
-
default:
|
|
1296
|
-
P = (h + l + c) / 3;
|
|
1297
|
-
}
|
|
1298
|
-
levels[0] = P;
|
|
1316
|
+
const NA_LEVELS = new Array(11).fill(NaN);
|
|
1317
|
+
function pivotLevels(type, h, l, c, o, wo) {
|
|
1318
|
+
const N = NaN;
|
|
1319
|
+
const r = h - l;
|
|
1299
1320
|
switch (type) {
|
|
1300
|
-
case "Traditional":
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
levels[5] = h + 2 * (P - l);
|
|
1331
|
-
levels[6] = l - 2 * (h - P);
|
|
1332
|
-
levels[7] = levels[5] + (h - l);
|
|
1333
|
-
levels[8] = levels[6] - (h - l);
|
|
1334
|
-
levels[9] = levels[7] + (h - l);
|
|
1335
|
-
levels[10] = levels[8] - (h - l);
|
|
1336
|
-
break;
|
|
1321
|
+
case "Traditional": {
|
|
1322
|
+
const p = (h + l + c) / 3;
|
|
1323
|
+
return [
|
|
1324
|
+
p,
|
|
1325
|
+
2 * p - l,
|
|
1326
|
+
2 * p - h,
|
|
1327
|
+
p + r,
|
|
1328
|
+
p - r,
|
|
1329
|
+
p * 2 + (h - 2 * l),
|
|
1330
|
+
p * 2 - (2 * h - l),
|
|
1331
|
+
p * 3 + (h - 3 * l),
|
|
1332
|
+
p * 3 - (3 * h - l),
|
|
1333
|
+
p * 4 + (h - 4 * l),
|
|
1334
|
+
p * 4 - (4 * h - l)
|
|
1335
|
+
];
|
|
1336
|
+
}
|
|
1337
|
+
case "Fibonacci": {
|
|
1338
|
+
const p = (h + l + c) / 3;
|
|
1339
|
+
return [p, p + 0.382 * r, p - 0.382 * r, p + 0.618 * r, p - 0.618 * r, p + 1 * r, p - 1 * r, N, N, N, N];
|
|
1340
|
+
}
|
|
1341
|
+
case "Classic": {
|
|
1342
|
+
const p = (h + l + c) / 3;
|
|
1343
|
+
return [p, 2 * p - l, 2 * p - h, p + r, p - r, p + 2 * r, p - 2 * r, p + 3 * r, p - 3 * r, N, N];
|
|
1344
|
+
}
|
|
1345
|
+
case "Woodie": {
|
|
1346
|
+
const p = (h + l + 2 * wo) / 4;
|
|
1347
|
+
const r3 = h + 2 * (p - l);
|
|
1348
|
+
const s3 = l - 2 * (h - p);
|
|
1349
|
+
return [p, 2 * p - l, 2 * p - h, p + r, p - r, r3, s3, r3 + r, s3 - r, N, N];
|
|
1350
|
+
}
|
|
1337
1351
|
case "DM": {
|
|
1338
|
-
const x = h + l + c
|
|
1339
|
-
|
|
1340
|
-
levels[0] = newP;
|
|
1341
|
-
levels[1] = x / 2 - l;
|
|
1342
|
-
levels[2] = x / 2 - h;
|
|
1343
|
-
break;
|
|
1352
|
+
const x = c < o ? h + 2 * l + c : c > o ? 2 * h + l + c : h + l + 2 * c;
|
|
1353
|
+
return [x / 4, x / 2 - l, x / 2 - h, N, N, N, N, N, N, N, N];
|
|
1344
1354
|
}
|
|
1345
1355
|
case "Camarilla": {
|
|
1346
|
-
const
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1356
|
+
const p = (h + l + c) / 3;
|
|
1357
|
+
const r5 = h / l * c;
|
|
1358
|
+
return [
|
|
1359
|
+
p,
|
|
1360
|
+
c + r * 1.1 / 12,
|
|
1361
|
+
c - r * 1.1 / 12,
|
|
1362
|
+
c + r * 1.1 / 6,
|
|
1363
|
+
c - r * 1.1 / 6,
|
|
1364
|
+
c + r * 1.1 / 4,
|
|
1365
|
+
c - r * 1.1 / 4,
|
|
1366
|
+
c + r * 1.1 / 2,
|
|
1367
|
+
c - r * 1.1 / 2,
|
|
1368
|
+
r5,
|
|
1369
|
+
2 * c - r5
|
|
1370
|
+
];
|
|
1358
1371
|
}
|
|
1372
|
+
default:
|
|
1373
|
+
return NA_LEVELS;
|
|
1359
1374
|
}
|
|
1360
|
-
return levels;
|
|
1361
1375
|
}
|
|
1362
1376
|
function ichimoku(conversionPeriods, basePeriods, laggingSpan2Periods, displacement, high, low, close) {
|
|
1363
1377
|
const length = high.length;
|