oakscriptjs 0.11.4 → 0.11.6

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 (104) hide show
  1. package/dist/cjs/index.d.ts +2 -2
  2. package/dist/cjs/index.d.ts.map +1 -1
  3. package/dist/cjs/index.js +2 -1
  4. package/dist/cjs/index.js.map +2 -2
  5. package/dist/cjs/input.d.ts +19 -3
  6. package/dist/cjs/input.d.ts.map +1 -1
  7. package/dist/cjs/input.js +24 -1
  8. package/dist/cjs/input.js.map +2 -2
  9. package/dist/cjs/lib/zigzag/zigzag.d.ts +8 -3
  10. package/dist/cjs/lib/zigzag/zigzag.d.ts.map +1 -1
  11. package/dist/cjs/lib/zigzag/zigzag.js +16 -3
  12. package/dist/cjs/lib/zigzag/zigzag.js.map +2 -2
  13. package/dist/cjs/runtime/index.d.ts +1 -1
  14. package/dist/cjs/runtime/index.d.ts.map +1 -1
  15. package/dist/cjs/runtime/index.js +1 -0
  16. package/dist/cjs/runtime/index.js.map +2 -2
  17. package/dist/cjs/runtime/inputs.d.ts +9 -0
  18. package/dist/cjs/runtime/inputs.d.ts.map +1 -1
  19. package/dist/cjs/runtime/inputs.js +8 -0
  20. package/dist/cjs/runtime/inputs.js.map +2 -2
  21. package/dist/cjs/runtime/types.d.ts +4 -3
  22. package/dist/cjs/runtime/types.d.ts.map +1 -1
  23. package/dist/cjs/runtime/types.js.map +1 -1
  24. package/dist/cjs/script/index.d.ts +50 -4
  25. package/dist/cjs/script/index.d.ts.map +1 -1
  26. package/dist/cjs/script/index.js +60 -4
  27. package/dist/cjs/script/index.js.map +3 -3
  28. package/dist/cjs/security/other.d.ts +2 -1
  29. package/dist/cjs/security/other.d.ts.map +1 -1
  30. package/dist/cjs/security/other.js +1 -1
  31. package/dist/cjs/security/other.js.map +2 -2
  32. package/dist/cjs/ta/index.d.ts +1 -0
  33. package/dist/cjs/ta/index.d.ts.map +1 -1
  34. package/dist/cjs/ta/index.js +1 -1
  35. package/dist/cjs/ta/index.js.map +2 -2
  36. package/dist/cjs/time/index.d.ts +2 -0
  37. package/dist/cjs/time/index.d.ts.map +1 -1
  38. package/dist/cjs/time/index.js +1 -1
  39. package/dist/cjs/time/index.js.map +2 -2
  40. package/dist/cjs/types/index.d.ts +1 -0
  41. package/dist/cjs/types/index.d.ts.map +1 -1
  42. package/dist/cjs/types/index.js.map +2 -2
  43. package/dist/cjs/utils/index.d.ts +5 -3
  44. package/dist/cjs/utils/index.d.ts.map +1 -1
  45. package/dist/cjs/utils/index.js +6 -0
  46. package/dist/cjs/utils/index.js.map +2 -2
  47. package/dist/esm/index.d.ts +2 -2
  48. package/dist/esm/index.d.ts.map +1 -1
  49. package/dist/esm/index.js +2 -2
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/input.d.ts +19 -3
  52. package/dist/esm/input.d.ts.map +1 -1
  53. package/dist/esm/input.js +24 -1
  54. package/dist/esm/input.js.map +1 -1
  55. package/dist/esm/lib/zigzag/zigzag.d.ts +8 -3
  56. package/dist/esm/lib/zigzag/zigzag.d.ts.map +1 -1
  57. package/dist/esm/lib/zigzag/zigzag.js +19 -4
  58. package/dist/esm/lib/zigzag/zigzag.js.map +1 -1
  59. package/dist/esm/runtime/index.d.ts +1 -1
  60. package/dist/esm/runtime/index.d.ts.map +1 -1
  61. package/dist/esm/runtime/index.js +1 -1
  62. package/dist/esm/runtime/index.js.map +1 -1
  63. package/dist/esm/runtime/inputs.d.ts +9 -0
  64. package/dist/esm/runtime/inputs.d.ts.map +1 -1
  65. package/dist/esm/runtime/inputs.js +15 -0
  66. package/dist/esm/runtime/inputs.js.map +1 -1
  67. package/dist/esm/runtime/types.d.ts +4 -3
  68. package/dist/esm/runtime/types.d.ts.map +1 -1
  69. package/dist/esm/script/index.d.ts +50 -4
  70. package/dist/esm/script/index.d.ts.map +1 -1
  71. package/dist/esm/script/index.js +73 -2
  72. package/dist/esm/script/index.js.map +1 -1
  73. package/dist/esm/security/other.d.ts +2 -1
  74. package/dist/esm/security/other.d.ts.map +1 -1
  75. package/dist/esm/security/other.js +4 -2
  76. package/dist/esm/security/other.js.map +1 -1
  77. package/dist/esm/ta/index.d.ts +1 -0
  78. package/dist/esm/ta/index.d.ts.map +1 -1
  79. package/dist/esm/ta/index.js +3 -1
  80. package/dist/esm/ta/index.js.map +1 -1
  81. package/dist/esm/time/index.d.ts +2 -0
  82. package/dist/esm/time/index.d.ts.map +1 -1
  83. package/dist/esm/time/index.js +4 -1
  84. package/dist/esm/time/index.js.map +1 -1
  85. package/dist/esm/types/index.d.ts +1 -0
  86. package/dist/esm/types/index.d.ts.map +1 -1
  87. package/dist/esm/types/index.js.map +1 -1
  88. package/dist/esm/utils/index.d.ts +5 -3
  89. package/dist/esm/utils/index.d.ts.map +1 -1
  90. package/dist/esm/utils/index.js +5 -1
  91. package/dist/esm/utils/index.js.map +1 -1
  92. package/package.json +1 -1
  93. package/src/index.ts +2 -1
  94. package/src/input.ts +28 -4
  95. package/src/lib/zigzag/zigzag.ts +20 -6
  96. package/src/runtime/index.ts +1 -0
  97. package/src/runtime/inputs.ts +16 -0
  98. package/src/runtime/types.ts +4 -3
  99. package/src/script/index.ts +111 -5
  100. package/src/security/other.ts +5 -2
  101. package/src/ta/index.ts +3 -1
  102. package/src/time/index.ts +4 -1
  103. package/src/types/index.ts +1 -0
  104. package/src/utils/index.ts +8 -3
