oakscriptjs 0.10.1 → 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 (271) 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.d.ts.map +1 -1
  6. package/dist/cjs/box/index.js +7 -1
  7. package/dist/cjs/box/index.js.map +2 -2
  8. package/dist/cjs/callsite/index.d.ts +73 -32
  9. package/dist/cjs/callsite/index.d.ts.map +1 -1
  10. package/dist/cjs/callsite/index.js +69 -65
  11. package/dist/cjs/callsite/index.js.map +2 -2
  12. package/dist/cjs/drawing/registry.d.ts +84 -0
  13. package/dist/cjs/drawing/registry.d.ts.map +1 -1
  14. package/dist/cjs/drawing/registry.js +153 -6
  15. package/dist/cjs/drawing/registry.js.map +2 -2
  16. package/dist/cjs/index.d.ts +8 -2
  17. package/dist/cjs/index.d.ts.map +1 -1
  18. package/dist/cjs/index.js +33 -1
  19. package/dist/cjs/index.js.map +2 -2
  20. package/dist/cjs/input.d.ts +9 -1
  21. package/dist/cjs/input.d.ts.map +1 -1
  22. package/dist/cjs/input.js +16 -0
  23. package/dist/cjs/input.js.map +2 -2
  24. package/dist/cjs/label/index.d.ts.map +1 -1
  25. package/dist/cjs/label/index.js +3 -0
  26. package/dist/cjs/label/index.js.map +2 -2
  27. package/dist/cjs/line/index.d.ts +10 -27
  28. package/dist/cjs/line/index.d.ts.map +1 -1
  29. package/dist/cjs/line/index.js +11 -22
  30. package/dist/cjs/line/index.js.map +2 -2
  31. package/dist/cjs/linefill/index.d.ts +3 -0
  32. package/dist/cjs/linefill/index.d.ts.map +1 -1
  33. package/dist/cjs/linefill/index.js +15 -1
  34. package/dist/cjs/linefill/index.js.map +3 -3
  35. package/dist/cjs/math/index.d.ts.map +1 -1
  36. package/dist/cjs/math/index.js +2 -0
  37. package/dist/cjs/math/index.js.map +2 -2
  38. package/dist/cjs/polyline/index.d.ts.map +1 -1
  39. package/dist/cjs/polyline/index.js +3 -0
  40. package/dist/cjs/polyline/index.js.map +2 -2
  41. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +1 -1
  42. package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +2 -2
  43. package/dist/cjs/runtime/index.d.ts +1 -1
  44. package/dist/cjs/runtime/index.d.ts.map +1 -1
  45. package/dist/cjs/runtime/index.js +1 -0
  46. package/dist/cjs/runtime/index.js.map +2 -2
  47. package/dist/cjs/runtime/inputs.d.ts +9 -0
  48. package/dist/cjs/runtime/inputs.d.ts.map +1 -1
  49. package/dist/cjs/runtime/inputs.js +8 -0
  50. package/dist/cjs/runtime/inputs.js.map +2 -2
  51. package/dist/cjs/runtime/types.d.ts +1 -1
  52. package/dist/cjs/runtime/types.d.ts.map +1 -1
  53. package/dist/cjs/runtime/types.js.map +1 -1
  54. package/dist/cjs/script/index.d.ts +91 -21
  55. package/dist/cjs/script/index.d.ts.map +1 -1
  56. package/dist/cjs/script/index.js +207 -19
  57. package/dist/cjs/script/index.js.map +3 -3
  58. package/dist/cjs/security/other.d.ts +92 -0
  59. package/dist/cjs/security/other.d.ts.map +1 -0
  60. package/dist/cjs/security/other.js +164 -0
  61. package/dist/cjs/security/other.js.map +7 -0
  62. package/dist/cjs/session/bars.d.ts +24 -1
  63. package/dist/cjs/session/bars.d.ts.map +1 -1
  64. package/dist/cjs/session/bars.js +56 -7
  65. package/dist/cjs/session/bars.js.map +3 -3
  66. package/dist/cjs/session/calendar.d.ts +13 -2
  67. package/dist/cjs/session/calendar.d.ts.map +1 -1
  68. package/dist/cjs/session/calendar.js +39 -9
  69. package/dist/cjs/session/calendar.js.map +2 -2
  70. package/dist/cjs/session/context.d.ts +76 -0
  71. package/dist/cjs/session/context.d.ts.map +1 -0
  72. package/dist/cjs/session/context.js +114 -0
  73. package/dist/cjs/session/context.js.map +7 -0
  74. package/dist/cjs/str/floatingdecimal.d.ts +31 -0
  75. package/dist/cjs/str/floatingdecimal.d.ts.map +1 -0
  76. package/dist/cjs/str/floatingdecimal.js +298 -0
  77. package/dist/cjs/str/floatingdecimal.js.map +7 -0
  78. package/dist/cjs/str/index.d.ts +4 -1
  79. package/dist/cjs/str/index.d.ts.map +1 -1
  80. package/dist/cjs/str/index.js +2 -1
  81. package/dist/cjs/str/index.js.map +2 -2
  82. package/dist/cjs/str/numberformat.d.ts +7 -3
  83. package/dist/cjs/str/numberformat.d.ts.map +1 -1
  84. package/dist/cjs/str/numberformat.js +4 -3
  85. package/dist/cjs/str/numberformat.js.map +2 -2
  86. package/dist/cjs/ta/index.d.ts +67 -34
  87. package/dist/cjs/ta/index.d.ts.map +1 -1
  88. package/dist/cjs/ta/index.js +202 -145
  89. package/dist/cjs/ta/index.js.map +2 -2
  90. package/dist/cjs/ta/limits.d.ts +35 -0
  91. package/dist/cjs/ta/limits.d.ts.map +1 -0
  92. package/dist/cjs/ta/limits.js +64 -0
  93. package/dist/cjs/ta/limits.js.map +7 -0
  94. package/dist/cjs/ta/running-sum.d.ts +0 -16
  95. package/dist/cjs/ta/running-sum.d.ts.map +1 -1
  96. package/dist/cjs/ta/running-sum.js +2 -0
  97. package/dist/cjs/ta/running-sum.js.map +2 -2
  98. package/dist/cjs/ta-series.d.ts +8 -8
  99. package/dist/cjs/ta-series.d.ts.map +1 -1
  100. package/dist/cjs/ta-series.js +10 -8
  101. package/dist/cjs/ta-series.js.map +2 -2
  102. package/dist/cjs/table/index.d.ts +3 -1
  103. package/dist/cjs/table/index.d.ts.map +1 -1
  104. package/dist/cjs/table/index.js +1 -0
  105. package/dist/cjs/table/index.js.map +3 -3
  106. package/dist/cjs/time/index.d.ts +5 -2
  107. package/dist/cjs/time/index.d.ts.map +1 -1
  108. package/dist/cjs/time/index.js +2 -2
  109. package/dist/cjs/time/index.js.map +2 -2
  110. package/dist/cjs/time/session.d.ts +26 -1
  111. package/dist/cjs/time/session.d.ts.map +1 -1
  112. package/dist/cjs/time/session.js +94 -12
  113. package/dist/cjs/time/session.js.map +3 -3
  114. package/dist/cjs/time/timezone.d.ts +6 -1
  115. package/dist/cjs/time/timezone.d.ts.map +1 -1
  116. package/dist/cjs/time/timezone.js +2 -2
  117. package/dist/cjs/time/timezone.js.map +2 -2
  118. package/dist/cjs/types/metadata.d.ts +28 -4
  119. package/dist/cjs/types/metadata.d.ts.map +1 -1
  120. package/dist/cjs/types/metadata.js.map +1 -1
  121. package/dist/esm/array/index.d.ts +8 -2
  122. package/dist/esm/array/index.d.ts.map +1 -1
  123. package/dist/esm/array/index.js +12 -3
  124. package/dist/esm/array/index.js.map +1 -1
  125. package/dist/esm/box/index.d.ts.map +1 -1
  126. package/dist/esm/box/index.js +8 -2
  127. package/dist/esm/box/index.js.map +1 -1
  128. package/dist/esm/callsite/index.d.ts +73 -32
  129. package/dist/esm/callsite/index.d.ts.map +1 -1
  130. package/dist/esm/callsite/index.js +143 -106
  131. package/dist/esm/callsite/index.js.map +1 -1
  132. package/dist/esm/drawing/registry.d.ts +84 -0
  133. package/dist/esm/drawing/registry.d.ts.map +1 -1
  134. package/dist/esm/drawing/registry.js +260 -6
  135. package/dist/esm/drawing/registry.js.map +1 -1
  136. package/dist/esm/index.d.ts +8 -2
  137. package/dist/esm/index.d.ts.map +1 -1
  138. package/dist/esm/index.js +13 -2
  139. package/dist/esm/index.js.map +1 -1
  140. package/dist/esm/input.d.ts +9 -1
  141. package/dist/esm/input.d.ts.map +1 -1
  142. package/dist/esm/input.js +16 -0
  143. package/dist/esm/input.js.map +1 -1
  144. package/dist/esm/label/index.d.ts.map +1 -1
  145. package/dist/esm/label/index.js +4 -1
  146. package/dist/esm/label/index.js.map +1 -1
  147. package/dist/esm/line/index.d.ts +10 -27
  148. package/dist/esm/line/index.d.ts.map +1 -1
  149. package/dist/esm/line/index.js +22 -60
  150. package/dist/esm/line/index.js.map +1 -1
  151. package/dist/esm/linefill/index.d.ts +3 -0
  152. package/dist/esm/linefill/index.d.ts.map +1 -1
  153. package/dist/esm/linefill/index.js +20 -1
  154. package/dist/esm/linefill/index.js.map +1 -1
  155. package/dist/esm/math/index.d.ts.map +1 -1
  156. package/dist/esm/math/index.js +3 -0
  157. package/dist/esm/math/index.js.map +1 -1
  158. package/dist/esm/polyline/index.d.ts.map +1 -1
  159. package/dist/esm/polyline/index.js +5 -1
  160. package/dist/esm/polyline/index.js.map +1 -1
  161. package/dist/esm/runtime/adapters/SimpleInputAdapter.js +1 -1
  162. package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -1
  163. package/dist/esm/runtime/index.d.ts +1 -1
  164. package/dist/esm/runtime/index.d.ts.map +1 -1
  165. package/dist/esm/runtime/index.js +1 -1
  166. package/dist/esm/runtime/index.js.map +1 -1
  167. package/dist/esm/runtime/inputs.d.ts +9 -0
  168. package/dist/esm/runtime/inputs.d.ts.map +1 -1
  169. package/dist/esm/runtime/inputs.js +15 -0
  170. package/dist/esm/runtime/inputs.js.map +1 -1
  171. package/dist/esm/runtime/types.d.ts +1 -1
  172. package/dist/esm/runtime/types.d.ts.map +1 -1
  173. package/dist/esm/script/index.d.ts +91 -21
  174. package/dist/esm/script/index.d.ts.map +1 -1
  175. package/dist/esm/script/index.js +259 -28
  176. package/dist/esm/script/index.js.map +1 -1
  177. package/dist/esm/security/other.d.ts +92 -0
  178. package/dist/esm/security/other.d.ts.map +1 -0
  179. package/dist/esm/security/other.js +211 -0
  180. package/dist/esm/security/other.js.map +1 -0
  181. package/dist/esm/session/bars.d.ts +24 -1
  182. package/dist/esm/session/bars.d.ts.map +1 -1
  183. package/dist/esm/session/bars.js +75 -6
  184. package/dist/esm/session/bars.js.map +1 -1
  185. package/dist/esm/session/calendar.d.ts +13 -2
  186. package/dist/esm/session/calendar.d.ts.map +1 -1
  187. package/dist/esm/session/calendar.js +54 -10
  188. package/dist/esm/session/calendar.js.map +1 -1
  189. package/dist/esm/session/context.d.ts +76 -0
  190. package/dist/esm/session/context.d.ts.map +1 -0
  191. package/dist/esm/session/context.js +124 -0
  192. package/dist/esm/session/context.js.map +1 -0
  193. package/dist/esm/str/floatingdecimal.d.ts +31 -0
  194. package/dist/esm/str/floatingdecimal.d.ts.map +1 -0
  195. package/dist/esm/str/floatingdecimal.js +272 -0
  196. package/dist/esm/str/floatingdecimal.js.map +1 -0
  197. package/dist/esm/str/index.d.ts +4 -1
  198. package/dist/esm/str/index.d.ts.map +1 -1
  199. package/dist/esm/str/index.js +9 -2
  200. package/dist/esm/str/index.js.map +1 -1
  201. package/dist/esm/str/numberformat.d.ts +7 -3
  202. package/dist/esm/str/numberformat.d.ts.map +1 -1
  203. package/dist/esm/str/numberformat.js +11 -5
  204. package/dist/esm/str/numberformat.js.map +1 -1
  205. package/dist/esm/ta/index.d.ts +67 -34
  206. package/dist/esm/ta/index.d.ts.map +1 -1
  207. package/dist/esm/ta/index.js +284 -240
  208. package/dist/esm/ta/index.js.map +1 -1
  209. package/dist/esm/ta/limits.d.ts +35 -0
  210. package/dist/esm/ta/limits.d.ts.map +1 -0
  211. package/dist/esm/ta/limits.js +67 -0
  212. package/dist/esm/ta/limits.js.map +1 -0
  213. package/dist/esm/ta/running-sum.d.ts +0 -16
  214. package/dist/esm/ta/running-sum.d.ts.map +1 -1
  215. package/dist/esm/ta/running-sum.js +2 -0
  216. package/dist/esm/ta/running-sum.js.map +1 -1
  217. package/dist/esm/ta-series.d.ts +8 -8
  218. package/dist/esm/ta-series.d.ts.map +1 -1
  219. package/dist/esm/ta-series.js +11 -8
  220. package/dist/esm/ta-series.js.map +1 -1
  221. package/dist/esm/table/index.d.ts +3 -1
  222. package/dist/esm/table/index.d.ts.map +1 -1
  223. package/dist/esm/table/index.js +6 -1
  224. package/dist/esm/table/index.js.map +1 -1
  225. package/dist/esm/time/index.d.ts +5 -2
  226. package/dist/esm/time/index.d.ts.map +1 -1
  227. package/dist/esm/time/index.js +6 -3
  228. package/dist/esm/time/index.js.map +1 -1
  229. package/dist/esm/time/session.d.ts +26 -1
  230. package/dist/esm/time/session.d.ts.map +1 -1
  231. package/dist/esm/time/session.js +141 -16
  232. package/dist/esm/time/session.js.map +1 -1
  233. package/dist/esm/time/timezone.d.ts +6 -1
  234. package/dist/esm/time/timezone.d.ts.map +1 -1
  235. package/dist/esm/time/timezone.js +8 -2
  236. package/dist/esm/time/timezone.js.map +1 -1
  237. package/dist/esm/types/metadata.d.ts +28 -4
  238. package/dist/esm/types/metadata.d.ts.map +1 -1
  239. package/package.json +1 -1
  240. package/src/array/index.ts +11 -3
  241. package/src/box/index.ts +8 -2
  242. package/src/callsite/index.ts +150 -100
  243. package/src/drawing/registry.ts +278 -5
  244. package/src/index.ts +44 -1
  245. package/src/input.ts +18 -1
  246. package/src/label/index.ts +4 -1
  247. package/src/line/index.ts +22 -64
  248. package/src/linefill/index.ts +20 -1
  249. package/src/math/index.ts +2 -0
  250. package/src/polyline/index.ts +3 -1
  251. package/src/runtime/adapters/SimpleInputAdapter.ts +1 -1
  252. package/src/runtime/index.ts +1 -0
  253. package/src/runtime/inputs.ts +16 -0
  254. package/src/runtime/types.ts +1 -1
  255. package/src/script/index.ts +355 -34
  256. package/src/security/other.ts +269 -0
  257. package/src/session/bars.ts +70 -6
  258. package/src/session/calendar.ts +60 -10
  259. package/src/session/context.ts +162 -0
  260. package/src/str/floatingdecimal.ts +268 -0
  261. package/src/str/index.ts +8 -2
  262. package/src/str/numberformat.ts +13 -6
  263. package/src/ta/index.ts +304 -248
  264. package/src/ta/limits.ts +74 -0
  265. package/src/ta/running-sum.ts +2 -0
  266. package/src/ta-series.ts +19 -16
  267. package/src/table/index.ts +4 -1
  268. package/src/time/index.ts +6 -3
  269. package/src/time/session.ts +137 -15
  270. package/src/time/timezone.ts +9 -2
  271. package/src/types/metadata.ts +28 -4
