@invinite-org/chartlang-runtime 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/CHANGELOG.md +245 -0
  2. package/README.md +1 -2
  3. package/dist/barPoint.d.ts +20 -0
  4. package/dist/barPoint.d.ts.map +1 -0
  5. package/dist/barPoint.js +72 -0
  6. package/dist/barPoint.js.map +1 -0
  7. package/dist/bufferSnapshot.d.ts +102 -0
  8. package/dist/bufferSnapshot.d.ts.map +1 -0
  9. package/dist/bufferSnapshot.js +119 -0
  10. package/dist/bufferSnapshot.js.map +1 -0
  11. package/dist/buildComputeContext.js.map +1 -1
  12. package/dist/createScriptRunner.d.ts +6 -3
  13. package/dist/createScriptRunner.d.ts.map +1 -1
  14. package/dist/createScriptRunner.js +29 -5
  15. package/dist/createScriptRunner.js.map +1 -1
  16. package/dist/dep/DepOutputStore.js.map +1 -1
  17. package/dist/dep/DepRunner.d.ts.map +1 -1
  18. package/dist/dep/DepRunner.js +1 -0
  19. package/dist/dep/DepRunner.js.map +1 -1
  20. package/dist/dep/depOutput.js.map +1 -1
  21. package/dist/dep/emissionFilter.js.map +1 -1
  22. package/dist/dep/index.js.map +1 -1
  23. package/dist/emit/alert.js.map +1 -1
  24. package/dist/emit/alertConditionEmission.js.map +1 -1
  25. package/dist/emit/applyPlotOverride.js.map +1 -1
  26. package/dist/emit/draw/annotations/arrow.js +1 -1
  27. package/dist/emit/draw/annotations/arrow.js.map +1 -1
  28. package/dist/emit/draw/annotations/arrowMarkDown.js +1 -1
  29. package/dist/emit/draw/annotations/arrowMarkDown.js.map +1 -1
  30. package/dist/emit/draw/annotations/arrowMarkUp.js +1 -1
  31. package/dist/emit/draw/annotations/arrowMarkUp.js.map +1 -1
  32. package/dist/emit/draw/annotations/arrowMarker.js +1 -1
  33. package/dist/emit/draw/annotations/arrowMarker.js.map +1 -1
  34. package/dist/emit/draw/annotations/text.js +1 -1
  35. package/dist/emit/draw/annotations/text.js.map +1 -1
  36. package/dist/emit/draw/boxes/circle.js +1 -1
  37. package/dist/emit/draw/boxes/circle.js.map +1 -1
  38. package/dist/emit/draw/boxes/ellipse.d.ts +1 -1
  39. package/dist/emit/draw/boxes/ellipse.js +1 -1
  40. package/dist/emit/draw/boxes/ellipse.js.map +1 -1
  41. package/dist/emit/draw/boxes/fillBetween.d.ts +45 -0
  42. package/dist/emit/draw/boxes/fillBetween.d.ts.map +1 -0
  43. package/dist/emit/draw/boxes/fillBetween.js +36 -0
  44. package/dist/emit/draw/boxes/fillBetween.js.map +1 -0
  45. package/dist/emit/draw/boxes/marker.js +1 -1
  46. package/dist/emit/draw/boxes/marker.js.map +1 -1
  47. package/dist/emit/draw/boxes/path.d.ts +1 -1
  48. package/dist/emit/draw/boxes/path.js +1 -1
  49. package/dist/emit/draw/boxes/path.js.map +1 -1
  50. package/dist/emit/draw/boxes/polyline.d.ts +1 -1
  51. package/dist/emit/draw/boxes/polyline.js +1 -1
  52. package/dist/emit/draw/boxes/polyline.js.map +1 -1
  53. package/dist/emit/draw/boxes/rectangle.js +1 -1
  54. package/dist/emit/draw/boxes/rectangle.js.map +1 -1
  55. package/dist/emit/draw/boxes/rotatedRectangle.js +1 -1
  56. package/dist/emit/draw/boxes/rotatedRectangle.js.map +1 -1
  57. package/dist/emit/draw/boxes/triangle.d.ts +1 -1
  58. package/dist/emit/draw/boxes/triangle.js +1 -1
  59. package/dist/emit/draw/boxes/triangle.js.map +1 -1
  60. package/dist/emit/draw/channels/disjointChannel.js +1 -1
  61. package/dist/emit/draw/channels/disjointChannel.js.map +1 -1
  62. package/dist/emit/draw/channels/flatTopBottom.d.ts +1 -2
  63. package/dist/emit/draw/channels/flatTopBottom.d.ts.map +1 -1
  64. package/dist/emit/draw/channels/flatTopBottom.js +1 -1
  65. package/dist/emit/draw/channels/flatTopBottom.js.map +1 -1
  66. package/dist/emit/draw/channels/regressionTrend.d.ts +3 -4
  67. package/dist/emit/draw/channels/regressionTrend.d.ts.map +1 -1
  68. package/dist/emit/draw/channels/regressionTrend.js +1 -1
  69. package/dist/emit/draw/channels/regressionTrend.js.map +1 -1
  70. package/dist/emit/draw/channels/trendChannel.js +1 -1
  71. package/dist/emit/draw/channels/trendChannel.js.map +1 -1
  72. package/dist/emit/draw/containers/frame.d.ts +1 -1
  73. package/dist/emit/draw/containers/frame.js +2 -2
  74. package/dist/emit/draw/containers/frame.js.map +1 -1
  75. package/dist/emit/draw/containers/group.d.ts +1 -2
  76. package/dist/emit/draw/containers/group.d.ts.map +1 -1
  77. package/dist/emit/draw/containers/group.js +2 -2
  78. package/dist/emit/draw/containers/group.js.map +1 -1
  79. package/dist/emit/draw/curves/arc.js +1 -1
  80. package/dist/emit/draw/curves/arc.js.map +1 -1
  81. package/dist/emit/draw/curves/brush.js +1 -1
  82. package/dist/emit/draw/curves/brush.js.map +1 -1
  83. package/dist/emit/draw/curves/curve.js +1 -1
  84. package/dist/emit/draw/curves/curve.js.map +1 -1
  85. package/dist/emit/draw/curves/doubleCurve.js +1 -1
  86. package/dist/emit/draw/curves/doubleCurve.js.map +1 -1
  87. package/dist/emit/draw/curves/highlighter.js +1 -1
  88. package/dist/emit/draw/curves/highlighter.js.map +1 -1
  89. package/dist/emit/draw/curves/pen.js +1 -1
  90. package/dist/emit/draw/curves/pen.js.map +1 -1
  91. package/dist/emit/draw/cycles/cyclicLines.js +1 -1
  92. package/dist/emit/draw/cycles/cyclicLines.js.map +1 -1
  93. package/dist/emit/draw/cycles/sineLine.js +1 -1
  94. package/dist/emit/draw/cycles/sineLine.js.map +1 -1
  95. package/dist/emit/draw/cycles/timeCycles.js +1 -1
  96. package/dist/emit/draw/cycles/timeCycles.js.map +1 -1
  97. package/dist/emit/draw/elliott/elliottCorrectionWave.js +1 -1
  98. package/dist/emit/draw/elliott/elliottCorrectionWave.js.map +1 -1
  99. package/dist/emit/draw/elliott/elliottDoubleCombo.js +1 -1
  100. package/dist/emit/draw/elliott/elliottDoubleCombo.js.map +1 -1
  101. package/dist/emit/draw/elliott/elliottImpulseWave.js +1 -1
  102. package/dist/emit/draw/elliott/elliottImpulseWave.js.map +1 -1
  103. package/dist/emit/draw/elliott/elliottTriangleWave.js +1 -1
  104. package/dist/emit/draw/elliott/elliottTriangleWave.js.map +1 -1
  105. package/dist/emit/draw/elliott/elliottTripleCombo.js +1 -1
  106. package/dist/emit/draw/elliott/elliottTripleCombo.js.map +1 -1
  107. package/dist/emit/draw/fibA/fibChannel.js +1 -1
  108. package/dist/emit/draw/fibA/fibChannel.js.map +1 -1
  109. package/dist/emit/draw/fibA/fibRetracement.js +1 -1
  110. package/dist/emit/draw/fibA/fibRetracement.js.map +1 -1
  111. package/dist/emit/draw/fibA/fibTimeZone.d.ts +1 -2
  112. package/dist/emit/draw/fibA/fibTimeZone.d.ts.map +1 -1
  113. package/dist/emit/draw/fibA/fibTimeZone.js +1 -1
  114. package/dist/emit/draw/fibA/fibTimeZone.js.map +1 -1
  115. package/dist/emit/draw/fibA/fibTrendExtension.js +1 -1
  116. package/dist/emit/draw/fibA/fibTrendExtension.js.map +1 -1
  117. package/dist/emit/draw/fibA/fibWedge.js +1 -1
  118. package/dist/emit/draw/fibA/fibWedge.js.map +1 -1
  119. package/dist/emit/draw/fibB/fibCircles.d.ts +1 -2
  120. package/dist/emit/draw/fibB/fibCircles.d.ts.map +1 -1
  121. package/dist/emit/draw/fibB/fibCircles.js +1 -1
  122. package/dist/emit/draw/fibB/fibCircles.js.map +1 -1
  123. package/dist/emit/draw/fibB/fibSpeedArcs.js +1 -1
  124. package/dist/emit/draw/fibB/fibSpeedArcs.js.map +1 -1
  125. package/dist/emit/draw/fibB/fibSpeedFan.js +1 -1
  126. package/dist/emit/draw/fibB/fibSpeedFan.js.map +1 -1
  127. package/dist/emit/draw/fibB/fibSpiral.d.ts +1 -2
  128. package/dist/emit/draw/fibB/fibSpiral.d.ts.map +1 -1
  129. package/dist/emit/draw/fibB/fibSpiral.js +1 -1
  130. package/dist/emit/draw/fibB/fibSpiral.js.map +1 -1
  131. package/dist/emit/draw/fibB/fibTrendTime.d.ts +1 -2
  132. package/dist/emit/draw/fibB/fibTrendTime.d.ts.map +1 -1
  133. package/dist/emit/draw/fibB/fibTrendTime.js +1 -1
  134. package/dist/emit/draw/fibB/fibTrendTime.js.map +1 -1
  135. package/dist/emit/draw/gann/gannBox.js +1 -1
  136. package/dist/emit/draw/gann/gannBox.js.map +1 -1
  137. package/dist/emit/draw/gann/gannFan.js +1 -1
  138. package/dist/emit/draw/gann/gannFan.js.map +1 -1
  139. package/dist/emit/draw/gann/gannSquare.js +1 -1
  140. package/dist/emit/draw/gann/gannSquare.js.map +1 -1
  141. package/dist/emit/draw/gann/gannSquareFixed.js +1 -1
  142. package/dist/emit/draw/gann/gannSquareFixed.js.map +1 -1
  143. package/dist/emit/draw/handle.d.ts +11 -2
  144. package/dist/emit/draw/handle.d.ts.map +1 -1
  145. package/dist/emit/draw/handle.js +67 -12
  146. package/dist/emit/draw/handle.js.map +1 -1
  147. package/dist/emit/draw/index.js.map +1 -1
  148. package/dist/emit/draw/lines/crossLine.js +1 -1
  149. package/dist/emit/draw/lines/crossLine.js.map +1 -1
  150. package/dist/emit/draw/lines/horizontalLine.d.ts +1 -1
  151. package/dist/emit/draw/lines/horizontalLine.js +1 -1
  152. package/dist/emit/draw/lines/horizontalLine.js.map +1 -1
  153. package/dist/emit/draw/lines/horizontalRay.js +1 -1
  154. package/dist/emit/draw/lines/horizontalRay.js.map +1 -1
  155. package/dist/emit/draw/lines/line.d.ts +1 -1
  156. package/dist/emit/draw/lines/line.d.ts.map +1 -1
  157. package/dist/emit/draw/lines/line.js +2 -3
  158. package/dist/emit/draw/lines/line.js.map +1 -1
  159. package/dist/emit/draw/lines/trendAngle.js +1 -1
  160. package/dist/emit/draw/lines/trendAngle.js.map +1 -1
  161. package/dist/emit/draw/lines/verticalLine.js +1 -1
  162. package/dist/emit/draw/lines/verticalLine.js.map +1 -1
  163. package/dist/emit/draw/namespace.d.ts +5 -4
  164. package/dist/emit/draw/namespace.d.ts.map +1 -1
  165. package/dist/emit/draw/namespace.js +7 -4
  166. package/dist/emit/draw/namespace.js.map +1 -1
  167. package/dist/emit/draw/patterns/abcdPattern.js +1 -1
  168. package/dist/emit/draw/patterns/abcdPattern.js.map +1 -1
  169. package/dist/emit/draw/patterns/cypherPattern.d.ts +1 -2
  170. package/dist/emit/draw/patterns/cypherPattern.d.ts.map +1 -1
  171. package/dist/emit/draw/patterns/cypherPattern.js +1 -1
  172. package/dist/emit/draw/patterns/cypherPattern.js.map +1 -1
  173. package/dist/emit/draw/patterns/headAndShoulders.js +1 -1
  174. package/dist/emit/draw/patterns/headAndShoulders.js.map +1 -1
  175. package/dist/emit/draw/patterns/threeDrivesPattern.js +1 -1
  176. package/dist/emit/draw/patterns/threeDrivesPattern.js.map +1 -1
  177. package/dist/emit/draw/patterns/trianglePattern.d.ts +1 -1
  178. package/dist/emit/draw/patterns/trianglePattern.js +1 -1
  179. package/dist/emit/draw/patterns/trianglePattern.js.map +1 -1
  180. package/dist/emit/draw/patterns/xabcdPattern.js +1 -1
  181. package/dist/emit/draw/patterns/xabcdPattern.js.map +1 -1
  182. package/dist/emit/draw/pitchforks/pitchfan.js +1 -1
  183. package/dist/emit/draw/pitchforks/pitchfan.js.map +1 -1
  184. package/dist/emit/draw/pitchforks/pitchfork.d.ts +1 -1
  185. package/dist/emit/draw/pitchforks/pitchfork.js +2 -2
  186. package/dist/emit/draw/pitchforks/pitchfork.js.map +1 -1
  187. package/dist/emit/draw/pushDrawing.js.map +1 -1
  188. package/dist/emit/draw/subIdAllocator.d.ts +1 -1
  189. package/dist/emit/draw/subIdAllocator.js +1 -1
  190. package/dist/emit/draw/subIdAllocator.js.map +1 -1
  191. package/dist/emit/draw/table/table.d.ts +1 -1
  192. package/dist/emit/draw/table/table.js.map +1 -1
  193. package/dist/emit/emissionsQueue.js.map +1 -1
  194. package/dist/emit/hash.js.map +1 -1
  195. package/dist/emit/hline.js.map +1 -1
  196. package/dist/emit/index.js.map +1 -1
  197. package/dist/emit/logEmission.js.map +1 -1
  198. package/dist/emit/paneResolver.js.map +1 -1
  199. package/dist/emit/plot.d.ts +7 -0
  200. package/dist/emit/plot.d.ts.map +1 -1
  201. package/dist/emit/plot.js +13 -0
  202. package/dist/emit/plot.js.map +1 -1
  203. package/dist/emit/runtimeError.js.map +1 -1
  204. package/dist/execution/dispose.d.ts.map +1 -1
  205. package/dist/execution/dispose.js +16 -0
  206. package/dist/execution/dispose.js.map +1 -1
  207. package/dist/execution/drain.js.map +1 -1
  208. package/dist/execution/index.js.map +1 -1
  209. package/dist/execution/onBarClose.js.map +1 -1
  210. package/dist/execution/onBarTick.js.map +1 -1
  211. package/dist/execution/onHistory.js.map +1 -1
  212. package/dist/execution/runComputeStep.d.ts.map +1 -1
  213. package/dist/execution/runComputeStep.js +10 -1
  214. package/dist/execution/runComputeStep.js.map +1 -1
  215. package/dist/execution/secondaryStream.js.map +1 -1
  216. package/dist/index.d.ts +1 -1
  217. package/dist/index.d.ts.map +1 -1
  218. package/dist/index.js +1 -1
  219. package/dist/index.js.map +1 -1
  220. package/dist/inputs/index.js.map +1 -1
  221. package/dist/inputs/resolveInputs.js.map +1 -1
  222. package/dist/internal.js.map +1 -1
  223. package/dist/persistentStateStore.js.map +1 -1
  224. package/dist/persistentStateStore.runtime.d.ts.map +1 -1
  225. package/dist/persistentStateStore.runtime.js +21 -7
  226. package/dist/persistentStateStore.runtime.js.map +1 -1
  227. package/dist/persistentStateStore.validate.js.map +1 -1
  228. package/dist/primitives.js.map +1 -1
  229. package/dist/request/alignHtfSeriesCache.js.map +1 -1
  230. package/dist/request/alignHtfSeriesToLtf.d.ts +2 -2
  231. package/dist/request/alignHtfSeriesToLtf.js +2 -2
  232. package/dist/request/alignHtfSeriesToLtf.js.map +1 -1
  233. package/dist/request/bucketLtfBarsByMainContainment.js.map +1 -1
  234. package/dist/request/bucketLtfBarsCache.js.map +1 -1
  235. package/dist/request/index.d.ts +2 -1
  236. package/dist/request/index.d.ts.map +1 -1
  237. package/dist/request/index.js +2 -1
  238. package/dist/request/index.js.map +1 -1
  239. package/dist/request/lowerTf.js.map +1 -1
  240. package/dist/request/pushOnce.js.map +1 -1
  241. package/dist/request/requestNamespace.d.ts.map +1 -1
  242. package/dist/request/requestNamespace.js +16 -3
  243. package/dist/request/requestNamespace.js.map +1 -1
  244. package/dist/request/security.d.ts +20 -1
  245. package/dist/request/security.d.ts.map +1 -1
  246. package/dist/request/security.js +62 -23
  247. package/dist/request/security.js.map +1 -1
  248. package/dist/request/securityExprRunner.d.ts +133 -0
  249. package/dist/request/securityExprRunner.d.ts.map +1 -0
  250. package/dist/request/securityExprRunner.js +235 -0
  251. package/dist/request/securityExprRunner.js.map +1 -0
  252. package/dist/request/streamBars.d.ts +14 -1
  253. package/dist/request/streamBars.d.ts.map +1 -1
  254. package/dist/request/streamBars.js +39 -1
  255. package/dist/request/streamBars.js.map +1 -1
  256. package/dist/ringBuffer.d.ts +2 -2
  257. package/dist/ringBuffer.js +1 -1
  258. package/dist/ringBuffer.js.map +1 -1
  259. package/dist/runtimeContext.d.ts +51 -3
  260. package/dist/runtimeContext.d.ts.map +1 -1
  261. package/dist/runtimeContext.js.map +1 -1
  262. package/dist/seriesView.d.ts +43 -18
  263. package/dist/seriesView.d.ts.map +1 -1
  264. package/dist/seriesView.js +66 -43
  265. package/dist/seriesView.js.map +1 -1
  266. package/dist/state/index.d.ts +2 -1
  267. package/dist/state/index.d.ts.map +1 -1
  268. package/dist/state/index.js +2 -1
  269. package/dist/state/index.js.map +1 -1
  270. package/dist/state/lifecycle.d.ts +40 -0
  271. package/dist/state/lifecycle.d.ts.map +1 -1
  272. package/dist/state/lifecycle.js +53 -0
  273. package/dist/state/lifecycle.js.map +1 -1
  274. package/dist/state/seriesPersistence.d.ts +48 -0
  275. package/dist/state/seriesPersistence.d.ts.map +1 -0
  276. package/dist/state/seriesPersistence.js +87 -0
  277. package/dist/state/seriesPersistence.js.map +1 -0
  278. package/dist/state/seriesSlot.d.ts +105 -0
  279. package/dist/state/seriesSlot.d.ts.map +1 -0
  280. package/dist/state/seriesSlot.js +123 -0
  281. package/dist/state/seriesSlot.js.map +1 -0
  282. package/dist/state/stateNamespace.d.ts.map +1 -1
  283. package/dist/state/stateNamespace.js +28 -0
  284. package/dist/state/stateNamespace.js.map +1 -1
  285. package/dist/state/stateSlot.js.map +1 -1
  286. package/dist/stateStore.d.ts +2 -2
  287. package/dist/stateStore.js.map +1 -1
  288. package/dist/streamState.d.ts +26 -20
  289. package/dist/streamState.d.ts.map +1 -1
  290. package/dist/streamState.js +41 -67
  291. package/dist/streamState.js.map +1 -1
  292. package/dist/ta/adl.js +2 -2
  293. package/dist/ta/adl.js.map +1 -1
  294. package/dist/ta/adr.d.ts +3 -3
  295. package/dist/ta/adr.js +5 -5
  296. package/dist/ta/adr.js.map +1 -1
  297. package/dist/ta/adx.d.ts +3 -2
  298. package/dist/ta/adx.d.ts.map +1 -1
  299. package/dist/ta/adx.js +5 -4
  300. package/dist/ta/adx.js.map +1 -1
  301. package/dist/ta/alma.d.ts +6 -4
  302. package/dist/ta/alma.d.ts.map +1 -1
  303. package/dist/ta/alma.js +21 -8
  304. package/dist/ta/alma.js.map +1 -1
  305. package/dist/ta/anchoredVolumeProfile.js.map +1 -1
  306. package/dist/ta/anchoredVwap.d.ts +1 -1
  307. package/dist/ta/anchoredVwap.js +3 -3
  308. package/dist/ta/anchoredVwap.js.map +1 -1
  309. package/dist/ta/ao.js +2 -2
  310. package/dist/ta/ao.js.map +1 -1
  311. package/dist/ta/aroon.js +2 -2
  312. package/dist/ta/aroon.js.map +1 -1
  313. package/dist/ta/aroonOsc.js +2 -2
  314. package/dist/ta/aroonOsc.js.map +1 -1
  315. package/dist/ta/atr.d.ts +3 -2
  316. package/dist/ta/atr.d.ts.map +1 -1
  317. package/dist/ta/atr.js +5 -4
  318. package/dist/ta/atr.js.map +1 -1
  319. package/dist/ta/barssince.js +1 -1
  320. package/dist/ta/barssince.js.map +1 -1
  321. package/dist/ta/bb.d.ts +3 -2
  322. package/dist/ta/bb.d.ts.map +1 -1
  323. package/dist/ta/bb.js +5 -4
  324. package/dist/ta/bb.js.map +1 -1
  325. package/dist/ta/bbPercentB.js +2 -2
  326. package/dist/ta/bbPercentB.js.map +1 -1
  327. package/dist/ta/bbw.js +2 -2
  328. package/dist/ta/bbw.js.map +1 -1
  329. package/dist/ta/bop.js +2 -2
  330. package/dist/ta/bop.js.map +1 -1
  331. package/dist/ta/cci.js +2 -2
  332. package/dist/ta/cci.js.map +1 -1
  333. package/dist/ta/chaikinOsc.d.ts +3 -2
  334. package/dist/ta/chaikinOsc.d.ts.map +1 -1
  335. package/dist/ta/chaikinOsc.js +5 -4
  336. package/dist/ta/chaikinOsc.js.map +1 -1
  337. package/dist/ta/chandeKrollStop.d.ts +1 -1
  338. package/dist/ta/chandeKrollStop.js +3 -3
  339. package/dist/ta/chandeKrollStop.js.map +1 -1
  340. package/dist/ta/chandelier.d.ts +1 -1
  341. package/dist/ta/chandelier.js +3 -3
  342. package/dist/ta/chandelier.js.map +1 -1
  343. package/dist/ta/change.js +1 -1
  344. package/dist/ta/change.js.map +1 -1
  345. package/dist/ta/chop.js +2 -2
  346. package/dist/ta/chop.js.map +1 -1
  347. package/dist/ta/cmf.js +2 -2
  348. package/dist/ta/cmf.js.map +1 -1
  349. package/dist/ta/cmo.js +2 -2
  350. package/dist/ta/cmo.js.map +1 -1
  351. package/dist/ta/connorsRsi.d.ts +1 -1
  352. package/dist/ta/connorsRsi.js +3 -3
  353. package/dist/ta/connorsRsi.js.map +1 -1
  354. package/dist/ta/coppock.js +2 -2
  355. package/dist/ta/coppock.js.map +1 -1
  356. package/dist/ta/crossover.d.ts +3 -2
  357. package/dist/ta/crossover.d.ts.map +1 -1
  358. package/dist/ta/crossover.js +4 -3
  359. package/dist/ta/crossover.js.map +1 -1
  360. package/dist/ta/crossunder.d.ts +3 -2
  361. package/dist/ta/crossunder.d.ts.map +1 -1
  362. package/dist/ta/crossunder.js +4 -3
  363. package/dist/ta/crossunder.js.map +1 -1
  364. package/dist/ta/dema.js +2 -2
  365. package/dist/ta/dema.js.map +1 -1
  366. package/dist/ta/dmi.d.ts +4 -3
  367. package/dist/ta/dmi.d.ts.map +1 -1
  368. package/dist/ta/dmi.js +6 -5
  369. package/dist/ta/dmi.js.map +1 -1
  370. package/dist/ta/donchian.js +2 -2
  371. package/dist/ta/donchian.js.map +1 -1
  372. package/dist/ta/dpo.js +2 -2
  373. package/dist/ta/dpo.js.map +1 -1
  374. package/dist/ta/ema.d.ts +3 -2
  375. package/dist/ta/ema.d.ts.map +1 -1
  376. package/dist/ta/ema.js +5 -4
  377. package/dist/ta/ema.js.map +1 -1
  378. package/dist/ta/envelope.js +2 -2
  379. package/dist/ta/envelope.js.map +1 -1
  380. package/dist/ta/eom.d.ts +3 -1
  381. package/dist/ta/eom.d.ts.map +1 -1
  382. package/dist/ta/eom.js +5 -3
  383. package/dist/ta/eom.js.map +1 -1
  384. package/dist/ta/fisher.js +2 -2
  385. package/dist/ta/fisher.js.map +1 -1
  386. package/dist/ta/fixedRangeVolumeProfile.js.map +1 -1
  387. package/dist/ta/highest.js +1 -1
  388. package/dist/ta/highest.js.map +1 -1
  389. package/dist/ta/highestbars.d.ts +25 -0
  390. package/dist/ta/highestbars.d.ts.map +1 -0
  391. package/dist/ta/highestbars.js +106 -0
  392. package/dist/ta/highestbars.js.map +1 -0
  393. package/dist/ta/historicalVolatility.d.ts +3 -2
  394. package/dist/ta/historicalVolatility.d.ts.map +1 -1
  395. package/dist/ta/historicalVolatility.js +5 -4
  396. package/dist/ta/historicalVolatility.js.map +1 -1
  397. package/dist/ta/hma.js +2 -2
  398. package/dist/ta/hma.js.map +1 -1
  399. package/dist/ta/ichimoku.d.ts +3 -1
  400. package/dist/ta/ichimoku.d.ts.map +1 -1
  401. package/dist/ta/ichimoku.js +5 -3
  402. package/dist/ta/ichimoku.js.map +1 -1
  403. package/dist/ta/index.js.map +1 -1
  404. package/dist/ta/kama.js +2 -2
  405. package/dist/ta/kama.js.map +1 -1
  406. package/dist/ta/keltner.js +2 -2
  407. package/dist/ta/keltner.js.map +1 -1
  408. package/dist/ta/klinger.js +2 -2
  409. package/dist/ta/klinger.js.map +1 -1
  410. package/dist/ta/kst.js +2 -2
  411. package/dist/ta/kst.js.map +1 -1
  412. package/dist/ta/lib/adxFromDi.js +2 -2
  413. package/dist/ta/lib/adxFromDi.js.map +1 -1
  414. package/dist/ta/lib/computeMa.js +2 -2
  415. package/dist/ta/lib/computeMa.js.map +1 -1
  416. package/dist/ta/lib/computeMaOfFloat64.js +2 -2
  417. package/dist/ta/lib/computeMaOfFloat64.js.map +1 -1
  418. package/dist/ta/lib/directionalState.js +2 -2
  419. package/dist/ta/lib/directionalState.js.map +1 -1
  420. package/dist/ta/lib/donchianMid.js +2 -2
  421. package/dist/ta/lib/donchianMid.js.map +1 -1
  422. package/dist/ta/lib/emaFloat64.js +2 -2
  423. package/dist/ta/lib/emaFloat64.js.map +1 -1
  424. package/dist/ta/lib/linearRegression.js +2 -2
  425. package/dist/ta/lib/linearRegression.js.map +1 -1
  426. package/dist/ta/lib/maTypes.js.map +1 -1
  427. package/dist/ta/lib/pearson.js +2 -2
  428. package/dist/ta/lib/pearson.js.map +1 -1
  429. package/dist/ta/lib/pickCandleSource.js +2 -2
  430. package/dist/ta/lib/pickCandleSource.js.map +1 -1
  431. package/dist/ta/lib/readSourceField.js +2 -2
  432. package/dist/ta/lib/readSourceField.js.map +1 -1
  433. package/dist/ta/lib/rollingStddev.js +2 -2
  434. package/dist/ta/lib/rollingStddev.js.map +1 -1
  435. package/dist/ta/lib/smaFloat64.js +2 -2
  436. package/dist/ta/lib/smaFloat64.js.map +1 -1
  437. package/dist/ta/lib/smmaFloat64.js +2 -2
  438. package/dist/ta/lib/smmaFloat64.js.map +1 -1
  439. package/dist/ta/lib/sourceValue.js.map +1 -1
  440. package/dist/ta/lib/trSeries.js +2 -2
  441. package/dist/ta/lib/trSeries.js.map +1 -1
  442. package/dist/ta/lib/volume-profile/bucketEdges.js.map +1 -1
  443. package/dist/ta/lib/volume-profile/bucketizeVolume.js.map +1 -1
  444. package/dist/ta/lib/volume-profile/developingSeries.js.map +1 -1
  445. package/dist/ta/lib/volume-profile/index.js.map +1 -1
  446. package/dist/ta/lib/volume-profile/intercept.js.map +1 -1
  447. package/dist/ta/lib/volume-profile/scaffold.js.map +1 -1
  448. package/dist/ta/lib/volume-profile/tooHeavy.js.map +1 -1
  449. package/dist/ta/lib/volume-profile/types.js.map +1 -1
  450. package/dist/ta/lib/volume-profile/valueArea.js.map +1 -1
  451. package/dist/ta/lib/volume-profile/volumeProfileShared.js.map +1 -1
  452. package/dist/ta/lib/vwmaFloat64.js +2 -2
  453. package/dist/ta/lib/vwmaFloat64.js.map +1 -1
  454. package/dist/ta/lib/wilderDirectional.js +2 -2
  455. package/dist/ta/lib/wilderDirectional.js.map +1 -1
  456. package/dist/ta/lib/wilderSmoothing.js +2 -2
  457. package/dist/ta/lib/wilderSmoothing.js.map +1 -1
  458. package/dist/ta/lib/wmaFloat64.js +2 -2
  459. package/dist/ta/lib/wmaFloat64.js.map +1 -1
  460. package/dist/ta/lowest.js +1 -1
  461. package/dist/ta/lowest.js.map +1 -1
  462. package/dist/ta/lowestbars.d.ts +25 -0
  463. package/dist/ta/lowestbars.d.ts.map +1 -0
  464. package/dist/ta/lowestbars.js +102 -0
  465. package/dist/ta/lowestbars.js.map +1 -0
  466. package/dist/ta/lsma.js +2 -2
  467. package/dist/ta/lsma.js.map +1 -1
  468. package/dist/ta/maRibbon.js +2 -2
  469. package/dist/ta/maRibbon.js.map +1 -1
  470. package/dist/ta/macd.d.ts +3 -2
  471. package/dist/ta/macd.d.ts.map +1 -1
  472. package/dist/ta/macd.js +6 -5
  473. package/dist/ta/macd.js.map +1 -1
  474. package/dist/ta/massIndex.d.ts +3 -2
  475. package/dist/ta/massIndex.d.ts.map +1 -1
  476. package/dist/ta/massIndex.js +5 -4
  477. package/dist/ta/massIndex.js.map +1 -1
  478. package/dist/ta/mcginley.js +2 -2
  479. package/dist/ta/mcginley.js.map +1 -1
  480. package/dist/ta/median.js +2 -2
  481. package/dist/ta/median.js.map +1 -1
  482. package/dist/ta/mfi.d.ts +3 -1
  483. package/dist/ta/mfi.d.ts.map +1 -1
  484. package/dist/ta/mfi.js +5 -3
  485. package/dist/ta/mfi.js.map +1 -1
  486. package/dist/ta/momentum.js +2 -2
  487. package/dist/ta/momentum.js.map +1 -1
  488. package/dist/ta/netVolume.d.ts +3 -1
  489. package/dist/ta/netVolume.d.ts.map +1 -1
  490. package/dist/ta/netVolume.js +5 -3
  491. package/dist/ta/netVolume.js.map +1 -1
  492. package/dist/ta/nvi.d.ts +3 -1
  493. package/dist/ta/nvi.d.ts.map +1 -1
  494. package/dist/ta/nvi.js +5 -3
  495. package/dist/ta/nvi.js.map +1 -1
  496. package/dist/ta/nz.js +1 -1
  497. package/dist/ta/nz.js.map +1 -1
  498. package/dist/ta/obv.js +2 -2
  499. package/dist/ta/obv.js.map +1 -1
  500. package/dist/ta/persistence.d.ts.map +1 -1
  501. package/dist/ta/persistence.js +1 -40
  502. package/dist/ta/persistence.js.map +1 -1
  503. package/dist/ta/pivotsHighLow.js +2 -2
  504. package/dist/ta/pivotsHighLow.js.map +1 -1
  505. package/dist/ta/pivotsStandard.d.ts +1 -1
  506. package/dist/ta/pivotsStandard.js +3 -3
  507. package/dist/ta/pivotsStandard.js.map +1 -1
  508. package/dist/ta/pmo.js +2 -2
  509. package/dist/ta/pmo.js.map +1 -1
  510. package/dist/ta/ppo.d.ts +3 -2
  511. package/dist/ta/ppo.d.ts.map +1 -1
  512. package/dist/ta/ppo.js +5 -4
  513. package/dist/ta/ppo.js.map +1 -1
  514. package/dist/ta/psar.js +2 -2
  515. package/dist/ta/psar.js.map +1 -1
  516. package/dist/ta/pvi.d.ts +3 -1
  517. package/dist/ta/pvi.d.ts.map +1 -1
  518. package/dist/ta/pvi.js +5 -3
  519. package/dist/ta/pvi.js.map +1 -1
  520. package/dist/ta/pvo.d.ts +3 -1
  521. package/dist/ta/pvo.d.ts.map +1 -1
  522. package/dist/ta/pvo.js +5 -3
  523. package/dist/ta/pvo.js.map +1 -1
  524. package/dist/ta/pvt.d.ts +3 -1
  525. package/dist/ta/pvt.d.ts.map +1 -1
  526. package/dist/ta/pvt.js +5 -3
  527. package/dist/ta/pvt.js.map +1 -1
  528. package/dist/ta/registry.d.ts +7 -1
  529. package/dist/ta/registry.d.ts.map +1 -1
  530. package/dist/ta/registry.js +4 -0
  531. package/dist/ta/registry.js.map +1 -1
  532. package/dist/ta/roc.js +2 -2
  533. package/dist/ta/roc.js.map +1 -1
  534. package/dist/ta/rsi.d.ts +3 -2
  535. package/dist/ta/rsi.d.ts.map +1 -1
  536. package/dist/ta/rsi.js +5 -4
  537. package/dist/ta/rsi.js.map +1 -1
  538. package/dist/ta/rvgi.js +2 -2
  539. package/dist/ta/rvgi.js.map +1 -1
  540. package/dist/ta/rvi.d.ts +3 -2
  541. package/dist/ta/rvi.d.ts.map +1 -1
  542. package/dist/ta/rvi.js +5 -4
  543. package/dist/ta/rvi.js.map +1 -1
  544. package/dist/ta/sessionVolumeProfile.js.map +1 -1
  545. package/dist/ta/sma.d.ts +6 -3
  546. package/dist/ta/sma.d.ts.map +1 -1
  547. package/dist/ta/sma.js +8 -5
  548. package/dist/ta/sma.js.map +1 -1
  549. package/dist/ta/smi.js +2 -2
  550. package/dist/ta/smi.js.map +1 -1
  551. package/dist/ta/smma.js +2 -2
  552. package/dist/ta/smma.js.map +1 -1
  553. package/dist/ta/stdev.d.ts +3 -2
  554. package/dist/ta/stdev.d.ts.map +1 -1
  555. package/dist/ta/stdev.js +5 -4
  556. package/dist/ta/stdev.js.map +1 -1
  557. package/dist/ta/stoch.js +2 -2
  558. package/dist/ta/stoch.js.map +1 -1
  559. package/dist/ta/stochRsi.js +2 -2
  560. package/dist/ta/stochRsi.js.map +1 -1
  561. package/dist/ta/supertrend.d.ts +1 -1
  562. package/dist/ta/supertrend.js +3 -3
  563. package/dist/ta/supertrend.js.map +1 -1
  564. package/dist/ta/tema.js +2 -2
  565. package/dist/ta/tema.js.map +1 -1
  566. package/dist/ta/trendStrengthIndex.d.ts +4 -3
  567. package/dist/ta/trendStrengthIndex.d.ts.map +1 -1
  568. package/dist/ta/trendStrengthIndex.js +6 -5
  569. package/dist/ta/trendStrengthIndex.js.map +1 -1
  570. package/dist/ta/trix.d.ts +4 -3
  571. package/dist/ta/trix.d.ts.map +1 -1
  572. package/dist/ta/trix.js +6 -5
  573. package/dist/ta/trix.js.map +1 -1
  574. package/dist/ta/tsi.js +2 -2
  575. package/dist/ta/tsi.js.map +1 -1
  576. package/dist/ta/ulcerIndex.js +2 -2
  577. package/dist/ta/ulcerIndex.js.map +1 -1
  578. package/dist/ta/ultimateOsc.js +2 -2
  579. package/dist/ta/ultimateOsc.js.map +1 -1
  580. package/dist/ta/valuewhen.js +1 -1
  581. package/dist/ta/valuewhen.js.map +1 -1
  582. package/dist/ta/visibleRangeVolumeProfile.d.ts +2 -2
  583. package/dist/ta/visibleRangeVolumeProfile.js +2 -2
  584. package/dist/ta/visibleRangeVolumeProfile.js.map +1 -1
  585. package/dist/ta/vol.js +2 -2
  586. package/dist/ta/vol.js.map +1 -1
  587. package/dist/ta/volatilityStop.d.ts +1 -1
  588. package/dist/ta/volatilityStop.js +3 -3
  589. package/dist/ta/volatilityStop.js.map +1 -1
  590. package/dist/ta/vortex.d.ts +3 -2
  591. package/dist/ta/vortex.d.ts.map +1 -1
  592. package/dist/ta/vortex.js +5 -4
  593. package/dist/ta/vortex.js.map +1 -1
  594. package/dist/ta/vwap.d.ts +3 -3
  595. package/dist/ta/vwap.js +5 -5
  596. package/dist/ta/vwap.js.map +1 -1
  597. package/dist/ta/vwma.js +2 -2
  598. package/dist/ta/vwma.js.map +1 -1
  599. package/dist/ta/williamsFractal.js +2 -2
  600. package/dist/ta/williamsFractal.js.map +1 -1
  601. package/dist/ta/williamsR.js +2 -2
  602. package/dist/ta/williamsR.js.map +1 -1
  603. package/dist/ta/wma.js +2 -2
  604. package/dist/ta/wma.js.map +1 -1
  605. package/dist/ta/zigZag.js +2 -2
  606. package/dist/ta/zigZag.js.map +1 -1
  607. package/dist/views/barstateView.js.map +1 -1
  608. package/dist/views/index.js.map +1 -1
  609. package/dist/views/refreshRuntimeViews.js.map +1 -1
  610. package/dist/views/symInfoView.js.map +1 -1
  611. package/dist/views/timeframeView.js.map +1 -1
  612. package/package.json +3 -3
  613. package/dist/ta/lib/applyOffset.d.ts +0 -19
  614. package/dist/ta/lib/applyOffset.d.ts.map +0 -1
  615. package/dist/ta/lib/applyOffset.js +0 -38
  616. package/dist/ta/lib/applyOffset.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fixedRangeVolumeProfile.js","sourceRoot":"","sources":["../../src/ta/fixedRangeVolumeProfile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fixedRangeVolumeProfile.js","sourceRoot":"","sources":["../../src/ta/fixedRangeVolumeProfile.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// Ported from ../invinite/src/components/trading-chart/indicators/fixed-range-volume-profile.ts\n// @ 3234c8c0c3f9880d9d1e3a3ee63ebd55ddd535f4.\n// Translated, not transcribed — Series<T> shape, opts.offset, JSDoc.\n// See packages/runtime/src/ta/CLAUDE.md for the port convention.\n\nimport type {\n FixedRangeVolumeProfileOpts,\n FixedRangeVolumeProfileResult,\n} from \"@invinite-org/chartlang-core\";\n\nimport { pushDiagnostic } from \"../emit/index.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport {\n type VolumeProfileBar,\n type VolumeProfileCore,\n type VolumeProfileSnapshot,\n commitVolumeProfileSnapshot,\n createVolumeProfileCore,\n emitVolumeProfileHistogram,\n emptyVolumeProfileSnapshot,\n resolveVolumeProfileSnapshot,\n volumeProfileConfigFromOpts,\n} from \"./lib/volume-profile/index.js\";\n\ntype FixedRangeVolumeProfileSlot = VolumeProfileCore & {\n frozen: VolumeProfileSnapshot | null;\n readonly result: FixedRangeVolumeProfileResult;\n readonly shiftedResults: Map<number, FixedRangeVolumeProfileResult>;\n};\n\ntype MutableFixedRangeVolumeProfileSlot = Omit<FixedRangeVolumeProfileSlot, \"result\"> & {\n result: FixedRangeVolumeProfileResult;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.fixedRangeVolumeProfile called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): FixedRangeVolumeProfileSlot {\n const core = createVolumeProfileCore(capacity);\n const slot: MutableFixedRangeVolumeProfileSlot = {\n ...core,\n frozen: null,\n result: Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeSeriesView<number>(core.pocBuffer),\n valHigh: makeSeriesView<number>(core.valHighBuffer),\n valLow: makeSeriesView<number>(core.valLowBuffer),\n }),\n shiftedResults: new Map(),\n };\n return slot;\n}\n\nfunction resultForOffset(\n slot: FixedRangeVolumeProfileSlot,\n offset: number,\n): FixedRangeVolumeProfileResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n get buckets() {\n return slot.buckets;\n },\n poc: makeShiftedSeriesView<number>(slot.pocBuffer, offset),\n valHigh: makeShiftedSeriesView<number>(slot.valHighBuffer, offset),\n valLow: makeShiftedSeriesView<number>(slot.valLowBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction collectBars(\n ctx: RuntimeContext,\n from: number,\n to: number,\n): ReadonlyArray<VolumeProfileBar> {\n const { ohlcv } = ctx.stream;\n const bars: VolumeProfileBar[] = [];\n for (let lookback = ohlcv.close.length - 1; lookback >= 0; lookback -= 1) {\n const time = ohlcv.time.at(lookback);\n if (time < from || time > to) continue;\n bars.push({\n close: ohlcv.close.at(lookback),\n high: ohlcv.high.at(lookback),\n low: ohlcv.low.at(lookback),\n open: ohlcv.open.at(lookback),\n time,\n volume: ohlcv.volume.at(lookback),\n });\n }\n return bars;\n}\n\nfunction diagnoseInvertedRange(ctx: RuntimeContext, slotId: string): void {\n const key = `fixed-range-inverted|${slotId}`;\n if (ctx.diagnosedRequestKeys.has(key)) return;\n ctx.diagnosedRequestKeys.add(key);\n pushDiagnostic(ctx.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"fixed-range-inverted\",\n message: \"ta.fixedRangeVolumeProfile requires opts.from <= opts.to.\",\n slotId,\n bar: ctx.barIndex(),\n });\n}\n\n/**\n * Fixed-Range Volume Profile — bucketizes volume between two\n * user-picked time anchors, inclusive on both ends.\n *\n * Bars before `opts.from` emit NaN. Bars after `opts.to` reuse the\n * frozen profile captured at the `to` bar. If `opts.from > opts.to`,\n * the primitive emits one `fixed-range-inverted` diagnostic per slot\n * and returns NaN series values.\n *\n * @formula Port of invinite fixed-range-vp: collect candles in the\n * fixed `[from, to]` window, bucket volume by price, then\n * derive POC / value-area high / value-area low through the\n * shared volume-profile pipeline.\n * @anchors `opts.from: Time` and `opts.to: Time`, typically supplied\n * by two `input.time(..., { pickFromChart: true })` inputs.\n * @warmup NaN before `opts.from`; a degenerate `from === to`\n * one-bar window can emit on the anchor bar when it has\n * finite positive volume.\n * @since 0.5\n * @stable\n * @example\n * // import { input, plot, ta } from \"@invinite-org/chartlang-core\";\n * // const from = input.time(0, { pickFromChart: true, title: \"From\" });\n * // const to = input.time(0, { pickFromChart: true, title: \"To\" });\n * // const vp = ta.fixedRangeVolumeProfile({ from: from.value, to: to.value });\n * // plot(vp.poc, { style: { kind: \"horizontal-histogram\", buckets: vp.buckets } });\n */\nexport function fixedRangeVolumeProfile(\n slotId: string,\n opts: FixedRangeVolumeProfileOpts,\n): FixedRangeVolumeProfileResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as FixedRangeVolumeProfileSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n let snapshot: VolumeProfileSnapshot = emptyVolumeProfileSnapshot();\n if (opts.from > opts.to) {\n diagnoseInvertedRange(ctx, slotId);\n slot.frozen = null;\n } else if (ctx.stream.bar.time < opts.from) {\n slot.frozen = null;\n } else if (ctx.stream.bar.time > opts.to && slot.frozen !== null) {\n snapshot = slot.frozen;\n } else {\n snapshot = resolveVolumeProfileSnapshot({\n bars: collectBars(ctx, opts.from, opts.to),\n bucketColor: opts.bucketColor,\n config: volumeProfileConfigFromOpts(opts),\n });\n if (ctx.stream.bar.time >= opts.to) slot.frozen = snapshot;\n }\n\n commitVolumeProfileSnapshot(slot, ctx.isTick, snapshot);\n emitVolumeProfileHistogram(\n ctx,\n slotId,\n \"Fixed Range Volume Profile\",\n snapshot.poc,\n snapshot.buckets,\n );\n return resultForOffset(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.highest`. See PLAN.md §3.1.
