oakscriptjs 0.10.1 → 0.11.0

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 (177) hide show
  1. package/dist/cjs/box/index.d.ts.map +1 -1
  2. package/dist/cjs/box/index.js +7 -1
  3. package/dist/cjs/box/index.js.map +2 -2
  4. package/dist/cjs/callsite/index.d.ts +73 -32
  5. package/dist/cjs/callsite/index.d.ts.map +1 -1
  6. package/dist/cjs/callsite/index.js +69 -65
  7. package/dist/cjs/callsite/index.js.map +2 -2
  8. package/dist/cjs/drawing/registry.d.ts +75 -0
  9. package/dist/cjs/drawing/registry.d.ts.map +1 -1
  10. package/dist/cjs/drawing/registry.js +139 -6
  11. package/dist/cjs/drawing/registry.js.map +2 -2
  12. package/dist/cjs/index.d.ts +6 -1
  13. package/dist/cjs/index.d.ts.map +1 -1
  14. package/dist/cjs/index.js +28 -1
  15. package/dist/cjs/index.js.map +2 -2
  16. package/dist/cjs/label/index.d.ts.map +1 -1
  17. package/dist/cjs/label/index.js +3 -0
  18. package/dist/cjs/label/index.js.map +2 -2
  19. package/dist/cjs/line/index.d.ts.map +1 -1
  20. package/dist/cjs/line/index.js +7 -1
  21. package/dist/cjs/line/index.js.map +2 -2
  22. package/dist/cjs/math/index.d.ts.map +1 -1
  23. package/dist/cjs/math/index.js +2 -0
  24. package/dist/cjs/math/index.js.map +2 -2
  25. package/dist/cjs/polyline/index.d.ts.map +1 -1
  26. package/dist/cjs/polyline/index.js +3 -0
  27. package/dist/cjs/polyline/index.js.map +2 -2
  28. package/dist/cjs/script/index.d.ts +30 -13
  29. package/dist/cjs/script/index.d.ts.map +1 -1
  30. package/dist/cjs/script/index.js +48 -9
  31. package/dist/cjs/script/index.js.map +3 -3
  32. package/dist/cjs/session/bars.d.ts +15 -1
  33. package/dist/cjs/session/bars.d.ts.map +1 -1
  34. package/dist/cjs/session/bars.js +41 -6
  35. package/dist/cjs/session/bars.js.map +3 -3
  36. package/dist/cjs/session/calendar.d.ts +9 -1
  37. package/dist/cjs/session/calendar.d.ts.map +1 -1
  38. package/dist/cjs/session/calendar.js +28 -2
  39. package/dist/cjs/session/calendar.js.map +2 -2
  40. package/dist/cjs/session/context.d.ts +75 -0
  41. package/dist/cjs/session/context.d.ts.map +1 -0
  42. package/dist/cjs/session/context.js +113 -0
  43. package/dist/cjs/session/context.js.map +7 -0
  44. package/dist/cjs/str/index.d.ts +3 -1
  45. package/dist/cjs/str/index.d.ts.map +1 -1
  46. package/dist/cjs/str/index.js +2 -1
  47. package/dist/cjs/str/index.js.map +2 -2
  48. package/dist/cjs/str/numberformat.d.ts +4 -2
  49. package/dist/cjs/str/numberformat.d.ts.map +1 -1
  50. package/dist/cjs/str/numberformat.js +1 -1
  51. package/dist/cjs/str/numberformat.js.map +2 -2
  52. package/dist/cjs/ta/index.d.ts +33 -17
  53. package/dist/cjs/ta/index.d.ts.map +1 -1
  54. package/dist/cjs/ta/index.js +70 -29
  55. package/dist/cjs/ta/index.js.map +2 -2
  56. package/dist/cjs/ta/limits.d.ts +24 -0
  57. package/dist/cjs/ta/limits.d.ts.map +1 -0
  58. package/dist/cjs/ta/limits.js +50 -0
  59. package/dist/cjs/ta/limits.js.map +7 -0
  60. package/dist/cjs/ta/running-sum.d.ts +0 -16
  61. package/dist/cjs/ta/running-sum.d.ts.map +1 -1
  62. package/dist/cjs/ta/running-sum.js +2 -0
  63. package/dist/cjs/ta/running-sum.js.map +2 -2
  64. package/dist/cjs/ta-series.d.ts +7 -7
  65. package/dist/cjs/ta-series.d.ts.map +1 -1
  66. package/dist/cjs/ta-series.js +9 -7
  67. package/dist/cjs/ta-series.js.map +2 -2
  68. package/dist/cjs/time/index.d.ts +5 -2
  69. package/dist/cjs/time/index.d.ts.map +1 -1
  70. package/dist/cjs/time/index.js +2 -2
  71. package/dist/cjs/time/index.js.map +2 -2
  72. package/dist/cjs/time/session.d.ts +17 -1
  73. package/dist/cjs/time/session.d.ts.map +1 -1
  74. package/dist/cjs/time/session.js +61 -7
  75. package/dist/cjs/time/session.js.map +2 -2
  76. package/dist/cjs/types/metadata.d.ts +27 -3
  77. package/dist/cjs/types/metadata.d.ts.map +1 -1
  78. package/dist/cjs/types/metadata.js.map +1 -1
  79. package/dist/esm/box/index.d.ts.map +1 -1
  80. package/dist/esm/box/index.js +8 -2
  81. package/dist/esm/box/index.js.map +1 -1
  82. package/dist/esm/callsite/index.d.ts +73 -32
  83. package/dist/esm/callsite/index.d.ts.map +1 -1
  84. package/dist/esm/callsite/index.js +143 -106
  85. package/dist/esm/callsite/index.js.map +1 -1
  86. package/dist/esm/drawing/registry.d.ts +75 -0
  87. package/dist/esm/drawing/registry.d.ts.map +1 -1
  88. package/dist/esm/drawing/registry.js +237 -6
  89. package/dist/esm/drawing/registry.js.map +1 -1
  90. package/dist/esm/index.d.ts +6 -1
  91. package/dist/esm/index.d.ts.map +1 -1
  92. package/dist/esm/index.js +10 -1
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/label/index.d.ts.map +1 -1
  95. package/dist/esm/label/index.js +4 -1
  96. package/dist/esm/label/index.js.map +1 -1
  97. package/dist/esm/line/index.d.ts.map +1 -1
  98. package/dist/esm/line/index.js +8 -2
  99. package/dist/esm/line/index.js.map +1 -1
  100. package/dist/esm/math/index.d.ts.map +1 -1
  101. package/dist/esm/math/index.js +3 -0
  102. package/dist/esm/math/index.js.map +1 -1
  103. package/dist/esm/polyline/index.d.ts.map +1 -1
  104. package/dist/esm/polyline/index.js +5 -1
  105. package/dist/esm/polyline/index.js.map +1 -1
  106. package/dist/esm/script/index.d.ts +30 -13
  107. package/dist/esm/script/index.d.ts.map +1 -1
  108. package/dist/esm/script/index.js +54 -11
  109. package/dist/esm/script/index.js.map +1 -1
  110. package/dist/esm/session/bars.d.ts +15 -1
  111. package/dist/esm/session/bars.d.ts.map +1 -1
  112. package/dist/esm/session/bars.js +50 -6
  113. package/dist/esm/session/bars.js.map +1 -1
  114. package/dist/esm/session/calendar.d.ts +9 -1
  115. package/dist/esm/session/calendar.d.ts.map +1 -1
  116. package/dist/esm/session/calendar.js +35 -3
  117. package/dist/esm/session/calendar.js.map +1 -1
  118. package/dist/esm/session/context.d.ts +75 -0
  119. package/dist/esm/session/context.d.ts.map +1 -0
  120. package/dist/esm/session/context.js +122 -0
  121. package/dist/esm/session/context.js.map +1 -0
  122. package/dist/esm/str/index.d.ts +3 -1
  123. package/dist/esm/str/index.d.ts.map +1 -1
  124. package/dist/esm/str/index.js +8 -2
  125. package/dist/esm/str/index.js.map +1 -1
  126. package/dist/esm/str/numberformat.d.ts +4 -2
  127. package/dist/esm/str/numberformat.d.ts.map +1 -1
  128. package/dist/esm/str/numberformat.js +4 -2
  129. package/dist/esm/str/numberformat.js.map +1 -1
  130. package/dist/esm/ta/index.d.ts +33 -17
  131. package/dist/esm/ta/index.d.ts.map +1 -1
  132. package/dist/esm/ta/index.js +130 -56
  133. package/dist/esm/ta/index.js.map +1 -1
  134. package/dist/esm/ta/limits.d.ts +24 -0
  135. package/dist/esm/ta/limits.d.ts.map +1 -0
  136. package/dist/esm/ta/limits.js +42 -0
  137. package/dist/esm/ta/limits.js.map +1 -0
  138. package/dist/esm/ta/running-sum.d.ts +0 -16
  139. package/dist/esm/ta/running-sum.d.ts.map +1 -1
  140. package/dist/esm/ta/running-sum.js +2 -0
  141. package/dist/esm/ta/running-sum.js.map +1 -1
  142. package/dist/esm/ta-series.d.ts +7 -7
  143. package/dist/esm/ta-series.d.ts.map +1 -1
  144. package/dist/esm/ta-series.js +9 -7
  145. package/dist/esm/ta-series.js.map +1 -1
  146. package/dist/esm/time/index.d.ts +5 -2
  147. package/dist/esm/time/index.d.ts.map +1 -1
  148. package/dist/esm/time/index.js +6 -3
  149. package/dist/esm/time/index.js.map +1 -1
  150. package/dist/esm/time/session.d.ts +17 -1
  151. package/dist/esm/time/session.d.ts.map +1 -1
  152. package/dist/esm/time/session.js +97 -10
  153. package/dist/esm/time/session.js.map +1 -1
  154. package/dist/esm/types/metadata.d.ts +27 -3
  155. package/dist/esm/types/metadata.d.ts.map +1 -1
  156. package/package.json +1 -1
  157. package/src/box/index.ts +8 -2
  158. package/src/callsite/index.ts +150 -100
  159. package/src/drawing/registry.ts +255 -5
  160. package/src/index.ts +34 -1
  161. package/src/label/index.ts +4 -1
  162. package/src/line/index.ts +8 -2
  163. package/src/math/index.ts +2 -0
  164. package/src/polyline/index.ts +3 -1
  165. package/src/script/index.ts +77 -18
  166. package/src/session/bars.ts +47 -6
  167. package/src/session/calendar.ts +37 -3
  168. package/src/session/context.ts +160 -0
  169. package/src/str/index.ts +7 -2
  170. package/src/str/numberformat.ts +5 -3
  171. package/src/ta/index.ts +148 -66
  172. package/src/ta/limits.ts +47 -0
  173. package/src/ta/running-sum.ts +2 -0
  174. package/src/ta-series.ts +16 -14
  175. package/src/time/index.ts +6 -3
  176. package/src/time/session.ts +89 -9
  177. package/src/types/metadata.ts +27 -3