@@ -91,15 +91,18 @@ __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) {
105
+ (0, import_limits.checkPositiveLength)("ema", length, 0);
103
106
  const result = [];
104
107
  const len = Math.floor(length);
105
108
  const multiplier = 2 / (len + 1);
@@ -132,6 +135,17 @@ function ema(source, length) {
132
135
  return result;
133
136
  }
134
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");
135
149
  const result = [];
136
150
  const changes = [];
137
151
  for (let i = 1; i < source.length; i++) {
@@ -169,6 +183,7 @@ function macd(source, fastLength, slowLength, signalLength) {
169
183
  return [macdLine, signalLine, histogram];
170
184
  }
171
185
  function bb(series, length, mult) {
186
+ (0, import_limits.checkSumLength)("ta.bb", length, 0);
172
187
  const basis = sma(series, length);
173
188
  const dev2 = stdev(series, length);
174
189
  const upper = [];
@@ -190,9 +205,9 @@ function lastValues(source, i, length) {
190
205
  }
191
206
  return values.length === length ? values : null;
192
207
  }
193
- function windowExtremes(source, length, lowest2) {
208
+ function windowExtremes(source, length, lowest2, newest = false) {
194
209
  const n = source.length;
195
- const span = length > 0 ? Math.ceil(length) : 0;
210
+ const span = length > 0 ? Math.trunc(length) : 0;
196
211
  const at = new Int32Array(n).fill(-1);
197
212
  const zeros = new Uint8Array(n);
198
213
  const queue = new Int32Array(n);
@@ -210,7 +225,9 @@ function windowExtremes(source, length, lowest2) {
210
225
  zeroCount = 0;
211
226
  continue;
212
227
  }
213
- while (tail > head && (lowest2 ? source[queue[tail - 1]] > x : source[queue[tail - 1]] < x)) {
228
+ while (tail > head) {
229
+ const last = source[queue[tail - 1]];
230
+ if (!(lowest2 ? last > x : last < x) && !(newest && last === x)) break;
214
231
  if (isPreferredZero(queue[--tail])) zeroCount--;
215
232
  }
216
233
  queue[tail++] = i;
@@ -226,16 +243,57 @@ function windowExtremes(source, length, lowest2) {
226
243
  }
227
244
  return { at, zeros };
228
245
  }
246
+ function keptValues(source) {
247
+ const values = [];
248
+ const bars = [];
249
+ const last = new Int32Array(source.length);
250
+ for (let i = 0; i < source.length; i++) {
251
+ const x = source[i];
252
+ if (!Number.isNaN(x)) {
253
+ values.push(x);
254
+ bars.push(i);
255
+ }
256
+ last[i] = values.length - 1;
257
+ }
258
+ return { values, bars, last };
259
+ }
260
+ function extremeSeriesLength(source, lengths, lowest2, offsets) {
261
+ const name = (lowest2 ? "lowest" : "highest") + (offsets ? "bars" : "");
262
+ const { values, bars, last } = keptValues(source);
263
+ return Array.from(source, (_, i) => {
264
+ const len = Math.trunc(lengths[i]);
265
+ (0, import_limits.checkWindowLength)(name, len, i);
266
+ const k = last[i];
267
+ if (!(len >= 1) || i < len - 1 || k < 0) return NaN;
268
+ let best = k;
269
+ for (let j = k - 1; j >= 0 && j > k - len; j--) {
270
+ if (lowest2 ? values[j] < values[best] : values[j] > values[best]) best = j;
271
+ }
272
+ return offsets ? -(i - bars[best]) : values[best];
273
+ });
274
+ }
229
275
  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]));
276
+ if (typeof length !== "number") return extremeSeriesLength(source, length, lowest2, true);
277
+ (0, import_limits.checkWindowLength)(lowest2 ? "lowestbars" : "highestbars", length, 0);
278
+ const { values, bars, last } = keptValues(source);
279
+ const { at } = windowExtremes(values, length, lowest2, true);
280
+ const len = Math.trunc(length);
281
+ return source.map((_, i) => {
282
+ const k = last[i];
283
+ return i < len - 1 || k < 0 || at[k] < 0 ? NaN : -(i - bars[at[k]]);
284
+ });
232
285
  }
