oakscriptjs 0.11.0 → 0.11.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/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.js +1 -1
- 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 +3 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +6 -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 +65 -12
- package/dist/cjs/script/index.d.ts.map +1 -1
- package/dist/cjs/script/index.js +168 -19
- 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 +11 -7
- package/dist/cjs/session/calendar.js.map +2 -2
- package/dist/cjs/session/context.d.ts +2 -1
- package/dist/cjs/session/context.d.ts.map +1 -1
- package/dist/cjs/session/context.js +2 -1
- 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 +34 -17
- package/dist/cjs/ta/index.d.ts.map +1 -1
- package/dist/cjs/ta/index.js +132 -116
- package/dist/cjs/ta/index.js.map +2 -2
- 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 +3 -1
- package/dist/cjs/table/index.d.ts.map +1 -1
- package/dist/cjs/table/index.js +1 -0
- 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.js +1 -1
- 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 +3 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +4 -2
- 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 +65 -12
- package/dist/esm/script/index.d.ts.map +1 -1
- package/dist/esm/script/index.js +217 -29
- 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 +19 -7
- package/dist/esm/session/calendar.js.map +1 -1
- package/dist/esm/session/context.d.ts +2 -1
- package/dist/esm/session/context.d.ts.map +1 -1
- package/dist/esm/session/context.js +5 -3
- 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 +34 -17
- package/dist/esm/ta/index.d.ts.map +1 -1
- package/dist/esm/ta/index.js +155 -185
- 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 +3 -1
- package/dist/esm/table/index.d.ts.map +1 -1
- package/dist/esm/table/index.js +6 -1
- 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 +1 -1
- package/src/drawing/registry.ts +30 -7
- package/src/index.ts +11 -1
- 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 +292 -30
- package/src/security/other.ts +269 -0
- package/src/session/bars.ts +24 -1
- package/src/session/calendar.ts +23 -7
- package/src/session/context.ts +5 -3
- 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 +157 -183
- 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 +4 -1
- 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,17 @@ 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
|
+
const r = 100 - 100 / (1 + x / y);
|
|
145
|
+
return Number.isFinite(r) ? r : NaN;
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
(0, import_limits.checkPositiveLength)("rsi", length, 0, "y");
|
|
137
149
|
const result = [];
|
|
138
150
|
const changes = [];
|
|
139
151
|
for (let i = 1; i < source.length; i++) {
|
|
@@ -306,6 +318,7 @@ function crossunder(series1, series2) {
|
|
|
306
318
|
return crossTest(series1, series2, (a, b, pa, pb) => a < b && pa >= pb);
|
|
307
319
|
}
|
|
308
320
|
function change(source, length = 1) {
|
|
321
|
+
(0, import_limits.checkPositiveLength)("change", length, 0);
|
|
309
322
|
const result = [];
|
|
310
323
|
for (let i = 0; i < source.length; i++) {
|
|
311
324
|
if (i < length) {
|
|
@@ -347,6 +360,7 @@ function tr(handle_na = false, high, low, close) {
|
|
|
347
360
|
return result;
|
|
348
361
|
}
|
|
349
362
|
function atr(length, high, low, close) {
|
|
363
|
+
(0, import_limits.checkPositiveLength)("atr->rma", length, 0);
|
|
350
364
|
if (!high || !low || !close) {
|
|
351
365
|
throw new Error(
|
|
352
366
|
"ta.atr() requires high, low, and close series. Either pass them explicitly or use createContext({ chart: { high, low, close } }) for implicit data."
|
|
@@ -402,6 +416,7 @@ function supertrend(factor, atrPeriod, high, low, close, wicks = false) {
|
|
|
402
416
|
return [supertrendValues, directions];
|
|
403
417
|
}
|
|
404
418
|
function rma(source, length) {
|
|
419
|
+
(0, import_limits.checkPositiveLength)("rma", length, 0);
|
|
405
420
|
const result = [];
|
|
406
421
|
const len = Math.floor(length);
|
|
407
422
|
let firstValidIndex = -1;
|
|
@@ -439,6 +454,7 @@ function wmaAdd(a, b) {
|
|
|
439
454
|
function wma(source, length) {
|
|
440
455
|
const result = [];
|
|
441
456
|
const fixed = typeof length === "number" ? Math.floor(length) : NaN;
|
|
457
|
+
if (typeof length === "number") (0, import_limits.checkPositiveLength)("wma", fixed, 0);
|
|
442
458
|
const filled = [];
|
|
443
459
|
let last = NaN;
|
|
444
460
|
let count = 0;
|
|
@@ -451,6 +467,7 @@ function wma(source, length) {
|
|
|
451
467
|
}
|
|
452
468
|
filled.push(last);
|
|
453
469
|
const len = typeof length === "number" ? fixed : Math.floor(length[i]);
|
|
470
|
+
if (typeof length !== "number") (0, import_limits.checkPositiveLength)("wma", len, i);
|
|
454
471
|
if (isNa || !(len >= 1) || count < len) {
|
|
455
472
|
result.push(NaN);
|
|
456
473
|
continue;
|
|
@@ -508,12 +525,15 @@ function monotonic(source, length, step) {
|
|
|
508
525
|
return result;
|
|
509
526
|
}
|
|
510
527
|
function rising(source, length) {
|
|
528
|
+
(0, import_limits.checkPositiveLength)("rising", length, 0);
|
|
511
529
|
return monotonic(source, length, import_compare.gt);
|
|
512
530
|
}
|
|
513
531
|
function falling(source, length) {
|
|
532
|
+
(0, import_limits.checkPositiveLength)("falling", length, 0);
|
|
514
533
|
return monotonic(source, length, import_compare.lt);
|
|
515
534
|
}
|
|
516
535
|
function roc(source, length) {
|
|
536
|
+
(0, import_limits.checkPositiveLength)("roc", length, 0);
|
|
517
537
|
const result = [];
|
|
518
538
|
for (let i = 0; i < source.length; i++) {
|
|
519
539
|
if (i < length) {
|
|
@@ -531,6 +551,7 @@ function roc(source, length) {
|
|
|
531
551
|
return result;
|
|
532
552
|
}
|
|
533
553
|
function mom(source, length) {
|
|
554
|
+
(0, import_limits.checkPositiveLength)("mom", length, 0);
|
|
534
555
|
const result = [];
|
|
535
556
|
for (let i = 0; i < source.length; i++) {
|
|
536
557
|
if (i < length) {
|
|
@@ -546,6 +567,7 @@ function mom(source, length) {
|
|
|
546
567
|
return result;
|
|
547
568
|
}
|
|
548
569
|
function dev(source, length) {
|
|
570
|
+
(0, import_limits.checkPositiveLength)("dev", length, 0);
|
|
549
571
|
const len = Math.floor(length);
|
|
550
572
|
return sma(source, len).map((mean, i) => {
|
|
551
573
|
if (i < len - 1 || Number.isNaN(mean)) return NaN;
|
|
@@ -568,6 +590,7 @@ function varianceOf(source, length, biased, name) {
|
|
|
568
590
|
return (0, import_running_sum.runningVariance)(source, len, biased);
|
|
569
591
|
}
|
|
570
592
|
function median(source, length) {
|
|
593
|
+
(0, import_limits.checkPositiveLength)("median", length, 0);
|
|
571
594
|
const len = Math.floor(length);
|
|
572
595
|
const n = source.length;
|
|
573
596
|
const out = new Array(n).fill(NaN);
|
|
@@ -604,6 +627,7 @@ function swma(source) {
|
|
|
604
627
|
);
|
|
605
628
|
}
|
|
606
629
|
function vwma(source, length, volume) {
|
|
630
|
+
(0, import_limits.checkPositiveLength)("vwma->sma", length, 0);
|
|
607
631
|
if (!volume) {
|
|
608
632
|
throw new Error(
|
|
609
633
|
"ta.vwma() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
|
|
@@ -626,6 +650,7 @@ function vwma(source, length, volume) {
|
|
|
626
650
|
return result;
|
|
627
651
|
}
|
|
628
652
|
function linreg(source, length, offset = 0) {
|
|
653
|
+
(0, import_limits.checkPositiveLength)("linreg", length, 0);
|
|
629
654
|
const result = [];
|
|
630
655
|
const len = Math.floor(length);
|
|
631
656
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -663,6 +688,7 @@ function linreg(source, length, offset = 0) {
|
|
|
663
688
|
return result;
|
|
664
689
|
}
|
|
665
690
|
function correlation(source1, source2, length) {
|
|
691
|
+
(0, import_limits.checkPositiveLength)("correlation", length, 0);
|
|
666
692
|
const product = Array.from({ length: source1.length }, (_, i) => {
|
|
667
693
|
const v1 = source1[i];
|
|
668
694
|
const v2 = source2[i];
|
|
@@ -682,10 +708,11 @@ function correlation(source1, source2, length) {
|
|
|
682
708
|
});
|
|
683
709
|
}
|
|
684
710
|
function percentrank(source, length) {
|
|
711
|
+
(0, import_limits.checkPositiveLength)("percentrank", length, 0);
|
|
685
712
|
const result = [];
|
|
686
713
|
for (let i = 0; i < source.length; i++) {
|
|
687
714
|
const currentValue = source[i];
|
|
688
|
-
if (i < length
|
|
715
|
+
if (i < length) {
|
|
689
716
|
result.push(NaN);
|
|
690
717
|
continue;
|
|
691
718
|
}
|
|
@@ -698,6 +725,7 @@ function percentrank(source, length) {
|
|
|
698
725
|
return result;
|
|
699
726
|
}
|
|
700
727
|
function cci(source, length) {
|
|
728
|
+
(0, import_limits.checkPositiveLength)("cci", length, 0);
|
|
701
729
|
const smaValues = sma(source, length);
|
|
702
730
|
const devValues = dev(source, length);
|
|
703
731
|
let last = 0;
|
|
@@ -709,6 +737,7 @@ function cci(source, length) {
|
|
|
709
737
|
});
|
|
710
738
|
}
|
|
711
739
|
function stoch(source, high, low, length) {
|
|
740
|
+
(0, import_limits.checkPositiveLength)("stoch->highest", length, 0);
|
|
712
741
|
const result = [];
|
|
713
742
|
const lowestValues = lowest(low, length);
|
|
714
743
|
const highestValues = highest(high, length);
|
|
@@ -723,6 +752,7 @@ function stoch(source, high, low, length) {
|
|
|
723
752
|
return result;
|
|
724
753
|
}
|
|
725
754
|
function mfi(source, length, volume) {
|
|
755
|
+
(0, import_limits.checkPositiveLength)("mfi", length, 0);
|
|
726
756
|
if (!volume) {
|
|
727
757
|
throw new Error(
|
|
728
758
|
"ta.mfi() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
|
|
@@ -749,6 +779,7 @@ function mfi(source, length, volume) {
|
|
|
749
779
|
});
|
|
750
780
|
}
|
|
751
781
|
function hma(source, length) {
|
|
782
|
+
(0, import_limits.checkPositiveLength)("hma", length, 0);
|
|
752
783
|
const halfLength = Math.floor(length / 2);
|
|
753
784
|
const sqrtLength = Math.floor(Math.sqrt(length));
|
|
754
785
|
const wmaHalf = wma(source, halfLength);
|
|
@@ -932,6 +963,7 @@ function dmi(diLength, adxSmoothing, high, low, close) {
|
|
|
932
963
|
return [plusDI, minusDI, adx];
|
|
933
964
|
}
|
|
934
965
|
function tsi(source, shortLength, longLength) {
|
|
966
|
+
(0, import_limits.checkPositiveLength)("tsi->ema", shortLength, 0);
|
|
935
967
|
const momentum = [];
|
|
936
968
|
for (let i = 0; i < source.length; i++) {
|
|
937
969
|
if (i === 0) {
|
|
@@ -949,6 +981,7 @@ function tsi(source, shortLength, longLength) {
|
|
|
949
981
|
});
|
|
950
982
|
}
|
|
951
983
|
function cmo(source, length) {
|
|
984
|
+
(0, import_limits.checkPositiveLength)("cmo", length, 0);
|
|
952
985
|
const up = [];
|
|
953
986
|
const down = [];
|
|
954
987
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -961,6 +994,7 @@ function cmo(source, length) {
|
|
|
961
994
|
return sm1.map((s1, i) => 100 * (s1 - sm2[i]) / (s1 + sm2[i]));
|
|
962
995
|
}
|
|
963
996
|
function kc(source, length, mult, useTrueRange = true, high, low, close) {
|
|
997
|
+
(0, import_limits.checkPositiveLength)("kc", length, 0);
|
|
964
998
|
const middle = ema(source, length);
|
|
965
999
|
let range2;
|
|
966
1000
|
if (useTrueRange) {
|
|
@@ -987,6 +1021,7 @@ function kc(source, length, mult, useTrueRange = true, high, low, close) {
|
|
|
987
1021
|
return [middle, upper, lower];
|
|
988
1022
|
}
|
|
989
1023
|
function bbw(source, length, mult) {
|
|
1024
|
+
(0, import_limits.checkPositiveLength)("bbw", length, 0);
|
|
990
1025
|
const [basis, upper, lower] = bb(source, length, mult);
|
|
991
1026
|
const result = [];
|
|
992
1027
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -1000,6 +1035,7 @@ function bbw(source, length, mult) {
|
|
|
1000
1035
|
return result;
|
|
1001
1036
|
}
|
|
1002
1037
|
function wpr(high, low, close, length = 14) {
|
|
1038
|
+
(0, import_limits.checkPositiveLength)("wpr", length, 0);
|
|
1003
1039
|
const highs = highest(high, length);
|
|
1004
1040
|
const lows = lowest(low, length);
|
|
1005
1041
|
return Array.from({ length: close.length }, (_, i) => {
|
|
@@ -1041,6 +1077,7 @@ function vwap(source, volume, anchor, stdev_mult) {
|
|
|
1041
1077
|
return stdev_mult === void 0 ? mid : [mid, upper, lower];
|
|
1042
1078
|
}
|
|
1043
1079
|
function alma(source, length = 9, offset = 0.85, sigma = 6, floor = false) {
|
|
1080
|
+
(0, import_limits.checkPositiveLength)("alma", length, 0);
|
|
1044
1081
|
const result = [];
|
|
1045
1082
|
const m = floor ? Math.floor(offset * (length - 1)) : offset * (length - 1);
|
|
1046
1083
|
const s = length / sigma;
|
|
@@ -1080,6 +1117,7 @@ function kcw(source, length = 20, mult = 2, useTrueRange = true, high, low, clos
|
|
|
1080
1117
|
return result;
|
|
1081
1118
|
}
|
|
1082
1119
|
function range(source, length) {
|
|
1120
|
+
(0, import_limits.checkPositiveLength)("range", length, 0);
|
|
1083
1121
|
return source.map((_, i) => {
|
|
1084
1122
|
const values = lastValues(source, i, length);
|
|
1085
1123
|
return values ? Math.max(...values) - Math.min(...values) : NaN;
|
|
@@ -1106,6 +1144,7 @@ function min(source) {
|
|
|
1106
1144
|
});
|
|
1107
1145
|
}
|
|
1108
1146
|
function cog(source, length = 10) {
|
|
1147
|
+
(0, import_limits.checkPositiveLength)("cog", length, 0);
|
|
1109
1148
|
const len = Math.floor(length);
|
|
1110
1149
|
return (0, import_running_sum.runningSum)(source, len).map((sum, i) => {
|
|
1111
1150
|
if (i < len - 1 || Number.isNaN(sum) || sum === 0) return NaN;
|
|
@@ -1115,6 +1154,7 @@ function cog(source, length = 10) {
|
|
|
1115
1154
|
});
|
|
1116
1155
|
}
|
|
1117
1156
|
function mode(source, length) {
|
|
1157
|
+
(0, import_limits.checkPositiveLength)("mode", length, 0);
|
|
1118
1158
|
const result = [];
|
|
1119
1159
|
const len = Math.floor(length);
|
|
1120
1160
|
const seen = [];
|
|
@@ -1147,6 +1187,7 @@ function mode(source, length) {
|
|
|
1147
1187
|
return result;
|
|
1148
1188
|
}
|
|
1149
1189
|
function percentile_linear_interpolation(source, length, percentage) {
|
|
1190
|
+
(0, import_limits.checkPositiveLength)("percentile_linear_interpolation", length, 0);
|
|
1150
1191
|
return sortedWindow(source, length, (s) => {
|
|
1151
1192
|
const pos = percentage / 100 * length - 0.5;
|
|
1152
1193
|
if (pos <= 0) return s[0];
|
|
@@ -1175,10 +1216,12 @@ function sortedWindow(source, length, fn) {
|
|
|
1175
1216
|
return result;
|
|
1176
1217
|
}
|
|
1177
1218
|
function percentile_nearest_rank(source, length, percentage) {
|
|
1219
|
+
(0, import_limits.checkPositiveLength)("percentile_nearest_rank", length, 0);
|
|
1178
1220
|
const rank = Math.min(length, Math.max(1, Math.ceil(percentage / 100 * length)));
|
|
1179
1221
|
return sortedWindow(source, length, (s) => s[rank - 1]);
|
|
1180
1222
|
}
|
|
1181
1223
|
function rci(source, length) {
|
|
1224
|
+
(0, import_limits.checkPositiveLength)("rci", length, 0);
|
|
1182
1225
|
const len = Math.floor(length);
|
|
1183
1226
|
const result = [];
|
|
1184
1227
|
const ring = new Array(len + 1).fill(0);
|
|
@@ -1232,132 +1275,105 @@ function rci(source, length) {
|
|
|
1232
1275
|
}
|
|
1233
1276
|
function pivot_point_levels(type, anchor, developing = false, high, low, close, open) {
|
|
1234
1277
|
const typeStr = typeof type === "string" ? type : String(type[0]);
|
|
1235
|
-
const isDeveloping = typeof developing === "boolean" ? developing : developing[0];
|
|
1278
|
+
const isDeveloping = typeof developing === "boolean" ? developing : Boolean(developing[0]);
|
|
1236
1279
|
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]);
|
|
1280
|
+
throw new Error(
|
|
1281
|
+
'Error on bar 0: The `developing` parameter of the `ta.pivot_point_levels()` cannot be `true` when `type` is "Woodie".'
|
|
1282
|
+
);
|
|
1283
|
+
}
|
|
1284
|
+
const n = anchor.length;
|
|
1285
|
+
for (const [s, name] of [[high, "High"], [low, "Low"], [close, "Close"], [open, "Open"]]) {
|
|
1286
|
+
if (s && s.length !== n) throw new Error(`${name} series length mismatch`);
|
|
1287
|
+
}
|
|
1288
|
+
const at = (s, i) => s ? s[i] ?? NaN : NaN;
|
|
1289
|
+
const results = Array.from({ length: 11 }, () => new Array(n));
|
|
1290
|
+
let curH = NaN, curL = NaN, curO = NaN;
|
|
1291
|
+
let prevH = NaN, prevL = NaN, prevC = NaN, prevO = NaN;
|
|
1292
|
+
let anchored = false;
|
|
1293
|
+
for (let i = 0; i < n; i++) {
|
|
1294
|
+
const h = at(high, i), l = at(low, i);
|
|
1295
|
+
if (i === 0) {
|
|
1296
|
+
curH = h;
|
|
1297
|
+
curL = l;
|
|
1298
|
+
curO = at(open, i);
|
|
1270
1299
|
}
|
|
1300
|
+
if (anchor[i]) {
|
|
1301
|
+
prevH = curH;
|
|
1302
|
+
prevL = curL;
|
|
1303
|
+
prevC = i > 0 ? at(close, i - 1) : NaN;
|
|
1304
|
+
prevO = curO;
|
|
1305
|
+
curH = h;
|
|
1306
|
+
curL = l;
|
|
1307
|
+
curO = at(open, i);
|
|
1308
|
+
anchored = true;
|
|
1309
|
+
} else if (i > 0) {
|
|
1310
|
+
if (h > curH || Number.isNaN(curH)) curH = h;
|
|
1311
|
+
if (l < curL || Number.isNaN(curL)) curL = l;
|
|
1312
|
+
}
|
|
1313
|
+
const levels = isDeveloping ? pivotLevels(typeStr, curH, curL, at(close, i), curO, at(close, i)) : anchored ? pivotLevels(typeStr, prevH, prevL, prevC, prevO, curO) : NA_LEVELS;
|
|
1314
|
+
for (let k = 0; k < 11; k++) results[k][i] = levels[k];
|
|
1271
1315
|
}
|
|
1272
1316
|
return results;
|
|
1273
1317
|
}
|
|
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;
|
|
1318
|
+
const NA_LEVELS = new Array(11).fill(NaN);
|
|
1319
|
+
function pivotLevels(type, h, l, c, o, wo) {
|
|
1320
|
+
const N = NaN;
|
|
1321
|
+
const r = h - l;
|
|
1299
1322
|
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;
|
|
1323
|
+
case "Traditional": {
|
|
1324
|
+
const p = (h + l + c) / 3;
|
|
1325
|
+
return [
|
|
1326
|
+
p,
|
|
1327
|
+
2 * p - l,
|
|
1328
|
+
2 * p - h,
|
|
1329
|
+
p + r,
|
|
1330
|
+
p - r,
|
|
1331
|
+
p * 2 + (h - 2 * l),
|
|
1332
|
+
p * 2 - (2 * h - l),
|
|
1333
|
+
p * 3 + (h - 3 * l),
|
|
1334
|
+
p * 3 - (3 * h - l),
|
|
1335
|
+
p * 4 + (h - 4 * l),
|
|
1336
|
+
p * 4 - (4 * h - l)
|
|
1337
|
+
];
|
|
1338
|
+
}
|
|
1339
|
+
case "Fibonacci": {
|
|
1340
|
+
const p = (h + l + c) / 3;
|
|
1341
|
+
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];
|
|
1342
|
+
}
|
|
1343
|
+
case "Classic": {
|
|
1344
|
+
const p = (h + l + c) / 3;
|
|
1345
|
+
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];
|
|
1346
|
+
}
|
|
1347
|
+
case "Woodie": {
|
|
1348
|
+
const p = (h + l + 2 * wo) / 4;
|
|
1349
|
+
const r3 = h + 2 * (p - l);
|
|
1350
|
+
const s3 = l - 2 * (h - p);
|
|
1351
|
+
return [p, 2 * p - l, 2 * p - h, p + r, p - r, r3, s3, r3 + r, s3 - r, N, N];
|
|
1352
|
+
}
|
|
1337
1353
|
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;
|
|
1354
|
+
const x = c < o ? h + 2 * l + c : c > o ? 2 * h + l + c : h + l + 2 * c;
|
|
1355
|
+
return [x / 4, x / 2 - l, x / 2 - h, N, N, N, N, N, N, N, N];
|
|
1344
1356
|
}
|
|
1345
1357
|
case "Camarilla": {
|
|
1346
|
-
const
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
+
const p = (h + l + c) / 3;
|
|
1359
|
+
const r5 = h / l * c;
|
|
1360
|
+
return [
|
|
1361
|
+
p,
|
|
1362
|
+
c + r * 1.1 / 12,
|
|
1363
|
+
c - r * 1.1 / 12,
|
|
1364
|
+
c + r * 1.1 / 6,
|
|
1365
|
+
c - r * 1.1 / 6,
|
|
1366
|
+
c + r * 1.1 / 4,
|
|
1367
|
+
c - r * 1.1 / 4,
|
|
1368
|
+
c + r * 1.1 / 2,
|
|
1369
|
+
c - r * 1.1 / 2,
|
|
1370
|
+
r5,
|
|
1371
|
+
2 * c - r5
|
|
1372
|
+
];
|
|
1358
1373
|
}
|
|
1374
|
+
default:
|
|
1375
|
+
return NA_LEVELS;
|
|
1359
1376
|
}
|
|
1360
|
-
return levels;
|
|
1361
1377
|
}
|
|
1362
1378
|
function ichimoku(conversionPeriods, basePeriods, laggingSpan2Periods, displacement, high, low, close) {
|
|
1363
1379
|
const length = high.length;
|