@invinite-org/chartlang-runtime 1.1.0 → 1.1.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 (508) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +1 -2
  3. package/dist/buildComputeContext.js.map +1 -1
  4. package/dist/createScriptRunner.js.map +1 -1
  5. package/dist/dep/DepOutputStore.js.map +1 -1
  6. package/dist/dep/DepRunner.js.map +1 -1
  7. package/dist/dep/depOutput.js.map +1 -1
  8. package/dist/dep/emissionFilter.js.map +1 -1
  9. package/dist/dep/index.js.map +1 -1
  10. package/dist/emit/alert.js.map +1 -1
  11. package/dist/emit/alertConditionEmission.js.map +1 -1
  12. package/dist/emit/applyPlotOverride.js.map +1 -1
  13. package/dist/emit/draw/annotations/arrow.js +1 -1
  14. package/dist/emit/draw/annotations/arrow.js.map +1 -1
  15. package/dist/emit/draw/annotations/arrowMarkDown.js +1 -1
  16. package/dist/emit/draw/annotations/arrowMarkDown.js.map +1 -1
  17. package/dist/emit/draw/annotations/arrowMarkUp.js +1 -1
  18. package/dist/emit/draw/annotations/arrowMarkUp.js.map +1 -1
  19. package/dist/emit/draw/annotations/arrowMarker.js +1 -1
  20. package/dist/emit/draw/annotations/arrowMarker.js.map +1 -1
  21. package/dist/emit/draw/annotations/text.js +1 -1
  22. package/dist/emit/draw/annotations/text.js.map +1 -1
  23. package/dist/emit/draw/boxes/circle.js +1 -1
  24. package/dist/emit/draw/boxes/circle.js.map +1 -1
  25. package/dist/emit/draw/boxes/ellipse.d.ts +1 -1
  26. package/dist/emit/draw/boxes/ellipse.js +1 -1
  27. package/dist/emit/draw/boxes/ellipse.js.map +1 -1
  28. package/dist/emit/draw/boxes/marker.js +1 -1
  29. package/dist/emit/draw/boxes/marker.js.map +1 -1
  30. package/dist/emit/draw/boxes/path.d.ts +1 -1
  31. package/dist/emit/draw/boxes/path.js +1 -1
  32. package/dist/emit/draw/boxes/path.js.map +1 -1
  33. package/dist/emit/draw/boxes/polyline.d.ts +1 -1
  34. package/dist/emit/draw/boxes/polyline.js +1 -1
  35. package/dist/emit/draw/boxes/polyline.js.map +1 -1
  36. package/dist/emit/draw/boxes/rectangle.js +1 -1
  37. package/dist/emit/draw/boxes/rectangle.js.map +1 -1
  38. package/dist/emit/draw/boxes/rotatedRectangle.js +1 -1
  39. package/dist/emit/draw/boxes/rotatedRectangle.js.map +1 -1
  40. package/dist/emit/draw/boxes/triangle.d.ts +1 -1
  41. package/dist/emit/draw/boxes/triangle.js +1 -1
  42. package/dist/emit/draw/boxes/triangle.js.map +1 -1
  43. package/dist/emit/draw/channels/disjointChannel.js +1 -1
  44. package/dist/emit/draw/channels/disjointChannel.js.map +1 -1
  45. package/dist/emit/draw/channels/flatTopBottom.d.ts +1 -2
  46. package/dist/emit/draw/channels/flatTopBottom.d.ts.map +1 -1
  47. package/dist/emit/draw/channels/flatTopBottom.js +1 -1
  48. package/dist/emit/draw/channels/flatTopBottom.js.map +1 -1
  49. package/dist/emit/draw/channels/regressionTrend.d.ts +3 -4
  50. package/dist/emit/draw/channels/regressionTrend.d.ts.map +1 -1
  51. package/dist/emit/draw/channels/regressionTrend.js +1 -1
  52. package/dist/emit/draw/channels/regressionTrend.js.map +1 -1
  53. package/dist/emit/draw/channels/trendChannel.js +1 -1
  54. package/dist/emit/draw/channels/trendChannel.js.map +1 -1
  55. package/dist/emit/draw/containers/frame.d.ts +1 -1
  56. package/dist/emit/draw/containers/frame.js +2 -2
  57. package/dist/emit/draw/containers/frame.js.map +1 -1
  58. package/dist/emit/draw/containers/group.d.ts +1 -2
  59. package/dist/emit/draw/containers/group.d.ts.map +1 -1
  60. package/dist/emit/draw/containers/group.js +2 -2
  61. package/dist/emit/draw/containers/group.js.map +1 -1
  62. package/dist/emit/draw/curves/arc.js +1 -1
  63. package/dist/emit/draw/curves/arc.js.map +1 -1
  64. package/dist/emit/draw/curves/brush.js +1 -1
  65. package/dist/emit/draw/curves/brush.js.map +1 -1
  66. package/dist/emit/draw/curves/curve.js +1 -1
  67. package/dist/emit/draw/curves/curve.js.map +1 -1
  68. package/dist/emit/draw/curves/doubleCurve.js +1 -1
  69. package/dist/emit/draw/curves/doubleCurve.js.map +1 -1
  70. package/dist/emit/draw/curves/highlighter.js +1 -1
  71. package/dist/emit/draw/curves/highlighter.js.map +1 -1
  72. package/dist/emit/draw/curves/pen.js +1 -1
  73. package/dist/emit/draw/curves/pen.js.map +1 -1
  74. package/dist/emit/draw/cycles/cyclicLines.js +1 -1
  75. package/dist/emit/draw/cycles/cyclicLines.js.map +1 -1
  76. package/dist/emit/draw/cycles/sineLine.js +1 -1
  77. package/dist/emit/draw/cycles/sineLine.js.map +1 -1
  78. package/dist/emit/draw/cycles/timeCycles.js +1 -1
  79. package/dist/emit/draw/cycles/timeCycles.js.map +1 -1
  80. package/dist/emit/draw/elliott/elliottCorrectionWave.js +1 -1
  81. package/dist/emit/draw/elliott/elliottCorrectionWave.js.map +1 -1
  82. package/dist/emit/draw/elliott/elliottDoubleCombo.js +1 -1
  83. package/dist/emit/draw/elliott/elliottDoubleCombo.js.map +1 -1
  84. package/dist/emit/draw/elliott/elliottImpulseWave.js +1 -1
  85. package/dist/emit/draw/elliott/elliottImpulseWave.js.map +1 -1
  86. package/dist/emit/draw/elliott/elliottTriangleWave.js +1 -1
  87. package/dist/emit/draw/elliott/elliottTriangleWave.js.map +1 -1
  88. package/dist/emit/draw/elliott/elliottTripleCombo.js +1 -1
  89. package/dist/emit/draw/elliott/elliottTripleCombo.js.map +1 -1
  90. package/dist/emit/draw/fibA/fibChannel.js +1 -1
  91. package/dist/emit/draw/fibA/fibChannel.js.map +1 -1
  92. package/dist/emit/draw/fibA/fibRetracement.js +1 -1
  93. package/dist/emit/draw/fibA/fibRetracement.js.map +1 -1
  94. package/dist/emit/draw/fibA/fibTimeZone.d.ts +1 -2
  95. package/dist/emit/draw/fibA/fibTimeZone.d.ts.map +1 -1
  96. package/dist/emit/draw/fibA/fibTimeZone.js +1 -1
  97. package/dist/emit/draw/fibA/fibTimeZone.js.map +1 -1
  98. package/dist/emit/draw/fibA/fibTrendExtension.js +1 -1
  99. package/dist/emit/draw/fibA/fibTrendExtension.js.map +1 -1
  100. package/dist/emit/draw/fibA/fibWedge.js +1 -1
  101. package/dist/emit/draw/fibA/fibWedge.js.map +1 -1
  102. package/dist/emit/draw/fibB/fibCircles.d.ts +1 -2
  103. package/dist/emit/draw/fibB/fibCircles.d.ts.map +1 -1
  104. package/dist/emit/draw/fibB/fibCircles.js +1 -1
  105. package/dist/emit/draw/fibB/fibCircles.js.map +1 -1
  106. package/dist/emit/draw/fibB/fibSpeedArcs.js +1 -1
  107. package/dist/emit/draw/fibB/fibSpeedArcs.js.map +1 -1
  108. package/dist/emit/draw/fibB/fibSpeedFan.js +1 -1
  109. package/dist/emit/draw/fibB/fibSpeedFan.js.map +1 -1
  110. package/dist/emit/draw/fibB/fibSpiral.d.ts +1 -2
  111. package/dist/emit/draw/fibB/fibSpiral.d.ts.map +1 -1
  112. package/dist/emit/draw/fibB/fibSpiral.js +1 -1
  113. package/dist/emit/draw/fibB/fibSpiral.js.map +1 -1
  114. package/dist/emit/draw/fibB/fibTrendTime.d.ts +1 -2
  115. package/dist/emit/draw/fibB/fibTrendTime.d.ts.map +1 -1
  116. package/dist/emit/draw/fibB/fibTrendTime.js +1 -1
  117. package/dist/emit/draw/fibB/fibTrendTime.js.map +1 -1
  118. package/dist/emit/draw/gann/gannBox.js +1 -1
  119. package/dist/emit/draw/gann/gannBox.js.map +1 -1
  120. package/dist/emit/draw/gann/gannFan.js +1 -1
  121. package/dist/emit/draw/gann/gannFan.js.map +1 -1
  122. package/dist/emit/draw/gann/gannSquare.js +1 -1
  123. package/dist/emit/draw/gann/gannSquare.js.map +1 -1
  124. package/dist/emit/draw/gann/gannSquareFixed.js +1 -1
  125. package/dist/emit/draw/gann/gannSquareFixed.js.map +1 -1
  126. package/dist/emit/draw/handle.d.ts +2 -2
  127. package/dist/emit/draw/handle.js +2 -2
  128. package/dist/emit/draw/handle.js.map +1 -1
  129. package/dist/emit/draw/index.js.map +1 -1
  130. package/dist/emit/draw/lines/crossLine.js +1 -1
  131. package/dist/emit/draw/lines/crossLine.js.map +1 -1
  132. package/dist/emit/draw/lines/horizontalLine.d.ts +1 -1
  133. package/dist/emit/draw/lines/horizontalLine.js +1 -1
  134. package/dist/emit/draw/lines/horizontalLine.js.map +1 -1
  135. package/dist/emit/draw/lines/horizontalRay.js +1 -1
  136. package/dist/emit/draw/lines/horizontalRay.js.map +1 -1
  137. package/dist/emit/draw/lines/line.d.ts +1 -1
  138. package/dist/emit/draw/lines/line.d.ts.map +1 -1
  139. package/dist/emit/draw/lines/line.js +2 -3
  140. package/dist/emit/draw/lines/line.js.map +1 -1
  141. package/dist/emit/draw/lines/trendAngle.js +1 -1
  142. package/dist/emit/draw/lines/trendAngle.js.map +1 -1
  143. package/dist/emit/draw/lines/verticalLine.js +1 -1
  144. package/dist/emit/draw/lines/verticalLine.js.map +1 -1
  145. package/dist/emit/draw/namespace.d.ts +1 -1
  146. package/dist/emit/draw/namespace.js +1 -1
  147. package/dist/emit/draw/namespace.js.map +1 -1
  148. package/dist/emit/draw/patterns/abcdPattern.js +1 -1
  149. package/dist/emit/draw/patterns/abcdPattern.js.map +1 -1
  150. package/dist/emit/draw/patterns/cypherPattern.d.ts +1 -2
  151. package/dist/emit/draw/patterns/cypherPattern.d.ts.map +1 -1
  152. package/dist/emit/draw/patterns/cypherPattern.js +1 -1
  153. package/dist/emit/draw/patterns/cypherPattern.js.map +1 -1
  154. package/dist/emit/draw/patterns/headAndShoulders.js +1 -1
  155. package/dist/emit/draw/patterns/headAndShoulders.js.map +1 -1
  156. package/dist/emit/draw/patterns/threeDrivesPattern.js +1 -1
  157. package/dist/emit/draw/patterns/threeDrivesPattern.js.map +1 -1
  158. package/dist/emit/draw/patterns/trianglePattern.d.ts +1 -1
  159. package/dist/emit/draw/patterns/trianglePattern.js +1 -1
  160. package/dist/emit/draw/patterns/trianglePattern.js.map +1 -1
  161. package/dist/emit/draw/patterns/xabcdPattern.js +1 -1
  162. package/dist/emit/draw/patterns/xabcdPattern.js.map +1 -1
  163. package/dist/emit/draw/pitchforks/pitchfan.js +1 -1
  164. package/dist/emit/draw/pitchforks/pitchfan.js.map +1 -1
  165. package/dist/emit/draw/pitchforks/pitchfork.d.ts +1 -1
  166. package/dist/emit/draw/pitchforks/pitchfork.js +2 -2
  167. package/dist/emit/draw/pitchforks/pitchfork.js.map +1 -1
  168. package/dist/emit/draw/pushDrawing.js.map +1 -1
  169. package/dist/emit/draw/subIdAllocator.d.ts +1 -1
  170. package/dist/emit/draw/subIdAllocator.js +1 -1
  171. package/dist/emit/draw/subIdAllocator.js.map +1 -1
  172. package/dist/emit/draw/table/table.d.ts +1 -1
  173. package/dist/emit/draw/table/table.js.map +1 -1
  174. package/dist/emit/emissionsQueue.js.map +1 -1
  175. package/dist/emit/hash.js.map +1 -1
  176. package/dist/emit/hline.js.map +1 -1
  177. package/dist/emit/index.js.map +1 -1
  178. package/dist/emit/logEmission.js.map +1 -1
  179. package/dist/emit/paneResolver.js.map +1 -1
  180. package/dist/emit/plot.js.map +1 -1
  181. package/dist/emit/runtimeError.js.map +1 -1
  182. package/dist/execution/dispose.js.map +1 -1
  183. package/dist/execution/drain.js.map +1 -1
  184. package/dist/execution/index.js.map +1 -1
  185. package/dist/execution/onBarClose.js.map +1 -1
  186. package/dist/execution/onBarTick.js.map +1 -1
  187. package/dist/execution/onHistory.js.map +1 -1
  188. package/dist/execution/runComputeStep.js.map +1 -1
  189. package/dist/execution/secondaryStream.js.map +1 -1
  190. package/dist/index.js.map +1 -1
  191. package/dist/inputs/index.js.map +1 -1
  192. package/dist/inputs/resolveInputs.js.map +1 -1
  193. package/dist/internal.js.map +1 -1
  194. package/dist/persistentStateStore.js.map +1 -1
  195. package/dist/persistentStateStore.runtime.js.map +1 -1
  196. package/dist/persistentStateStore.validate.js.map +1 -1
  197. package/dist/primitives.js.map +1 -1
  198. package/dist/request/alignHtfSeriesCache.js.map +1 -1
  199. package/dist/request/alignHtfSeriesToLtf.d.ts +2 -2
  200. package/dist/request/alignHtfSeriesToLtf.js +2 -2
  201. package/dist/request/alignHtfSeriesToLtf.js.map +1 -1
  202. package/dist/request/bucketLtfBarsByMainContainment.js.map +1 -1
  203. package/dist/request/bucketLtfBarsCache.js.map +1 -1
  204. package/dist/request/index.js.map +1 -1
  205. package/dist/request/lowerTf.js.map +1 -1
  206. package/dist/request/pushOnce.js.map +1 -1
  207. package/dist/request/requestNamespace.js.map +1 -1
  208. package/dist/request/security.js.map +1 -1
  209. package/dist/request/streamBars.js.map +1 -1
  210. package/dist/ringBuffer.d.ts +2 -2
  211. package/dist/ringBuffer.js +1 -1
  212. package/dist/ringBuffer.js.map +1 -1
  213. package/dist/runtimeContext.d.ts +3 -3
  214. package/dist/runtimeContext.js.map +1 -1
  215. package/dist/seriesView.d.ts +1 -1
  216. package/dist/seriesView.js +1 -1
  217. package/dist/seriesView.js.map +1 -1
  218. package/dist/state/index.js.map +1 -1
  219. package/dist/state/lifecycle.js.map +1 -1
  220. package/dist/state/stateNamespace.js.map +1 -1
  221. package/dist/state/stateSlot.js.map +1 -1
  222. package/dist/stateStore.d.ts +2 -2
  223. package/dist/stateStore.js.map +1 -1
  224. package/dist/streamState.d.ts +1 -1
  225. package/dist/streamState.js +1 -1
  226. package/dist/streamState.js.map +1 -1
  227. package/dist/ta/adl.js +2 -2
  228. package/dist/ta/adl.js.map +1 -1
  229. package/dist/ta/adr.d.ts +3 -3
  230. package/dist/ta/adr.js +5 -5
  231. package/dist/ta/adr.js.map +1 -1
  232. package/dist/ta/adx.d.ts +1 -1
  233. package/dist/ta/adx.js +3 -3
  234. package/dist/ta/adx.js.map +1 -1
  235. package/dist/ta/alma.d.ts +3 -3
  236. package/dist/ta/alma.js +5 -5
  237. package/dist/ta/alma.js.map +1 -1
  238. package/dist/ta/anchoredVolumeProfile.js.map +1 -1
  239. package/dist/ta/anchoredVwap.d.ts +1 -1
  240. package/dist/ta/anchoredVwap.js +3 -3
  241. package/dist/ta/anchoredVwap.js.map +1 -1
  242. package/dist/ta/ao.js +2 -2
  243. package/dist/ta/ao.js.map +1 -1
  244. package/dist/ta/aroon.js +2 -2
  245. package/dist/ta/aroon.js.map +1 -1
  246. package/dist/ta/aroonOsc.js +2 -2
  247. package/dist/ta/aroonOsc.js.map +1 -1
  248. package/dist/ta/atr.d.ts +1 -1
  249. package/dist/ta/atr.js +3 -3
  250. package/dist/ta/atr.js.map +1 -1
  251. package/dist/ta/barssince.js +1 -1
  252. package/dist/ta/barssince.js.map +1 -1
  253. package/dist/ta/bb.d.ts +1 -1
  254. package/dist/ta/bb.js +3 -3
  255. package/dist/ta/bb.js.map +1 -1
  256. package/dist/ta/bbPercentB.js +2 -2
  257. package/dist/ta/bbPercentB.js.map +1 -1
  258. package/dist/ta/bbw.js +2 -2
  259. package/dist/ta/bbw.js.map +1 -1
  260. package/dist/ta/bop.js +2 -2
  261. package/dist/ta/bop.js.map +1 -1
  262. package/dist/ta/cci.js +2 -2
  263. package/dist/ta/cci.js.map +1 -1
  264. package/dist/ta/chaikinOsc.d.ts +1 -1
  265. package/dist/ta/chaikinOsc.js +3 -3
  266. package/dist/ta/chaikinOsc.js.map +1 -1
  267. package/dist/ta/chandeKrollStop.d.ts +1 -1
  268. package/dist/ta/chandeKrollStop.js +3 -3
  269. package/dist/ta/chandeKrollStop.js.map +1 -1
  270. package/dist/ta/chandelier.d.ts +1 -1
  271. package/dist/ta/chandelier.js +3 -3
  272. package/dist/ta/chandelier.js.map +1 -1
  273. package/dist/ta/change.js +1 -1
  274. package/dist/ta/change.js.map +1 -1
  275. package/dist/ta/chop.js +2 -2
  276. package/dist/ta/chop.js.map +1 -1
  277. package/dist/ta/cmf.js +2 -2
  278. package/dist/ta/cmf.js.map +1 -1
  279. package/dist/ta/cmo.js +2 -2
  280. package/dist/ta/cmo.js.map +1 -1
  281. package/dist/ta/connorsRsi.d.ts +1 -1
  282. package/dist/ta/connorsRsi.js +3 -3
  283. package/dist/ta/connorsRsi.js.map +1 -1
  284. package/dist/ta/coppock.js +2 -2
  285. package/dist/ta/coppock.js.map +1 -1
  286. package/dist/ta/crossover.d.ts +1 -1
  287. package/dist/ta/crossover.js +2 -2
  288. package/dist/ta/crossover.js.map +1 -1
  289. package/dist/ta/crossunder.d.ts +1 -1
  290. package/dist/ta/crossunder.js +2 -2
  291. package/dist/ta/crossunder.js.map +1 -1
  292. package/dist/ta/dema.js +2 -2
  293. package/dist/ta/dema.js.map +1 -1
  294. package/dist/ta/dmi.d.ts +1 -1
  295. package/dist/ta/dmi.js +3 -3
  296. package/dist/ta/dmi.js.map +1 -1
  297. package/dist/ta/donchian.js +2 -2
  298. package/dist/ta/donchian.js.map +1 -1
  299. package/dist/ta/dpo.js +2 -2
  300. package/dist/ta/dpo.js.map +1 -1
  301. package/dist/ta/ema.d.ts +1 -1
  302. package/dist/ta/ema.js +3 -3
  303. package/dist/ta/ema.js.map +1 -1
  304. package/dist/ta/envelope.js +2 -2
  305. package/dist/ta/envelope.js.map +1 -1
  306. package/dist/ta/eom.d.ts +1 -1
  307. package/dist/ta/eom.js +3 -3
  308. package/dist/ta/eom.js.map +1 -1
  309. package/dist/ta/fisher.js +2 -2
  310. package/dist/ta/fisher.js.map +1 -1
  311. package/dist/ta/fixedRangeVolumeProfile.js.map +1 -1
  312. package/dist/ta/highest.js +1 -1
  313. package/dist/ta/highest.js.map +1 -1
  314. package/dist/ta/historicalVolatility.d.ts +1 -1
  315. package/dist/ta/historicalVolatility.js +3 -3
  316. package/dist/ta/historicalVolatility.js.map +1 -1
  317. package/dist/ta/hma.js +2 -2
  318. package/dist/ta/hma.js.map +1 -1
  319. package/dist/ta/ichimoku.d.ts +1 -1
  320. package/dist/ta/ichimoku.js +3 -3
  321. package/dist/ta/ichimoku.js.map +1 -1
  322. package/dist/ta/index.js.map +1 -1
  323. package/dist/ta/kama.js +2 -2
  324. package/dist/ta/kama.js.map +1 -1
  325. package/dist/ta/keltner.js +2 -2
  326. package/dist/ta/keltner.js.map +1 -1
  327. package/dist/ta/klinger.js +2 -2
  328. package/dist/ta/klinger.js.map +1 -1
  329. package/dist/ta/kst.js +2 -2
  330. package/dist/ta/kst.js.map +1 -1
  331. package/dist/ta/lib/adxFromDi.js +2 -2
  332. package/dist/ta/lib/adxFromDi.js.map +1 -1
  333. package/dist/ta/lib/applyOffset.js +2 -2
  334. package/dist/ta/lib/applyOffset.js.map +1 -1
  335. package/dist/ta/lib/computeMa.js +2 -2
  336. package/dist/ta/lib/computeMa.js.map +1 -1
  337. package/dist/ta/lib/computeMaOfFloat64.js +2 -2
  338. package/dist/ta/lib/computeMaOfFloat64.js.map +1 -1
  339. package/dist/ta/lib/directionalState.js +2 -2
  340. package/dist/ta/lib/directionalState.js.map +1 -1
  341. package/dist/ta/lib/donchianMid.js +2 -2
  342. package/dist/ta/lib/donchianMid.js.map +1 -1
  343. package/dist/ta/lib/emaFloat64.js +2 -2
  344. package/dist/ta/lib/emaFloat64.js.map +1 -1
  345. package/dist/ta/lib/linearRegression.js +2 -2
  346. package/dist/ta/lib/linearRegression.js.map +1 -1
  347. package/dist/ta/lib/maTypes.js.map +1 -1
  348. package/dist/ta/lib/pearson.js +2 -2
  349. package/dist/ta/lib/pearson.js.map +1 -1
  350. package/dist/ta/lib/pickCandleSource.js +2 -2
  351. package/dist/ta/lib/pickCandleSource.js.map +1 -1
  352. package/dist/ta/lib/readSourceField.js +2 -2
  353. package/dist/ta/lib/readSourceField.js.map +1 -1
  354. package/dist/ta/lib/rollingStddev.js +2 -2
  355. package/dist/ta/lib/rollingStddev.js.map +1 -1
  356. package/dist/ta/lib/smaFloat64.js +2 -2
  357. package/dist/ta/lib/smaFloat64.js.map +1 -1
  358. package/dist/ta/lib/smmaFloat64.js +2 -2
  359. package/dist/ta/lib/smmaFloat64.js.map +1 -1
  360. package/dist/ta/lib/sourceValue.js.map +1 -1
  361. package/dist/ta/lib/trSeries.js +2 -2
  362. package/dist/ta/lib/trSeries.js.map +1 -1
  363. package/dist/ta/lib/volume-profile/bucketEdges.js.map +1 -1
  364. package/dist/ta/lib/volume-profile/bucketizeVolume.js.map +1 -1
  365. package/dist/ta/lib/volume-profile/developingSeries.js.map +1 -1
  366. package/dist/ta/lib/volume-profile/index.js.map +1 -1
  367. package/dist/ta/lib/volume-profile/intercept.js.map +1 -1
  368. package/dist/ta/lib/volume-profile/scaffold.js.map +1 -1
  369. package/dist/ta/lib/volume-profile/tooHeavy.js.map +1 -1
  370. package/dist/ta/lib/volume-profile/types.js.map +1 -1
  371. package/dist/ta/lib/volume-profile/valueArea.js.map +1 -1
  372. package/dist/ta/lib/volume-profile/volumeProfileShared.js.map +1 -1
  373. package/dist/ta/lib/vwmaFloat64.js +2 -2
  374. package/dist/ta/lib/vwmaFloat64.js.map +1 -1
  375. package/dist/ta/lib/wilderDirectional.js +2 -2
  376. package/dist/ta/lib/wilderDirectional.js.map +1 -1
  377. package/dist/ta/lib/wilderSmoothing.js +2 -2
  378. package/dist/ta/lib/wilderSmoothing.js.map +1 -1
  379. package/dist/ta/lib/wmaFloat64.js +2 -2
  380. package/dist/ta/lib/wmaFloat64.js.map +1 -1
  381. package/dist/ta/lowest.js +1 -1
  382. package/dist/ta/lowest.js.map +1 -1
  383. package/dist/ta/lsma.js +2 -2
  384. package/dist/ta/lsma.js.map +1 -1
  385. package/dist/ta/maRibbon.js +2 -2
  386. package/dist/ta/maRibbon.js.map +1 -1
  387. package/dist/ta/macd.d.ts +1 -1
  388. package/dist/ta/macd.js +4 -4
  389. package/dist/ta/macd.js.map +1 -1
  390. package/dist/ta/massIndex.d.ts +1 -1
  391. package/dist/ta/massIndex.js +3 -3
  392. package/dist/ta/massIndex.js.map +1 -1
  393. package/dist/ta/mcginley.js +2 -2
  394. package/dist/ta/mcginley.js.map +1 -1
  395. package/dist/ta/median.js +2 -2
  396. package/dist/ta/median.js.map +1 -1
  397. package/dist/ta/mfi.d.ts +1 -1
  398. package/dist/ta/mfi.js +3 -3
  399. package/dist/ta/mfi.js.map +1 -1
  400. package/dist/ta/momentum.js +2 -2
  401. package/dist/ta/momentum.js.map +1 -1
  402. package/dist/ta/netVolume.d.ts +1 -1
  403. package/dist/ta/netVolume.js +3 -3
  404. package/dist/ta/netVolume.js.map +1 -1
  405. package/dist/ta/nvi.d.ts +1 -1
  406. package/dist/ta/nvi.js +3 -3
  407. package/dist/ta/nvi.js.map +1 -1
  408. package/dist/ta/nz.js +1 -1
  409. package/dist/ta/nz.js.map +1 -1
  410. package/dist/ta/obv.js +2 -2
  411. package/dist/ta/obv.js.map +1 -1
  412. package/dist/ta/persistence.js.map +1 -1
  413. package/dist/ta/pivotsHighLow.js +2 -2
  414. package/dist/ta/pivotsHighLow.js.map +1 -1
  415. package/dist/ta/pivotsStandard.d.ts +1 -1
  416. package/dist/ta/pivotsStandard.js +3 -3
  417. package/dist/ta/pivotsStandard.js.map +1 -1
  418. package/dist/ta/pmo.js +2 -2
  419. package/dist/ta/pmo.js.map +1 -1
  420. package/dist/ta/ppo.d.ts +1 -1
  421. package/dist/ta/ppo.js +3 -3
  422. package/dist/ta/ppo.js.map +1 -1
  423. package/dist/ta/psar.js +2 -2
  424. package/dist/ta/psar.js.map +1 -1
  425. package/dist/ta/pvi.d.ts +1 -1
  426. package/dist/ta/pvi.js +3 -3
  427. package/dist/ta/pvi.js.map +1 -1
  428. package/dist/ta/pvo.d.ts +1 -1
  429. package/dist/ta/pvo.js +3 -3
  430. package/dist/ta/pvo.js.map +1 -1
  431. package/dist/ta/pvt.d.ts +1 -1
  432. package/dist/ta/pvt.js +3 -3
  433. package/dist/ta/pvt.js.map +1 -1
  434. package/dist/ta/registry.js.map +1 -1
  435. package/dist/ta/roc.js +2 -2
  436. package/dist/ta/roc.js.map +1 -1
  437. package/dist/ta/rsi.d.ts +1 -1
  438. package/dist/ta/rsi.js +3 -3
  439. package/dist/ta/rsi.js.map +1 -1
  440. package/dist/ta/rvgi.js +2 -2
  441. package/dist/ta/rvgi.js.map +1 -1
  442. package/dist/ta/rvi.d.ts +1 -1
  443. package/dist/ta/rvi.js +3 -3
  444. package/dist/ta/rvi.js.map +1 -1
  445. package/dist/ta/sessionVolumeProfile.js.map +1 -1
  446. package/dist/ta/sma.d.ts +1 -1
  447. package/dist/ta/sma.js +3 -3
  448. package/dist/ta/sma.js.map +1 -1
  449. package/dist/ta/smi.js +2 -2
  450. package/dist/ta/smi.js.map +1 -1
  451. package/dist/ta/smma.js +2 -2
  452. package/dist/ta/smma.js.map +1 -1
  453. package/dist/ta/stdev.d.ts +1 -1
  454. package/dist/ta/stdev.js +3 -3
  455. package/dist/ta/stdev.js.map +1 -1
  456. package/dist/ta/stoch.js +2 -2
  457. package/dist/ta/stoch.js.map +1 -1
  458. package/dist/ta/stochRsi.js +2 -2
  459. package/dist/ta/stochRsi.js.map +1 -1
  460. package/dist/ta/supertrend.d.ts +1 -1
  461. package/dist/ta/supertrend.js +3 -3
  462. package/dist/ta/supertrend.js.map +1 -1
  463. package/dist/ta/tema.js +2 -2
  464. package/dist/ta/tema.js.map +1 -1
  465. package/dist/ta/trendStrengthIndex.d.ts +2 -2
  466. package/dist/ta/trendStrengthIndex.js +4 -4
  467. package/dist/ta/trendStrengthIndex.js.map +1 -1
  468. package/dist/ta/trix.d.ts +1 -1
  469. package/dist/ta/trix.js +3 -3
  470. package/dist/ta/trix.js.map +1 -1
  471. package/dist/ta/tsi.js +2 -2
  472. package/dist/ta/tsi.js.map +1 -1
  473. package/dist/ta/ulcerIndex.js +2 -2
  474. package/dist/ta/ulcerIndex.js.map +1 -1
  475. package/dist/ta/ultimateOsc.js +2 -2
  476. package/dist/ta/ultimateOsc.js.map +1 -1
  477. package/dist/ta/valuewhen.js +1 -1
  478. package/dist/ta/valuewhen.js.map +1 -1
  479. package/dist/ta/visibleRangeVolumeProfile.d.ts +2 -2
  480. package/dist/ta/visibleRangeVolumeProfile.js +2 -2
  481. package/dist/ta/visibleRangeVolumeProfile.js.map +1 -1
  482. package/dist/ta/vol.js +2 -2
  483. package/dist/ta/vol.js.map +1 -1
  484. package/dist/ta/volatilityStop.d.ts +1 -1
  485. package/dist/ta/volatilityStop.js +3 -3
  486. package/dist/ta/volatilityStop.js.map +1 -1
  487. package/dist/ta/vortex.d.ts +1 -1
  488. package/dist/ta/vortex.js +3 -3
  489. package/dist/ta/vortex.js.map +1 -1
  490. package/dist/ta/vwap.d.ts +3 -3
  491. package/dist/ta/vwap.js +5 -5
  492. package/dist/ta/vwap.js.map +1 -1
  493. package/dist/ta/vwma.js +2 -2
  494. package/dist/ta/vwma.js.map +1 -1
  495. package/dist/ta/williamsFractal.js +2 -2
  496. package/dist/ta/williamsFractal.js.map +1 -1
  497. package/dist/ta/williamsR.js +2 -2
  498. package/dist/ta/williamsR.js.map +1 -1
  499. package/dist/ta/wma.js +2 -2
  500. package/dist/ta/wma.js.map +1 -1
  501. package/dist/ta/zigZag.js +2 -2
  502. package/dist/ta/zigZag.js.map +1 -1
  503. package/dist/views/barstateView.js.map +1 -1
  504. package/dist/views/index.js.map +1 -1
  505. package/dist/views/refreshRuntimeViews.js.map +1 -1
  506. package/dist/views/symInfoView.js.map +1 -1
  507. package/dist/views/timeframeView.js.map +1 -1
  508. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"aroon.js","sourceRoot":"","sources":["../../src/ta/aroon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aroon.js","sourceRoot":"","sources":["../../src/ta/aroon.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/aroon.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. Aroon reads `bar.high` / `bar.low` directly\n// (mirrors Pine's `ta.aroon(length)` which has no source param) and\n// scans the trailing `length + 1` window per close for the argmax /\n// argmin (matches the invinite reference's `computeAroonSeries` loop).\n\nimport type { AroonOpts, AroonResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype AroonSlot = {\n readonly outputs: AroonResult;\n readonly upBuffer: Float64RingBuffer;\n readonly downBuffer: Float64RingBuffer;\n readonly length: number;\n /**\n * Closed-bar `high`s across the trailing `length + 1` window.\n * `at(0)` is the most recent close; `at(length)` is the oldest.\n */\n readonly highWindow: Float64RingBuffer;\n /** Closed-bar `low`s across the trailing `length + 1` window. */\n readonly lowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n /**\n * Bars-since-high computed at the most recent close (0-based,\n * `0 ≤ value ≤ length`). Updated only on close-side advances.\n */\n lastHighIndex: number;\n /** Bars-since-low computed at the most recent close. */\n lastLowIndex: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.aroon called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): AroonSlot {\n const upBuffer = new Float64RingBuffer(capacity);\n const downBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n up: makeSeriesView<number>(upBuffer),\n down: makeSeriesView<number>(downBuffer),\n }),\n upBuffer,\n downBuffer,\n length,\n highWindow: new Float64RingBuffer(length + 1),\n lowWindow: new Float64RingBuffer(length + 1),\n barCount: 0,\n lastHighIndex: 0,\n lastLowIndex: 0,\n };\n}\n\n/**\n * Scan the `length + 1` window for the bars-since-high index. NaN\n * entries are skipped (cannot win argmax). Tie-break: smallest age\n * wins (the most-recent extreme — matches invinite's `>` comparison\n * and TradingView's convention). Returns `-1` if every entry in the\n * window is NaN.\n *\n * `headHigh` is the candidate value for age 0 — passed separately so\n * tick replay can substitute the tick's head value without mutating\n * the closed `highWindow`.\n */\nfunction scanHighArgmax(window: Float64RingBuffer, headHigh: number, length: number): number {\n let bestIdx = -1;\n let bestVal = Number.NEGATIVE_INFINITY;\n if (Number.isFinite(headHigh)) {\n bestIdx = 0;\n bestVal = headHigh;\n }\n for (let k = 1; k <= length; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v > bestVal) {\n bestVal = v;\n bestIdx = k;\n }\n }\n return bestIdx;\n}\n\nfunction scanLowArgmin(window: Float64RingBuffer, headLow: number, length: number): number {\n let bestIdx = -1;\n let bestVal = Number.POSITIVE_INFINITY;\n if (Number.isFinite(headLow)) {\n bestIdx = 0;\n bestVal = headLow;\n }\n for (let k = 1; k <= length; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v < bestVal) {\n bestVal = v;\n bestIdx = k;\n }\n }\n return bestIdx;\n}\n\nfunction closeStep(slot: AroonSlot, high: number, low: number): { up: number; down: number } {\n slot.barCount += 1;\n slot.highWindow.append(high);\n slot.lowWindow.append(low);\n\n // Per the invinite reference: warmup is `length` bars; the first\n // finite output lands at `barCount === length + 1` (the bar at\n // 0-based index `length`).\n if (slot.barCount <= slot.length) {\n return { up: Number.NaN, down: Number.NaN };\n }\n\n const barsSinceHigh = scanHighArgmax(slot.highWindow, slot.highWindow.at(0), slot.length);\n const barsSinceLow = scanLowArgmin(slot.lowWindow, slot.lowWindow.at(0), slot.length);\n if (barsSinceHigh === -1 || barsSinceLow === -1) {\n return { up: Number.NaN, down: Number.NaN };\n }\n slot.lastHighIndex = barsSinceHigh;\n slot.lastLowIndex = barsSinceLow;\n const up = (100 * (slot.length - barsSinceHigh)) / slot.length;\n const down = (100 * (slot.length - barsSinceLow)) / slot.length;\n return { up, down };\n}\n\nfunction tickStep(slot: AroonSlot, high: number, low: number): { up: number; down: number } {\n if (slot.barCount <= slot.length) return { up: Number.NaN, down: Number.NaN };\n // Substitute the tick's head values into the scan without mutating\n // the closed window. The age-0 slot in `highWindow` / `lowWindow`\n // still holds the most recent CLOSE; we pass `high` / `low` as the\n // override.\n const barsSinceHigh = scanHighArgmax(slot.highWindow, high, slot.length);\n const barsSinceLow = scanLowArgmin(slot.lowWindow, low, slot.length);\n if (barsSinceHigh === -1 || barsSinceLow === -1) {\n return { up: Number.NaN, down: Number.NaN };\n }\n const up = (100 * (slot.length - barsSinceHigh)) / slot.length;\n const down = (100 * (slot.length - barsSinceLow)) / slot.length;\n return { up, down };\n}\n\n/**\n * Aroon — recency-of-extreme oscillator over the trailing `length + 1`\n * bars. `aroon.up` tracks how recently a new N-bar high was made;\n * `aroon.down` mirrors with N-bar lows. Both Series ∈ [0, 100] when\n * defined; NaN until `length` closed bars have been folded in. Reads\n * `bar.high` / `bar.low` directly from the runtime stream (mirrors\n * Pine's `ta.aroon(length)` — no source param). Returns a cached\n * `{ up, down }` record (same identity every bar).\n *\n * @formula barsSinceHigh = age (0..length) of the max high in window ;\n * barsSinceLow = age (0..length) of the min low in window ;\n * up = 100 · (length − barsSinceHigh) / length ;\n * down = 100 · (length − barsSinceLow) / length\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const a = ta.aroon(14);\n * // plot(a.up);\n * // plot(a.down);\n */\nexport function aroon(slotId: string, length: number, _opts?: AroonOpts): AroonResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AroonSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const high = ctx.stream.bar.high;\n const low = ctx.stream.bar.low;\n if (ctx.isTick) {\n const { up, down } = tickStep(slot, high, low);\n slot.upBuffer.replaceHead(up);\n slot.downBuffer.replaceHead(down);\n } else {\n const { up, down } = closeStep(slot, high, low);\n slot.upBuffer.append(up);\n slot.downBuffer.append(down);\n }\n return slot.outputs;\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/aroon-osc.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. AroonOsc composes `ta.aroon` via a sub-slot
@@ -1 +1 @@
1
- {"version":3,"file":"aroonOsc.js","sourceRoot":"","sources":["../../src/ta/aroonOsc.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,4EAA4E;AAC5E,mEAAmE;AACnE,0DAA0D;AAC1D,yEAAyE;AACzE,qEAAqE;AACrE,4DAA4D;AAC5D,qEAAqE;AACrE,6DAA6D;AAI7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAOnC,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAC9B,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;KAC5C,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,MAAc,EAAE,KAAoB;IACzE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,oEAAoE;IACpE,+DAA+D;IAC/D,2DAA2D;IAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE3C,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;IACtE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IACxB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACpF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"aroonOsc.js","sourceRoot":"","sources":["../../src/ta/aroonOsc.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,4EAA4E;AAC5E,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,qEAAqE;AACrE,6DAA6D;AAI7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAOnC,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAC9B,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;KAC5C,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,MAAc,EAAE,KAAoB;IACzE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,oEAAoE;IACpE,+DAA+D;IAC/D,2DAA2D;IAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE3C,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;IACtE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IACxB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACpF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/aroon-osc.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. AroonOsc composes `ta.aroon` via a sub-slot\n// id `${slotId}/aroon`, so a fix to Aroon flows in for free.\n\nimport type { AroonOscOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { aroon } from \"./aroon.js\";\n\ntype AroonOscSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.aroonOsc called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): AroonOscSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n };\n}\n\n/**\n * Aroon Oscillator — `aroon.up − aroon.down`. Bounded in `[-100, 100]`\n * when defined; NaN through the `length` warmup window. Composes\n * `ta.aroon` at sub-slot `${slotId}/aroon`, so the math is fed by\n * the same per-bar window scan and a fix to Aroon flows in for free.\n *\n * @formula osc = aroon.up − aroon.down\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const osc = ta.aroonOsc(14);\n * // plot(osc);\n */\nexport function aroonOsc(slotId: string, length: number, _opts?: AroonOscOpts): Series<number> {\n const ctx = getCtx();\n // Compose: aroon(subSlotId, length) — no opts pass-through; aroon's\n // opts surface differs (it carries `outputs`) and the AroonOsc\n // surface concerns (`lineStyle`) don't pipe into the math.\n const r = aroon(`${slotId}/aroon`, length);\n\n let slot = ctx.stream.taSlots.get(slotId) as AroonOscSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const up = r.up.current;\n const down = r.down.current;\n const value = Number.isFinite(up) && Number.isFinite(down) ? up - down : Number.NaN;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n"]}
package/dist/ta/atr.d.ts CHANGED
@@ -13,7 +13,7 @@ import type { AtrOpts, Series } from "@invinite-org/chartlang-core";
13
13
  * @stable
14
14
  *
15
15
  * `opts.offset` shifts the returned series so `series.current` reads
16
- * the value `offset` bars ago (PLAN.md §9.1).
16
+ * the value `offset` bars ago.
17
17
  *
18
18
  * @example
19
19
  * // import { ta } from "@invinite-org/chartlang-runtime";
package/dist/ta/atr.js CHANGED
@@ -4,8 +4,8 @@
4
4
  // Ported from invinite/src/components/trading-chart/indicators/atr.ts
5
5
  // plus lib/tr-series.ts
6
6
  // (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).
7
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
8
- // provenance contract; the math is the reference, the code style is not.
7
+ // Re-licensed MIT for chartlang. The math is the reference, the code
8
+ // style is not.
9
9
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
10
10
  // mode) follow chartlang's primitive shape — NOT invinite's
11
11
  // IndicatorPlugin shape. ATR derives from `bar.high`/`bar.low`/
@@ -105,7 +105,7 @@ function tickValue(slot, high, low, close) {
105
105
  * @stable
106
106
  *
107
107
  * `opts.offset` shifts the returned series so `series.current` reads
108
- * the value `offset` bars ago (PLAN.md §9.1).
108
+ * the value `offset` bars ago.
109
109
  *
110
110
  * @example
111
111
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"atr.js","sourceRoot":"","sources":["../../src/ta/atr.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"atr.js","sourceRoot":"","sources":["../../src/ta/atr.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/atr.ts\n// plus lib/tr-series.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. ATR derives from `bar.high`/`bar.low`/\n// `bar.close` directly — no `source` argument per Pine.\n\nimport type { AtrOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { wilderStep } from \"./lib/wilderSmoothing.js\";\n\ntype AtrSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n seedTrSum: number;\n /** Number of TR values folded into the seed so far. */\n trCount: number;\n atr: number;\n /** Close of the prior closed bar — used to compute TR on the next close. */\n prevClose: number;\n /** Close of the bar before the current bar (i.e. the close 2 bars ago). */\n prevPrevClose: number;\n /** ATR as of the prior closed bar — used by tick-mode replay. */\n prevClosedAtr: number;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.atr called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): AtrSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n seedTrSum: 0,\n trCount: 0,\n atr: Number.NaN,\n prevClose: Number.NaN,\n prevPrevClose: Number.NaN,\n prevClosedAtr: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: AtrSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction trueRange(high: number, low: number, prevClose: number): number {\n if (!Number.isFinite(prevClose)) return high - low;\n return Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n}\n\nfunction closeValue(slot: AtrSlot, high: number, low: number, close: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n if (Number.isFinite(slot.atr)) return slot.atr;\n return Number.NaN;\n }\n const tr = trueRange(high, low, slot.prevClose);\n slot.prevPrevClose = slot.prevClose;\n slot.prevClose = close;\n slot.trCount += 1;\n\n if (slot.trCount < slot.length) {\n slot.seedTrSum += tr;\n return Number.NaN;\n }\n if (slot.trCount === slot.length) {\n slot.seedTrSum += tr;\n slot.atr = slot.seedTrSum / slot.length;\n slot.prevClosedAtr = slot.atr;\n return slot.atr;\n }\n slot.prevClosedAtr = slot.atr;\n slot.atr = wilderStep(slot.atr, tr, slot.length);\n return slot.atr;\n}\n\nfunction tickValue(slot: AtrSlot, high: number, low: number, close: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(close)) {\n return Number.isFinite(slot.atr) ? slot.atr : Number.NaN;\n }\n if (slot.trCount < slot.length) return Number.NaN;\n // Tick TR uses the **bar before the current bar**'s close — frozen\n // by the prior close-side advance as `prevPrevClose`.\n const tr = trueRange(high, low, slot.prevPrevClose);\n if (slot.trCount === slot.length) {\n // We just seeded on the current close; tick replays the same seed\n // (the seed window is fixed once the bar closes).\n return slot.atr;\n }\n return wilderStep(slot.prevClosedAtr, tr, slot.length);\n}\n\n/**\n * Wilder's Average True Range. Sources from `bar.high` / `bar.low` /\n * `bar.close` directly (no `source` arg — matches Pine). Seeds at bar\n * `length − 1` as the simple mean of the first `length` TR values;\n * subsequent slots use the Wilder recurrence with α = 1/length.\n *\n * @formula TR[t] = max(high − low, |high − prevClose|, |low − prevClose|) ;\n * seed at bar length − 1 = mean(TR[0 .. length − 1]) ;\n * ATR[t] = (ATR[t − 1] · (length − 1) + TR[t]) / length\n * @warmup length − 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const a = ta.atr(\"slot\", 14);\n * // const head = a.current;\n * // const lagged = ta.atr(\"slot2\", 14, { offset: 5 });\n */\nexport function atr(slotId: string, length: number, opts?: AtrOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as AtrSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, bar.high, bar.low, bar.close));\n } else {\n slot.outBuffer.append(closeValue(slot, bar.high, bar.low, bar.close));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
2
  // See the LICENSE file in the repo root for full license text.
3
3
  //
4
- // No invinite source — semantics per Pine `ta.barssince`. See PLAN.md §3.1.
4
+ // No invinite source — semantics per Pine `ta.barssince`.
5
5
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
6
6
  // mode) follow chartlang's primitive shape.
7
7
  import { Float64RingBuffer } from "../ringBuffer.js";
@@ -1 +1 @@
1
- {"version":3,"file":"barssince.js","sourceRoot":"","sources":["../../src/ta/barssince.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"barssince.js","sourceRoot":"","sources":["../../src/ta/barssince.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// No invinite source — semantics per Pine `ta.barssince`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { BarssinceOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\ntype BarssinceSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedSeries: Map<number, Series<number>>;\n /** Bars elapsed since the most recent `condition === true`. */\n sinceTrue: number;\n /** Whether any `true` has ever been seen. */\n seenTrue: boolean;\n /** Snapshot BEFORE the most recent close (for tick replay). */\n prevSinceTrue: number;\n prevSeenTrue: boolean;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.barssince called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): BarssinceSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedSeries: new Map(),\n sinceTrue: 0,\n seenTrue: false,\n prevSinceTrue: 0,\n prevSeenTrue: false,\n };\n}\n\nfunction closeValue(slot: BarssinceSlot, fired: boolean): number {\n slot.prevSinceTrue = slot.sinceTrue;\n slot.prevSeenTrue = slot.seenTrue;\n if (fired) {\n slot.sinceTrue = 0;\n slot.seenTrue = true;\n } else if (slot.seenTrue) {\n slot.sinceTrue += 1;\n }\n return slot.seenTrue ? slot.sinceTrue : Number.NaN;\n}\n\nfunction tickValue(slot: BarssinceSlot, fired: boolean): number {\n // Replay against pre-close snapshot.\n let sinceTrue = slot.prevSinceTrue;\n let seenTrue = slot.prevSeenTrue;\n if (fired) {\n sinceTrue = 0;\n seenTrue = true;\n } else if (seenTrue) {\n sinceTrue += 1;\n }\n return seenTrue ? sinceTrue : Number.NaN;\n}\n\n/**\n * Number of bars since `condition === true` last fired. `0` at the\n * matching bar, `1` the next bar, etc. NaN until the first ever match.\n * NaN-condition values are treated as `false` — they do NOT reset the\n * counter.\n *\n * @formula out[t] = 0 if condition[t]; out[t − 1] + 1 if seenTrue; NaN otherwise\n * @warmup data-dependent — NaN until the first `condition === true`\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const fast = ta.ema(bar.close, 12);\n * // const slow = ta.ema(bar.close, 26);\n * // const sinceCross = ta.barssince(ta.crossover(fast, slow));\n * // plot(sinceCross);\n */\nexport function barssince(\n slotId: string,\n condition: Series<boolean>,\n opts: BarssinceOpts = {},\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as BarssinceSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const fired = condition.current === true;\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, fired));\n } else {\n slot.outBuffer.append(closeValue(slot, fired));\n }\n const offset = opts.offset ?? 0;\n if (offset === 0) return slot.series;\n const shifted = slot.shiftedSeries.get(offset);\n if (shifted !== undefined) return shifted;\n const next = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedSeries.set(offset, next);\n return next;\n}\n"]}
package/dist/ta/bb.d.ts CHANGED
@@ -15,7 +15,7 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
15
15
  * @since 0.1
16
16
  * @stable
17
17
  *
18
- * `opts.offset` shifts all three bands in lockstep (PLAN.md §9.1)
18
+ * `opts.offset` shifts all three bands in lockstep —
19
19
  * `series.current` on each band returns the value `offset` bars ago.
20
20
  *
21
21
  * @example
package/dist/ta/bb.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/bb.ts
5
5
  // (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. BB is composed from `sma` + `stdev` via
@@ -66,7 +66,7 @@ function resultForOffset(slot, offset) {
66
66
  * @since 0.1
67
67
  * @stable
68
68
  *
69
- * `opts.offset` shifts all three bands in lockstep (PLAN.md §9.1)
69
+ * `opts.offset` shifts all three bands in lockstep —
70
70
  * `series.current` on each band returns the value `offset` bars ago.
71
71
  *
72
72
  * @example
package/dist/ta/bb.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bb.js","sourceRoot":"","sources":["../../src/ta/bb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bb.js","sourceRoot":"","sources":["../../src/ta/bb.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bb.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. BB is composed from `sma` + `stdev` via\n// sub-slot ids so a fix to either primitive flows in for free.\n\nimport type { BbOpts, BbResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { sma } from \"./sma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { stdev } from \"./stdev.js\";\n\nconst DEFAULT_MULTIPLIER = 2;\n\ntype BbSlot = {\n readonly result: BbResult;\n readonly upper: Float64RingBuffer;\n readonly middle: Series<number>;\n readonly lower: Float64RingBuffer;\n /**\n * Reference to the SMA sub-slot's output ring buffer. Captured at\n * first call so per-offset shifted middle views can be constructed\n * without re-entering `sma()` (which would double-advance the\n * sub-slot's compute on every bar).\n */\n readonly middleBuf: Float64RingBuffer;\n /**\n * Per-offset frozen `BbResult` cache. `offset === 0` returns\n * `result` directly (identity-preserving). Each cached result\n * proxies the same three underlying buffers via shifted views.\n */\n readonly shiftedResults: Map<number, BbResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bb called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, middle: Series<number>, middleBuf: Float64RingBuffer): BbSlot {\n const upper = new Float64RingBuffer(capacity);\n const lower = new Float64RingBuffer(capacity);\n const upperView = makeSeriesView<number>(upper);\n const lowerView = makeSeriesView<number>(lower);\n return {\n result: Object.freeze({ upper: upperView, middle, lower: lowerView }),\n upper,\n middle,\n lower,\n middleBuf,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: BbSlot, offset: number): BbResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n upper: makeShiftedSeriesView<number>(slot.upper, offset),\n middle: makeShiftedSeriesView<number>(slot.middleBuf, offset),\n lower: makeShiftedSeriesView<number>(slot.lower, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * Bollinger Bands — `multiplier × σ` envelope around an SMA(length)\n * middle band. Default `multiplier = 2` per Pine. Returns a cached\n * `{ upper, middle, lower }` record (same identity every bar) backed\n * by three `Series<number>` Proxies. The middle band is the\n * underlying SMA primitive's output (identity-shared).\n *\n * @formula middle = sma(source, length) ;\n * σ = stdev(source, length, { biased: true }) ;\n * upper = middle + multiplier · σ ;\n * lower = middle − multiplier · σ\n * @warmup length − 1\n * @since 0.1\n * @stable\n *\n * `opts.offset` shifts all three bands in lockstep —\n * `series.current` on each band returns the value `offset` bars ago.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const bands = ta.bb(\"slot\", bar.close, 20, { multiplier: 2 });\n * // const u = bands.upper.current;\n * // const lagged = ta.bb(\"slot2\", bar.close, 20, { offset: 5 });\n */\nexport function bb(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: BbOpts,\n): BbResult {\n const ctx = getCtx();\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n const src = readSourceValue(source);\n const middleSlotId = `${slotId}/sma`;\n const stdevSlotId = `${slotId}/stdev`;\n // Compose: sma updates the middle band; stdev updates a separate\n // rolling-sigma series. Both primitives respect ctx.isTick. The\n // un-shifted middle (no offset) drives the per-bar math; the\n // shifted middle for non-zero offset is composed lazily in\n // `resultForOffset` to keep the close-path tight.\n const middleSeries = sma(middleSlotId, src, length);\n // BB's invinite math uses population sigma (denominator length); we\n // pass `biased: true` so the helper matches.\n const sigmaSeries = stdev(stdevSlotId, src, length, { biased: true });\n\n let slot = ctx.stream.taSlots.get(slotId) as BbSlot | undefined;\n if (slot === undefined) {\n // Capture the SMA sub-slot's output ring buffer so future\n // shifted-view lookups don't need to re-enter `sma()`.\n const smaSlot = ctx.stream.taSlots.get(middleSlotId) as { outBuffer: Float64RingBuffer };\n slot = initSlot(ctx.stream.ohlcv.close.capacity, middleSeries, smaSlot.outBuffer);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const mid = middleSeries.current;\n const sigma = sigmaSeries.current;\n let upperValue: number;\n let lowerValue: number;\n if (Number.isFinite(mid) && Number.isFinite(sigma)) {\n upperValue = mid + multiplier * sigma;\n lowerValue = mid - multiplier * sigma;\n } else {\n upperValue = Number.NaN;\n lowerValue = Number.NaN;\n }\n if (ctx.isTick) {\n slot.upper.replaceHead(upperValue);\n slot.lower.replaceHead(lowerValue);\n } else {\n slot.upper.append(upperValue);\n slot.lower.append(lowerValue);\n }\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/bb-percent-b.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. %B is composed from `ta.bb` via a sub-slot
@@ -1 +1 @@
1
- {"version":3,"file":"bbPercentB.js","sourceRoot":"","sources":["../../src/ta/bbPercentB.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bbPercentB.js","sourceRoot":"","sources":["../../src/ta/bbPercentB.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bb-percent-b.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. %B is composed from `ta.bb` via a sub-slot\n// (`${slotId}/bb`) so a fix to the BB envelope math flows in for free.\n\nimport type { BbPercentBOpts, BbResult, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { bb } from \"./bb.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_MULTIPLIER = 2;\n\ntype BbPercentBSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly multiplier: number;\n bbSub: BbResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bbPercentB called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, multiplier: number, capacity: number): BbPercentBSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n multiplier,\n bbSub: null,\n };\n}\n\nfunction percentBValue(src: number, upper: number, lower: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(upper) || !Number.isFinite(lower)) {\n return Number.NaN;\n }\n const denom = upper - lower;\n if (denom === 0) return Number.NaN;\n return (src - lower) / denom;\n}\n\n/**\n * Bollinger %B — sub-pane oscillator measuring price position\n * relative to the Bollinger Band envelope. `0` sits on the lower\n * band, `1` on the upper; excursions past either signal a volatility\n * breakout. Composes `ta.bb` via sub-slot `${slotId}/bb` — a fix to\n * the BB envelope math flows in for free. NaN when the band collapses\n * (`upper === lower`) or during warmup.\n *\n * @formula bands = bb(source, length, { multiplier }) ;\n * pct = (source − bands.lower) / (bands.upper − bands.lower)\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const pct = ta.bbPercentB(bar.close, 20, { multiplier: 2 });\n * // plot(pct);\n */\nexport function bbPercentB(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: BbPercentBOpts,\n): Series<number> {\n const ctx = getCtx();\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n let slot = ctx.stream.taSlots.get(slotId) as BbPercentBSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, multiplier, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n const bands = bb(`${slotId}/bb`, source, length, { multiplier });\n if (slot.bbSub === null) slot.bbSub = bands;\n const value = percentBValue(src, bands.upper.current, bands.lower.current);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n"]}
package/dist/ta/bbw.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/bbw.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. Math scale follows the task spec
@@ -1 +1 @@
1
- {"version":3,"file":"bbw.js","sourceRoot":"","sources":["../../src/ta/bbw.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bbw.js","sourceRoot":"","sources":["../../src/ta/bbw.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bbw.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. Math scale follows the task spec\n// `(upper − lower) / middle` (raw ratio); invinite multiplies by 100\n// render-side for TV-parity display. BBW composes `ta.bb` via\n// sub-slot `${slotId}/bb` so a fix to the BB envelope flows in for free.\n\nimport type { BbResult, BbwOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { bb } from \"./bb.js\";\nimport type { ScalarOrSeries } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_MULTIPLIER = 2;\n\ntype BbwSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly multiplier: number;\n bbSub: BbResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bbw called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, multiplier: number, capacity: number): BbwSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n multiplier,\n bbSub: null,\n };\n}\n\nfunction bbwValue(upper: number, middle: number, lower: number): number {\n if (\n !Number.isFinite(upper) ||\n !Number.isFinite(middle) ||\n !Number.isFinite(lower) ||\n middle === 0\n ) {\n return Number.NaN;\n }\n return (upper - lower) / middle;\n}\n\n/**\n * Bollinger BandWidth — sub-pane volatility line. Compresses\n * (\"squeezes\") before breakouts. Composes `ta.bb` via sub-slot\n * `${slotId}/bb` — a fix to the BB envelope flows in for free.\n * Emits the raw ratio `(upper − lower) / middle`; multiply by 100\n * in the script for TradingView-parity display. NaN when the SMA\n * middle is zero or during warmup.\n *\n * @formula bands = bb(source, length, { multiplier }) ;\n * bbw = (bands.upper − bands.lower) / bands.middle\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const width = ta.bbw(bar.close, 20, { multiplier: 2 });\n * // plot(width);\n */\nexport function bbw(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: BbwOpts,\n): Series<number> {\n const ctx = getCtx();\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n let slot = ctx.stream.taSlots.get(slotId) as BbwSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, multiplier, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bands = bb(`${slotId}/bb`, source, length, { multiplier });\n if (slot.bbSub === null) slot.bbSub = bands;\n const value = bbwValue(bands.upper.current, bands.middle.current, bands.lower.current);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n"]}
package/dist/ta/bop.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/bop.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. The runtime emits the RAW per-bar BOP
@@ -1 +1 @@
1
- {"version":3,"file":"bop.js","sourceRoot":"","sources":["../../src/ta/bop.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,mEAAmE;AACnE,0DAA0D;AAC1D,yEAAyE;AACzE,qEAAqE;AACrE,4DAA4D;AAC5D,+DAA+D;AAC/D,gEAAgE;AAChE,uEAAuE;AAIvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOlD,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAC9B,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW,EAAE,KAAa;IACjE,IACI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EACzB,CAAC;QACC,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC;IACzB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,KAAe;IAC/C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAwB,CAAC;IACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"bop.js","sourceRoot":"","sources":["../../src/ta/bop.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,+DAA+D;AAC/D,gEAAgE;AAChE,uEAAuE;AAIvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOlD,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAC9B,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW,EAAE,KAAa;IACjE,IACI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EACzB,CAAC;QACC,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC;IACzB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,KAAe;IAC/C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAwB,CAAC;IACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/bop.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. The runtime emits the RAW per-bar BOP\n// `(close - open) / (high - low)` only; invinite's optional SMA\n// smoothing knob is left to the script author (`ta.sma(ta.bop(), n)`).\n\nimport type { BopOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype BopSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.bop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): BopSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return { outBuffer, series: makeSeriesView<number>(outBuffer) };\n}\n\nfunction bopAt(open: number, high: number, low: number, close: number): number {\n if (\n !Number.isFinite(open) ||\n !Number.isFinite(high) ||\n !Number.isFinite(low) ||\n !Number.isFinite(close)\n ) {\n return Number.NaN;\n }\n const range = high - low;\n if (range === 0) return 0;\n return (close - open) / range;\n}\n\n/**\n * Balance of Power — `(close − open) / (high − low)` per bar. Raw,\n * unsmoothed output; flat-range bars contribute 0 (matches invinite's\n * defensive guard). NaN OHLC inputs emit NaN. No warmup — every bar\n * is independent.\n *\n * The script author can wrap this in `ta.sma(ta.bop(), n)` to recover\n * TradingView's optional smoothing pairing.\n *\n * @formula out[t] = (close[t] − open[t]) / (high[t] − low[t])\n * @warmup 0\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const b = ta.bop();\n * // plot(b);\n */\nexport function bop(slotId: string, _opts?: BopOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as BopSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { open, high, low, close } = ctx.stream.bar;\n const value = bopAt(open, high, low, close);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(value);\n } else {\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n"]}
package/dist/ta/cci.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/cci.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. `scaling = 0.015` is hard-coded per the
@@ -1 +1 @@
1
- {"version":3,"file":"cci.js","sourceRoot":"","sources":["../../src/ta/cci.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cci.js","sourceRoot":"","sources":["../../src/ta/cci.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/cci.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. `scaling = 0.015` is hard-coded per the\n// task spec; CciOpts intentionally narrows away invinite's `scaling`\n// knob.\n\nimport type { CciOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst SCALING = 0.015;\n\ntype CciSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /** Closed source (typical price) values across the trailing `length` bars. */\n readonly typicalPriceWindow: Float64RingBuffer;\n sumTp: number;\n /** Number of closed bars folded into the slot. */\n count: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.cci called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): CciSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n typicalPriceWindow: new Float64RingBuffer(length),\n sumTp: 0,\n count: 0,\n };\n}\n\nfunction cciFromCenter(center: number, currentTp: number, meanDev: number): number {\n if (meanDev === 0) return Number.NaN;\n return (currentTp - center) / (SCALING * meanDev);\n}\n\nfunction meanAbsDev(window: Float64RingBuffer, center: number, length: number): number {\n let sumAbs = 0;\n for (let i = 0; i < length; i += 1) {\n const v = window.at(i);\n const dev = v - center;\n sumAbs += dev < 0 ? -dev : dev;\n }\n return sumAbs / length;\n}\n\nfunction closeValue(slot: CciSlot, src: number): number {\n if (!Number.isFinite(src)) {\n // Hold prior — do not advance window; emit NaN when unwarmed,\n // otherwise re-emit the prior CCI using existing window state.\n if (slot.count < slot.length) return Number.NaN;\n const center = slot.sumTp / slot.length;\n const currentTp = slot.typicalPriceWindow.at(0);\n // Defensive: the window head is the most recently appended finite\n // typical price (we never append NaN — the outer `!isFinite(src)`\n // branch above bypasses append). Kept as a safety net.\n /* c8 ignore next */\n if (!Number.isFinite(currentTp)) return Number.NaN;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, currentTp, md);\n }\n if (slot.count < slot.length) {\n slot.typicalPriceWindow.append(src);\n slot.sumTp += src;\n slot.count += 1;\n if (slot.count < slot.length) return Number.NaN;\n const center = slot.sumTp / slot.length;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, src, md);\n }\n const outgoing = slot.typicalPriceWindow.at(slot.length - 1);\n slot.typicalPriceWindow.append(src);\n slot.sumTp = slot.sumTp + src - outgoing;\n const center = slot.sumTp / slot.length;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, src, md);\n}\n\nfunction tickValue(slot: CciSlot, src: number): number {\n if (slot.count < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) {\n // Tick NaN: re-emit the prior closed CCI off the existing window.\n const center = slot.sumTp / slot.length;\n const currentTp = slot.typicalPriceWindow.at(0);\n // Defensive: see closeValue() comment — window head is always finite\n // because non-finite sources skip the append.\n /* c8 ignore next */\n if (!Number.isFinite(currentTp)) return Number.NaN;\n const md = meanAbsDev(slot.typicalPriceWindow, center, slot.length);\n return cciFromCenter(center, currentTp, md);\n }\n // Substitute the head bar's typical price with `src` and recompute.\n const headValue = slot.typicalPriceWindow.at(0);\n const adjustedSum = slot.sumTp - headValue + src;\n const center = adjustedSum / slot.length;\n let sumAbs = 0;\n for (let i = 0; i < slot.length; i += 1) {\n const v = i === 0 ? src : slot.typicalPriceWindow.at(i);\n const dev = v - center;\n sumAbs += dev < 0 ? -dev : dev;\n }\n const md = sumAbs / slot.length;\n return cciFromCenter(center, src, md);\n}\n\n/**\n * Commodity Channel Index — momentum oscillator centred on `0`.\n * Compares the source (typically `bar.hlc3`) to its SMA over the\n * trailing `length` bars, normalised by mean absolute deviation\n * with the classic Lambert `scaling = 0.015` constant. Unbounded\n * by construction; `meanDev === 0` (flat-line window) emits `NaN`.\n *\n * @formula tp = source[t] ;\n * sma = mean(tp[t − length + 1 .. t]) ;\n * meanAbsDev = mean(|tp[i] − sma| for i in window) ;\n * cci = (tp[t] − sma) / (0.015 · meanAbsDev) ;\n * NaN when meanAbsDev === 0\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.cci(\"slot\", bar.hlc3, 20);\n * // const head = c.current;\n */\nexport function cci(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: CciOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CciSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n slot.outBuffer.replaceHead(tickValue(slot, src));\n } else {\n slot.outBuffer.append(closeValue(slot, src));\n }\n return slot.series;\n}\n"]}
@@ -22,7 +22,7 @@ import type { ChaikinOscOpts, Series } from "@invinite-org/chartlang-core";
22
22
  * @stable
23
23
  *
24
24
  * `opts.offset` shifts the returned series so `series.current` reads
25
- * the value `offset` bars ago (PLAN.md §9.1).
25
+ * the value `offset` bars ago.
26
26
  *
27
27
  * @example
28
28
  * // import { ta, plot } from "@invinite-org/chartlang-core";
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/chaikin-osc.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. Per §9.4 we fold invinite's private ADL +
@@ -70,7 +70,7 @@ function diff(fast, slow) {
70
70
  * @stable
71
71
  *
72
72
  * `opts.offset` shifts the returned series so `series.current` reads
73
- * the value `offset` bars ago (PLAN.md §9.1).
73
+ * the value `offset` bars ago.
74
74
  *
75
75
  * @example
76
76
  * // import { ta, plot } from "@invinite-org/chartlang-core";
@@ -1 +1 @@
1
- {"version":3,"file":"chaikinOsc.js","sourceRoot":"","sources":["../../src/ta/chaikinOsc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chaikinOsc.js","sourceRoot":"","sources":["../../src/ta/chaikinOsc.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/chaikin-osc.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. Per §9.4 we fold invinite's private ADL +\n// EMA copies onto the canonical `ta.adl` + `ta.ema` primitives via\n// three sub-slots (`${slotId}/adl`, `${slotId}/fast`, `${slotId}/slow`).\n\nimport type { ChaikinOscOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { adl } from \"./adl.js\";\nimport { ema } from \"./ema.js\";\n\nconst DEFAULT_FAST = 3;\nconst DEFAULT_SLOW = 10;\n\ntype ChaikinOscSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chaikinOsc called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): ChaikinOscSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: ChaikinOscSlot, offset: number): Series<number> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<number>(slot.outBuffer, offset);\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction diff(fast: number, slow: number): number {\n if (!Number.isFinite(fast) || !Number.isFinite(slow)) return Number.NaN;\n return fast - slow;\n}\n\n/**\n * Chaikin Oscillator — `EMA(ADL, fastLength) − EMA(ADL, slowLength)`.\n * Composes one `ta.adl` sub-slot (cumulative money-flow volume) plus\n * two `ta.ema` sub-slots over the ADL series; a fix to `ta.adl` or\n * `ta.ema` flows in for free. Renders in its own pane (volume\n * category, oscillator-shape around zero).\n *\n * Defaults `{ fastLength: 3, slowLength: 10 }` (TradingView /\n * invinite canonical). ADL has warmup 0; the slow EMA seeds at bar\n * `slowLength − 1`, so the oscillator first emits a finite value at\n * that bar.\n *\n * **Tick mode.** The sub-slots handle their own tick replay (ADL\n * snapshots `prevClosedCumAdl`; EMA snapshots `prevClosedEma`); this\n * primitive's parent slot just re-evaluates `fastEma − slowEma`\n * against the live sub-slot heads and `replaceHead`s its own output.\n *\n * @formula chaikinOsc[t] = ema(adl(t), fastLength) − ema(adl(t), slowLength)\n * @warmup slowLength − 1\n * @since 0.2\n * @stable\n *\n * `opts.offset` shifts the returned series so `series.current` reads\n * the value `offset` bars ago.\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chaikinOsc();\n * // plot(c);\n */\nexport function chaikinOsc(slotId: string, opts?: ChaikinOscOpts): Series<number> {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n const offset = opts?.offset ?? 0;\n\n const adlSeries = adl(`${slotId}/adl`);\n const fastSeries = ema(`${slotId}/fast`, adlSeries.current, fastLength);\n const slowSeries = ema(`${slotId}/slow`, adlSeries.current, slowLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as ChaikinOscSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = diff(fastSeries.current, slowSeries.current);\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return viewForOffset(slot, offset);\n}\n"]}
@@ -6,7 +6,7 @@ import type { ChandeKrollStopOpts, ChandeKrollStopResult } from "@invinite-org/c
6
6
  * stops by taking the rolling max / min over a `smoothingLength`-bar
7
7
  * window. `long` is the long-trade trailing stop ceiling (max of
8
8
  * `firstHigh`), `short` is the short-trade trailing stop floor (min
9
- * of `firstLow`). Composes Phase-1 `ta.atr` plus Task-5 `ta.highest`
9
+ * of `firstLow`). Composes `ta.atr` plus `ta.highest`
10
10
  * and `ta.lowest` at sub-slots.
11
11
  *
12
12
  * Source field is hard-coded to `bar.high` / `bar.low` (matches Pine
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/chande-kroll-stop.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. ChandeKrollStop composes Phase-1 `ta.atr`
@@ -97,7 +97,7 @@ function minOver(window, headOverride, startExclusiveOfHead, smoothingLength) {
97
97
  * stops by taking the rolling max / min over a `smoothingLength`-bar
98
98
  * window. `long` is the long-trade trailing stop ceiling (max of
99
99
  * `firstHigh`), `short` is the short-trade trailing stop floor (min
100
- * of `firstLow`). Composes Phase-1 `ta.atr` plus Task-5 `ta.highest`
100
+ * of `firstLow`). Composes `ta.atr` plus `ta.highest`
101
101
  * and `ta.lowest` at sub-slots.
102
102
  *
103
103
  * Source field is hard-coded to `bar.high` / `bar.low` (matches Pine
@@ -1 +1 @@
1
- {"version":3,"file":"chandeKrollStop.js","sourceRoot":"","sources":["../../src/ta/chandeKrollStop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chandeKrollStop.js","sourceRoot":"","sources":["../../src/ta/chandeKrollStop.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n//\n// Ported from invinite/src/components/trading-chart/indicators/chande-kroll-stop.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. ChandeKrollStop composes Phase-1 `ta.atr`\n// plus Task-5 `ta.highest` / `ta.lowest` at sub-slots\n// `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow` for the\n// first pass, then walks a self-owned `Float64RingBuffer` window of\n// size `smoothingLength` for the second-pass max/min. The opts\n// naming (`length` / `multiplier` / `smoothingLength`) matches\n// Chande Kroll's 1995 paper — `length` is the ATR period AND the\n// first-pass rolling extreme window, `smoothingLength` is the\n// second-pass extreme window.\n\nimport type { ChandeKrollStopOpts, ChandeKrollStopResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport { atr } from \"./atr.js\";\nimport { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_LENGTH = 10;\nconst DEFAULT_MULTIPLIER = 1;\nconst DEFAULT_SMOOTHING = 9;\n\ntype ChandeKrollStopSlot = {\n readonly outputs: ChandeKrollStopResult;\n readonly longBuffer: Float64RingBuffer;\n readonly shortBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n readonly smoothingLength: number;\n /**\n * First-pass long/high stops across the trailing `smoothingLength`\n * CLOSED bars. `at(0)` is the most recent close.\n */\n readonly firstHighWindow: Float64RingBuffer;\n /** First-pass short/low stops across the trailing window. */\n readonly firstLowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.chandeKrollStop called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n length: number,\n multiplier: number,\n smoothingLength: number,\n): ChandeKrollStopSlot {\n const longBuffer = new Float64RingBuffer(capacity);\n const shortBuffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n long: makeSeriesView<number>(longBuffer),\n short: makeSeriesView<number>(shortBuffer),\n }),\n longBuffer,\n shortBuffer,\n length,\n multiplier,\n smoothingLength,\n firstHighWindow: new Float64RingBuffer(smoothingLength),\n firstLowWindow: new Float64RingBuffer(smoothingLength),\n barCount: 0,\n };\n}\n\nfunction firstPass(\n hi: number,\n lo: number,\n atrValue: number,\n multiplier: number,\n): { firstHigh: number; firstLow: number } {\n if (!Number.isFinite(hi) || !Number.isFinite(lo) || !Number.isFinite(atrValue)) {\n return { firstHigh: Number.NaN, firstLow: Number.NaN };\n }\n return {\n firstHigh: hi - multiplier * atrValue,\n firstLow: lo + multiplier * atrValue,\n };\n}\n\n/**\n * Scan `window.at(start)..at(end)` (inclusive of start, exclusive of\n * end+1) for the max of finite entries. Returns `NaN` if no finite\n * entry exists.\n */\nfunction maxOver(\n window: Float64RingBuffer,\n headOverride: number,\n startExclusiveOfHead: boolean,\n smoothingLength: number,\n): number {\n let best = Number.NEGATIVE_INFINITY;\n if (Number.isFinite(headOverride)) best = headOverride;\n const startAge = startExclusiveOfHead ? 1 : 0;\n const filled = window.length;\n for (let k = startAge; k < filled && k < smoothingLength; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v > best) best = v;\n }\n return best === Number.NEGATIVE_INFINITY ? Number.NaN : best;\n}\n\nfunction minOver(\n window: Float64RingBuffer,\n headOverride: number,\n startExclusiveOfHead: boolean,\n smoothingLength: number,\n): number {\n let best = Number.POSITIVE_INFINITY;\n if (Number.isFinite(headOverride)) best = headOverride;\n const startAge = startExclusiveOfHead ? 1 : 0;\n const filled = window.length;\n for (let k = startAge; k < filled && k < smoothingLength; k += 1) {\n const v = window.at(k);\n if (Number.isFinite(v) && v < best) best = v;\n }\n return best === Number.POSITIVE_INFINITY ? Number.NaN : best;\n}\n\n/**\n * Chande Kroll Stop — two-pass ATR-offset trailing stops. The first\n * pass anchors each bar to its `length`-bar high/low extreme minus /\n * plus `multiplier · ATR`; the second pass smooths the first-pass\n * stops by taking the rolling max / min over a `smoothingLength`-bar\n * window. `long` is the long-trade trailing stop ceiling (max of\n * `firstHigh`), `short` is the short-trade trailing stop floor (min\n * of `firstLow`). Composes `ta.atr` plus `ta.highest`\n * and `ta.lowest` at sub-slots.\n *\n * Source field is hard-coded to `bar.high` / `bar.low` (matches Pine\n * `ta.cks` and the canonical TradingView CKS). Invinite's `source`\n * parameter is omitted; a `source` opt could land in a follow-up.\n *\n * NaN ATR or NaN extreme → NaN at both first-pass and second-pass\n * outputs for that bar (the rolling window retains the NaN slot;\n * downstream max/min skip NaN entries via `Number.isFinite`).\n *\n * @formula firstHigh = highest(bar.high, length) − multiplier · atr(length) ;\n * firstLow = lowest(bar.low, length) + multiplier · atr(length) ;\n * long = max(firstHigh over smoothingLength bars) ;\n * short = min(firstLow over smoothingLength bars)\n * @warmup length + smoothingLength − 1\n * @anchors length, multiplier\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const c = ta.chandeKrollStop({ length: 10, multiplier: 1, smoothingLength: 9 });\n * // plot(c.long);\n * // plot(c.short);\n */\nexport function chandeKrollStop(slotId: string, opts?: ChandeKrollStopOpts): ChandeKrollStopResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ChandeKrollStopSlot | undefined;\n if (slot === undefined) {\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n const smoothingLength = opts?.smoothingLength ?? DEFAULT_SMOOTHING;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, length, multiplier, smoothingLength);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n // Compose: ta.atr + ta.highest + ta.lowest at sub-slots. Each\n // sub-slot owns its own tick replay; the head reads below are\n // correct in both close and tick contexts.\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n const highSeries = highest(`${slotId}/highHigh`, bar.high, slot.length);\n const lowSeries = lowest(`${slotId}/lowLow`, bar.low, slot.length);\n\n const { firstHigh, firstLow } = firstPass(\n highSeries.current,\n lowSeries.current,\n atrSeries.current,\n slot.multiplier,\n );\n\n if (ctx.isTick) {\n // Second pass: scan the CLOSED window (excluding head) plus the\n // tick's first-pass value as the candidate for age 0.\n const long = maxOver(slot.firstHighWindow, firstHigh, true, slot.smoothingLength);\n const short = minOver(slot.firstLowWindow, firstLow, true, slot.smoothingLength);\n // Output is NaN unless both first-pass passes are warm AND the\n // smoothing window has enough closed entries (>= smoothingLength).\n // The closed window has `min(barCount, smoothingLength)` entries;\n // the tick adds one more candidate. So second-pass warm requires\n // `barCount >= smoothingLength`.\n const warm = slot.barCount >= slot.smoothingLength;\n slot.longBuffer.replaceHead(warm ? long : Number.NaN);\n slot.shortBuffer.replaceHead(warm ? short : Number.NaN);\n } else {\n slot.firstHighWindow.append(firstHigh);\n slot.firstLowWindow.append(firstLow);\n slot.barCount += 1;\n // Second-pass warmup needs `smoothingLength` first-pass bars\n // (matches invinite's `secondValidIdx = firstValidIdx + pLength\n // - 1`, which is `length - 1 + smoothingLength - 1` — i.e.\n // `barCount >= length + smoothingLength - 1`). With invinite's\n // `firstValidIdx = max(length - 1, length - 1)`, the second\n // valid index is `length + smoothingLength - 2` (0-based), so\n // bar `length + smoothingLength - 1` (1-based barCount) is the\n // first warm bar.\n const warm = slot.barCount >= slot.length + slot.smoothingLength - 1;\n if (!warm) {\n slot.longBuffer.append(Number.NaN);\n slot.shortBuffer.append(Number.NaN);\n } else {\n // Second pass over the full window (head included).\n const long = maxOver(slot.firstHighWindow, Number.NaN, false, slot.smoothingLength);\n const short = minOver(slot.firstLowWindow, Number.NaN, false, slot.smoothingLength);\n slot.longBuffer.append(long);\n slot.shortBuffer.append(short);\n }\n }\n return slot.outputs;\n}\n"]}
@@ -5,7 +5,7 @@ import type { ChandelierOpts, ChandelierResult } from "@invinite-org/chartlang-c
5
5
  * long trades (highest of `bar.high` over the window minus
6
6
  * `multiplier · ATR`); `short` is the symmetric stop for short
7
7
  * trades (lowest of `bar.low` plus `multiplier · ATR`). Composes
8
- * Phase-1 `ta.atr` plus Task-5 `ta.highest` / `ta.lowest` at sub-slots
8
+ * `ta.atr` plus `ta.highest` / `ta.lowest` at sub-slots
9
9
  * `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow`. Returns
10
10
  * a cached `{ long, short }` record (same identity every bar).
11
11
  *
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/chandelier.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. Chandelier composes Phase-1 `ta.atr` plus
@@ -57,7 +57,7 @@ function compute(hi, lo, atrValue, multiplier) {
57
57
  * long trades (highest of `bar.high` over the window minus
58
58
  * `multiplier · ATR`); `short` is the symmetric stop for short
59
59
  * trades (lowest of `bar.low` plus `multiplier · ATR`). Composes
60
- * Phase-1 `ta.atr` plus Task-5 `ta.highest` / `ta.lowest` at sub-slots
60
+ * `ta.atr` plus `ta.highest` / `ta.lowest` at sub-slots
61
61
  * `${slotId}/atr` / `${slotId}/highHigh` / `${slotId}/lowLow`. Returns
62
62
  * a cached `{ long, short }` record (same identity every bar).
63
63
  *