233
286
  function extremeValue(source, length, lowest2) {
234
- const { at, zeros } = windowExtremes(source, length, lowest2);
287
+ if (typeof length !== "number") return extremeSeriesLength(source, length, lowest2, false);
288
+ (0, import_limits.checkWindowLength)(lowest2 ? "lowest" : "highest", length, 0);
289
+ const { values, last } = keptValues(source);
290
+ const { at, zeros } = windowExtremes(values, length, lowest2);
291
+ const len = Math.trunc(length);
235
292
  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;
293
+ const k = last[i];
294
+ if (i < len - 1 || k < 0 || at[k] < 0) return NaN;
295
+ const v = values[at[k]];
296
+ return v === 0 && zeros[k] ? lowest2 ? -0 : 0 : v;
239
297
  });
240
298
  }
241
299
  function crossTest(series1, series2, test) {
@@ -260,6 +318,7 @@ function crossunder(series1, series2) {
260
318
  return crossTest(series1, series2, (a, b, pa, pb) => a < b && pa >= pb);
261
319
  }
262
320
  function change(source, length = 1) {
321
+ (0, import_limits.checkPositiveLength)("change", length, 0);
263
322
  const result = [];
264
323
  for (let i = 0; i < source.length; i++) {
265
324
  if (i < length) {
@@ -301,6 +360,7 @@ function tr(handle_na = false, high, low, close) {
301
360
  return result;
302
361
  }
303
362
  function atr(length, high, low, close) {
363
+ (0, import_limits.checkPositiveLength)("atr->rma", length, 0);
304
364
  if (!high || !low || !close) {
305
365
  throw new Error(
306
366
  "ta.atr() requires high, low, and close series. Either pass them explicitly or use createContext({ chart: { high, low, close } }) for implicit data."
@@ -356,6 +416,7 @@ function supertrend(factor, atrPeriod, high, low, close, wicks = false) {
356
416
  return [supertrendValues, directions];
357
417
  }
358
418
  function rma(source, length) {
419
+ (0, import_limits.checkPositiveLength)("rma", length, 0);
359
420
  const result = [];
360
421
  const len = Math.floor(length);
361
422
  let firstValidIndex = -1;
@@ -392,7 +453,8 @@ function wmaAdd(a, b) {
392
453
  }
393
454
  function wma(source, length) {
394
455
  const result = [];
395
- const len = Math.floor(length);
456
+ const fixed = typeof length === "number" ? Math.floor(length) : NaN;
457
+ if (typeof length === "number") (0, import_limits.checkPositiveLength)("wma", fixed, 0);
396
458
  const filled = [];
397
459
  let last = NaN;
398
460
  let count = 0;
@@ -404,7 +466,9 @@ function wma(source, length) {
404
466
  count++;
405
467
  }
406
468
  filled.push(last);
407
- if (isNa || count < len) {
469
+ const len = typeof length === "number" ? fixed : Math.floor(length[i]);
470
+ if (typeof length !== "number") (0, import_limits.checkPositiveLength)("wma", len, i);
471
+ if (isNa || !(len >= 1) || count < len) {
408
472
  result.push(NaN);
409
473
  continue;
410
474
  }
@@ -461,12 +525,15 @@ function monotonic(source, length, step) {
461
525
  return result;
462
526
  }
463
527
  function rising(source, length) {
528
+ (0, import_limits.checkPositiveLength)("rising", length, 0);
464
529
  return monotonic(source, length, import_compare.gt);
465
530
  }
466
531
  function falling(source, length) {
532
+ (0, import_limits.checkPositiveLength)("falling", length, 0);
467
533
  return monotonic(source, length, import_compare.lt);
468
534
  }
469
535
  function roc(source, length) {
536
+ (0, import_limits.checkPositiveLength)("roc", length, 0);
470
537
  const result = [];
471
538
  for (let i = 0; i < source.length; i++) {
472
539
  if (i < length) {
@@ -484,6 +551,7 @@ function roc(source, length) {
484
551
  return result;
485
552
  }
486
553
  function mom(source, length) {
554
+ (0, import_limits.checkPositiveLength)("mom", length, 0);
487
555
  const result = [];
488
556
  for (let i = 0; i < source.length; i++) {
489
557
  if (i < length) {
@@ -499,6 +567,7 @@ function mom(source, length) {
499
567
  return result;
500
568
  }
501
569
  function dev(source, length) {
570
+ (0, import_limits.checkPositiveLength)("dev", length, 0);
502
571
  const len = Math.floor(length);
503
572
  return sma(source, len).map((mean, i) => {
504
573
  if (i < len - 1 || Number.isNaN(mean)) return NaN;
@@ -516,10 +585,12 @@ function varianceOf(source, length, biased, name) {
516
585
  return biased ? result : result.map((v, i) => Math.floor(length[i]) > 1 ? v : NaN);
517
586
  }
518
587
  const len = Math.floor(length);
588
+ (0, import_limits.checkSumLength)(name, len, 0);
519
589
  if ((biased ? len : len - 1) <= 0) return source.map(() => NaN);
520
590
  return (0, import_running_sum.runningVariance)(source, len, biased);
521
591
  }
522
592
  function median(source, length) {
593
+ (0, import_limits.checkPositiveLength)("median", length, 0);
523
594
  const len = Math.floor(length);
524
595
  const n = source.length;
525
596
  const out = new Array(n).fill(NaN);
@@ -556,6 +627,7 @@ function swma(source) {
556
627
  );
557
628
  }
558
629
  function vwma(source, length, volume) {
630
+ (0, import_limits.checkPositiveLength)("vwma->sma", length, 0);
559
631
  if (!volume) {
560
632
  throw new Error(
561
633
  "ta.vwma() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
@@ -578,6 +650,7 @@ function vwma(source, length, volume) {
578
650
  return result;
579
651
  }
580
652
  function linreg(source, length, offset = 0) {
653
+ (0, import_limits.checkPositiveLength)("linreg", length, 0);
581
654
  const result = [];
582
655
  const len = Math.floor(length);
583
656
  for (let i = 0; i < source.length; i++) {
@@ -615,6 +688,7 @@ function linreg(source, length, offset = 0) {
615
688
  return result;
616
689
  }
617
690
  function correlation(source1, source2, length) {
691
+ (0, import_limits.checkPositiveLength)("correlation", length, 0);
618
692
  const product = Array.from({ length: source1.length }, (_, i) => {
619
693
  const v1 = source1[i];
620
694
  const v2 = source2[i];
@@ -634,10 +708,11 @@ function correlation(source1, source2, length) {
634
708
  });
635
709
  }
636
710
  function percentrank(source, length) {
711
+ (0, import_limits.checkPositiveLength)("percentrank", length, 0);
637
712
  const result = [];
638
713
  for (let i = 0; i < source.length; i++) {
639
714
  const currentValue = source[i];
640
- if (i < length || Number.isNaN(currentValue)) {
715
+ if (i < length) {
641
716
  result.push(NaN);
642
717
  continue;
643
718
  }
@@ -650,6 +725,7 @@ function percentrank(source, length) {
650
725
  return result;
651
726
  }
652
727
  function cci(source, length) {
728
+ (0, import_limits.checkPositiveLength)("cci", length, 0);
653
729
  const smaValues = sma(source, length);
654
730
  const devValues = dev(source, length);
655
731
  let last = 0;
@@ -661,6 +737,7 @@ function cci(source, length) {
661
737
  });
662
738
  }
663
739
  function stoch(source, high, low, length) {
740
+ (0, import_limits.checkPositiveLength)("stoch->highest", length, 0);
664
741
  const result = [];
665
742
  const lowestValues = lowest(low, length);
666
743
  const highestValues = highest(high, length);
@@ -675,6 +752,7 @@ function stoch(source, high, low, length) {
675
752
  return result;
676
753
  }
677
754
  function mfi(source, length, volume) {
755
+ (0, import_limits.checkPositiveLength)("mfi", length, 0);
678
756
  if (!volume) {
679
757
  throw new Error(
680
758
  "ta.mfi() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
@@ -701,6 +779,7 @@ function mfi(source, length, volume) {
701
779
  });
702
780
  }
703
781
  function hma(source, length) {
782
+ (0, import_limits.checkPositiveLength)("hma", length, 0);
704
783
  const halfLength = Math.floor(length / 2);
705
784
  const sqrtLength = Math.floor(Math.sqrt(length));
706
785
  const wmaHalf = wma(source, halfLength);
@@ -789,24 +868,17 @@ function sar(start, inc, max2, high, low, close) {
789
868
  return result;
790
869
  }
791
870
  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;
871
+ const { values, bars, last } = keptValues(source);
872
+ return Array.from(source, (_, i) => {
873
+ const left = Math.trunc(typeof leftbars === "number" ? leftbars : leftbars[i]);
874
+ const right = Math.trunc(typeof rightbars === "number" ? rightbars : rightbars[i]);
875
+ const k = last[i];
876
+ if (!(i >= left + right) || k < 0) return NaN;
877
+ let best = k;
878
+ for (let j = k - 1; j >= 0 && j >= k - left - right; j--) {
879
+ if (isHigh ? values[j] > values[best] : values[j] < values[best]) best = j;
880
+ }
881
+ return bars[best] === i - right ? values[best] : NaN;
810
882
  });
811
883
  }
812
884
  function pivothigh(sourceOrLeftbars, leftbarsOrRightbars, rightbars, high) {
@@ -891,6 +963,7 @@ function dmi(diLength, adxSmoothing, high, low, close) {
891
963
  return [plusDI, minusDI, adx];
892
964
  }
893
965
  function tsi(source, shortLength, longLength) {
966
+ (0, import_limits.checkPositiveLength)("tsi->ema", shortLength, 0);
894
967
  const momentum = [];
895
968
  for (let i = 0; i < source.length; i++) {
896
969
  if (i === 0) {
@@ -908,6 +981,7 @@ function tsi(source, shortLength, longLength) {
908
981
  });
909
982
  }
910
983
  function cmo(source, length) {
984
+ (0, import_limits.checkPositiveLength)("cmo", length, 0);
911
985
  const up = [];
912
986
  const down = [];
913
987
  for (let i = 0; i < source.length; i++) {
@@ -920,6 +994,7 @@ function cmo(source, length) {
920
994
  return sm1.map((s1, i) => 100 * (s1 - sm2[i]) / (s1 + sm2[i]));
921
995
  }
922
996
  function kc(source, length, mult, useTrueRange = true, high, low, close) {
997
+ (0, import_limits.checkPositiveLength)("kc", length, 0);
923
998
  const middle = ema(source, length);
924
999
  let range2;
925
1000
  if (useTrueRange) {
@@ -946,6 +1021,7 @@ function kc(source, length, mult, useTrueRange = true, high, low, close) {
946
1021
  return [middle, upper, lower];
947
1022
  }
948
1023
  function bbw(source, length, mult) {
1024
+ (0, import_limits.checkPositiveLength)("bbw", length, 0);
949
1025
  const [basis, upper, lower] = bb(source, length, mult);
950
1026
  const result = [];
951
1027
  for (let i = 0; i < source.length; i++) {
@@ -959,6 +1035,7 @@ function bbw(source, length, mult) {
959
1035
  return result;
960
1036
  }
961
1037
  function wpr(high, low, close, length = 14) {
1038
+ (0, import_limits.checkPositiveLength)("wpr", length, 0);
962
1039
  const highs = highest(high, length);
963
1040
  const lows = lowest(low, length);
964
1041
  return Array.from({ length: close.length }, (_, i) => {
@@ -1000,6 +1077,7 @@ function vwap(source, volume, anchor, stdev_mult) {
1000
1077
  return stdev_mult === void 0 ? mid : [mid, upper, lower];
1001
1078
  }
1002
1079
  function alma(source, length = 9, offset = 0.85, sigma = 6, floor = false) {
1080
+ (0, import_limits.checkPositiveLength)("alma", length, 0);
1003
1081
  const result = [];
1004
1082
  const m = floor ? Math.floor(offset * (length - 1)) : offset * (length - 1);
1005
1083
  const s = length / sigma;
@@ -1039,6 +1117,7 @@ function kcw(source, length = 20, mult = 2, useTrueRange = true, high, low, clos
1039
1117
  return result;
1040
1118
  }
1041
1119
  function range(source, length) {
1120
+ (0, import_limits.checkPositiveLength)("range", length, 0);
1042
1121
  return source.map((_, i) => {
1043
1122
  const values = lastValues(source, i, length);
1044
1123
  return values ? Math.max(...values) - Math.min(...values) : NaN;
@@ -1065,6 +1144,7 @@ function min(source) {
1065
1144
  });
1066
1145
  }
1067
1146
  function cog(source, length = 10) {
1147
+ (0, import_limits.checkPositiveLength)("cog", length, 0);
1068
1148
  const len = Math.floor(length);
1069
1149
  return (0, import_running_sum.runningSum)(source, len).map((sum, i) => {
1070
1150
  if (i < len - 1 || Number.isNaN(sum) || sum === 0) return NaN;
@@ -1074,6 +1154,7 @@ function cog(source, length = 10) {
1074
1154
  });
1075
1155
  }
1076
1156
  function mode(source, length) {
1157
+ (0, import_limits.checkPositiveLength)("mode", length, 0);
1077
1158
  const result = [];
1078
1159
  const len = Math.floor(length);
1079
1160
  const seen = [];
@@ -1106,6 +1187,7 @@ function mode(source, length) {
1106
1187
  return result;
1107
1188
  }
1108
1189
  function percentile_linear_interpolation(source, length, percentage) {
1190
+ (0, import_limits.checkPositiveLength)("percentile_linear_interpolation", length, 0);
1109
1191
  return sortedWindow(source, length, (s) => {
1110
1192
  const pos = percentage / 100 * length - 0.5;
1111
1193
  if (pos <= 0) return s[0];
@@ -1134,10 +1216,12 @@ function sortedWindow(source, length, fn) {
1134
1216
  return result;
1135
1217
  }
1136
1218
  function percentile_nearest_rank(source, length, percentage) {
1219
+ (0, import_limits.checkPositiveLength)("percentile_nearest_rank", length, 0);
1137
1220
  const rank = Math.min(length, Math.max(1, Math.ceil(percentage / 100 * length)));
1138
1221
  return sortedWindow(source, length, (s) => s[rank - 1]);
1139
1222
  }
1140
1223
  function rci(source, length) {
1224
+ (0, import_limits.checkPositiveLength)("rci", length, 0);
1141
1225
  const len = Math.floor(length);
1142
1226
  const result = [];
1143
1227
  const ring = new Array(len + 1).fill(0);
@@ -1191,132 +1275,105 @@ function rci(source, length) {
1191
1275
  }
1192
1276
  function pivot_point_levels(type, anchor, developing = false, high, low, close, open) {
1193
1277
  const typeStr = typeof type === "string" ? type : String(type[0]);
1194
- const isDeveloping = typeof developing === "boolean" ? developing : developing[0];
1278
+ const isDeveloping = typeof developing === "boolean" ? developing : Boolean(developing[0]);
1195
1279
  if (typeStr === "Woodie" && isDeveloping) {
1196
- throw new Error("ta.pivot_point_levels: Woodie type cannot use developing=true");
1197
- }
1198
- const length = anchor.length;
1199
- if (high && high.length !== length) throw new Error("High series length mismatch");
1200
- if (low && low.length !== length) throw new Error("Low series length mismatch");
1201
- if (close && close.length !== length) throw new Error("Close series length mismatch");
1202
- if (open && open.length !== length) throw new Error("Open series length mismatch");
1203
- const results = Array.from({ length: 11 }, () => []);
1204
- let lastH = NaN, lastL = NaN, lastC = NaN, lastO = NaN;
1205
- let lastAnchorIndex = -1;
1206
- for (let i = 0; i < length; i++) {
1207
- if (anchor[i]) {
1208
- lastAnchorIndex = i;
1209
- lastH = high ? high[i] : NaN;
1210
- lastL = low ? low[i] : NaN;
1211
- lastC = close ? close[i] : NaN;
1212
- lastO = open ? open[i] : NaN;
1213
- }
1214
- let h, l, c, o;
1215
- if (isDeveloping && lastAnchorIndex >= 0) {
1216
- h = high ? Math.max(...high.slice(lastAnchorIndex, i + 1).filter((v) => !isNaN(v))) : NaN;
1217
- l = low ? Math.min(...low.slice(lastAnchorIndex, i + 1).filter((v) => !isNaN(v))) : NaN;
1218
- c = close ? close[i] : NaN;
1219
- o = open && lastAnchorIndex >= 0 ? open[lastAnchorIndex] : NaN;
1220
- } else {
1221
- h = lastH;
1222
- l = lastL;
1223
- c = lastC;
1224
- o = lastO;
1225
- }
1226
- const levels = calculatePivotLevels(typeStr, h, l, c, o);
1227
- for (let j = 0; j < 11; j++) {
1228
- 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);
1229
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];
1230
1315
  }
1231
1316
  return results;
1232
1317
  }
1233
- function calculatePivotLevels(type, h, l, c, o) {
1234
- if (isNaN(h) || isNaN(l) || isNaN(c)) {
1235
- return Array(11).fill(NaN);
1236
- }
1237
- const levels = Array(11).fill(NaN);
1238
- let P;
1239
- switch (type) {
1240
- case "Traditional":
1241
- case "Fibonacci":
1242
- case "Classic":
1243
- P = (h + l + c) / 3;
1244
- break;
1245
- case "Woodie":
1246
- P = (h + l + 2 * c) / 4;
1247
- break;
1248
- case "DM":
1249
- P = (h + l + c) / 3;
1250
- break;
1251
- case "Camarilla":
1252
- P = (h + l + c) / 3;
1253
- break;
1254
- default:
1255
- P = (h + l + c) / 3;
1256
- }
1257
- 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;
1258
1322
  switch (type) {
1259
- case "Traditional":
1260
- case "Classic":
1261
- levels[1] = 2 * P - l;
1262
- levels[2] = 2 * P - h;
1263
- levels[3] = P + (h - l);
1264
- levels[4] = P - (h - l);
1265
- levels[5] = h + 2 * (P - l);
1266
- levels[6] = l - 2 * (h - P);
1267
- levels[7] = levels[5] + (h - l);
1268
- levels[8] = levels[6] - (h - l);
1269
- levels[9] = levels[7] + (h - l);
1270
- levels[10] = levels[8] - (h - l);
1271
- break;
1272
- case "Fibonacci":
1273
- levels[1] = P + 0.382 * (h - l);
1274
- levels[2] = P - 0.382 * (h - l);
1275
- levels[3] = P + 0.618 * (h - l);
1276
- levels[4] = P - 0.618 * (h - l);
1277
- levels[5] = P + (h - l);
1278
- levels[6] = P - (h - l);
1279
- levels[7] = levels[5] + 0.618 * (h - l);
1280
- levels[8] = levels[6] - 0.618 * (h - l);
1281
- levels[9] = levels[7] + 0.382 * (h - l);
1282
- levels[10] = levels[8] - 0.382 * (h - l);
1283
- break;
1284
- case "Woodie":
1285
- levels[1] = 2 * P - l;
1286
- levels[2] = 2 * P - h;
1287
- levels[3] = P + (h - l);
1288
- levels[4] = P - (h - l);
1289
- levels[5] = h + 2 * (P - l);
1290
- levels[6] = l - 2 * (h - P);
1291
- levels[7] = levels[5] + (h - l);
1292
- levels[8] = levels[6] - (h - l);
1293
- levels[9] = levels[7] + (h - l);
1294
- levels[10] = levels[8] - (h - l);
1295
- 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
+ }
1296
1353
  case "DM": {
1297
- const x = h + l + c * 2 + (isNaN(o) ? c : o);
1298
- const newP = x / (isNaN(o) ? 4 : 5);
1299
- levels[0] = newP;
1300
- levels[1] = x / 2 - l;
1301
- levels[2] = x / 2 - h;
1302
- 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];
1303
1356
  }
1304
1357
  case "Camarilla": {
1305
- const range2 = h - l;
1306
- levels[1] = c + range2 * 1.1 / 12;
1307
- levels[2] = c - range2 * 1.1 / 12;
1308
- levels[3] = c + range2 * 1.1 / 6;
1309
- levels[4] = c - range2 * 1.1 / 6;
1310
- levels[5] = c + range2 * 1.1 / 4;
1311
- levels[6] = c - range2 * 1.1 / 4;
1312
- levels[7] = c + range2 * 1.1 / 2;
1313
- levels[8] = c - range2 * 1.1 / 2;
1314
- levels[9] = h;
1315
- levels[10] = l;
1316
- 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
+ ];
1317
1373
  }
1374
+ default:
1375
+ return NA_LEVELS;
1318
1376
  }
1319
- return levels;
1320
1377
  }
1321
1378
  function ichimoku(conversionPeriods, basePeriods, laggingSpan2Periods, displacement, high, low, close) {
1322
1379
  const length = high.length;