package/src/time/index.ts CHANGED
@@ -5,6 +5,8 @@
5
5
  * Every function takes an explicit time zone: UTC/GMT offset notation ("UTC-5",
6
6
  * "GMT+0530", "UTC+05:30") or an IANA name ("America/New_York"). The PineScript
7
7
  * default time zone (the exchange time zone, `syminfo.timezone`) is not known here.
8
+ * As in PineScript, the calendar fields (`year` ... `second`) of an na time are those
9
+ * of time 0 in the time zone.
8
10
  */
9
11
 
10
12
  import type { int, simple_int } from '../types/index.js';
@@ -72,8 +74,9 @@ export function timestamp(first: string | simple_int, ...rest: Array<simple_int
72
74
 
73
75
  // ── Calendar fields ──────────────────────────────────────────────────────────
74
76
 
77
+ // PineScript reads an na time as 0: year(na) is 1970 in UTC, 1969 in America/New_York (#184)
75
78
  function field(time: number, timezone: string, pick: (f: ReturnType<typeof zonedFields>) => number): int {
76
- return Number.isNaN(time) ? NaN : pick(zonedFields(time, timezone));
79
+ return pick(zonedFields(Number.isNaN(time) ? 0 : time, timezone));
77
80
  }
78
81
 
79
82
  /**
@@ -348,6 +348,7 @@ export interface OHLC {
348
348
  high: series_float;
349
349
  low: series_float;
350
350
  close: series_float;
351
+ volume?: series_float;
351
352
  }
352
353
 
353
354
  // Constants
@@ -6,6 +6,7 @@
6
6
  import type { series_float, int, float, Source, Bar, OHLC } from '../types/index.js';
7
7
  import { sma, ema, wma, rma } from '../ta/index.js';
8
8
  import { Series } from '../runtime/series.js';
9
+ import type { SourceType } from '../input.js';
9
10
  import { isDeleted } from '../drawing/registry.js';
10
11
 
11
12
  /**
@@ -165,7 +166,8 @@ export function getOpen(ohlc: OHLC): series_float {
165
166
  * Extract a specific source from OHLC data or bar array
166
167
  *
167
168
  * @param data - Bar array or OHLC data
168
- * @param source - Source type: 'close', 'open', 'high', 'low', 'hl2', 'hlc3', 'ohlc4'
169
+ * @param source - Source type: 'close', 'open', 'high', 'low', 'hl2', 'hlc3', 'ohlc4', 'hlcc4', 'volume' (NaN for a
170
+ * bar without volume)
169
171
  * @returns Series of the requested source
170
172
  *
171
173
  * @example
@@ -177,7 +179,7 @@ export function getOpen(ohlc: OHLC): series_float {
177
179
  */
178
180
  export function getSource(
179
181
  data: Bar[] | OHLC,
180
- source: 'close' | 'open' | 'high' | 'low' | 'hl2' | 'hlc3' | 'ohlc4' | 'hlcc4' = 'close'
182
+ source: SourceType = 'close'
181
183
  ): series_float {
182
184
  // Check if data is OHLC structure
183
185
  const isOHLC = 'open' in data && Array.isArray(data.open);
@@ -193,6 +195,7 @@ export function getSource(
193
195
  case 'hlc3': return ohlc.high.map((h, i) => (h + ohlc.low[i]! + ohlc.close[i]!) / 3);
194
196
  case 'ohlc4': return ohlc.open.map((o, i) => (o + ohlc.high[i]! + ohlc.low[i]! + ohlc.close[i]!) / 4);
195
197
  case 'hlcc4': return ohlc.high.map((h, i) => (h + ohlc.low[i]! + ohlc.close[i]! + ohlc.close[i]!) / 4);
198
+ case 'volume': return ohlc.volume ?? ohlc.close.map(() => NaN);
196
199
  }
197
200
  } else {
198
201
  const bars = data as Bar[];
@@ -205,6 +208,7 @@ export function getSource(
205
208
  case 'hlc3': return bars.map(b => (b.high + b.low + b.close) / 3);
206
209
  case 'ohlc4': return bars.map(b => (b.open + b.high + b.low + b.close) / 4);
207
210
  case 'hlcc4': return bars.map(b => (b.high + b.low + b.close + b.close) / 4);
211
+ case 'volume': return bars.map(b => b.volume ?? NaN);
208
212
  }
209
213
  }
210
214
  }
@@ -227,7 +231,7 @@ export function getSource(
227
231
  */
228
232
  export function getSourceSeries(
229
233
  bars: Bar[],
230
- source: 'open' | 'high' | 'low' | 'close' | 'hl2' | 'hlc3' | 'ohlc4' | 'hlcc4' = 'close'
234
+ source: SourceType = 'close'
231
235
  ): Series {
232
236
  const open = new Series(bars, (bar) => bar.open);
233
237
  const high = new Series(bars, (bar) => bar.high);
@@ -243,6 +247,7 @@ export function getSourceSeries(
243
247
  case 'hlc3': return high.add(low).add(close).div(3);
244
248
  case 'ohlc4': return open.add(high).add(low).add(close).div(4);
245
249
  case 'hlcc4': return high.add(low).add(close).add(close).div(4);
250
+ case 'volume': return Series.fromBars(bars, 'volume');
246
251
  default: return close;
247
252
  }
248
253
  }