@@ -91,12 +91,14 @@ __export(ta_exports, {
91
91
  module.exports = __toCommonJS(ta_exports);
92
92
  var import_compare = require("../compare/index.js");
93
93
  var import_running_sum = require("./running-sum.js");
94
+ var import_limits = require("./limits.js");
94
95
  function sma(source, length) {
95
96
  if (typeof length !== "number") {
96
97
  const sums = (0, import_running_sum.runningSumSeries)(source, length, "ta.sma");
97
98
  return sums.map((sum, i) => sum / Math.floor(length[i]));
98
99
  }
99
100
  const len = Math.floor(length);
101
+ (0, import_limits.checkSumLength)("ta.sma", len, 0);
100
102
  return (0, import_running_sum.runningSum)(source, len).map((sum) => sum / len);
101
103
  }
102
104
  function ema(source, length) {
@@ -169,6 +171,7 @@ function macd(source, fastLength, slowLength, signalLength) {
169
171
  return [macdLine, signalLine, histogram];
170
172
  }
171
173
  function bb(series, length, mult) {
174
+ (0, import_limits.checkSumLength)("ta.bb", length, 0);
172
175
  const basis = sma(series, length);
173
176
  const dev2 = stdev(series, length);
174
177
  const upper = [];
@@ -190,9 +193,9 @@ function lastValues(source, i, length) {
190
193
  }
191
194
  return values.length === length ? values : null;
192
195
  }
193
- function windowExtremes(source, length, lowest2) {
196
+ function windowExtremes(source, length, lowest2, newest = false) {
194
197
  const n = source.length;
195
- const span = length > 0 ? Math.ceil(length) : 0;
198
+ const span = length > 0 ? Math.trunc(length) : 0;
196
199
  const at = new Int32Array(n).fill(-1);
197
200
  const zeros = new Uint8Array(n);
198
201
  const queue = new Int32Array(n);
@@ -210,7 +213,9 @@ function windowExtremes(source, length, lowest2) {
210
213
  zeroCount = 0;
211
214
  continue;
212
215
  }
213
- while (tail > head && (lowest2 ? source[queue[tail - 1]] > x : source[queue[tail - 1]] < x)) {
216
+ while (tail > head) {
217
+ const last = source[queue[tail - 1]];
218
+ if (!(lowest2 ? last > x : last < x) && !(newest && last === x)) break;
214
219
  if (isPreferredZero(queue[--tail])) zeroCount--;
215
220
  }
216
221
  queue[tail++] = i;
@@ -226,16 +231,57 @@ function windowExtremes(source, length, lowest2) {
226
231
  }
227
232
  return { at, zeros };
228
233
  }
234
+ function keptValues(source) {
235
+ const values = [];
236
+ const bars = [];
237
+ const last = new Int32Array(source.length);
238
+ for (let i = 0; i < source.length; i++) {
239
+ const x = source[i];
240
+ if (!Number.isNaN(x)) {
241
+ values.push(x);
242
+ bars.push(i);
243
+ }
244
+ last[i] = values.length - 1;
245
+ }
246
+ return { values, bars, last };
247
+ }
248
+ function extremeSeriesLength(source, lengths, lowest2, offsets) {
249
+ const name = (lowest2 ? "lowest" : "highest") + (offsets ? "bars" : "");
250
+ const { values, bars, last } = keptValues(source);
251
+ return Array.from(source, (_, i) => {
252
+ const len = Math.trunc(lengths[i]);
253
+ (0, import_limits.checkWindowLength)(name, len, i);
254
+ const k = last[i];
255
+ if (!(len >= 1) || i < len - 1 || k < 0) return NaN;
256
+ let best = k;
257
+ for (let j = k - 1; j >= 0 && j > k - len; j--) {
258
+ if (lowest2 ? values[j] < values[best] : values[j] > values[best]) best = j;
259
+ }
260
+ return offsets ? -(i - bars[best]) : values[best];
261
+ });
262
+ }
229
263
  function extremeOffset(source, length, lowest2) {
230
- const { at } = windowExtremes(source, length, lowest2);
231
- return source.map((_, i) => i < length - 1 ? NaN : at[i] < 0 ? 0 : -(i - at[i]));
264
+ if (typeof length !== "number") return extremeSeriesLength(source, length, lowest2, true);
265
+ (0, import_limits.checkWindowLength)(lowest2 ? "lowestbars" : "highestbars", length, 0);
266
+ const { values, bars, last } = keptValues(source);
267
+ const { at } = windowExtremes(values, length, lowest2, true);
268
+ const len = Math.trunc(length);
269
+ return source.map((_, i) => {
270
+ const k = last[i];
271
+ return i < len - 1 || k < 0 || at[k] < 0 ? NaN : -(i - bars[at[k]]);
272
+ });
232
273
  }
233
274
  function extremeValue(source, length, lowest2) {
234
- const { at, zeros } = windowExtremes(source, length, lowest2);
275
+ if (typeof length !== "number") return extremeSeriesLength(source, length, lowest2, false);
276
+ (0, import_limits.checkWindowLength)(lowest2 ? "lowest" : "highest", length, 0);
277
+ const { values, last } = keptValues(source);
278
+ const { at, zeros } = windowExtremes(values, length, lowest2);
279
+ const len = Math.trunc(length);
235
280
  return source.map((_, i) => {
236
- if (i < length - 1 || at[i] < 0) return NaN;
237
- const v = source[at[i]];
238
- return v === 0 && zeros[i] ? lowest2 ? -0 : 0 : v;
281
+ const k = last[i];
282
+ if (i < len - 1 || k < 0 || at[k] < 0) return NaN;
283
+ const v = values[at[k]];
284
+ return v === 0 && zeros[k] ? lowest2 ? -0 : 0 : v;
239
285
  });
240
286
  }
241
287
  function crossTest(series1, series2, test) {
@@ -392,7 +438,7 @@ function wmaAdd(a, b) {
392
438
  }
393
439
  function wma(source, length) {
394
440
  const result = [];
395
- const len = Math.floor(length);
441
+ const fixed = typeof length === "number" ? Math.floor(length) : NaN;
396
442
  const filled = [];
397
443
  let last = NaN;
398
444
  let count = 0;
@@ -404,7 +450,8 @@ function wma(source, length) {
404
450
  count++;
405
451
  }
406
452
  filled.push(last);
407
- if (isNa || count < len) {
453
+ const len = typeof length === "number" ? fixed : Math.floor(length[i]);
454
+ if (isNa || !(len >= 1) || count < len) {
408
455
  result.push(NaN);
409
456
  continue;
410
457
  }
@@ -516,6 +563,7 @@ function varianceOf(source, length, biased, name) {
516
563
  return biased ? result : result.map((v, i) => Math.floor(length[i]) > 1 ? v : NaN);
517
564
  }
518
565
  const len = Math.floor(length);
566
+ (0, import_limits.checkSumLength)(name, len, 0);
519
567
  if ((biased ? len : len - 1) <= 0) return source.map(() => NaN);
520
568
  return (0, import_running_sum.runningVariance)(source, len, biased);
521
569
  }
@@ -789,24 +837,17 @@ function sar(start, inc, max2, high, low, close) {
789
837
  return result;
790
838
  }
791
839
  function pivot(source, leftbars, rightbars, isHigh) {
792
- const beatsLeft = isHigh ? (x, v) => x > v : (x, v) => x < v;
793
- const beatsRight = isHigh ? (x, v) => x >= v : (x, v) => x <= v;
794
- return source.map((_, i) => {
795
- const center = i - rightbars;
796
- if (center - leftbars < 0) return NaN;
797
- const v = source[center];
798
- if (Number.isNaN(v)) return NaN;
799
- for (let j = 1; j <= leftbars; j++) {
800
- const x = source[center - j];
801
- if (Number.isNaN(x)) break;
802
- if (beatsLeft(x, v)) return NaN;
803
- }
804
- for (let j = 1; j <= rightbars; j++) {
805
- const x = source[center + j];
806
- if (Number.isNaN(x)) break;
807
- if (beatsRight(x, v)) return NaN;
808
- }
809
- return v;
840
+ const { values, bars, last } = keptValues(source);
841
+ return Array.from(source, (_, i) => {
842
+ const left = Math.trunc(typeof leftbars === "number" ? leftbars : leftbars[i]);
843
+ const right = Math.trunc(typeof rightbars === "number" ? rightbars : rightbars[i]);
844
+ const k = last[i];
845
+ if (!(i >= left + right) || k < 0) return NaN;
846
+ let best = k;
847
+ for (let j = k - 1; j >= 0 && j >= k - left - right; j--) {
848
+ if (isHigh ? values[j] > values[best] : values[j] < values[best]) best = j;
849
+ }
850
+ return bars[best] === i - right ? values[best] : NaN;
810
851
  });
811
852
  }
812
853
  function pivothigh(sourceOrLeftbars, leftbarsOrRightbars, rightbars, high) {