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.
Files changed (236) hide show
  1. package/dist/cjs/array/index.d.ts +8 -2
  2. package/dist/cjs/array/index.d.ts.map +1 -1
  3. package/dist/cjs/array/index.js +2 -1
  4. package/dist/cjs/array/index.js.map +2 -2
  5. package/dist/cjs/box/index.js +6 -6
  6. package/dist/cjs/box/index.js.map +2 -2
  7. package/dist/cjs/callsite/index.js +1 -1
  8. package/dist/cjs/callsite/index.js.map +2 -2
  9. package/dist/cjs/drawing/registry.d.ts +15 -6
  10. package/dist/cjs/drawing/registry.d.ts.map +1 -1
  11. package/dist/cjs/drawing/registry.js +16 -2
  12. package/dist/cjs/drawing/registry.js.map +2 -2
  13. package/dist/cjs/index.d.ts +3 -2
  14. package/dist/cjs/index.d.ts.map +1 -1
  15. package/dist/cjs/index.js +6 -1
  16. package/dist/cjs/index.js.map +2 -2
  17. package/dist/cjs/input.d.ts +9 -1
  18. package/dist/cjs/input.d.ts.map +1 -1
  19. package/dist/cjs/input.js +16 -0
  20. package/dist/cjs/input.js.map +2 -2
  21. package/dist/cjs/label/index.js +3 -3
  22. package/dist/cjs/label/index.js.map +2 -2
  23. package/dist/cjs/line/index.d.ts +10 -27
  24. package/dist/cjs/line/index.d.ts.map +1 -1
  25. package/dist/cjs/line/index.js +10 -27
  26. package/dist/cjs/line/index.js.map +2 -2
  27. package/dist/cjs/linefill/index.d.ts +3 -0
  28. package/dist/cjs/linefill/index.d.ts.map +1 -1
  29. package/dist/cjs/linefill/index.js +15 -1
  30. package/dist/cjs/linefill/index.js.map +3 -3
  31. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +1 -1
  32. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +2 -2
  33. package/dist/cjs/runtime/index.d.ts +1 -1
  34. package/dist/cjs/runtime/index.d.ts.map +1 -1
  35. package/dist/cjs/runtime/index.js +1 -0
  36. package/dist/cjs/runtime/index.js.map +2 -2
  37. package/dist/cjs/runtime/inputs.d.ts +9 -0
  38. package/dist/cjs/runtime/inputs.d.ts.map +1 -1
  39. package/dist/cjs/runtime/inputs.js +8 -0
  40. package/dist/cjs/runtime/inputs.js.map +2 -2
  41. package/dist/cjs/runtime/types.d.ts +1 -1
  42. package/dist/cjs/runtime/types.d.ts.map +1 -1
  43. package/dist/cjs/runtime/types.js.map +1 -1
  44. package/dist/cjs/script/index.d.ts +65 -12
  45. package/dist/cjs/script/index.d.ts.map +1 -1
  46. package/dist/cjs/script/index.js +168 -19
  47. package/dist/cjs/script/index.js.map +3 -3
  48. package/dist/cjs/security/other.d.ts +92 -0
  49. package/dist/cjs/security/other.d.ts.map +1 -0
  50. package/dist/cjs/security/other.js +164 -0
  51. package/dist/cjs/security/other.js.map +7 -0
  52. package/dist/cjs/session/bars.d.ts +10 -1
  53. package/dist/cjs/session/bars.d.ts.map +1 -1
  54. package/dist/cjs/session/bars.js +16 -2
  55. package/dist/cjs/session/bars.js.map +2 -2
  56. package/dist/cjs/session/calendar.d.ts +4 -1
  57. package/dist/cjs/session/calendar.d.ts.map +1 -1
  58. package/dist/cjs/session/calendar.js +11 -7
  59. package/dist/cjs/session/calendar.js.map +2 -2
  60. package/dist/cjs/session/context.d.ts +2 -1
  61. package/dist/cjs/session/context.d.ts.map +1 -1
  62. package/dist/cjs/session/context.js +2 -1
  63. package/dist/cjs/session/context.js.map +2 -2
  64. package/dist/cjs/str/floatingdecimal.d.ts +31 -0
  65. package/dist/cjs/str/floatingdecimal.d.ts.map +1 -0
  66. package/dist/cjs/str/floatingdecimal.js +298 -0
  67. package/dist/cjs/str/floatingdecimal.js.map +7 -0
  68. package/dist/cjs/str/index.d.ts +4 -3
  69. package/dist/cjs/str/index.d.ts.map +1 -1
  70. package/dist/cjs/str/index.js +1 -1
  71. package/dist/cjs/str/index.js.map +2 -2
  72. package/dist/cjs/str/numberformat.d.ts +6 -4
  73. package/dist/cjs/str/numberformat.d.ts.map +1 -1
  74. package/dist/cjs/str/numberformat.js +3 -2
  75. package/dist/cjs/str/numberformat.js.map +2 -2
  76. package/dist/cjs/ta/index.d.ts +34 -17
  77. package/dist/cjs/ta/index.d.ts.map +1 -1
  78. package/dist/cjs/ta/index.js +132 -116
  79. package/dist/cjs/ta/index.js.map +2 -2
  80. package/dist/cjs/ta/limits.d.ts +11 -0
  81. package/dist/cjs/ta/limits.d.ts.map +1 -1
  82. package/dist/cjs/ta/limits.js +15 -1
  83. package/dist/cjs/ta/limits.js.map +2 -2
  84. package/dist/cjs/ta/running-sum.js +1 -1
  85. package/dist/cjs/ta/running-sum.js.map +2 -2
  86. package/dist/cjs/ta-series.d.ts +1 -1
  87. package/dist/cjs/ta-series.d.ts.map +1 -1
  88. package/dist/cjs/ta-series.js +1 -1
  89. package/dist/cjs/ta-series.js.map +2 -2
  90. package/dist/cjs/table/index.d.ts +3 -1
  91. package/dist/cjs/table/index.d.ts.map +1 -1
  92. package/dist/cjs/table/index.js +1 -0
  93. package/dist/cjs/table/index.js.map +3 -3
  94. package/dist/cjs/time/session.d.ts +9 -0
  95. package/dist/cjs/time/session.d.ts.map +1 -1
  96. package/dist/cjs/time/session.js +42 -14
  97. package/dist/cjs/time/session.js.map +3 -3
  98. package/dist/cjs/time/timezone.d.ts +6 -1
  99. package/dist/cjs/time/timezone.d.ts.map +1 -1
  100. package/dist/cjs/time/timezone.js +2 -2
  101. package/dist/cjs/time/timezone.js.map +2 -2
  102. package/dist/cjs/types/metadata.d.ts +1 -1
  103. package/dist/cjs/types/metadata.d.ts.map +1 -1
  104. package/dist/cjs/types/metadata.js.map +1 -1
  105. package/dist/esm/array/index.d.ts +8 -2
  106. package/dist/esm/array/index.d.ts.map +1 -1
  107. package/dist/esm/array/index.js +12 -3
  108. package/dist/esm/array/index.js.map +1 -1
  109. package/dist/esm/box/index.js +6 -6
  110. package/dist/esm/box/index.js.map +1 -1
  111. package/dist/esm/callsite/index.js +1 -1
  112. package/dist/esm/callsite/index.js.map +1 -1
  113. package/dist/esm/drawing/registry.d.ts +15 -6
  114. package/dist/esm/drawing/registry.d.ts.map +1 -1
  115. package/dist/esm/drawing/registry.js +30 -7
  116. package/dist/esm/drawing/registry.js.map +1 -1
  117. package/dist/esm/index.d.ts +3 -2
  118. package/dist/esm/index.d.ts.map +1 -1
  119. package/dist/esm/index.js +4 -2
  120. package/dist/esm/index.js.map +1 -1
  121. package/dist/esm/input.d.ts +9 -1
  122. package/dist/esm/input.d.ts.map +1 -1
  123. package/dist/esm/input.js +16 -0
  124. package/dist/esm/input.js.map +1 -1
  125. package/dist/esm/label/index.js +3 -3
  126. package/dist/esm/label/index.js.map +1 -1
  127. package/dist/esm/line/index.d.ts +10 -27
  128. package/dist/esm/line/index.d.ts.map +1 -1
  129. package/dist/esm/line/index.js +20 -64
  130. package/dist/esm/line/index.js.map +1 -1
  131. package/dist/esm/linefill/index.d.ts +3 -0
  132. package/dist/esm/linefill/index.d.ts.map +1 -1
  133. package/dist/esm/linefill/index.js +20 -1
  134. package/dist/esm/linefill/index.js.map +1 -1
  135. package/dist/esm/runtime/adapters/SimpleInputAdapter.js +1 -1
  136. package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -1
  137. package/dist/esm/runtime/index.d.ts +1 -1
  138. package/dist/esm/runtime/index.d.ts.map +1 -1
  139. package/dist/esm/runtime/index.js +1 -1
  140. package/dist/esm/runtime/index.js.map +1 -1
  141. package/dist/esm/runtime/inputs.d.ts +9 -0
  142. package/dist/esm/runtime/inputs.d.ts.map +1 -1
  143. package/dist/esm/runtime/inputs.js +15 -0
  144. package/dist/esm/runtime/inputs.js.map +1 -1
  145. package/dist/esm/runtime/types.d.ts +1 -1
  146. package/dist/esm/runtime/types.d.ts.map +1 -1
  147. package/dist/esm/script/index.d.ts +65 -12
  148. package/dist/esm/script/index.d.ts.map +1 -1
  149. package/dist/esm/script/index.js +217 -29
  150. package/dist/esm/script/index.js.map +1 -1
  151. package/dist/esm/security/other.d.ts +92 -0
  152. package/dist/esm/security/other.d.ts.map +1 -0
  153. package/dist/esm/security/other.js +211 -0
  154. package/dist/esm/security/other.js.map +1 -0
  155. package/dist/esm/session/bars.d.ts +10 -1
  156. package/dist/esm/session/bars.d.ts.map +1 -1
  157. package/dist/esm/session/bars.js +26 -1
  158. package/dist/esm/session/bars.js.map +1 -1
  159. package/dist/esm/session/calendar.d.ts +4 -1
  160. package/dist/esm/session/calendar.d.ts.map +1 -1
  161. package/dist/esm/session/calendar.js +19 -7
  162. package/dist/esm/session/calendar.js.map +1 -1
  163. package/dist/esm/session/context.d.ts +2 -1
  164. package/dist/esm/session/context.d.ts.map +1 -1
  165. package/dist/esm/session/context.js +5 -3
  166. package/dist/esm/session/context.js.map +1 -1
  167. package/dist/esm/str/floatingdecimal.d.ts +31 -0
  168. package/dist/esm/str/floatingdecimal.d.ts.map +1 -0
  169. package/dist/esm/str/floatingdecimal.js +272 -0
  170. package/dist/esm/str/floatingdecimal.js.map +1 -0
  171. package/dist/esm/str/index.d.ts +4 -3
  172. package/dist/esm/str/index.d.ts.map +1 -1
  173. package/dist/esm/str/index.js +6 -5
  174. package/dist/esm/str/index.js.map +1 -1
  175. package/dist/esm/str/numberformat.d.ts +6 -4
  176. package/dist/esm/str/numberformat.d.ts.map +1 -1
  177. package/dist/esm/str/numberformat.js +9 -5
  178. package/dist/esm/str/numberformat.js.map +1 -1
  179. package/dist/esm/ta/index.d.ts +34 -17
  180. package/dist/esm/ta/index.d.ts.map +1 -1
  181. package/dist/esm/ta/index.js +155 -185
  182. package/dist/esm/ta/index.js.map +1 -1
  183. package/dist/esm/ta/limits.d.ts +11 -0
  184. package/dist/esm/ta/limits.d.ts.map +1 -1
  185. package/dist/esm/ta/limits.js +27 -2
  186. package/dist/esm/ta/limits.js.map +1 -1
  187. package/dist/esm/ta/running-sum.js +1 -1
  188. package/dist/esm/ta/running-sum.js.map +1 -1
  189. package/dist/esm/ta-series.d.ts +1 -1
  190. package/dist/esm/ta-series.d.ts.map +1 -1
  191. package/dist/esm/ta-series.js +2 -1
  192. package/dist/esm/ta-series.js.map +1 -1
  193. package/dist/esm/table/index.d.ts +3 -1
  194. package/dist/esm/table/index.d.ts.map +1 -1
  195. package/dist/esm/table/index.js +6 -1
  196. package/dist/esm/table/index.js.map +1 -1
  197. package/dist/esm/time/session.d.ts +9 -0
  198. package/dist/esm/time/session.d.ts.map +1 -1
  199. package/dist/esm/time/session.js +53 -15
  200. package/dist/esm/time/session.js.map +1 -1
  201. package/dist/esm/time/timezone.d.ts +6 -1
  202. package/dist/esm/time/timezone.d.ts.map +1 -1
  203. package/dist/esm/time/timezone.js +8 -2
  204. package/dist/esm/time/timezone.js.map +1 -1
  205. package/dist/esm/types/metadata.d.ts +1 -1
  206. package/dist/esm/types/metadata.d.ts.map +1 -1
  207. package/package.json +1 -1
  208. package/src/array/index.ts +11 -3
  209. package/src/box/index.ts +6 -6
  210. package/src/callsite/index.ts +1 -1
  211. package/src/drawing/registry.ts +30 -7
  212. package/src/index.ts +11 -1
  213. package/src/input.ts +18 -1
  214. package/src/label/index.ts +3 -3
  215. package/src/line/index.ts +20 -68
  216. package/src/linefill/index.ts +20 -1
  217. package/src/runtime/adapters/SimpleInputAdapter.ts +1 -1
  218. package/src/runtime/index.ts +1 -0
  219. package/src/runtime/inputs.ts +16 -0
  220. package/src/runtime/types.ts +1 -1
  221. package/src/script/index.ts +292 -30
  222. package/src/security/other.ts +269 -0
  223. package/src/session/bars.ts +24 -1
  224. package/src/session/calendar.ts +23 -7
  225. package/src/session/context.ts +5 -3
  226. package/src/str/floatingdecimal.ts +268 -0
  227. package/src/str/index.ts +6 -5
  228. package/src/str/numberformat.ts +11 -6
  229. package/src/ta/index.ts +157 -183
  230. package/src/ta/limits.ts +28 -1
  231. package/src/ta/running-sum.ts +1 -1
  232. package/src/ta-series.ts +3 -2
  233. package/src/table/index.ts +4 -1
  234. package/src/time/session.ts +58 -16
  235. package/src/time/timezone.ts +9 -2
  236. package/src/types/metadata.ts +1 -1
