@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
@@ -2,7 +2,7 @@
2
2
  // See the LICENSE file in the repo root for full license text.
3
3
  //
4
4
  // No invinite source — Phase-1 new code, semantics per Pine
5
- // `ta.crossover` / `ta.crossunder`. See PLAN.md §3.1.
5
+ // `ta.crossover` / `ta.crossunder`.
6
6
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
7
7
  // mode) follow chartlang's primitive shape.
8
8
  import { RingBuffer } from "../ringBuffer.js";
@@ -64,8 +64,9 @@ function detect(prevA, prevB, currA, currB) {
64
64
  * @since 0.1
65
65
  * @stable
66
66
  *
67
- * `opts.offset` shifts the boolean series so `series.current` returns
68
- * the crossover detection `offset` bars ago (PLAN.md §9.1).
67
+ * `opts.offset` is a presentation display shift carried to the plot
68
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
69
+ * boolean crossover series value is unshifted.
69
70
  *
70
71
  * @example
71
72
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"crossover.js","sourceRoot":"","sources":["../../src/ta/crossover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crossover.js","sourceRoot":"","sources":["../../src/ta/crossover.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 — Phase-1 new code, semantics per Pine\n// `ta.crossover` / `ta.crossunder`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { CrossoverOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { RingBuffer } 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\ntype CrossSlot = {\n readonly outBuffer: RingBuffer<boolean>;\n readonly series: Series<boolean>;\n /** Prior closed-bar values of `a` and `b` (rolling 2-slot history). */\n prevA: number;\n prevB: number;\n /** As-of-current-close values, frozen so ticks replay against prior. */\n currA: number;\n currB: number;\n initialised: boolean;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<boolean>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.crossover called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): CrossSlot {\n const outBuffer = new RingBuffer<boolean>(capacity);\n return {\n outBuffer,\n series: makeSeriesView<boolean>(outBuffer) as Series<boolean>,\n prevA: Number.NaN,\n prevB: Number.NaN,\n currA: Number.NaN,\n currB: Number.NaN,\n initialised: false,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: CrossSlot, offset: number): Series<boolean> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<boolean>(slot.outBuffer, offset) as Series<boolean>;\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction detect(prevA: number, prevB: number, currA: number, currB: number): boolean {\n if (\n !Number.isFinite(prevA) ||\n !Number.isFinite(prevB) ||\n !Number.isFinite(currA) ||\n !Number.isFinite(currB)\n ) {\n return false;\n }\n return currA > currB && prevA <= prevB;\n}\n\n/**\n * `true` exactly at the bar where `a` crosses above `b`: `a.current >\n * b.current && a.prev <= b.prev`. `b` may be a scalar (treated as a\n * constant series). NaN inputs yield `false` — Pine semantics for\n * Boolean series (NaN doesn't bubble through booleans).\n *\n * The slot keeps a 2-slot history of both `a` and `b` so scalar\n * sources work without the caller wrapping them. Tick-mode replays\n * the head with the prior closed-bar's `(a, b)` pair so a partial-\n * bar value doesn't seed the next close's comparison.\n *\n * @formula out[t] = a[t] > b[t] && a[t − 1] ≤ b[t − 1] (else false)\n * @warmup 1 (need a prior bar)\n * @since 0.1\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 * boolean crossover series value is unshifted.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.crossover(\"slot\", fastEma, slowEma);\n * // if (c.current) { ... }\n * // const lagged = ta.crossover(\"slot2\", fastEma, slowEma, { offset: 1 });\n */\nexport function crossover(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossoverOpts,\n): Series<boolean> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CrossSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const aValue = readSourceValue(a);\n const bValue = readSourceValue(b);\n const offset = opts?.offset ?? 0;\n if (ctx.isTick) {\n const out = detect(slot.prevA, slot.prevB, aValue, bValue);\n slot.outBuffer.replaceHead(out);\n return viewForOffset(slot, offset);\n }\n if (!slot.initialised) {\n slot.initialised = true;\n slot.prevA = aValue;\n slot.prevB = bValue;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(false);\n return viewForOffset(slot, offset);\n }\n // Standard close-side advance: prev becomes currA/B, currA/B become the new sample.\n slot.prevA = slot.currA;\n slot.prevB = slot.currB;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(detect(slot.prevA, slot.prevB, slot.currA, slot.currB));\n return viewForOffset(slot, offset);\n}\n"]}
@@ -10,8 +10,9 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
10
10
  * @since 0.1
11
11
  * @stable
12
12
  *
13
- * `opts.offset` shifts the boolean series so `series.current` returns
14
- * the crossunder detection `offset` bars ago (PLAN.md §9.1).
13
+ * `opts.offset` is a presentation display shift carried to the plot
14
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
15
+ * boolean crossunder series value is unshifted.
15
16
  *
16
17
  * @example
17
18
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"crossunder.d.ts","sourceRoot":"","sources":["../../src/ta/crossunder.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAK3E,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AA0D5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CACtB,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,cAAc,EACjB,CAAC,EAAE,cAAc,EACjB,IAAI,CAAC,EAAE,cAAc,GACtB,MAAM,CAAC,OAAO,CAAC,CA8BjB"}
1
+ {"version":3,"file":"crossunder.d.ts","sourceRoot":"","sources":["../../src/ta/crossunder.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAK3E,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AA0D5E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CACtB,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,cAAc,EACjB,CAAC,EAAE,cAAc,EACjB,IAAI,CAAC,EAAE,cAAc,GACtB,MAAM,CAAC,OAAO,CAAC,CA8BjB"}
@@ -2,7 +2,7 @@
2
2
  // See the LICENSE file in the repo root for full license text.
3
3
  //
4
4
  // No invinite source — Phase-1 new code, semantics per Pine
5
- // `ta.crossover` / `ta.crossunder`. See PLAN.md §3.1.
5
+ // `ta.crossover` / `ta.crossunder`.
6
6
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
7
7
  // mode) follow chartlang's primitive shape.
8
8
  import { RingBuffer } from "../ringBuffer.js";
@@ -58,8 +58,9 @@ function detect(prevA, prevB, currA, currB) {
58
58
  * @since 0.1
59
59
  * @stable
60
60
  *
61
- * `opts.offset` shifts the boolean series so `series.current` returns
62
- * the crossunder detection `offset` bars ago (PLAN.md §9.1).
61
+ * `opts.offset` is a presentation display shift carried to the plot
62
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
63
+ * boolean crossunder series value is unshifted.
63
64
  *
64
65
  * @example
65
66
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"crossunder.js","sourceRoot":"","sources":["../../src/ta/crossunder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crossunder.js","sourceRoot":"","sources":["../../src/ta/crossunder.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 — Phase-1 new code, semantics per Pine\n// `ta.crossover` / `ta.crossunder`.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape.\n\nimport type { CrossunderOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { RingBuffer } 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\ntype CrossSlot = {\n readonly outBuffer: RingBuffer<boolean>;\n readonly series: Series<boolean>;\n prevA: number;\n prevB: number;\n currA: number;\n currB: number;\n initialised: boolean;\n /** Per-offset Series-view cache; see `sma.ts` for the convention. */\n readonly shiftedViews: Map<number, Series<boolean>>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.crossunder called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): CrossSlot {\n const outBuffer = new RingBuffer<boolean>(capacity);\n return {\n outBuffer,\n series: makeSeriesView<boolean>(outBuffer) as Series<boolean>,\n prevA: Number.NaN,\n prevB: Number.NaN,\n currA: Number.NaN,\n currB: Number.NaN,\n initialised: false,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: CrossSlot, offset: number): Series<boolean> {\n if (offset === 0) return slot.series;\n let view = slot.shiftedViews.get(offset);\n if (view === undefined) {\n view = makeShiftedSeriesView<boolean>(slot.outBuffer, offset) as Series<boolean>;\n slot.shiftedViews.set(offset, view);\n }\n return view;\n}\n\nfunction detect(prevA: number, prevB: number, currA: number, currB: number): boolean {\n if (\n !Number.isFinite(prevA) ||\n !Number.isFinite(prevB) ||\n !Number.isFinite(currA) ||\n !Number.isFinite(currB)\n ) {\n return false;\n }\n return currA < currB && prevA >= prevB;\n}\n\n/**\n * `true` exactly at the bar where `a` crosses below `b`: `a.current <\n * b.current && a.prev >= b.prev`. Mirror of {@link crossover}; NaN\n * inputs yield `false`.\n *\n * @formula out[t] = a[t] < b[t] && a[t − 1] ≥ b[t − 1] (else false)\n * @warmup 1\n * @since 0.1\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 * boolean crossunder series value is unshifted.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const c = ta.crossunder(\"slot\", fastEma, slowEma);\n * // if (c.current) { ... }\n * // const lagged = ta.crossunder(\"slot2\", fastEma, slowEma, { offset: 1 });\n */\nexport function crossunder(\n slotId: string,\n a: ScalarOrSeries,\n b: ScalarOrSeries,\n opts?: CrossunderOpts,\n): Series<boolean> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as CrossSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const aValue = readSourceValue(a);\n const bValue = readSourceValue(b);\n const offset = opts?.offset ?? 0;\n if (ctx.isTick) {\n const out = detect(slot.prevA, slot.prevB, aValue, bValue);\n slot.outBuffer.replaceHead(out);\n return viewForOffset(slot, offset);\n }\n if (!slot.initialised) {\n slot.initialised = true;\n slot.prevA = aValue;\n slot.prevB = bValue;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(false);\n return viewForOffset(slot, offset);\n }\n slot.prevA = slot.currA;\n slot.prevB = slot.currB;\n slot.currA = aValue;\n slot.currB = bValue;\n slot.outBuffer.append(detect(slot.prevA, slot.prevB, slot.currA, slot.currB));\n return viewForOffset(slot, offset);\n}\n"]}
package/dist/ta/dema.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/dema.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. DEMA composes two EMA sub-slots derived from
@@ -1 +1 @@
1
- {"version":3,"file":"dema.js","sourceRoot":"","sources":["../../src/ta/dema.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,sEAAsE;AACtE,sBAAsB;AAItB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAQ5E,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,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;KACT,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,IAAI,CAChB,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,KAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,KAAK,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;IAEpF,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,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,IAAI,GAAG,CAAC,MAAM;QAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;;QAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,MAAM,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"dema.js","sourceRoot":"","sources":["../../src/ta/dema.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAChB,qEAAqE;AACrE,4DAA4D;AAC5D,sEAAsE;AACtE,sBAAsB;AAItB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAQ5E,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,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;KACT,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,IAAI,CAChB,MAAc,EACd,MAAsB,EACtB,MAAc,EACd,KAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;IAC9B,MAAM,KAAK,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;IAEpF,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,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,IAAI,GAAG,CAAC,MAAM;QAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;;QAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,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/dema.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. DEMA composes two EMA sub-slots derived from\n// the parent slot id.\n\nimport type { DemaOpts, 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 { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype DemaSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.dema called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DemaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n };\n}\n\n/**\n * Double Exponential Moving Average — `DEMA = 2·EMA(src) − EMA(EMA(src))`.\n * Composes two EMA sub-slots derived from the parent slot id\n * (`${slotId}/ema1`, `${slotId}/ema2`). The outer EMA reads the inner\n * EMA's `.current` scalar each bar; the parent slot allocates its own\n * `outBuffer + series` because the output is a linear combination of\n * the two sub-slots (not equal to either). Mirrors the MACD / HMA\n * sub-slot pattern.\n *\n * @formula ema1 = EMA(source, length) ;\n * ema2 = EMA(ema1, length) ;\n * out = 2 · ema1 − ema2\n * @warmup 2 · length − 2\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const d = ta.dema(bar.close, 20);\n * // plot(d);\n */\nexport function dema(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n _opts?: DemaOpts,\n): Series<number> {\n const ctx = getCtx();\n const src = readSourceValue(source);\n const ema1Series = ema(`${slotId}/ema1`, src, length);\n const e1 = ema1Series.current;\n const ema2Series = ema(`${slotId}/ema2`, e1, length);\n const e2 = ema2Series.current;\n const value = Number.isFinite(e1) && Number.isFinite(e2) ? 2 * e1 - e2 : Number.NaN;\n\n let slot = ctx.stream.taSlots.get(slotId) as DemaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return slot.series;\n}\n"]}
package/dist/ta/dmi.d.ts CHANGED
@@ -22,9 +22,10 @@ import type { DmiOpts, DmiResult } from "@invinite-org/chartlang-core";
22
22
  * @since 0.2
23
23
  * @stable
24
24
  *
25
- * `opts.offset` shifts both series in lockstep (PLAN.md §9.1)
26
- * `series.current` on each output returns the value `offset` bars
27
- * ago.
25
+ * `opts.offset` is a presentation display shift carried to the plot
26
+ * emission as `xShift` for both series in lockstep (`+n` right / future,
27
+ * `−n` left / past); the series values are unshifted, so
28
+ * `series.current` on each output returns the value at the current bar.
28
29
  *
29
30
  * @example
30
31
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"dmi.d.ts","sourceRoot":"","sources":["../../src/ta/dmi.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AA8DvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAuB7E"}
1
+ {"version":3,"file":"dmi.d.ts","sourceRoot":"","sources":["../../src/ta/dmi.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AA8DvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAuB7E"}
package/dist/ta/dmi.js CHANGED
@@ -4,8 +4,8 @@
4
4
  // Ported from invinite/src/components/trading-chart/indicators/dmi.ts
5
5
  // plus lib/wilder-directional.ts
6
6
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
7
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
8
- // provenance contract; the math is the reference, the code style is not.
7
+ // Re-licensed MIT for chartlang. The math is the reference, the code
8
+ // style is not.
9
9
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
10
10
  // mode) follow chartlang's primitive shape — NOT invinite's
11
11
  // IndicatorPlugin shape. DMI reads `bar.high` / `bar.low` / `bar.close`
@@ -74,9 +74,10 @@ function resultForOffset(slot, offset) {
74
74
  * @since 0.2
75
75
  * @stable
76
76
  *
77
- * `opts.offset` shifts both series in lockstep (PLAN.md §9.1)
78
- * `series.current` on each output returns the value `offset` bars
79
- * ago.
77
+ * `opts.offset` is a presentation display shift carried to the plot
78
+ * emission as `xShift` for both series in lockstep (`+n` right / future,
79
+ * `−n` left / past); the series values are unshifted, so
80
+ * `series.current` on each output returns the value at the current bar.
80
81
  *
81
82
  * @example
82
83
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"dmi.js","sourceRoot":"","sources":["../../src/ta/dmi.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,mCAAmC;AACnC,mEAAmE;AACnE,0DAA0D;AAC1D,yEAAyE;AACzE,qEAAqE;AACrE,4DAA4D;AAC5D,wEAAwE;AACxE,uEAAuE;AACvE,iEAAiE;AACjE,2DAA2D;AAC3D,+CAA+C;AAI/C,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,EACH,uBAAuB,EAEvB,oBAAoB,EACpB,eAAe,GAClB,MAAM,2BAA2B,CAAC;AAgBnC,SAAS,MAAM;IACX,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAgB;IAC9C,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACtD,OAAO;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YAClB,MAAM,EAAE,cAAc,CAAS,YAAY,CAAC;YAC5C,OAAO,EAAE,cAAc,CAAS,aAAa,CAAC;SACjD,CAAC;QACF,YAAY;QACZ,aAAa;QACb,QAAQ,EAAE,oBAAoB,CAAC,MAAM,CAAC;QACtC,cAAc,EAAE,IAAI,GAAG,EAAE;KAC5B,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CAAC,IAAa,EAAE,MAAc;IAClD,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACrC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,qBAAqB,CAAS,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;YAChE,OAAO,EAAE,qBAAqB,CAAS,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;SACrE,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,MAAc,EAAE,IAAc;IAC9D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAwB,CAAC;IACjE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,QAAQ,CAAC,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,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAC3B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACzF,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,uBAAuB,CAC/C,IAAI,CAAC,QAAQ,EACb,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,KAAK,CACZ,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"dmi.js","sourceRoot":"","sources":["../../src/ta/dmi.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/dmi.ts\n// plus lib/wilder-directional.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. DMI reads `bar.high` / `bar.low` / `bar.close`\n// directly (mirrors Pine's `ta.dmi(length)` which has no source param)\n// and runs the Wilder +DM / -DM / TR smoothing incrementally via\n// `wilderStep` (the same per-step recurrence the reference\n// `lib/wilderDirectional.ts` uses internally).\n\nimport type { DmiOpts, DmiResult } 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 {\n advanceDirectionalClose,\n type DirectionalState,\n initDirectionalState,\n tickDirectional,\n} from \"./lib/directionalState.js\";\n\ntype DmiSlot = {\n readonly result: DmiResult;\n readonly plusDiBuffer: Float64RingBuffer;\n readonly minusDiBuffer: Float64RingBuffer;\n readonly dirState: DirectionalState;\n /**\n * Per-offset frozen `DmiResult` cache. `offset === 0` returns\n * `result` by identity. Non-zero offsets get a frozen result\n * whose two Series are `makeShiftedSeriesView` proxies over the\n * same two underlying ring buffers.\n */\n readonly shiftedResults: Map<number, DmiResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.dmi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DmiSlot {\n const plusDiBuffer = new Float64RingBuffer(capacity);\n const minusDiBuffer = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n plusDi: makeSeriesView<number>(plusDiBuffer),\n minusDi: makeSeriesView<number>(minusDiBuffer),\n }),\n plusDiBuffer,\n minusDiBuffer,\n dirState: initDirectionalState(length),\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: DmiSlot, offset: number): DmiResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n plusDi: makeShiftedSeriesView<number>(slot.plusDiBuffer, offset),\n minusDi: makeShiftedSeriesView<number>(slot.minusDiBuffer, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\n/**\n * Wilder's Directional Movement Index — `+DI` / `−DI` pair derived\n * from the Wilder-smoothed `+DM` / `−DM` over the smoothed True\n * Range. Reads `bar.high` / `bar.low` / `bar.close` directly\n * (mirrors Pine's `ta.dmi(length)` — no source param). Both series\n * ∈ [0, 100] when defined; NaN until `length` closed bars have\n * folded into the seed window. The first defined value lands at\n * bar index `length` (counted zero-based — matches the\n * full-recompute reference in `lib/wilderDirectional.ts`).\n *\n * @formula TR[t] = max(high − low, |high − prevClose|, |low − prevClose|) ;\n * upMove = high[t] − high[t−1] ; downMove = low[t−1] − low[t] ;\n * +DM = upMove > downMove && upMove > 0 ? upMove : 0 ;\n * −DM = downMove > upMove && downMove > 0 ? downMove : 0 ;\n * seed at bar `length` = simple sum over the seed window ;\n * smoothed via wilderStep(α = 1/length) thereafter ;\n * +DI = 100 · smoothed+DM / smoothedTR ;\n * −DI = 100 · smoothed−DM / smoothedTR ;\n * DI falls back to 0 when smoothedTR is 0 (matches invinite).\n * @warmup length\n * @since 0.2\n * @stable\n *\n * `opts.offset` is a presentation display shift carried to the plot\n * emission as `xShift` for both series in lockstep (`+n` right / future,\n * `−n` left / past); the series values are unshifted, so\n * `series.current` on each output returns the value at the current bar.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const d = ta.dmi(\"slot\", 14);\n * // plot(d.plusDi);\n * // plot(d.minusDi);\n */\nexport function dmi(slotId: string, length: number, opts?: DmiOpts): DmiResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as DmiSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n const { plusDi, minusDi } = tickDirectional(slot.dirState, bar.high, bar.low, bar.close);\n slot.plusDiBuffer.replaceHead(plusDi);\n slot.minusDiBuffer.replaceHead(minusDi);\n } else {\n const { plusDi, minusDi } = advanceDirectionalClose(\n slot.dirState,\n bar.high,\n bar.low,\n bar.close,\n );\n slot.plusDiBuffer.append(plusDi);\n slot.minusDiBuffer.append(minusDi);\n }\n return resultForOffset(slot, opts?.offset ?? 0);\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/donchian.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. Reads `bar.high` / `bar.low` directly (no
@@ -1 +1 @@
1
- {"version":3,"file":"donchian.js","sourceRoot":"","sources":["../../src/ta/donchian.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"donchian.js","sourceRoot":"","sources":["../../src/ta/donchian.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/donchian.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. Reads `bar.high` / `bar.low` directly (no\n// source param, mirrors Pine's `ta.highest` / `ta.lowest` over the\n// `high` / `low` series). Composes the registered `ta.highest` /\n// `ta.lowest` primitives via sub-slots `${slotId}/highest` and\n// `${slotId}/lowest` — the math equivalent of `lib/donchianMid`\n// (used by `ta.ichimoku` in its full-recompute path) but routed\n// through the slot-aware registry so a fix to either primitive\n// flows in for free.\n\nimport type { DonchianOpts, DonchianResult } 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 { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\ntype DonchianSlot = {\n readonly middleBuffer: Float64RingBuffer;\n readonly length: number;\n outputs: DonchianResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.donchian called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DonchianSlot {\n return {\n middleBuffer: new Float64RingBuffer(capacity),\n length,\n outputs: null,\n };\n}\n\nfunction middleValue(upper: number, lower: number): number {\n if (!Number.isFinite(upper) || !Number.isFinite(lower)) return Number.NaN;\n return (upper + lower) / 2;\n}\n\n/**\n * Donchian Channels — overlay volatility indicator. Highest high and\n * lowest low over a fixed `length`-bar window form the upper / lower\n * band; their midpoint is the centerline. Reads `bar.high` /\n * `bar.low` directly (no source param, mirrors Pine). Composes the\n * registered `ta.highest` / `ta.lowest` primitives via sub-slots\n * `${slotId}/highest` and `${slotId}/lowest` — the math equivalent of\n * `lib/donchianMid` but routed through the slot-aware registry so a\n * fix to either primitive flows in for free. Returns a cached\n * `{ upper, middle, lower }` record (same identity every bar). NaN\n * across all outputs while the trailing window is fully unwarmed.\n *\n * @formula upper = highest(bar.high, length) ;\n * lower = lowest(bar.low, length) ;\n * middle = (upper + lower) / 2\n * @warmup length − 1\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const d = ta.donchian(20);\n * // plot(d.upper);\n * // plot(d.middle);\n * // plot(d.lower);\n */\nexport function donchian(slotId: string, length: number, _opts?: DonchianOpts): DonchianResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as DonchianSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const upperSeries = highest(`${slotId}/highest`, ctx.stream.bar.high, length);\n const lowerSeries = lowest(`${slotId}/lowest`, ctx.stream.bar.low, length);\n if (slot.outputs === null) {\n slot.outputs = Object.freeze({\n upper: upperSeries,\n middle: makeSeriesView<number>(slot.middleBuffer),\n lower: lowerSeries,\n });\n }\n const value = middleValue(upperSeries.current, lowerSeries.current);\n if (ctx.isTick) {\n slot.middleBuffer.replaceHead(value);\n } else {\n slot.middleBuffer.append(value);\n }\n return slot.outputs;\n}\n"]}
package/dist/ta/dpo.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/dpo.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. Composition: `ta.sma`
10
10
  // over the source via a sub-slot (`${slotId}/sma`); a per-slot
@@ -1 +1 @@
1
- {"version":3,"file":"dpo.js","sourceRoot":"","sources":["../../src/ta/dpo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dpo.js","sourceRoot":"","sources":["../../src/ta/dpo.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/dpo.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. Composition: `ta.sma`\n// over the source via a sub-slot (`${slotId}/sma`); a per-slot\n// `sourceWindow` Float64RingBuffer carries the trailing\n// `displacement + 1` source values for the `src[t − displacement]`\n// lookback.\n//\n// DEVIATION from invinite: only the non-centered (default) render\n// mode is shipped. Invinite's `centered: true` mode emits\n// `dpo[i] = src[i] - sma[i + displacement]`, which depends on the\n// future SMA; chartlang's append-only ring-buffer contract can't\n// backfill earlier emissions when the future SMA confirms, so we'd\n// have to emit centered as NaN at the head until the future SMA\n// lands — the visual would diverge from invinite. The non-centered\n// mode is the TradingView \"shifts back to the right to match current\n// price\" default, which is what most authors want.\n\nimport type { DpoOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\nimport { sma } from \"./sma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\ntype DpoSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly length: number;\n readonly displacement: number;\n /** Source values across the trailing `displacement + 1` bars. `at(0)` is the head. */\n readonly sourceWindow: Float64RingBuffer;\n /** Number of closed bars folded into the slot so far. */\n barCount: number;\n /** Per-offset Series-view cache. */\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.dpo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): DpoSlot {\n const displacement = Math.floor(length / 2) + 1;\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n length,\n displacement,\n sourceWindow: new Float64RingBuffer(displacement + 1),\n barCount: 0,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: DpoSlot, 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 computeDpo(slot: DpoSlot, smaCurrent: number): number {\n if (slot.sourceWindow.length <= slot.displacement) return Number.NaN;\n if (!Number.isFinite(smaCurrent)) return Number.NaN;\n const shifted = slot.sourceWindow.at(slot.displacement);\n if (!Number.isFinite(shifted)) return Number.NaN;\n return shifted - smaCurrent;\n}\n\n/**\n * Detrended Price Oscillator — strips the SMA trend out of price so\n * the remaining oscillator visualises the short-cycle component.\n * Non-centered (default) mode: `dpo[i] = source[i − displacement]\n * − sma[i]` with `displacement = floor(length / 2) + 1`. Composes\n * `ta.sma(${slotId}/sma, src, length)`; a per-slot source window\n * carries the trailing `displacement + 1` bars so the\n * `source[i − displacement]` lookback is O(1) per close.\n *\n * @formula displacement = floor(length / 2) + 1 ;\n * sma[i] = mean(source[i − length + 1 ..= i]) ;\n * dpo[i] = source[i − displacement] − sma[i]\n * @warmup length\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const d = ta.dpo(\"slot\", bar.close, 21);\n * // const head = d.current;\n */\nexport function dpo(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: DpoOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as DpoSlot | 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.sourceWindow.replaceHead(src);\n const smaSeries = sma(`${slotId}/sma`, src, length);\n slot.outBuffer.replaceHead(computeDpo(slot, smaSeries.current));\n } else {\n slot.sourceWindow.append(src);\n slot.barCount += 1;\n const smaSeries = sma(`${slotId}/sma`, src, length);\n slot.outBuffer.append(computeDpo(slot, smaSeries.current));\n }\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n"]}
package/dist/ta/ema.d.ts CHANGED
@@ -14,8 +14,9 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
14
14
  * @since 0.1
15
15
  * @stable
16
16
  *
17
- * `opts.offset` shifts the returned series so `series.current` reads
18
- * the value `offset` bars ago (PLAN.md §9.1).
17
+ * `opts.offset` is a presentation display shift carried to the plot
18
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
19
+ * series value is unshifted.
19
20
  *
20
21
  * @example
21
22
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"ema.d.ts","sourceRoot":"","sources":["../../src/ta/ema.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAKpE,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AAiF5E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,GAAG,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,CAAC,CAWhB"}
1
+ {"version":3,"file":"ema.d.ts","sourceRoot":"","sources":["../../src/ta/ema.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAKpE,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AAiF5E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,GAAG,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,CAAC,CAWhB"}
package/dist/ta/ema.js CHANGED
@@ -4,8 +4,8 @@
4
4
  // Ported from invinite/src/components/trading-chart/indicators/ema.ts
5
5
  // plus lib/ema-of-float64.ts
6
6
  // (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).
7
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
8
- // provenance contract; the math is the reference, the code style is not.
7
+ // Re-licensed MIT for chartlang. The math is the reference, the code
8
+ // style is not.
9
9
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
10
10
  // mode) follow chartlang's primitive shape — NOT invinite's
11
11
  // IndicatorPlugin shape.
@@ -90,8 +90,9 @@ function compute(slot, src, isTick) {
90
90
  * @since 0.1
91
91
  * @stable
92
92
  *
93
- * `opts.offset` shifts the returned series so `series.current` reads
94
- * the value `offset` bars ago (PLAN.md §9.1).
93
+ * `opts.offset` is a presentation display shift carried to the plot
94
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
95
+ * series value is unshifted.
95
96
  *
96
97
  * @example
97
98
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"ema.js","sourceRoot":"","sources":["../../src/ta/ema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ema.js","sourceRoot":"","sources":["../../src/ta/ema.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/ema.ts\n// plus lib/ema-of-float64.ts\n// (commit d2d1043c1b039f66d2f3674526d303d31cf2f1e0, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape.\n\nimport type { EmaOpts, 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\ntype EmaSlot = {\n readonly kind: \"ta.ema\";\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly alpha: number;\n readonly length: number;\n seedSum: number;\n seedCount: number;\n prevEma: number;\n prevClosedEma: 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.ema called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): EmaSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n kind: \"ta.ema\",\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n alpha: 2 / (length + 1),\n length,\n seedSum: 0,\n seedCount: 0,\n prevEma: Number.NaN,\n prevClosedEma: Number.NaN,\n shiftedViews: new Map(),\n };\n}\n\nfunction viewForOffset(slot: EmaSlot, 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 compute(slot: EmaSlot, src: number, isTick: boolean): number {\n if (!Number.isFinite(src)) {\n return isTick ? slot.prevEma : slot.prevClosedEma;\n }\n if (slot.seedCount < slot.length) {\n if (isTick) {\n const nextSum = slot.seedSum + src;\n const nextCount = slot.seedCount + 1;\n if (nextCount < slot.length) return Number.NaN;\n return nextSum / slot.length;\n }\n slot.seedSum += src;\n slot.seedCount += 1;\n if (slot.seedCount < slot.length) {\n slot.prevClosedEma = Number.NaN;\n return Number.NaN;\n }\n const seedValue = slot.seedSum / slot.length;\n slot.prevClosedEma = seedValue;\n slot.prevEma = seedValue;\n return seedValue;\n }\n const prev = slot.prevClosedEma;\n const next = src * slot.alpha + prev * (1 - slot.alpha);\n if (!isTick) {\n slot.prevClosedEma = next;\n slot.prevEma = next;\n }\n return next;\n}\n\n/**\n * Exponential moving average. Recurrence `EMA[t] = α·x[t] + (1 − α)·EMA[t − 1]`\n * with `α = 2 / (length + 1)` after a seed of `simple mean of the first\n * `length` finite source values`. Tick-mode (`onBarTick`) recomputes the\n * head from the previous closed EMA so partial-bar values don't bleed\n * into the next close's recurrence.\n *\n * @formula α = 2 / (length + 1) ;\n * seed at bar length−1 = mean(source[0..length−1]) ;\n * EMA[t] = source[t]·α + EMA[t−1]·(1−α)\n * @warmup length − 1\n * @since 0.1\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-runtime\";\n * // const e = ta.ema(\"slot-id\", bar.close, 20);\n * // const head = e.current; // NaN until bar length-1\n * // const projected = ta.ema(\"slot2\", bar.close, 20, { offset: 5 });\n */\nexport function ema(\n slotId: string,\n source: ScalarOrSeries,\n length: number,\n opts?: EmaOpts,\n): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as EmaSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const value = compute(slot, readSourceValue(source), ctx.isTick);\n if (ctx.isTick) slot.outBuffer.replaceHead(value);\n else slot.outBuffer.append(value);\n return viewForOffset(slot, opts?.offset ?? 0);\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/envelope.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. Envelope composes the registered MA primitive
@@ -1 +1 @@
1
- {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/ta/envelope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/ta/envelope.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/envelope.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. Envelope composes the registered MA primitive\n// (sma / ema / wma / smma) via sub-slot `${slotId}/<maType>` over the\n// script-provided source — so a fix to any MA flows in for free.\n\nimport type {\n EnvelopeOpts,\n EnvelopeResult,\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 { ema } from \"./ema.js\";\nimport { sma } from \"./sma.js\";\nimport { smma } from \"./smma.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\nimport { wma } from \"./wma.js\";\n\nconst DEFAULT_LENGTH = 20;\nconst DEFAULT_PERCENT = 10;\nconst DEFAULT_MA_TYPE: MaTypeNoVolume = \"sma\";\n\ntype EnvelopeSlot = {\n readonly upperBuffer: Float64RingBuffer;\n readonly lowerBuffer: Float64RingBuffer;\n readonly length: number;\n readonly percent: number;\n readonly maType: MaTypeNoVolume;\n outputs: EnvelopeResult | null;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.envelope called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n length: number,\n percent: number,\n maType: MaTypeNoVolume,\n capacity: number,\n): EnvelopeSlot {\n return {\n upperBuffer: new Float64RingBuffer(capacity),\n lowerBuffer: new Float64RingBuffer(capacity),\n length,\n percent,\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 * Envelope — overlay percent-band envelope around an MA of the\n * script-provided source. Defaults `length = 20`, `percent = 10`,\n * `maType = \"sma\"` (matches Pine `ta.envelope` defaults). The upper /\n * lower bands are a pure multiplicative offset of the middle MA.\n * Composes the registered MA primitive via sub-slot\n * `${slotId}/<maType>` — fixes to any MA flow in for free. Returns a\n * cached `{ upper, middle, lower }` record (same identity every bar).\n * NaN across all outputs while the MA is unwarmed.\n *\n * @formula middle = MA(source, length, maType) ;\n * upper = middle · (1 + percent / 100) ;\n * lower = middle · (1 − percent / 100)\n * @warmup length − 1\n * @anchors maType\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const e = ta.envelope(bar.close);\n * // plot(e.upper);\n * // plot(e.middle);\n * // plot(e.lower);\n */\nexport function envelope(\n slotId: string,\n source: ScalarOrSeries,\n opts?: EnvelopeOpts,\n): EnvelopeResult {\n const ctx = getCtx();\n const length = opts?.length ?? DEFAULT_LENGTH;\n const percent = opts?.percent ?? DEFAULT_PERCENT;\n const maType = opts?.maType ?? DEFAULT_MA_TYPE;\n let slot = ctx.stream.taSlots.get(slotId) as EnvelopeSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, percent, maType, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const src = readSourceValue(source);\n const middleSeries = dispatchMa(slot.maType, `${slotId}/${slot.maType}`, src, 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 factor = slot.percent / 100;\n let upperValue: number;\n let lowerValue: number;\n if (Number.isFinite(mid)) {\n upperValue = mid * (1 + factor);\n lowerValue = mid * (1 - factor);\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"]}
package/dist/ta/eom.d.ts CHANGED
@@ -24,7 +24,9 @@ import type { EomOpts, Series } from "@invinite-org/chartlang-core";
24
24
  * @since 0.2
25
25
  * @stable
26
26
  *
27
- * `opts.offset` shifts the returned series (PLAN.md §9.1).
27
+ * `opts.offset` is a presentation display shift carried to the plot
28
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
29
+ * series value is unshifted.
28
30
  *
29
31
  * @example
30
32
  * // import { ta, plot } from "@invinite-org/chartlang-core";
@@ -1 +1 @@
1
- {"version":3,"file":"eom.d.ts","sourceRoot":"","sources":["../../src/ta/eom.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAyGpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAiElF"}
1
+ {"version":3,"file":"eom.d.ts","sourceRoot":"","sources":["../../src/ta/eom.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAyGpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAiElF"}
package/dist/ta/eom.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/eom.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 `length`-bar SMA over the raw EOM
@@ -111,7 +111,9 @@ function emit(slot, ready) {
111
111
  * @since 0.2
112
112
  * @stable
113
113
  *
114
- * `opts.offset` shifts the returned series (PLAN.md §9.1).
114
+ * `opts.offset` is a presentation display shift carried to the plot
115
+ * emission as `xShift` (`+n` right / future, `−n` left / past); the
116
+ * series value is unshifted.
115
117
  *
116
118
  * @example
117
119
  * // import { ta, plot } from "@invinite-org/chartlang-core";
@@ -1 +1 @@
1
- {"version":3,"file":"eom.js","sourceRoot":"","sources":["../../src/ta/eom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eom.js","sourceRoot":"","sources":["../../src/ta/eom.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/eom.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 `length`-bar SMA over the raw EOM\n// series is inlined (rather than composed via a `ta.sma` sub-slot)\n// because each per-bar rawEom is a scalar derived from H/L/V + the\n// per-slot `prevMid` state — feeding it through SMA's `Series`-or-\n// scalar surface would be more friction than the trailing-window\n// running sum below.\n\nimport type { EomOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView, makeShiftedSeriesView } from \"../seriesView.js\";\n\n/**\n * Hard-coded divisor matching invinite's default\n * (`indicators/eom.ts:37` ships `divisor: 10000` as the\n * conventional choice). TV's published example uses 100 000 000 and\n * explicitly warns the divisor \"should be adjusted based on trading\n * volume\" — there is no canonical default. We pin invinite's default;\n * scripts that want a different scale can multiply the output.\n */\nconst DIVISOR = 10000;\n\ntype EomSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n readonly length: number;\n /**\n * Closed-bar raw-EOM values across the trailing `length` bars\n * (capacity `length`). `at(0)` is the head (most recent); older\n * slots index upward.\n */\n readonly rawEomWindow: Float64RingBuffer;\n /** Running sum of `rawEomWindow` (over only the finite entries). */\n sumRawEom: number;\n /** Count of NaN entries in `rawEomWindow` — forces NaN output when > 0. */\n nanCount: number;\n /** Midpoint of the most recent closed bar (NaN before bar 0 lands). */\n prevMid: number;\n /**\n * Midpoint of the bar BEFORE the most recent close — needed so a\n * tick can recompute the head bar's rawEom against the same prevMid\n * the close-side update used. Snapshotted at the START of every\n * close-side update.\n */\n prevPrevMid: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.eom called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): EomSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n length,\n rawEomWindow: new Float64RingBuffer(length),\n sumRawEom: 0,\n nanCount: 0,\n prevMid: Number.NaN,\n prevPrevMid: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: EomSlot, 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 safeVol(volume: number): number {\n return Number.isFinite(volume) ? volume : 0;\n}\n\n/**\n * Per-bar raw EOM `(midpointMove) / boxRatio`. Returns NaN when the\n * range is zero (no movement, boxRatio undefined), boxRatio is zero\n * (volume-free bar), prevMid is NaN (first bar), or any input is NaN.\n */\nfunction rawEomAt(high: number, low: number, volume: number, prevMid: number): number {\n if (!Number.isFinite(high) || !Number.isFinite(low) || !Number.isFinite(prevMid)) {\n return Number.NaN;\n }\n const range = high - low;\n if (range === 0) return Number.NaN;\n const boxRatio = safeVol(volume) / DIVISOR / range;\n if (boxRatio === 0) return Number.NaN;\n const midpointMove = (high + low) / 2 - prevMid;\n return midpointMove / boxRatio;\n}\n\n/**\n * Emit the SMA over `rawEomWindow` once it's full AND contains no\n * NaN entries. Pre-warmup OR any NaN in the window → NaN.\n */\nfunction emit(slot: EomSlot, ready: boolean): number {\n if (!ready || slot.nanCount > 0) return Number.NaN;\n return slot.sumRawEom / slot.length;\n}\n\n/**\n * Ease of Movement — `length`-bar SMA of per-bar `(midpointMove) /\n * (boxRatio)` where `midpointMove = mid[t] − mid[t − 1]` and\n * `boxRatio = (volume / divisor) / (high − low)`. Zero-range bars,\n * zero-volume bars, and any NaN input produce a NaN slot in the\n * window; the window SMA propagates NaN — any NaN in the trailing\n * `length` slots forces the output to NaN (forces a clean restart\n * after a flat / NaN bar). The hard-coded divisor matches invinite's\n * default of `10000`.\n *\n * **Tick mode.** Computes the tick's rawEom against the snapshot\n * prevMid, substitutes it for the head slot in the trailing window\n * (`hypSum = sum − headRawEom + tickRawEom`), and emits\n * `hypSum / length` if the window is full AND `hypNanCount === 0`,\n * else NaN. Does NOT mutate the closed window.\n *\n * @formula rawEom[t] = ((high[t] + low[t]) / 2 − (high[t − 1] + low[t − 1]) / 2)\n * / ((volume[t] / 10000) / (high[t] − low[t])) ;\n * eom[t] = SMA(rawEom, length)[t] ;\n * any NaN in the window → NaN\n * @warmup length (first defined output at bar `length`; bar 1 has the\n * first finite rawEom; the window needs `length` such values)\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, plot } from \"@invinite-org/chartlang-core\";\n * // const e = ta.eom(14);\n * // plot(e);\n */\nexport function eom(slotId: string, length: number, opts?: EomOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as EomSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { high, low, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n // Tick replay against the closed window: recompute the head\n // bar's rawEom against the SAME prevMid the close used (which\n // is the prior bar's midpoint = `prevPrevMid`), substitute it\n // for the head slot in the trailing window without mutating\n // the window. `sumRawEom` + `nanCount` already reflect the\n // post-close state; subtract the current head and add the tick's\n // rawEom. Pre-warmup ticks emit NaN.\n if (slot.rawEomWindow.length < slot.length) {\n slot.outBuffer.replaceHead(Number.NaN);\n return viewForOffset(slot, offset);\n }\n const tickRaw = rawEomAt(high, low, volume, slot.prevPrevMid);\n const headRaw = slot.rawEomWindow.at(0);\n const headWasNaN = !Number.isFinite(headRaw);\n const tickIsNaN = !Number.isFinite(tickRaw);\n const hypNan = slot.nanCount - (headWasNaN ? 1 : 0) + (tickIsNaN ? 1 : 0);\n if (hypNan > 0) {\n slot.outBuffer.replaceHead(Number.NaN);\n return viewForOffset(slot, offset);\n }\n // When we reach here `hypNan === 0`, which guarantees\n // `tickIsNaN === false` (the only way nanCount could decrement\n // is via the head being NaN and the tick being finite). The\n // `headWasNaN ? 0 : headRaw` guards against subtracting a NaN\n // headRaw when the head slot was NaN.\n const hypSum = slot.sumRawEom - (headWasNaN ? 0 : headRaw) + tickRaw;\n slot.outBuffer.replaceHead(hypSum / slot.length);\n return viewForOffset(slot, offset);\n }\n\n // Close-side: snapshot the bar-before-last's midpoint (so a tick on\n // the new head bar can recompute its rawEom against the same\n // prevMid the close used), then fold the new rawEom into the window.\n slot.prevPrevMid = slot.prevMid;\n\n const raw = rawEomAt(high, low, volume, slot.prevMid);\n const midpoint =\n Number.isFinite(high) && Number.isFinite(low) ? (high + low) / 2 : slot.prevMid;\n\n // Evict the oldest slot if the ring is full.\n if (slot.rawEomWindow.length === slot.length) {\n const oldest = slot.rawEomWindow.at(slot.length - 1);\n if (Number.isFinite(oldest)) slot.sumRawEom -= oldest;\n else slot.nanCount -= 1;\n }\n // Append the new rawEom + update sum / nanCount.\n slot.rawEomWindow.append(raw);\n if (Number.isFinite(raw)) slot.sumRawEom += raw;\n else slot.nanCount += 1;\n slot.prevMid = midpoint;\n\n const ready = slot.rawEomWindow.length === slot.length;\n slot.outBuffer.append(emit(slot, ready));\n return viewForOffset(slot, offset);\n}\n"]}
package/dist/ta/fisher.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/fisher.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: `ta.highest` + `ta.lowest`
@@ -1 +1 @@
1
- {"version":3,"file":"fisher.js","sourceRoot":"","sources":["../../src/ta/fisher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fisher.js","sourceRoot":"","sources":["../../src/ta/fisher.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/fisher.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. Composition: `ta.highest` + `ta.lowest`\n// sub-slots over `bar.hl2`; the clamp / atanh / EMA-blend recurrence\n// is inline (no registry helper expresses Fisher's bespoke α=0.66/0.67\n// blend).\n//\n// DIVERGENCE: invinite clamps `x` to ±0.999 before the `atanh` so the\n// transform never diverges. The task spec (§6) overrides this: when\n// `|x| ≥ 1` we emit NaN at `fisher` AND hold the recurrence state\n// (`prevX` / `prevFisher` carry forward unchanged so the next bar\n// continues from the last valid state).\n\nimport type { FisherOpts, FisherResult, 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 { highest } from \"./highest.js\";\nimport { lowest } from \"./lowest.js\";\n\ntype FisherSlot = {\n result: FisherResult | null;\n readonly fisherBuf: Float64RingBuffer;\n readonly triggerBuf: Float64RingBuffer;\n readonly fisherSeries: Series<number>;\n readonly triggerSeries: Series<number>;\n readonly length: number;\n /** Closed-side state — last bar's contribution applied. */\n prevX: number;\n prevFisher: number;\n /** Snapshot BEFORE the most recent close-side update — used by tick replay. */\n prevClosedX: number;\n prevClosedFisher: number;\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.fisher called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(length: number, capacity: number): FisherSlot {\n const fisherBuf = new Float64RingBuffer(capacity);\n const triggerBuf = new Float64RingBuffer(capacity);\n return {\n result: null,\n fisherBuf,\n triggerBuf,\n fisherSeries: makeSeriesView<number>(fisherBuf),\n triggerSeries: makeSeriesView<number>(triggerBuf),\n length,\n prevX: 0,\n prevFisher: 0,\n prevClosedX: 0,\n prevClosedFisher: 0,\n barCount: 0,\n };\n}\n\n/**\n * Compute `(fisherValue, triggerValue, nextX, nextFisher)` given the\n * normalised mid + the basis `(baseX, baseFisher)` snapshot. The\n * `triggerValue` written is the input `baseFisher` (Fisher's\n * 1-bar-lagged trigger). NaN at `fisher` propagates as a \"no-update\"\n * to `nextX` / `nextFisher` so the recurrence holds.\n */\nfunction computeStep(\n normalised: number,\n baseX: number,\n baseFisher: number,\n): { fisherValue: number; triggerValue: number; nextX: number; nextFisher: number } {\n const x = 0.66 * normalised + 0.67 * baseX;\n // Defensive: normalised ∈ [-0.5, 0.5] means x asymptotes to ±1.0\n // but never crosses under exact arithmetic. Keep the clamp so a\n // pathological floating-point overshoot produces NaN rather than\n // ±Infinity from `ln((1+x)/(1-x))`.\n /* c8 ignore start */\n if (Math.abs(x) >= 1) {\n return {\n fisherValue: Number.NaN,\n triggerValue: baseFisher,\n nextX: baseX,\n nextFisher: baseFisher,\n };\n }\n /* c8 ignore stop */\n const fisherValue = 0.5 * Math.log((1 + x) / (1 - x)) + 0.5 * baseFisher;\n return { fisherValue, triggerValue: baseFisher, nextX: x, nextFisher: fisherValue };\n}\n\n/**\n * John Ehlers' Fisher Transform. Normalises the rolling `bar.hl2`\n * midpoint to `[-0.5, 0.5]` over a `length`-bar window, blends with\n * the prior `x` (`0.66·norm + 0.67·prevX`), then applies the Fisher\n * z-transform `0.5·ln((1+x)/(1−x))` with an EMA-style blend against\n * the prior Fisher. Composes `ta.highest` + `ta.lowest` sub-slots over\n * `bar.hl2` (`${slotId}/midHigh` + `${slotId}/midLow`). The clamp /\n * atanh / blend recurrence stays inline (no registry equivalent).\n *\n * The `trigger` output is the prior bar's `fisher` value (1-bar lag);\n * bar 0's `trigger` is NaN. When the recurrence would drive `|x| ≥ 1`\n * (pathological case), emits NaN at `fisher` and holds the recurrence\n * state — diverges from invinite's ±0.999 clamp per task spec.\n *\n * @formula mid = (bar.high + bar.low) / 2 ;\n * normalised = flatRange ? 0 : (mid − ll) / (hh − ll) − 0.5\n * where hh = highest(mid, length), ll = lowest(mid, length) ;\n * x = 0.66 · normalised + 0.67 · prevX ;\n * NaN at fisher if |x| ≥ 1 (recurrence held) ;\n * fisher = 0.5 · ln((1 + x) / (1 − x)) + 0.5 · prevFisher ;\n * trigger[t] = prevFisher (the value of fisher before this close)\n * @warmup length (first defined `fisher` at bar `length - 1`; first defined `trigger` at bar `length`)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const f = ta.fisher(\"slot\", 9);\n * // plot(f.fisher); plot(f.trigger);\n */\nexport function fisher(slotId: string, length: number, _opts?: FisherOpts): FisherResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as FisherSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(length, ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n\n const mid = ctx.stream.bar.hl2;\n const hhSeries = highest(`${slotId}/midHigh`, mid, length);\n const llSeries = lowest(`${slotId}/midLow`, mid, length);\n const hh = hhSeries.current;\n const ll = llSeries.current;\n\n let normalised: number;\n if (!Number.isFinite(mid) || !Number.isFinite(hh) || !Number.isFinite(ll)) {\n normalised = Number.NaN;\n } else if (hh === ll) {\n normalised = 0;\n } else {\n normalised = (mid - ll) / (hh - ll) - 0.5;\n }\n\n if (ctx.isTick) {\n // Replay against the prevClosed* snapshot — the closed-side\n // (prevX, prevFisher) are unchanged by the tick.\n const step = Number.isFinite(normalised)\n ? computeStep(normalised, slot.prevClosedX, slot.prevClosedFisher)\n : {\n fisherValue: Number.NaN,\n triggerValue: slot.prevClosedFisher,\n nextX: slot.prevClosedX,\n nextFisher: slot.prevClosedFisher,\n };\n // First-bar trigger is NaN (no prior fisher) — barCount captures\n // the closed-side advances. Defensive: ticks always follow at\n // least one close, so barCount > 0 on this branch.\n const triggerOut =\n /* c8 ignore next */ slot.barCount === 0 ? Number.NaN : step.triggerValue;\n slot.fisherBuf.replaceHead(step.fisherValue);\n slot.triggerBuf.replaceHead(triggerOut);\n } else {\n // Close-side. Snapshot the closed state BEFORE the update so the\n // next tick can replay against (prevClosedX, prevClosedFisher).\n slot.prevClosedX = slot.prevX;\n slot.prevClosedFisher = slot.prevFisher;\n const step = Number.isFinite(normalised)\n ? computeStep(normalised, slot.prevX, slot.prevFisher)\n : {\n fisherValue: Number.NaN,\n triggerValue: slot.prevFisher,\n nextX: slot.prevX,\n nextFisher: slot.prevFisher,\n };\n const triggerOut = slot.barCount === 0 ? Number.NaN : step.triggerValue;\n slot.fisherBuf.append(step.fisherValue);\n slot.triggerBuf.append(triggerOut);\n slot.prevX = step.nextX;\n slot.prevFisher = step.nextFisher;\n slot.barCount += 1;\n }\n\n if (slot.result === null) {\n slot.result = Object.freeze({\n fisher: slot.fisherSeries,\n trigger: slot.triggerSeries,\n });\n }\n return slot.result;\n}\n"]}