4
+ // No invinite source — semantics per Pine `ta.highest`.
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":"highest.js","sourceRoot":"","sources":["../../src/ta/highest.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,4CAA4C;AAI5C,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,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AA8B5E,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAgB;IAC9C,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;QACzC,MAAM;QACN,YAAY,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC;QAC3C,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,CAAC;QACX,sBAAsB,EAAE,MAAM,CAAC,iBAAiB;KACnD,CAAC;AACN,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAiB;IAChD,oEAAoE;IACpE,kEAAkE;IAClE,uCAAuC;IACvC,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;YAAE,IAAI,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB,EAAE,GAAW;IAC9C,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE9B,kEAAkE;IAClE,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,iEAAiE;QACjE,+DAA+D;QAC/D,8CAA8C;QAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;YACtF,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,qEAAqE;IACrE,+CAA+C;IAE/C,iEAAiE;IACjE,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACvD,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,sBAAsB,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAE9D,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,yBAAyB;QACzB,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,IAAiB,EAAE,GAAW;IAC7C,0CAA0C;IAC1C,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,2DAA2D;QAC3D,sCAAsC;QACtC,OAAO,IAAI,CAAC,sBAAsB,KAAK,MAAM,CAAC,iBAAiB;YAC3D,CAAC,CAAC,MAAM,CAAC,GAAG;YACZ,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,CAAC,sBAAsB,KAAK,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3D,gEAAgE;QAChE,0DAA0D;QAC1D,aAAa;QACb,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CACnB,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,KAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAA4B,CAAC;IACrE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"highest.js","sourceRoot":"","sources":["../../src/ta/highest.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.highest`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { HighestOpts, 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\ntype HighestSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed source values across the trailing `length` bars (capacity\n * `length`). `at(0)` is the most recent close (the head bar).\n */\n readonly sourceWindow: Float64RingBuffer;\n /**\n * Monotonic-decreasing deque of absolute bar indices in the trailing\n * `length` window. Front = bar index whose source value is the\n * current rolling max.\n */\n monoIndices: number[];\n /** Source value at each retained index — mirrors `monoIndices`. */\n monoValues: number[];\n /** Number of closed bars folded into the slot. */\n barCount: number;\n /**\n * Max of the trailing `length` window EXCLUDING the head bar.\n * Computed once per close by walking the source window. Tick replay\n * reads this directly. `NEGATIVE_INFINITY` when no finite\n * non-head value exists.\n */\n closedMaxExcludingHead: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.highest called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): HighestSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n monoIndices: [],\n monoValues: [],\n barCount: 0,\n closedMaxExcludingHead: Number.NEGATIVE_INFINITY,\n };\n}\n\nfunction recomputeMaxExcludingHead(slot: HighestSlot): number {\n // The window holds the last `min(barCount, length)` closed sources;\n // `sourceWindow.at(0)` is the head bar. Walk the non-head entries\n // and find the max of the finite ones.\n let maxV = Number.NEGATIVE_INFINITY;\n const filled = slot.sourceWindow.length;\n for (let i = 1; i < filled; i += 1) {\n const v = slot.sourceWindow.at(i);\n if (Number.isFinite(v) && v > maxV) maxV = v;\n }\n return maxV;\n}\n\nfunction closeValue(slot: HighestSlot, src: number): number {\n slot.barCount += 1;\n const headIndex = slot.barCount - 1;\n slot.sourceWindow.append(src);\n\n // Evict deque front entries that fell out of the trailing window.\n const oldestAllowed = headIndex - slot.length + 1;\n while (slot.monoIndices.length > 0 && slot.monoIndices[0] < oldestAllowed) {\n slot.monoIndices.shift();\n slot.monoValues.shift();\n }\n\n if (Number.isFinite(src)) {\n // Maintain monotone-decreasing values from front to back. Pop on\n // strict `<` keeps equal values in the deque so the window can\n // tell when multiple bars share the same max.\n while (slot.monoIndices.length > 0 && slot.monoValues[slot.monoValues.length - 1] < src) {\n slot.monoIndices.pop();\n slot.monoValues.pop();\n }\n slot.monoIndices.push(headIndex);\n slot.monoValues.push(src);\n }\n // NaN sources are not pushed — NaN slots are skipped from the window\n // (matches `ta.highest`'s NaN-skip semantics).\n\n // Warmup: require at least `length` closed bars before emitting.\n if (slot.barCount < slot.length) {\n slot.closedMaxExcludingHead = Number.NEGATIVE_INFINITY;\n return Number.NaN;\n }\n\n slot.closedMaxExcludingHead = recomputeMaxExcludingHead(slot);\n\n if (slot.monoIndices.length === 0) {\n // All NaN in the window.\n return Number.NaN;\n }\n return slot.monoValues[0];\n}\n\nfunction tickValue(slot: HighestSlot, src: number): number {\n // Unwarmed: tick during warmup still NaN.\n if (slot.barCount < slot.length) return Number.NaN;\n if (!Number.isFinite(src)) {\n // NaN tick — treat the head as if its source were NaN; the\n // window's max excludes the head bar.\n return slot.closedMaxExcludingHead === Number.NEGATIVE_INFINITY\n ? Number.NaN\n : slot.closedMaxExcludingHead;\n }\n if (slot.closedMaxExcludingHead === Number.NEGATIVE_INFINITY) {\n // Window-excluding-head has no finite values (e.g. length === 1\n // or every other bar was NaN). The tick value is the only\n // candidate.\n return src;\n }\n return Math.max(slot.closedMaxExcludingHead, src);\n}\n\n/**\n * Rolling maximum of the last `length` source values. NaN inputs are\n * skipped from the window; the output is NaN until `length` closed\n * bars have been folded in. Tick-mode replays the head as\n * `max(closedMaxExcludingHead, tickValue)` so partial-bar values do\n * not pollute the next close's deque.\n *\n * @formula out[t] = max(source[t − length + 1 .. t]) (NaN slots skipped)\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const upper = ta.highest(bar.high, 20);\n * // plot(upper);\n */\nexport function highest(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: HighestOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as HighestSlot | 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"]}
@@ -0,0 +1,25 @@
1
+ import type { HighestbarsOpts, Series } from "@invinite-org/chartlang-core";
2
+ import { type ScalarOrSeries } from "./lib/sourceValue.js";
3
+ /**
4
+ * Bar offset (≤ 0) to the highest `source` value over the trailing
5
+ * `length` bars (the window INCLUDES the current bar). `0` means the
6
+ * current bar is the highest; `-k` means the highest occurred `k` bars
7
+ * ago. Ties resolve to the MOST RECENT bar (smallest |offset|). NaN
8
+ * inputs are skipped as candidates; an all-NaN window emits NaN. The
9
+ * output is NaN until `length` closed bars have folded in. Tick-mode
10
+ * replays the in-progress head as the offset-0 candidate without
11
+ * advancing the buffer.
12
+ *
13
+ * @formula out[t] = argmax_{k ∈ [0, length)} source[t − k] expressed as −k
14
+ * (NaN slots skipped; ties → smallest k)
15
+ * @warmup length − 1
16
+ * @since 0.2
17
+ * @stable
18
+ *
19
+ * @example
20
+ * // import { ta } from "@invinite-org/chartlang-core";
21
+ * // const hbar = ta.highestbars(bar.high, 20);
22
+ * // const left = bar.point(hbar.current, bar.high.current);
23
+ */
24
+ export declare function highestbars(slotId: string, source: ScalarOrSeries, length: number, _opts?: HighestbarsOpts): Series<number>;
25
+ //# sourceMappingURL=highestbars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highestbars.d.ts","sourceRoot":"","sources":["../../src/ta/highestbars.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAK5E,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AA+E5E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,eAAe,GACxB,MAAM,CAAC,MAAM,CAAC,CAchB"}
@@ -0,0 +1,106 @@
1
+ // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
+ // See the LICENSE file in the repo root for full license text.
3
+ //
4
+ // No invinite source — semantics per Pine `ta.highestbars`.
5
+ // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
6
+ // mode) follow chartlang's primitive shape.
7
+ import { Float64RingBuffer } from "../ringBuffer.js";
8
+ import { ACTIVE_RUNTIME_CONTEXT } from "../runtimeContext.js";
9
+ import { makeSeriesView } from "../seriesView.js";
10
+ import { readSourceValue } from "./lib/sourceValue.js";
11
+ function getCtx() {
12
+ const ctx = ACTIVE_RUNTIME_CONTEXT.current;
13
+ if (ctx === null) {
14
+ throw new Error("ta.highestbars called outside an active script step");
15
+ }
16
+ return ctx;
17
+ }
18
+ function initSlot(length, capacity) {
19
+ const outBuffer = new Float64RingBuffer(capacity);
20
+ return {
21
+ outBuffer,
22
+ series: makeSeriesView(outBuffer),
23
+ length,
24
+ sourceWindow: new Float64RingBuffer(length),
25
+ barCount: 0,
26
+ };
27
+ }
28
+ /**
29
+ * Bar offset (≤ 0) to the highest value across the retained window.
30
+ * Walks the window most-recent-first (`at(0)` is the head bar) and
31
+ * updates the running extreme only on a STRICT improvement, so ties
32
+ * keep the most-recent bar (smallest |offset|). `headValue` overrides
33
+ * the head candidate (`at(0)`) for the tick-replay path; pass
34
+ * `undefined` to read the closed head from the window.
35
+ *
36
+ * Returns `NaN` when every candidate in the window is NaN.
37
+ */
38
+ function offsetToMax(slot, headValue) {
39
+ const filled = slot.sourceWindow.length;
40
+ let bestValue = Number.NEGATIVE_INFINITY;
41
+ let bestOffset = Number.NaN;
42
+ for (let i = 0; i < filled; i += 1) {
43
+ const v = i === 0 && headValue !== undefined ? headValue : slot.sourceWindow.at(i);
44
+ if (Number.isFinite(v) && v > bestValue) {
45
+ bestValue = v;
46
+ // `i === 0` ⇒ offset 0 (NOT −0) so `Object.is`-based equality
47
+ // and JSON serialisation never see negative zero.
48
+ bestOffset = i === 0 ? 0 : -i;
49
+ }
50
+ }
51
+ return bestOffset;
52
+ }
53
+ function closeValue(slot, src) {
54
+ slot.barCount += 1;
55
+ slot.sourceWindow.append(src);
56
+ // Warmup: require at least `length` closed bars before emitting.
57
+ if (slot.barCount < slot.length)
58
+ return Number.NaN;
59
+ return offsetToMax(slot, undefined);
60
+ }
61
+ function tickValue(slot, src) {
62
+ if (slot.barCount < slot.length)
63
+ return Number.NaN;
64
+ // Replay the in-progress head: its source overrides the closed
65
+ // head candidate without advancing the window or mutating closed
66
+ // state.
67
+ return offsetToMax(slot, src);
68
+ }
69
+ /**
70
+ * Bar offset (≤ 0) to the highest `source` value over the trailing
71
+ * `length` bars (the window INCLUDES the current bar). `0` means the
72
+ * current bar is the highest; `-k` means the highest occurred `k` bars
73
+ * ago. Ties resolve to the MOST RECENT bar (smallest |offset|). NaN
74
+ * inputs are skipped as candidates; an all-NaN window emits NaN. The
75
+ * output is NaN until `length` closed bars have folded in. Tick-mode
76
+ * replays the in-progress head as the offset-0 candidate without
77
+ * advancing the buffer.
78
+ *
79
+ * @formula out[t] = argmax_{k ∈ [0, length)} source[t − k] expressed as −k
80
+ * (NaN slots skipped; ties → smallest k)
81
+ * @warmup length − 1
82
+ * @since 0.2
83
+ * @stable
84
+ *
85
+ * @example
86
+ * // import { ta } from "@invinite-org/chartlang-core";
87
+ * // const hbar = ta.highestbars(bar.high, 20);
88
+ * // const left = bar.point(hbar.current, bar.high.current);
89
+ */
90
+ export function highestbars(slotId, source, length, _opts) {
91
+ const ctx = getCtx();
92
+ let slot = ctx.stream.taSlots.get(slotId);
93
+ if (slot === undefined) {
94
+ slot = initSlot(length, ctx.stream.ohlcv.close.capacity);
95
+ ctx.stream.taSlots.set(slotId, slot);
96
+ }
97
+ const src = readSourceValue(source);
98
+ if (ctx.isTick) {
99
+ slot.outBuffer.replaceHead(tickValue(slot, src));
100
+ }
101
+ else {
102
+ slot.outBuffer.append(closeValue(slot, src));
103
+ }
104
+ return slot.series;
105
+ }
106
+ //# sourceMappingURL=highestbars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highestbars.js","sourceRoot":"","sources":["../../src/ta/highestbars.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.highestbars`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { HighestbarsOpts, 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\ntype HighestbarsSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n /**\n * Closed source values across the trailing `length` bars (capacity\n * `length`). `at(0)` is the most recent close (the head bar),\n * `at(k)` the value `k` closed bars ago.\n */\n readonly sourceWindow: Float64RingBuffer;\n /** Number of closed bars folded into the slot. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.highestbars called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): HighestbarsSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n sourceWindow: new Float64RingBuffer(length),\n barCount: 0,\n };\n}\n\n/**\n * Bar offset (≤ 0) to the highest value across the retained window.\n * Walks the window most-recent-first (`at(0)` is the head bar) and\n * updates the running extreme only on a STRICT improvement, so ties\n * keep the most-recent bar (smallest |offset|). `headValue` overrides\n * the head candidate (`at(0)`) for the tick-replay path; pass\n * `undefined` to read the closed head from the window.\n *\n * Returns `NaN` when every candidate in the window is NaN.\n */\nfunction offsetToMax(slot: HighestbarsSlot, headValue: number | undefined): number {\n const filled = slot.sourceWindow.length;\n let bestValue = Number.NEGATIVE_INFINITY;\n let bestOffset = Number.NaN;\n for (let i = 0; i < filled; i += 1) {\n const v = i === 0 && headValue !== undefined ? headValue : slot.sourceWindow.at(i);\n if (Number.isFinite(v) && v > bestValue) {\n bestValue = v;\n // `i === 0` ⇒ offset 0 (NOT −0) so `Object.is`-based equality\n // and JSON serialisation never see negative zero.\n bestOffset = i === 0 ? 0 : -i;\n }\n }\n return bestOffset;\n}\n\nfunction closeValue(slot: HighestbarsSlot, src: number): number {\n slot.barCount += 1;\n slot.sourceWindow.append(src);\n\n // Warmup: require at least `length` closed bars before emitting.\n if (slot.barCount < slot.length) return Number.NaN;\n\n return offsetToMax(slot, undefined);\n}\n\nfunction tickValue(slot: HighestbarsSlot, src: number): number {\n if (slot.barCount < slot.length) return Number.NaN;\n // Replay the in-progress head: its source overrides the closed\n // head candidate without advancing the window or mutating closed\n // state.\n return offsetToMax(slot, src);\n}\n\n/**\n * Bar offset (≤ 0) to the highest `source` value over the trailing\n * `length` bars (the window INCLUDES the current bar). `0` means the\n * current bar is the highest; `-k` means the highest occurred `k` bars\n * ago. Ties resolve to the MOST RECENT bar (smallest |offset|). NaN\n * inputs are skipped as candidates; an all-NaN window emits NaN. The\n * output is NaN until `length` closed bars have folded in. Tick-mode\n * replays the in-progress head as the offset-0 candidate without\n * advancing the buffer.\n *\n * @formula out[t] = argmax_{k ∈ [0, length)} source[t − k] expressed as −k\n * (NaN slots skipped; ties → smallest k)\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const hbar = ta.highestbars(bar.high, 20);\n * // const left = bar.point(hbar.current, bar.high.current);\n */\nexport function highestbars(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: HighestbarsOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as HighestbarsSlot | 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"]}
@@ -16,8 +16,9 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
16
16
  * @since 0.2
