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
@@ -52,6 +52,7 @@ __export(script_exports, {
52
52
  hlc3: () => hlc3,
53
53
  hlcc4: () => hlcc4,
54
54
  hline: () => hline,
55
+ holdDrawing: () => import_registry2.holdDrawing,
55
56
  hour: () => hour,
56
57
  inSession: () => inSession,
57
58
  indicator: () => indicator,
@@ -76,6 +77,7 @@ __export(script_exports, {
76
77
  plotshape: () => plotshape,
77
78
  polyline: () => polyline,
78
79
  position: () => import_types.position,
80
+ releaseDrawing: () => import_registry2.releaseDrawing,
79
81
  request: () => request,
80
82
  second: () => second,
81
83
  seriesOf: () => seriesOf,
@@ -91,7 +93,9 @@ __export(script_exports, {
91
93
  time_close: () => time_close,
92
94
  time_tradingday: () => time_tradingday,
93
95
  timeframe: () => timeframe,
96
+ timenow: () => timenow,
94
97
  timestamp: () => timestamp,
98
+ varDrawing: () => import_registry2.varDrawing,
95
99
  volume: () => volume,
96
100
  weekofyear: () => weekofyear,
97
101
  year: () => year
@@ -112,6 +116,7 @@ var chartPointCore = __toESM(require("../chartpoint/index.js"), 1);
112
116
  var textCore = __toESM(require("../text/index.js"), 1);
113
117
  var mathCore = __toESM(require("../math/index.js"), 1);
114
118
  var import_registry = require("../drawing/registry.js");
119
+ var import_registry2 = require("../drawing/registry.js");
115
120
  var import_output = require("../drawing/output.js");
116
121
  var timeframeCore = __toESM(require("../timeframe/index.js"), 1);
117
122
  var timeCore = __toESM(require("../time/index.js"), 1);
@@ -175,6 +180,7 @@ let scriptOptions = {};
175
180
  function executeScript(body, barsInput, inputs = {}, chart2 = {}, options = {}) {
176
181
  ctxBars.setAll(barsInput);
177
182
  chartCtx = { ...chart2 };
183
+ runNow = chart2.now ?? Date.now();
178
184
  scriptOptions = options;
179
185
  ctx = freshCollector(inputs);
180
186
  (0, import_registry.resetDrawings)();
@@ -356,9 +362,10 @@ const ta = {
356
362
  /** `ta.lowestbars(source, length)` or `ta.lowestbars(length)` (source = low); offsets are 0 or negative. */
357
363
  lowestbars: (sourceOrLength, length) => typeof sourceOrLength === "number" ? taSeries.lowestbars(low, sourceOrLength) : taSeries.lowestbars(sourceOrLength, length),
358
364
  /** `ta.vwap(source, anchor?, stdev_mult?)` with the chart volume; the default anchor is a new trading
359
- * day (`timeframe.change("1D")`), which needs the chart context (timeframe, time zone, session). */
365
+ * day (`timeframe.change("1D")`), which needs the chart context (timeframe, time zone, session), and the
366
+ * first bar: as in PineScript, the first loaded bars (a day in progress) have a value. */
360
367
  vwap: ((source, anchor, stdev_mult) => {
361
- const a = anchor ?? changeOf("1D");
368
+ const a = anchor ?? changeOf("1D", true);
362
369
  return stdev_mult === void 0 ? taSeries.vwap(source, volume, a) : taSeries.vwapBands(source, volume, a, stdev_mult);
363
370
  }),
364
371
  /** `ta.mfi(source, length)` with the chart volume (PineScript takes 2 arguments). */
@@ -758,6 +765,7 @@ function eachBar(fn) {
758
765
  for (idx = 0; idx < b.length; idx++) {
759
766
  if (pendingError && pendingError.bar === idx) throw new Error((0, import_series.historyError)(idx, pendingError.barsBack));
760
767
  currentBar = idx;
768
+ (0, import_registry.setDrawingBar)(idx, idx === b.length - 1);
761
769
  const r = fn(ctx2);
762
770
  out[idx] = typeof r === "number" ? r : typeof r === "boolean" ? r ? 1 : 0 : NaN;
763
771
  for (const buffer of buffers.values()) {
@@ -773,6 +781,7 @@ function eachBar(fn) {
773
781
  }
774
782
  } finally {
775
783
  currentBar = -1;
784
+ (0, import_registry.setDrawingBar)(null);
776
785
  }
777
786
  return import_series.Series.fromArray(ctxBars, out);
778
787
  }
@@ -988,6 +997,14 @@ function symbolProperty(key) {
988
997
  }
989
998
  return value;
990
999
  }
1000
+ function chartText(key, name) {
1001
+ collector();
1002
+ const value = chartCtx[key];
1003
+ if (value === void 0) {
1004
+ throw new Error(`${name} is not known: pass it as executeScript(body, bars, inputs, { ${key} }).`);
1005
+ }
1006
+ return value;
1007
+ }
991
1008
  function symbolScale() {
992
1009
  collector();
993
1010
  const { minmove, pricescale } = chartCtx;
@@ -1024,6 +1041,12 @@ const syminfo = {
1024
1041
  get session() {
1025
1042
  collector();
1026
1043
  return chartCtx.sessionType ?? "regular";
1044
+ },
1045
+ get type() {
1046
+ return chartText("symbolType", "syminfo.type");
1047
+ },
1048
+ get currency() {
1049
+ return chartText("currency", "syminfo.currency");
1027
1050
  }
1028
1051
  };
1029
1052
  function calendar(fn) {
@@ -1095,7 +1118,12 @@ function calendarFor(session2, timezone) {
1095
1118
  return { bars: new import_bars.SessionBars(new import_calendar.TradingCalendar(tz, { session: toSpec(symbol).session }, "symbol"), bars2.chart.period), test: true };
1096
1119
  }
1097
1120
  const spec = session2 ? { session: session2 } : { session: toSpec(chartCtx.session).session };
1098
- return { bars: new import_bars.SessionBars(new import_calendar.TradingCalendar(tz, spec, session2 ? "pine" : "symbol"), bars2.chart.period), test: true };
1121
+ return {
1122
+ bars: new import_bars.SessionBars(new import_calendar.TradingCalendar(tz, spec, session2 ? "pine" : "symbol"), bars2.chart.period),
1123
+ test: true,
1124
+ // a PineScript session string: the rules of time.inSession (runs ending at 0000, days around a clock change)
1125
+ inside: session2 ? (time2) => timeCore.inSession(time2, session2, tz, timeframeCore.in_seconds(bars2.chart.period) * 1e3) : void 0
1126
+ };
1099
1127
  }
1100
1128
  function perBar(fn) {
1101
1129
  const times = ctxBars.bars.map(barTime);
@@ -1108,25 +1136,28 @@ function callableSeries(series, fn) {
1108
1136
  }
1109
1137
  function timeFunction(tf, session2, timezone) {
1110
1138
  collector();
1111
- const { bars: bars2, test } = calendarFor(session2, timezone);
1139
+ const { bars: bars2, test, inside } = calendarFor(session2, timezone);
1112
1140
  const timeframeString = tf || chartTimeframe().period;
1113
- return perBar((t) => test && !bars2.inside(t) ? NaN : bars2.timeOf(t, timeframeString));
1141
+ return perBar((t) => test && !(inside ? inside(t) : bars2.inside(t)) ? NaN : bars2.timeOf(t, timeframeString));
1114
1142
  }
1115
1143
  function timeCloseFunction(tf, session2, timezone) {
1116
1144
  collector();
1117
- const { bars: bars2, test } = calendarFor(session2, timezone);
1145
+ const { bars: bars2, test, inside } = calendarFor(session2, timezone);
1118
1146
  const timeframeString = tf || chartTimeframe().period;
1119
- return perBar((t) => test && !bars2.inside(t) ? NaN : bars2.closeOf(t, timeframeString));
1147
+ return perBar((t) => test && !(inside ? inside(t) : bars2.inside(t)) ? NaN : bars2.closeOf(t, timeframeString));
1120
1148
  }
1149
+ let runNow = NaN;
1150
+ const timenow = new import_series.Series(ctxBars, () => runNow);
1121
1151
  const time = callableSeries(new import_series.Series(ctxBars, (b) => barTime(b)), timeFunction);
1122
1152
  const time_close = callableSeries(
1123
1153
  new import_series.Series(ctxBars, (_b, i) => sessionBars().bars.closeOf(barTime(ctxBars.bars[i]), chartTimeframe().period)),
1124
1154
  timeCloseFunction
1125
1155
  );
1126
1156
  const time_tradingday = new import_series.Series(ctxBars, (b) => sessionBars().bars.tradingDayTime(barTime(b)));
1127
- function changeOf(tf) {
1157
+ function changeOf(tf, firstBar = false) {
1128
1158
  const { bars: bars2 } = sessionBars();
1129
- return perBar((t, i, times) => i > 0 && bars2.timeOf(t, tf) !== bars2.timeOf(times[i - 1], tf) ? 1 : 0);
1159
+ const changed = (a, b) => !Number.isNaN(a) && !Number.isNaN(b) && a !== b;
1160
+ return perBar((t, i, times) => (i > 0 ? changed(bars2.timeOf(t, tf), bars2.timeOf(times[i - 1], tf)) : firstBar) ? 1 : 0);
1130
1161
  }
1131
1162
  function flag(key) {
1132
1163
  const { bars: bars2, regular } = sessionBars();
@@ -1308,6 +1339,14 @@ const table = {
1308
1339
  };
1309
1340
  const text = { ...textCore };
1310
1341
  const chart = {
1342
+ /** Chart foreground colour (PineScript `chart.fg_color`), from the chart context. */
1343
+ get fg_color() {
1344
+ return chartText("foregroundColor", "chart.fg_color");
1345
+ },
1346
+ /** Chart background colour (PineScript `chart.bg_color`), from the chart context. */
1347
+ get bg_color() {
1348
+ return chartText("backgroundColor", "chart.bg_color");
1349
+ },
1311
1350
  point: {
1312
1351
  ...chartPointCore,
1313
1352
  now(price) {