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.
Files changed (238) 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.d.ts.map +1 -1
  8. package/dist/cjs/callsite/index.js +6 -3
  9. package/dist/cjs/callsite/index.js.map +2 -2
  10. package/dist/cjs/drawing/registry.d.ts +15 -6
  11. package/dist/cjs/drawing/registry.d.ts.map +1 -1
  12. package/dist/cjs/drawing/registry.js +16 -2
  13. package/dist/cjs/drawing/registry.js.map +2 -2
  14. package/dist/cjs/index.d.ts +4 -3
  15. package/dist/cjs/index.d.ts.map +1 -1
  16. package/dist/cjs/index.js +7 -1
  17. package/dist/cjs/index.js.map +2 -2
  18. package/dist/cjs/input.d.ts +9 -1
  19. package/dist/cjs/input.d.ts.map +1 -1
  20. package/dist/cjs/input.js +16 -0
  21. package/dist/cjs/input.js.map +2 -2
  22. package/dist/cjs/label/index.js +3 -3
  23. package/dist/cjs/label/index.js.map +2 -2
  24. package/dist/cjs/line/index.d.ts +10 -27
  25. package/dist/cjs/line/index.d.ts.map +1 -1
  26. package/dist/cjs/line/index.js +10 -27
  27. package/dist/cjs/line/index.js.map +2 -2
  28. package/dist/cjs/linefill/index.d.ts +3 -0
  29. package/dist/cjs/linefill/index.d.ts.map +1 -1
  30. package/dist/cjs/linefill/index.js +15 -1
  31. package/dist/cjs/linefill/index.js.map +3 -3
  32. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +1 -1
  33. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +2 -2
  34. package/dist/cjs/runtime/index.d.ts +1 -1
  35. package/dist/cjs/runtime/index.d.ts.map +1 -1
  36. package/dist/cjs/runtime/index.js +1 -0
  37. package/dist/cjs/runtime/index.js.map +2 -2
  38. package/dist/cjs/runtime/inputs.d.ts +9 -0
  39. package/dist/cjs/runtime/inputs.d.ts.map +1 -1
  40. package/dist/cjs/runtime/inputs.js +8 -0
  41. package/dist/cjs/runtime/inputs.js.map +2 -2
  42. package/dist/cjs/runtime/types.d.ts +1 -1
  43. package/dist/cjs/runtime/types.d.ts.map +1 -1
  44. package/dist/cjs/runtime/types.js.map +1 -1
  45. package/dist/cjs/script/index.d.ts +66 -13
  46. package/dist/cjs/script/index.d.ts.map +1 -1
  47. package/dist/cjs/script/index.js +139 -35
  48. package/dist/cjs/script/index.js.map +3 -3
  49. package/dist/cjs/security/other.d.ts +92 -0
  50. package/dist/cjs/security/other.d.ts.map +1 -0
  51. package/dist/cjs/security/other.js +164 -0
  52. package/dist/cjs/security/other.js.map +7 -0
  53. package/dist/cjs/session/bars.d.ts +10 -1
  54. package/dist/cjs/session/bars.d.ts.map +1 -1
  55. package/dist/cjs/session/bars.js +16 -2
  56. package/dist/cjs/session/bars.js.map +2 -2
  57. package/dist/cjs/session/calendar.d.ts +4 -1
  58. package/dist/cjs/session/calendar.d.ts.map +1 -1
  59. package/dist/cjs/session/calendar.js +12 -7
  60. package/dist/cjs/session/calendar.js.map +2 -2
  61. package/dist/cjs/session/context.d.ts +22 -5
  62. package/dist/cjs/session/context.d.ts.map +1 -1
  63. package/dist/cjs/session/context.js +67 -6
  64. package/dist/cjs/session/context.js.map +2 -2
  65. package/dist/cjs/str/floatingdecimal.d.ts +31 -0
  66. package/dist/cjs/str/floatingdecimal.d.ts.map +1 -0
  67. package/dist/cjs/str/floatingdecimal.js +298 -0
  68. package/dist/cjs/str/floatingdecimal.js.map +7 -0
  69. package/dist/cjs/str/index.d.ts +4 -3
  70. package/dist/cjs/str/index.d.ts.map +1 -1
  71. package/dist/cjs/str/index.js +1 -1
  72. package/dist/cjs/str/index.js.map +2 -2
  73. package/dist/cjs/str/numberformat.d.ts +6 -4
  74. package/dist/cjs/str/numberformat.d.ts.map +1 -1
  75. package/dist/cjs/str/numberformat.js +3 -2
  76. package/dist/cjs/str/numberformat.js.map +2 -2
  77. package/dist/cjs/ta/index.d.ts +64 -45
  78. package/dist/cjs/ta/index.d.ts.map +1 -1
  79. package/dist/cjs/ta/index.js +140 -126
  80. package/dist/cjs/ta/index.js.map +3 -3
  81. package/dist/cjs/ta/limits.d.ts +11 -0
  82. package/dist/cjs/ta/limits.d.ts.map +1 -1
  83. package/dist/cjs/ta/limits.js +15 -1
  84. package/dist/cjs/ta/limits.js.map +2 -2
  85. package/dist/cjs/ta/running-sum.js +1 -1
  86. package/dist/cjs/ta/running-sum.js.map +2 -2
  87. package/dist/cjs/ta-series.d.ts +1 -1
  88. package/dist/cjs/ta-series.d.ts.map +1 -1
  89. package/dist/cjs/ta-series.js +1 -1
  90. package/dist/cjs/ta-series.js.map +2 -2
  91. package/dist/cjs/table/index.d.ts +10 -3
  92. package/dist/cjs/table/index.d.ts.map +1 -1
  93. package/dist/cjs/table/index.js +11 -1
  94. package/dist/cjs/table/index.js.map +3 -3
  95. package/dist/cjs/time/session.d.ts +9 -0
  96. package/dist/cjs/time/session.d.ts.map +1 -1
  97. package/dist/cjs/time/session.js +42 -14
  98. package/dist/cjs/time/session.js.map +3 -3
  99. package/dist/cjs/time/timezone.d.ts +6 -1
  100. package/dist/cjs/time/timezone.d.ts.map +1 -1
  101. package/dist/cjs/time/timezone.js +2 -2
  102. package/dist/cjs/time/timezone.js.map +2 -2
  103. package/dist/cjs/types/metadata.d.ts +1 -1
  104. package/dist/cjs/types/metadata.d.ts.map +1 -1
  105. package/dist/cjs/types/metadata.js.map +1 -1
  106. package/dist/esm/array/index.d.ts +8 -2
  107. package/dist/esm/array/index.d.ts.map +1 -1
  108. package/dist/esm/array/index.js +12 -3
  109. package/dist/esm/array/index.js.map +1 -1
  110. package/dist/esm/box/index.js +6 -6
  111. package/dist/esm/box/index.js.map +1 -1
  112. package/dist/esm/callsite/index.d.ts.map +1 -1
  113. package/dist/esm/callsite/index.js +6 -3
  114. package/dist/esm/callsite/index.js.map +1 -1
  115. package/dist/esm/drawing/registry.d.ts +15 -6
  116. package/dist/esm/drawing/registry.d.ts.map +1 -1
  117. package/dist/esm/drawing/registry.js +30 -7
  118. package/dist/esm/drawing/registry.js.map +1 -1
  119. package/dist/esm/index.d.ts +4 -3
  120. package/dist/esm/index.d.ts.map +1 -1
  121. package/dist/esm/index.js +8 -5
  122. package/dist/esm/index.js.map +1 -1
  123. package/dist/esm/input.d.ts +9 -1
  124. package/dist/esm/input.d.ts.map +1 -1
  125. package/dist/esm/input.js +16 -0
  126. package/dist/esm/input.js.map +1 -1
  127. package/dist/esm/label/index.js +3 -3
  128. package/dist/esm/label/index.js.map +1 -1
  129. package/dist/esm/line/index.d.ts +10 -27
  130. package/dist/esm/line/index.d.ts.map +1 -1
  131. package/dist/esm/line/index.js +20 -64
  132. package/dist/esm/line/index.js.map +1 -1
  133. package/dist/esm/linefill/index.d.ts +3 -0
  134. package/dist/esm/linefill/index.d.ts.map +1 -1
  135. package/dist/esm/linefill/index.js +20 -1
  136. package/dist/esm/linefill/index.js.map +1 -1
  137. package/dist/esm/runtime/adapters/SimpleInputAdapter.js +1 -1
  138. package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -1
  139. package/dist/esm/runtime/index.d.ts +1 -1
  140. package/dist/esm/runtime/index.d.ts.map +1 -1
  141. package/dist/esm/runtime/index.js +1 -1
  142. package/dist/esm/runtime/index.js.map +1 -1
  143. package/dist/esm/runtime/inputs.d.ts +9 -0
  144. package/dist/esm/runtime/inputs.d.ts.map +1 -1
  145. package/dist/esm/runtime/inputs.js +15 -0
  146. package/dist/esm/runtime/inputs.js.map +1 -1
  147. package/dist/esm/runtime/types.d.ts +1 -1
  148. package/dist/esm/runtime/types.d.ts.map +1 -1
  149. package/dist/esm/script/index.d.ts +66 -13
  150. package/dist/esm/script/index.d.ts.map +1 -1
  151. package/dist/esm/script/index.js +187 -54
  152. package/dist/esm/script/index.js.map +1 -1
  153. package/dist/esm/security/other.d.ts +92 -0
  154. package/dist/esm/security/other.d.ts.map +1 -0
  155. package/dist/esm/security/other.js +211 -0
  156. package/dist/esm/security/other.js.map +1 -0
  157. package/dist/esm/session/bars.d.ts +10 -1
  158. package/dist/esm/session/bars.d.ts.map +1 -1
  159. package/dist/esm/session/bars.js +26 -1
  160. package/dist/esm/session/bars.js.map +1 -1
  161. package/dist/esm/session/calendar.d.ts +4 -1
  162. package/dist/esm/session/calendar.d.ts.map +1 -1
  163. package/dist/esm/session/calendar.js +23 -7
  164. package/dist/esm/session/calendar.js.map +1 -1
  165. package/dist/esm/session/context.d.ts +22 -5
  166. package/dist/esm/session/context.d.ts.map +1 -1
  167. package/dist/esm/session/context.js +86 -10
  168. package/dist/esm/session/context.js.map +1 -1
  169. package/dist/esm/str/floatingdecimal.d.ts +31 -0
  170. package/dist/esm/str/floatingdecimal.d.ts.map +1 -0
  171. package/dist/esm/str/floatingdecimal.js +272 -0
  172. package/dist/esm/str/floatingdecimal.js.map +1 -0
  173. package/dist/esm/str/index.d.ts +4 -3
  174. package/dist/esm/str/index.d.ts.map +1 -1
  175. package/dist/esm/str/index.js +6 -5
  176. package/dist/esm/str/index.js.map +1 -1
  177. package/dist/esm/str/numberformat.d.ts +6 -4
  178. package/dist/esm/str/numberformat.d.ts.map +1 -1
  179. package/dist/esm/str/numberformat.js +9 -5
  180. package/dist/esm/str/numberformat.js.map +1 -1
  181. package/dist/esm/ta/index.d.ts +64 -45
  182. package/dist/esm/ta/index.d.ts.map +1 -1
  183. package/dist/esm/ta/index.js +198 -228
  184. package/dist/esm/ta/index.js.map +1 -1
  185. package/dist/esm/ta/limits.d.ts +11 -0
  186. package/dist/esm/ta/limits.d.ts.map +1 -1
  187. package/dist/esm/ta/limits.js +27 -2
  188. package/dist/esm/ta/limits.js.map +1 -1
  189. package/dist/esm/ta/running-sum.js +1 -1
  190. package/dist/esm/ta/running-sum.js.map +1 -1
  191. package/dist/esm/ta-series.d.ts +1 -1
  192. package/dist/esm/ta-series.d.ts.map +1 -1
  193. package/dist/esm/ta-series.js +2 -1
  194. package/dist/esm/ta-series.js.map +1 -1
  195. package/dist/esm/table/index.d.ts +10 -3
  196. package/dist/esm/table/index.d.ts.map +1 -1
  197. package/dist/esm/table/index.js +23 -3
  198. package/dist/esm/table/index.js.map +1 -1
  199. package/dist/esm/time/session.d.ts +9 -0
  200. package/dist/esm/time/session.d.ts.map +1 -1
  201. package/dist/esm/time/session.js +53 -15
  202. package/dist/esm/time/session.js.map +1 -1
  203. package/dist/esm/time/timezone.d.ts +6 -1
  204. package/dist/esm/time/timezone.d.ts.map +1 -1
  205. package/dist/esm/time/timezone.js +8 -2
  206. package/dist/esm/time/timezone.js.map +1 -1
  207. package/dist/esm/types/metadata.d.ts +1 -1
  208. package/dist/esm/types/metadata.d.ts.map +1 -1
  209. package/package.json +1 -1
  210. package/src/array/index.ts +11 -3
  211. package/src/box/index.ts +6 -6
  212. package/src/callsite/index.ts +6 -3
  213. package/src/drawing/registry.ts +30 -7
  214. package/src/index.ts +16 -3
  215. package/src/input.ts +18 -1
  216. package/src/label/index.ts +3 -3
  217. package/src/line/index.ts +20 -68
  218. package/src/linefill/index.ts +20 -1
  219. package/src/runtime/adapters/SimpleInputAdapter.ts +1 -1
  220. package/src/runtime/index.ts +1 -0
  221. package/src/runtime/inputs.ts +16 -0
  222. package/src/runtime/types.ts +1 -1
  223. package/src/script/index.ts +262 -58
  224. package/src/security/other.ts +269 -0
  225. package/src/session/bars.ts +24 -1
  226. package/src/session/calendar.ts +26 -7
  227. package/src/session/context.ts +104 -10
  228. package/src/str/floatingdecimal.ts +268 -0
  229. package/src/str/index.ts +6 -5
  230. package/src/str/numberformat.ts +11 -6
  231. package/src/ta/index.ts +200 -225
  232. package/src/ta/limits.ts +28 -1
  233. package/src/ta/running-sum.ts +1 -1
  234. package/src/ta-series.ts +3 -2
  235. package/src/table/index.ts +22 -3
  236. package/src/time/session.ts +58 -16
  237. package/src/time/timezone.ts +9 -2
  238. 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,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 (!Number.isNaN(x)) values.push(x);
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 (!Number.isNaN(x)) {
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 (!Number.isNaN(v) && !Number.isNaN(prev)) count = step(v, prev) ? count + 1 : 0;
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 (!Number.isNaN(x)) {
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 || Number.isNaN(currentValue)) {
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 range2 = highestValues[i] - lo;
720
- if (!Number.isNaN(value) && !Number.isNaN(range2) && range2 !== 0) previous = 100 * (value - lo) / range2;
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 (!Number.isNaN(x) && !(x <= best)) best = x;
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 (!Number.isNaN(x) && !(x >= best)) best = x;
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 (!Number.isNaN(v)) seen.push(v);
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("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]);
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
- 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;
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
- 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;
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 * 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;
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 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;
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;