17
17
  * @stable
18
18
  *
19
- * `opts.offset` shifts the returned series so `series.current` reads
20
- * the value `offset` bars ago (PLAN.md §9.1).
19
+ * `opts.offset` is a presentation display shift carried to the plot
20
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
21
+ * series value is unshifted.
21
22
  *
22
23
  * @example
23
24
  * // import { ta } from "@invinite-org/chartlang-core";
@@ -1 +1 @@
1
- {"version":3,"file":"historicalVolatility.d.ts","sourceRoot":"","sources":["../../src/ta/historicalVolatility.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAKnE,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AA4J5E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,CAAC,CAehB"}
1
+ {"version":3,"file":"historicalVolatility.d.ts","sourceRoot":"","sources":["../../src/ta/historicalVolatility.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAKnE,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AA4J5E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,CAAC,CAehB"}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/historical-volatility.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 rolling log-returns window is folded
@@ -171,8 +171,9 @@ function tickValue(slot, src) {
171
171
  * @since 0.2
172
172
  * @stable
173
173
  *
174
- * `opts.offset` shifts the returned series so `series.current` reads
175
- * the value `offset` bars ago (PLAN.md §9.1).
174
+ * `opts.offset` is a presentation display shift carried to the plot
175
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
176
+ * series value is unshifted.
176
177
  *
177
178
  * @example
178
179
  * // import { ta } from "@invinite-org/chartlang-core";
@@ -1 +1 @@
1
- {"version":3,"file":"historicalVolatility.js","sourceRoot":"","sources":["../../src/ta/historicalVolatility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"historicalVolatility.js","sourceRoot":"","sources":["../../src/ta/historicalVolatility.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,wFAAwF;AACxF,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,kEAAkE;AAClE,oEAAoE;AACpE,iEAAiE;AACjE,iEAAiE;AACjE,iCAAiC;AAIjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAgBzC,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,mBAA2B,EAAE,QAAgB;IAC3E,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;QACzC,MAAM;QACN,mBAAmB;QACnB,gBAAgB,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC;QAC/C,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,MAAM,CAAC,GAAG;QACnB,YAAY,EAAE,IAAI,GAAG,EAAE;KAC1B,CAAC;AACN,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,MAAc;IAC/C,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrC,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,qBAAqB,CAAS,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,GAAW;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,YAAY,CAAC,MAAyB,EAAE,IAAY,EAAE,KAAa;IACxE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,kEAAkE;IAClE,oBAAoB;IACpB,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,IAAY;IAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,GAAG,IAAI,CAAC;YACd,MAAM;QACV,CAAC;QACD,IAAI,IAAI,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACT,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5B,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,GAAW;IACzC,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAChE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5B,CAAC;SAAM,IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,oBAAoB;QACpB,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC5B,CAAC;QACC,6DAA6D;QAC7D,qDAAqD;QACrD,6DAA6D;QAC7D,2DAA2D;QAC3D,0DAA0D;QAC1D,gDAAgD;QAChD,aAAa,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,EAAE,GAAG,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnD,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,GAAG,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,GAAW;IACxC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACrF,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,mEAAmE;IACnE,mEAAmE;IACnE,6DAA6D;IAC7D,qCAAqC;IACrC,oBAAoB;IACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,YAAY,GAAG,YAAY,GAAG,EAAE,GAAG,EAAE,CAAC;IACjE,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,GAAG,CAAC;AACxF,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,oBAAoB,CAChC,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,IAAa;IAEb,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAuB,CAAC;IAChE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,mBAAmB,GAAG,IAAI,EAAE,mBAAmB,IAAI,4BAA4B,CAAC;QACtF,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9E,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;AAClD,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/historical-volatility.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 rolling log-returns window is folded\n// incrementally per bar (one append per close, one head-replace per\n// tick) rather than invinite's full-array recompute. The Phase-1\n// `lib/rollingStddev` helper is the full-recompute reference the\n// property test asserts against.\n\nimport type { HvOpts, 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 { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_ANNUALISATION_FACTOR = 365;\n\ntype HvSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly annualisationFactor: number;\n readonly logReturnsWindow: Float64RingBuffer;\n sumX: number;\n sumX2: number;\n /** Last closed source value (basis of next bar's log-return). */\n prevSrc: 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.historicalVolatility called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, annualisationFactor: number, capacity: number): HvSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n annualisationFactor,\n logReturnsWindow: new Float64RingBuffer(length),\n sumX: 0,\n sumX2: 0,\n prevSrc: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: HvSlot, 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 logReturn(prev: number, cur: number): number {\n if (!Number.isFinite(prev) || !Number.isFinite(cur) || prev <= 0 || cur <= 0) {\n return Number.NaN;\n }\n return Math.log(cur / prev);\n}\n\nfunction windowStdDev(window: Float64RingBuffer, sumX: number, sumX2: number): number {\n const n = window.length;\n // Defensive: callers gate on `length === capacity` so n > 0 here.\n /* c8 ignore next */\n if (n <= 0) return Number.NaN;\n const mean = sumX / n;\n const variance = sumX2 / n - mean * mean;\n return Math.sqrt(Math.max(0, variance));\n}\n\n/**\n * Recompute the window-sums by walking the buffer. Called when a NaN\n * has been folded into the running sums (which would otherwise poison\n * every subsequent recompute) — restores the running invariant from\n * the live window contents. O(length) but only runs when needed.\n */\nfunction recomputeSums(slot: HvSlot): void {\n let sumX = 0;\n let sumX2 = 0;\n let anyNaN = false;\n for (let i = 0; i < slot.logReturnsWindow.length; i += 1) {\n const v = slot.logReturnsWindow.at(slot.logReturnsWindow.length - 1 - i);\n if (!Number.isFinite(v)) {\n anyNaN = true;\n break;\n }\n sumX += v;\n sumX2 += v * v;\n }\n if (anyNaN) {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n } else {\n slot.sumX = sumX;\n slot.sumX2 = sumX2;\n }\n}\n\nfunction closeValue(slot: HvSlot, src: number): number {\n const lr = logReturn(slot.prevSrc, src);\n if (slot.logReturnsWindow.length < slot.logReturnsWindow.capacity) {\n slot.logReturnsWindow.append(lr);\n if (Number.isFinite(lr)) {\n slot.sumX += lr;\n slot.sumX2 += lr * lr;\n } else {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n }\n slot.prevSrc = src;\n return Number.NaN;\n }\n const outgoing = slot.logReturnsWindow.at(slot.logReturnsWindow.length - 1);\n slot.logReturnsWindow.append(lr);\n if (!Number.isFinite(lr)) {\n slot.sumX = Number.NaN;\n slot.sumX2 = Number.NaN;\n } else if (\n !Number.isFinite(slot.sumX) ||\n /* c8 ignore next */\n !Number.isFinite(outgoing)\n ) {\n // A previous NaN poisoned the running sums; rebuild from the\n // live window. NaN inside short-circuits to NaN. The\n // `!Number.isFinite(outgoing)` half of the OR is defensive —\n // outgoing comes from the live window head and is only NaN\n // when a NaN was previously appended, which also poisoned\n // `sumX` (covered by the first half of the OR).\n recomputeSums(slot);\n } else {\n slot.sumX = slot.sumX - outgoing + lr;\n slot.sumX2 = slot.sumX2 - outgoing * outgoing + lr * lr;\n }\n slot.prevSrc = src;\n if (!Number.isFinite(slot.sumX)) return Number.NaN;\n const sd = windowStdDev(slot.logReturnsWindow, slot.sumX, slot.sumX2);\n return sd * Math.sqrt(slot.annualisationFactor) * 100;\n}\n\nfunction tickValue(slot: HvSlot, src: number): number {\n if (slot.logReturnsWindow.length < slot.logReturnsWindow.capacity) return Number.NaN;\n const lr = logReturn(slot.prevSrc, src);\n if (!Number.isFinite(lr) || !Number.isFinite(slot.sumX)) return Number.NaN;\n const oldestInHead = slot.logReturnsWindow.at(0);\n // Defensive: the close-side advance appends a finite lr (otherwise\n // sumX is poisoned and we returned at the guard above). The window\n // head can only be NaN if a prior NaN was appended, which is\n // already covered by the sumX guard.\n /* c8 ignore next */\n if (!Number.isFinite(oldestInHead)) return Number.NaN;\n const sumX = slot.sumX - oldestInHead + lr;\n const sumX2 = slot.sumX2 - oldestInHead * oldestInHead + lr * lr;\n const n = slot.logReturnsWindow.length;\n const mean = sumX / n;\n const variance = sumX2 / n - mean * mean;\n return Math.sqrt(Math.max(0, variance)) * Math.sqrt(slot.annualisationFactor) * 100;\n}\n\n/**\n * Historical Volatility — sub-pane line. Standard deviation of log\n * returns annualised + percent-scaled. Use `annualisationFactor: 365`\n * for crypto / 24-7 series (the default), `252` for trading-day\n * equity series. NaN through warmup (`[0, length − 1]`) — the first\n * log return lands at bar 1 and the window needs `length` of them.\n * NaN inputs (≤ 0 or non-finite source) yield NaN log-returns; any\n * NaN inside the window short-circuits the output to NaN.\n *\n * @formula lr[t] = ln(src[t] / src[t − 1]) ;\n * hv[t] = stddev(lr[t − length + 1..= t]) · sqrt(annualisationFactor) · 100\n * @warmup length\n * @anchors annualisationFactor\n * @since 0.2\n * @stable\n *\n * `opts.offset` is a presentation display shift carried to the plot\n * emission as `xShift` (`+n` right / future, `−n` left / past); the\n * series value is unshifted.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const hv = ta.historicalVolatility(bar.close, 10);\n * // plot(hv);\n */\nexport function historicalVolatility(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: HvOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as HvSlot | undefined;\n if (slot === undefined) {\n const annualisationFactor = opts?.annualisationFactor ?? DEFAULT_ANNUALISATION_FACTOR;\n slot = initSlot(length, annualisationFactor, 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 viewForOffset(slot, opts?.offset ?? 0);\n}\n"]}
package/dist/ta/hma.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/hma.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 HMA primitive composes three WMA sub-
@@ -1 +1 @@
1
- {"version":3,"file":"hma.js","sourceRoot":"","sources":["../../src/ta/hma.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,mEAAmE;AACnE,yCAAyC;AAIzC,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAM/B,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;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,GAAG,CACf,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,KAAe;IAEf,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACnF,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,MAAM,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAwB,CAAC;IACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAC/B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"hma.js","sourceRoot":"","sources":["../../src/ta/hma.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,mEAAmE;AACnE,yCAAyC;AAIzC,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAM/B,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;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,GAAG,CACf,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,KAAe;IAEf,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACnF,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,MAAM,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAwB,CAAC;IACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAC/B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,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/hma.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 HMA primitive composes three WMA sub-\n// slots derived from the parent slot id.\n\nimport type { HmaOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { wma } from \"./wma.js\";\n\ntype HmaSlot = {\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.hma called outside an active script step\");\n }\n return ctx;\n}\n\n/**\n * Hull moving average — `WMA(2·WMA(src, N/2) − WMA(src, N), sqrt(N))`.\n * Composes three WMA sub-slots derived from the parent slot id\n * (`${slotId}/half`, `${slotId}/full`, `${slotId}/final`). The intermediate\n * `diff = 2·halfWMA − fullWMA` is a scalar passed into the final WMA;\n * no separate primitive owns the diff stream. Warmup is the full chain:\n * `length + ceil(sqrt(length)) − 2`. Tick-mode propagates through every\n * sub-slot's replace-head branch.\n *\n * @formula halfLen = floor(length / 2) ;\n * sqrtLen = round(sqrt(length)) ;\n * half = WMA(source, halfLen) ;\n * full = WMA(source, length) ;\n * diff = 2 · half − full ;\n * out = WMA(diff, sqrtLen)\n * @warmup length + ceil(sqrt(length)) − 2\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const h = ta.hma(bar.close, 21);\n * // plot(h);\n */\nexport function hma(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: HmaOpts,\n): Series<number> {\n const ctx = getCtx();\n const halfLen = Math.max(1, Math.floor(length / 2));\n const sqrtLen = Math.max(1, Math.round(Math.sqrt(length)));\n const src = readSourceValue(source);\n const halfSeries = wma(`${slotId}/half`, src, halfLen);\n const fullSeries = wma(`${slotId}/full`, src, length);\n const ha = halfSeries.current;\n const fa = fullSeries.current;\n const diff = Number.isFinite(ha) && Number.isFinite(fa) ? 2 * ha - fa : Number.NaN;\n const finalSeries = wma(`${slotId}/final`, diff, sqrtLen);\n\n let slot = ctx.stream.taSlots.get(slotId) as HmaSlot | undefined;\n if (slot === undefined) {\n slot = { series: finalSeries };\n ctx.stream.taSlots.set(slotId, slot);\n }\n return slot.series;\n}\n"]}
@@ -27,7 +27,9 @@ import type { IchimokuOpts, IchimokuResult } from "@invinite-org/chartlang-core"
27
27
  * @since 0.2
28
28
  * @stable
29
29
  *
30
- * `opts.offset` shifts all five outputs in lockstep (PLAN.md §9.1).
30
+ * `opts.offset` is a presentation display shift carried to the plot
31
+ * emission as `xShift` for all five outputs in lockstep (`+n` right / future,
32
+ * `−n` left / past); the series values are unshifted.
31
33
  *
32
34
  * @example
33
35
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"ichimoku.d.ts","sourceRoot":"","sources":["../../src/ta/ichimoku.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAqHjF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,cAAc,CA8D5E"}
1
+ {"version":3,"file":"ichimoku.d.ts","sourceRoot":"","sources":["../../src/ta/ichimoku.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAqHjF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,cAAc,CA8D5E"}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/ichimoku.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. Ichimoku composes six `ta.highest` / `ta.lowest`
@@ -121,7 +121,9 @@ function resultForOffset(slot, offset) {
121
121
  * @since 0.2
122
122
  * @stable
123
123
  *
124
- * `opts.offset` shifts all five outputs in lockstep (PLAN.md §9.1).
124
+ * `opts.offset` is a presentation display shift carried to the plot
125
+ * emission as `xShift` for all five outputs in lockstep (`+n` right / future,
126
+ * `−n` left / past); the series values are unshifted.
125
127
  *
126
128
  * @example
127
129
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"ichimoku.js","sourceRoot":"","sources":["../../src/ta/ichimoku.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ichimoku.js","sourceRoot":"","sources":["../../src/ta/ichimoku.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/ichimoku.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. Ichimoku composes six `ta.highest` / `ta.lowest`\n// sub-slots (one pair each for Tenkan / Kijun / Senkou B) — the same\n// composition seam `donchian.ts` uses — so a fix to highest/lowest\n// flows in for free. The forward-displaced Senkou A / Senkou B and\n// backward-displaced Chikou are produced via per-slot delay ring\n// buffers of capacity `displacement + 1`.\n\nimport type { IchimokuOpts, IchimokuResult } 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 { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\nconst DEFAULT_CONVERSION_LENGTH = 9;\nconst DEFAULT_BASE_LENGTH = 26;\nconst DEFAULT_LEADING_SPAN_B_LENGTH = 52;\nconst DEFAULT_DISPLACEMENT = 26;\n\ntype IchimokuSlot = {\n readonly outputs: IchimokuResult;\n readonly tenkanBuffer: Float64RingBuffer;\n readonly kijunBuffer: Float64RingBuffer;\n readonly senkouABuffer: Float64RingBuffer;\n readonly senkouBBuffer: Float64RingBuffer;\n readonly chikouBuffer: Float64RingBuffer;\n readonly conversionLength: number;\n readonly baseLength: number;\n readonly leadingSpanBLength: number;\n readonly displacement: number;\n /** Forward-shift delay for senkouA: capacity `displacement + 1`.\n * At each close we append the new `senkouARaw`; `at(displacement)`\n * gives the value from `displacement` closes ago — exactly the\n * value we emit for `senkouA[t]`. */\n readonly senkouADelay: Float64RingBuffer;\n readonly senkouBDelay: Float64RingBuffer;\n /** Backward-shift delay for chikou: capacity `displacement + 1`.\n * `chikou[t] = close[t − displacement]` — at each close we append\n * the new close; `at(displacement)` gives the value from\n * `displacement` closes ago. */\n readonly closeDelay: Float64RingBuffer;\n readonly shiftedResults: Map<number, IchimokuResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ichimoku called outside an active script step\");\n }\n return ctx;\n}\n\nfunction midpoint(hi: number, lo: number): number {\n if (!Number.isFinite(hi) || !Number.isFinite(lo)) return Number.NaN;\n return (hi + lo) / 2;\n}\n\nfunction spanAverage(a: number, b: number): number {\n if (!Number.isFinite(a) || !Number.isFinite(b)) return Number.NaN;\n return (a + b) / 2;\n}\n\nfunction delayedValue(delay: Float64RingBuffer, displacement: number): number {\n if (delay.length <= displacement) return Number.NaN;\n return delay.at(displacement);\n}\n\nfunction initSlot(\n capacity: number,\n conversionLength: number,\n baseLength: number,\n leadingSpanBLength: number,\n displacement: number,\n): IchimokuSlot {\n const tenkanBuffer = new Float64RingBuffer(capacity);\n const kijunBuffer = new Float64RingBuffer(capacity);\n const senkouABuffer = new Float64RingBuffer(capacity);\n const senkouBBuffer = new Float64RingBuffer(capacity);\n const chikouBuffer = new Float64RingBuffer(capacity);\n // The delay ring buffers need only `displacement + 1` slots — at\n // each close we append the new raw value; `at(displacement)`\n // returns the value from `displacement` closes ago.\n const delayCap = displacement + 1;\n return {\n outputs: Object.freeze({\n tenkan: makeSeriesView<number>(tenkanBuffer),\n kijun: makeSeriesView<number>(kijunBuffer),\n senkouA: makeSeriesView<number>(senkouABuffer),\n senkouB: makeSeriesView<number>(senkouBBuffer),\n chikou: makeSeriesView<number>(chikouBuffer),\n }),\n tenkanBuffer,\n kijunBuffer,\n senkouABuffer,\n senkouBBuffer,\n chikouBuffer,\n conversionLength,\n baseLength,\n leadingSpanBLength,\n displacement,\n senkouADelay: new Float64RingBuffer(delayCap),\n senkouBDelay: new Float64RingBuffer(delayCap),\n closeDelay: new Float64RingBuffer(delayCap),\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: IchimokuSlot, offset: number): IchimokuResult {\n if (offset === 0) return slot.outputs;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n tenkan: makeShiftedSeriesView<number>(slot.tenkanBuffer, offset),\n kijun: makeShiftedSeriesView<number>(slot.kijunBuffer, offset),\n senkouA: makeShiftedSeriesView<number>(slot.senkouABuffer, offset),\n senkouB: makeShiftedSeriesView<number>(slot.senkouBBuffer, offset),\n chikou: makeShiftedSeriesView<number>(slot.chikouBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * Ichimoku Cloud — five-line trend / cloud overlay. Composes six\n * `ta.highest` / `ta.lowest` sub-slots (Tenkan high+low, Kijun\n * high+low, Senkou B high+low) — the same composition seam\n * `ta.donchian` uses — so a fix to either rolling-extreme primitive\n * flows in for free. Forward-displaced Senkou A / Senkou B and\n * backward-displaced Chikou are produced via per-slot delay ring\n * buffers of capacity `displacement + 1`.\n *\n * `chikou.current` returns `close[t − displacement]` (the close from\n * `displacement` bars ago, plotted at today's position — the\n * lagging-span semantic). Renderer-side, the script author may\n * choose to draw it at the visually-offset position; the runtime\n * exposes the backward-shifted value so script-author conditionals\n * (cross / alert) see meaningful data.\n *\n * @formula tenkan[t] = (highest(high, conversionLength) + lowest(low, conversionLength)) / 2 ;\n * kijun[t] = (highest(high, baseLength) + lowest(low, baseLength)) / 2 ;\n * senkouARaw = (tenkan + kijun) / 2 ;\n * senkouBRaw = (highest(high, leadingSpanBLength) + lowest(low, leadingSpanBLength)) / 2 ;\n * senkouA[t] = senkouARaw[t − displacement] ;\n * senkouB[t] = senkouBRaw[t − displacement] ;\n * chikou[t] = close[t − displacement]\n * @anchors displacement, conversionLength, baseLength, leadingSpanBLength\n * @warmup max(conversionLength, baseLength, leadingSpanBLength) + displacement − 1\n * @since 0.2\n * @stable\n *\n * `opts.offset` is a presentation display shift carried to the plot\n * emission as `xShift` for all five outputs in lockstep (`+n` right / future,\n * `−n` left / past); the series values are unshifted.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const i = ta.ichimoku(\"slot\");\n * // plot(i.tenkan);\n * // plot(i.kijun);\n * // plot(i.senkouA);\n * // plot(i.senkouB);\n * // plot(i.chikou);\n */\nexport function ichimoku(slotId: string, opts?: IchimokuOpts): IchimokuResult {\n const ctx = getCtx();\n const conversionLength = opts?.conversionLength ?? DEFAULT_CONVERSION_LENGTH;\n const baseLength = opts?.baseLength ?? DEFAULT_BASE_LENGTH;\n const leadingSpanBLength = opts?.leadingSpanBLength ?? DEFAULT_LEADING_SPAN_B_LENGTH;\n const displacement = opts?.displacement ?? DEFAULT_DISPLACEMENT;\n const offset = opts?.offset ?? 0;\n const bar = ctx.stream.bar;\n\n let slot = ctx.stream.taSlots.get(slotId) as IchimokuSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(\n ctx.stream.ohlcv.close.capacity,\n conversionLength,\n baseLength,\n leadingSpanBLength,\n displacement,\n );\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n // Compose: rolling extremes via the registered ta.highest /\n // ta.lowest sub-slots. Each composed call advances the sub-slot on\n // the same close (or replaces its head on the same tick).\n const tenkanHi = highest(`${slotId}/tenkanHigh`, bar.high, conversionLength).current;\n const tenkanLo = lowest(`${slotId}/tenkanLow`, bar.low, conversionLength).current;\n const kijunHi = highest(`${slotId}/kijunHigh`, bar.high, baseLength).current;\n const kijunLo = lowest(`${slotId}/kijunLow`, bar.low, baseLength).current;\n const senkouBHi = highest(`${slotId}/senkouBHigh`, bar.high, leadingSpanBLength).current;\n const senkouBLo = lowest(`${slotId}/senkouBLow`, bar.low, leadingSpanBLength).current;\n\n const tenkan = midpoint(tenkanHi, tenkanLo);\n const kijun = midpoint(kijunHi, kijunLo);\n const senkouBRaw = midpoint(senkouBHi, senkouBLo);\n const senkouARaw = spanAverage(tenkan, kijun);\n\n if (ctx.isTick) {\n // Replace the head of the delay buffers with the tick's\n // updated raw values. `at(displacement)` then returns the\n // SAME value as before (the displacement-shifted slot is not\n // affected by the head's value), so the displaced output\n // heads are stable on tick.\n slot.senkouADelay.replaceHead(senkouARaw);\n slot.senkouBDelay.replaceHead(senkouBRaw);\n slot.closeDelay.replaceHead(bar.close);\n slot.tenkanBuffer.replaceHead(tenkan);\n slot.kijunBuffer.replaceHead(kijun);\n slot.senkouABuffer.replaceHead(delayedValue(slot.senkouADelay, displacement));\n slot.senkouBBuffer.replaceHead(delayedValue(slot.senkouBDelay, displacement));\n slot.chikouBuffer.replaceHead(delayedValue(slot.closeDelay, displacement));\n } else {\n slot.senkouADelay.append(senkouARaw);\n slot.senkouBDelay.append(senkouBRaw);\n slot.closeDelay.append(bar.close);\n slot.tenkanBuffer.append(tenkan);\n slot.kijunBuffer.append(kijun);\n slot.senkouABuffer.append(delayedValue(slot.senkouADelay, displacement));\n slot.senkouBBuffer.append(delayedValue(slot.senkouBDelay, displacement));\n slot.chikouBuffer.append(delayedValue(slot.closeDelay, displacement));\n }\n\n return resultForOffset(slot, offset);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ta/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ta/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,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\nexport { TA_REGISTRY, ta } from \"./registry.js\";\nexport type { RuntimeTaNamespace } from \"./registry.js\";\nexport { maRibbonOutputKeys } from \"./maRibbon.js\";\nexport type { ScalarOrSeries } from \"./lib/sourceValue.js\";\n"]}
package/dist/ta/kama.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/kama.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.
@@ -1 +1 @@
1
- {"version":3,"file":"kama.js","sourceRoot":"","sources":["../../src/ta/kama.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,mEAAmE;AACnE,0DAA0D;AAC1D,yEAAyE;AACzE,qEAAqE;AACrE,4DAA4D;AAC5D,yBAAyB;AAIzB,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,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,YAAY,GAAG,EAAE,CAAC;AAcxB,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CACb,MAAc,EACd,UAAkB,EAClB,UAAkB,EAClB,QAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc,CAAS,SAAS,CAAC;QACzC,MAAM;QACN,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QAC/B,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QAC/B,YAAY,EAAE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/C,QAAQ,EAAE,MAAM,CAAC,GAAG;QACpB,cAAc,EAAE,MAAM,CAAC,GAAG;KAC7B,CAAC;AACN,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,IAAc,EAAE,OAAe,EAAE,IAAY;IAC9D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IAE1C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,6DAA6D;IAC7D,gEAAgE;IAChE,0DAA0D;IAC1D,sCAAsC;IACtC,CAAC;QACG,MAAM,IAAI,GAAG,OAAO,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE1E,2DAA2D;IAC3D,6DAA6D;IAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC3C,OAAO,IAAI,GAAG,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,IAAI,CAAC,MAAc,EAAE,MAAsB,EAAE,IAAe;IACxE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,cAAc,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,YAAY,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,YAAY,CAAC;IACpD,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAyB,CAAC;IAClE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjF,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,4DAA4D;QAC5D,iEAAiE;QACjE,wCAAwC;QACxC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACrE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QAC3E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"kama.js","sourceRoot":"","sources":["../../src/ta/kama.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/kama.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.\n\nimport type { KamaOpts, 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 DEFAULT_LENGTH = 10;\nconst DEFAULT_FAST = 2;\nconst DEFAULT_SLOW = 30;\n\ntype KamaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly fastAlpha: number;\n readonly slowAlpha: number;\n /** Trailing `length + 1` source values; `at(0)` is head, `at(length)` is oldest. */\n readonly sourceWindow: Float64RingBuffer;\n prevKama: number;\n prevClosedKama: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.kama called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n length: number,\n fastLength: number,\n slowLength: number,\n capacity: number,\n): KamaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n fastAlpha: 2 / (fastLength + 1),\n slowAlpha: 2 / (slowLength + 1),\n sourceWindow: new Float64RingBuffer(length + 1),\n prevKama: Number.NaN,\n prevClosedKama: Number.NaN,\n };\n}\n\n/**\n * Compute the next KAMA value given the slot's current window state,\n * `headSrc` (the source value to evaluate at age 0 — may be the\n * just-appended close or a tick replacement), and `prev` (the prior\n * KAMA — either `prevClosedKama` on close or `prevClosedKama` on\n * tick; tick recomputes from the closed prior). Returns NaN until the\n * window holds `length + 1` finite samples.\n */\nfunction computeKama(slot: KamaSlot, headSrc: number, prev: number): number {\n if (slot.sourceWindow.length < slot.length + 1) return Number.NaN;\n if (!Number.isFinite(headSrc)) return prev;\n\n const oldest = slot.sourceWindow.at(slot.length);\n if (!Number.isFinite(oldest)) return prev;\n\n const change = Math.abs(headSrc - oldest);\n\n let volatility = 0;\n // Per-bar absolute diffs across the trailing `length` pairs:\n // |w[0] − w[1]| + |w[1] − w[2]| + … + |w[length-1] − w[length]|\n // with w[0] substituted by `headSrc` so tick replays work\n // without mutating the closed window.\n {\n const next = headSrc;\n const prior = slot.sourceWindow.at(1);\n if (!Number.isFinite(prior)) return prev;\n volatility += Math.abs(next - prior);\n }\n for (let j = 1; j < slot.length; j += 1) {\n const next = slot.sourceWindow.at(j);\n const prior = slot.sourceWindow.at(j + 1);\n if (!Number.isFinite(next) || !Number.isFinite(prior)) return prev;\n volatility += Math.abs(next - prior);\n }\n\n const er = volatility > 0 ? change / volatility : 0;\n const sc = (er * (slot.fastAlpha - slot.slowAlpha) + slot.slowAlpha) ** 2;\n\n // Seed at the warmup boundary with the source value itself\n // (matches invinite's convention + standard Pine `ta.kama`).\n if (!Number.isFinite(prev)) return headSrc;\n return prev + sc * (headSrc - prev);\n}\n\n/**\n * Kaufman's Adaptive Moving Average — an EMA-like recurrence whose\n * smoothing constant adapts to market efficiency. The \"efficiency\n * ratio\" is the directional change over the last `length` bars\n * divided by the total path-length over the same window; high\n * efficiency (trending) → smoothing approaches `fastAlpha`,\n * low efficiency (chop) → smoothing approaches `slowAlpha`.\n * Defaults: `length = 10`, `fastLength = 2`, `slowLength = 30`.\n *\n * NaN handling: mid-stream NaN source → KAMA carries the prior value\n * forward (matches the EMA / SMMA recurrence convention). Zero-\n * volatility window → `er = 0`, smoothing degenerates to `slowAlpha²`\n * but no change occurs because `src − prev` is itself 0 in the\n * constant-source regime.\n *\n * @formula fastAlpha = 2 / (fastLength + 1) ;\n * slowAlpha = 2 / (slowLength + 1) ;\n * change = |src[t] − src[t − length]| ;\n * vol = Σ_{j=0..length-1} |src[t − j] − src[t − j − 1]| ;\n * er = vol > 0 ? change / vol : 0 ;\n * sc = (er · (fastAlpha − slowAlpha) + slowAlpha)² ;\n * KAMA[t] = KAMA[t − 1] + sc · (src[t] − KAMA[t − 1])\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const k = ta.kama(bar.close, { length: 10, fastLength: 2, slowLength: 30 });\n * // plot(k);\n */\nexport function kama(slotId: string, source: ScalarOrSeries, opts?: KamaOpts): Series<number> {\n const ctx = getCtx();\n const length = opts?.length ?? DEFAULT_LENGTH;\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n let slot = ctx.stream.taSlots.get(slotId) as KamaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, fastLength, slowLength, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n if (ctx.isTick) {\n // Tick replays the head off the existing closed window with\n // `src` substituted at age 0; `prevClosedKama` is the recurrence\n // anchor (the prior CLOSED bar's KAMA).\n const value = computeKama(slot, src, slot.prevClosedKama);\n slot.prevKama = Number.isFinite(value) ? value : slot.prevClosedKama;\n slot.outBuffer.replaceHead(value);\n } else {\n slot.sourceWindow.append(src);\n const value = computeKama(slot, src, slot.prevClosedKama);\n slot.prevClosedKama = Number.isFinite(value) ? value : slot.prevClosedKama;\n slot.prevKama = slot.prevClosedKama;\n slot.outBuffer.append(value);\n }\n return slot.series;\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/keltner.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. Keltner composes the registered MA primitive
@@ -1 +1 @@
1
- {"version":3,"file":"keltner.js","sourceRoot":"","sources":["../../src/ta/keltner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keltner.js","sourceRoot":"","sources":["../../src/ta/keltner.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/keltner.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. Keltner composes the registered MA primitive\n// (sma / ema / wma / smma) via sub-slot `${slotId}/<maType>` over\n// `bar.close` for the middle band, and `ta.atr` via sub-slot\n// `${slotId}/atr` for the band offset — so fixes to either flow in\n// for free (mirrors maRibbon / donchian composition convention).\n\nimport type {\n KeltnerOpts,\n KeltnerResult,\n MaTypeNoVolume,\n Series,\n} 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 { ema } from \"./ema.js\";\nimport { sma } from \"./sma.js\";\nimport { smma } from \"./smma.js\";\nimport { wma } from \"./wma.js\";\n\nconst DEFAULT_LENGTH = 20;\nconst DEFAULT_MULTIPLIER = 2;\nconst DEFAULT_MA_TYPE: MaTypeNoVolume = \"ema\";\n\ntype KeltnerSlot = {\n readonly upperBuffer: Float64RingBuffer;\n readonly lowerBuffer: Float64RingBuffer;\n readonly length: number;\n readonly multiplier: number;\n readonly maType: MaTypeNoVolume;\n outputs: KeltnerResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.keltner called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n length: number,\n multiplier: number,\n maType: MaTypeNoVolume,\n capacity: number,\n): KeltnerSlot {\n return {\n upperBuffer: new Float64RingBuffer(capacity),\n lowerBuffer: new Float64RingBuffer(capacity),\n length,\n multiplier,\n maType,\n outputs: null,\n };\n}\n\nfunction dispatchMa(\n maType: MaTypeNoVolume,\n subSlotId: string,\n source: number,\n length: number,\n): Series<number> {\n switch (maType) {\n case \"sma\":\n return sma(subSlotId, source, length);\n case \"ema\":\n return ema(subSlotId, source, length);\n case \"wma\":\n return wma(subSlotId, source, length);\n case \"smma\":\n return smma(subSlotId, source, length);\n }\n}\n\n/**\n * Keltner Channels — overlay volatility envelope. Middle band is an\n * `maType` MA of `bar.close` over `length`; upper / lower bands sit\n * `multiplier · ATR(length)` above / below the middle. Defaults\n * `length = 20`, `multiplier = 2`, `maType = \"ema\"` (Linda Raschke /\n * TradingView canonical form — Chester Keltner's original used a\n * different \"typical range\" formulation; every modern reference\n * defaults to EMA + Wilder ATR). Composes the registered MA primitive\n * via sub-slot `${slotId}/<maType>` and `ta.atr` via sub-slot\n * `${slotId}/atr` — fixes to either flow in for free. Returns a\n * cached `{ upper, middle, lower }` record (same identity every bar).\n * NaN across all outputs while the trailing window is unwarmed.\n *\n * @formula middle = MA(close, length, maType) ;\n * upper = middle + multiplier · atr(length) ;\n * lower = middle − multiplier · atr(length)\n * @warmup length\n * @anchors maType\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const k = ta.keltner({ length: 20, multiplier: 2 });\n * // plot(k.upper);\n * // plot(k.middle);\n * // plot(k.lower);\n */\nexport function keltner(slotId: string, opts?: KeltnerOpts): KeltnerResult {\n const ctx = getCtx();\n const length = opts?.length ?? DEFAULT_LENGTH;\n const multiplier = opts?.multiplier ?? DEFAULT_MULTIPLIER;\n const maType = opts?.maType ?? DEFAULT_MA_TYPE;\n let slot = ctx.stream.taSlots.get(slotId) as KeltnerSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, multiplier, maType, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const close = ctx.stream.bar.close;\n const middleSeries = dispatchMa(slot.maType, `${slotId}/${slot.maType}`, close, slot.length);\n const atrSeries = atr(`${slotId}/atr`, slot.length);\n if (slot.outputs === null) {\n slot.outputs = Object.freeze({\n upper: makeSeriesView<number>(slot.upperBuffer),\n middle: middleSeries,\n lower: makeSeriesView<number>(slot.lowerBuffer),\n });\n }\n const mid = middleSeries.current;\n const atrValue = atrSeries.current;\n let upperValue: number;\n let lowerValue: number;\n if (Number.isFinite(mid) && Number.isFinite(atrValue)) {\n upperValue = mid + slot.multiplier * atrValue;\n lowerValue = mid - slot.multiplier * atrValue;\n } else {\n upperValue = Number.NaN;\n lowerValue = Number.NaN;\n }\n if (ctx.isTick) {\n slot.upperBuffer.replaceHead(upperValue);\n slot.lowerBuffer.replaceHead(lowerValue);\n } else {\n slot.upperBuffer.append(upperValue);\n slot.lowerBuffer.append(lowerValue);\n }\n return slot.outputs;\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/klinger.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. Composition: three `ta.ema` sub-slots