@@ -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 || Number.isNaN(currentValue)) {
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("ta.pivot_point_levels: Woodie type cannot use developing=true");
1238
- }
1239
- const length = anchor.length;
1240
- if (high && high.length !== length) throw new Error("High series length mismatch");
1241
- if (low && low.length !== length) throw new Error("Low series length mismatch");
1242
- if (close && close.length !== length) throw new Error("Close series length mismatch");
1243
- if (open && open.length !== length) throw new Error("Open series length mismatch");
1244
- const results = Array.from({ length: 11 }, () => []);
1245
- let lastH = NaN, lastL = NaN, lastC = NaN, lastO = NaN;
1246
- let lastAnchorIndex = -1;
1247
- for (let i = 0; i < length; i++) {
1248
- if (anchor[i]) {
1249
- lastAnchorIndex = i;
1250
- lastH = high ? high[i] : NaN;
1251
- lastL = low ? low[i] : NaN;
1252
- lastC = close ? close[i] : NaN;
1253
- lastO = open ? open[i] : NaN;
1254
- }
1255
- let h, l, c, o;
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
- function calculatePivotLevels(type, h, l, c, o) {
1275
- if (isNaN(h) || isNaN(l) || isNaN(c)) {
1276
- return Array(11).fill(NaN);
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
- case "Classic":
1302
- levels[1] = 2 * P - l;
1303
- levels[2] = 2 * P - h;
1304
- levels[3] = P + (h - l);
1305
- levels[4] = P - (h - l);
1306
- levels[5] = h + 2 * (P - l);
1307
- levels[6] = l - 2 * (h - P);
1308
- levels[7] = levels[5] + (h - l);
1309
- levels[8] = levels[6] - (h - l);
1310
- levels[9] = levels[7] + (h - l);
1311
- levels[10] = levels[8] - (h - l);
1312
- break;
1313
- case "Fibonacci":
1314
- levels[1] = P + 0.382 * (h - l);
1315
- levels[2] = P - 0.382 * (h - l);
1316
- levels[3] = P + 0.618 * (h - l);
1317
- levels[4] = P - 0.618 * (h - l);
1318
- levels[5] = P + (h - l);
1319
- levels[6] = P - (h - l);
1320
- levels[7] = levels[5] + 0.618 * (h - l);
1321
- levels[8] = levels[6] - 0.618 * (h - l);
1322
- levels[9] = levels[7] + 0.382 * (h - l);
1323
- levels[10] = levels[8] - 0.382 * (h - l);
1324
- break;
1325
- case "Woodie":
1326
- levels[1] = 2 * P - l;
1327
- levels[2] = 2 * P - h;
1328
- levels[3] = P + (h - l);
1329
- levels[4] = P - (h - l);
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 * 2 + (isNaN(o) ? c : o);
1339
- const newP = x / (isNaN(o) ? 4 : 5);
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 range2 = h - l;
1347
- levels[1] = c + range2 * 1.1 / 12;
1348
- levels[2] = c - range2 * 1.1 / 12;
1349
- levels[3] = c + range2 * 1.1 / 6;
1350
- levels[4] = c - range2 * 1.1 / 6;
1351
- levels[5] = c + range2 * 1.1 / 4;
1352
- levels[6] = c - range2 * 1.1 / 4;
1353
- levels[7] = c + range2 * 1.1 / 2;
1354
- levels[8] = c - range2 * 1.1 / 2;
1355
- levels[9] = h;
1356
- levels[10] = l;
1357
- break;
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;