@invinite-org/chartlang-runtime 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/CHANGELOG.md +245 -0
  2. package/README.md +1 -2
  3. package/dist/barPoint.d.ts +20 -0
  4. package/dist/barPoint.d.ts.map +1 -0
  5. package/dist/barPoint.js +72 -0
  6. package/dist/barPoint.js.map +1 -0
  7. package/dist/bufferSnapshot.d.ts +102 -0
  8. package/dist/bufferSnapshot.d.ts.map +1 -0
  9. package/dist/bufferSnapshot.js +119 -0
  10. package/dist/bufferSnapshot.js.map +1 -0
  11. package/dist/buildComputeContext.js.map +1 -1
  12. package/dist/createScriptRunner.d.ts +6 -3
  13. package/dist/createScriptRunner.d.ts.map +1 -1
  14. package/dist/createScriptRunner.js +29 -5
  15. package/dist/createScriptRunner.js.map +1 -1
  16. package/dist/dep/DepOutputStore.js.map +1 -1
  17. package/dist/dep/DepRunner.d.ts.map +1 -1
  18. package/dist/dep/DepRunner.js +1 -0
  19. package/dist/dep/DepRunner.js.map +1 -1
  20. package/dist/dep/depOutput.js.map +1 -1
  21. package/dist/dep/emissionFilter.js.map +1 -1
  22. package/dist/dep/index.js.map +1 -1
  23. package/dist/emit/alert.js.map +1 -1
  24. package/dist/emit/alertConditionEmission.js.map +1 -1
  25. package/dist/emit/applyPlotOverride.js.map +1 -1
  26. package/dist/emit/draw/annotations/arrow.js +1 -1
  27. package/dist/emit/draw/annotations/arrow.js.map +1 -1
  28. package/dist/emit/draw/annotations/arrowMarkDown.js +1 -1
  29. package/dist/emit/draw/annotations/arrowMarkDown.js.map +1 -1
  30. package/dist/emit/draw/annotations/arrowMarkUp.js +1 -1
  31. package/dist/emit/draw/annotations/arrowMarkUp.js.map +1 -1
  32. package/dist/emit/draw/annotations/arrowMarker.js +1 -1
  33. package/dist/emit/draw/annotations/arrowMarker.js.map +1 -1
  34. package/dist/emit/draw/annotations/text.js +1 -1
  35. package/dist/emit/draw/annotations/text.js.map +1 -1
  36. package/dist/emit/draw/boxes/circle.js +1 -1
  37. package/dist/emit/draw/boxes/circle.js.map +1 -1
  38. package/dist/emit/draw/boxes/ellipse.d.ts +1 -1
  39. package/dist/emit/draw/boxes/ellipse.js +1 -1
  40. package/dist/emit/draw/boxes/ellipse.js.map +1 -1
  41. package/dist/emit/draw/boxes/fillBetween.d.ts +45 -0
  42. package/dist/emit/draw/boxes/fillBetween.d.ts.map +1 -0
  43. package/dist/emit/draw/boxes/fillBetween.js +36 -0
  44. package/dist/emit/draw/boxes/fillBetween.js.map +1 -0
  45. package/dist/emit/draw/boxes/marker.js +1 -1
  46. package/dist/emit/draw/boxes/marker.js.map +1 -1
  47. package/dist/emit/draw/boxes/path.d.ts +1 -1
  48. package/dist/emit/draw/boxes/path.js +1 -1
  49. package/dist/emit/draw/boxes/path.js.map +1 -1
  50. package/dist/emit/draw/boxes/polyline.d.ts +1 -1
  51. package/dist/emit/draw/boxes/polyline.js +1 -1
  52. package/dist/emit/draw/boxes/polyline.js.map +1 -1
  53. package/dist/emit/draw/boxes/rectangle.js +1 -1
  54. package/dist/emit/draw/boxes/rectangle.js.map +1 -1
  55. package/dist/emit/draw/boxes/rotatedRectangle.js +1 -1
  56. package/dist/emit/draw/boxes/rotatedRectangle.js.map +1 -1
  57. package/dist/emit/draw/boxes/triangle.d.ts +1 -1
  58. package/dist/emit/draw/boxes/triangle.js +1 -1
  59. package/dist/emit/draw/boxes/triangle.js.map +1 -1
  60. package/dist/emit/draw/channels/disjointChannel.js +1 -1
  61. package/dist/emit/draw/channels/disjointChannel.js.map +1 -1
  62. package/dist/emit/draw/channels/flatTopBottom.d.ts +1 -2
  63. package/dist/emit/draw/channels/flatTopBottom.d.ts.map +1 -1
  64. package/dist/emit/draw/channels/flatTopBottom.js +1 -1
  65. package/dist/emit/draw/channels/flatTopBottom.js.map +1 -1
  66. package/dist/emit/draw/channels/regressionTrend.d.ts +3 -4
  67. package/dist/emit/draw/channels/regressionTrend.d.ts.map +1 -1
  68. package/dist/emit/draw/channels/regressionTrend.js +1 -1
  69. package/dist/emit/draw/channels/regressionTrend.js.map +1 -1
  70. package/dist/emit/draw/channels/trendChannel.js +1 -1
  71. package/dist/emit/draw/channels/trendChannel.js.map +1 -1
  72. package/dist/emit/draw/containers/frame.d.ts +1 -1
  73. package/dist/emit/draw/containers/frame.js +2 -2
  74. package/dist/emit/draw/containers/frame.js.map +1 -1
  75. package/dist/emit/draw/containers/group.d.ts +1 -2
  76. package/dist/emit/draw/containers/group.d.ts.map +1 -1
  77. package/dist/emit/draw/containers/group.js +2 -2
  78. package/dist/emit/draw/containers/group.js.map +1 -1
  79. package/dist/emit/draw/curves/arc.js +1 -1
  80. package/dist/emit/draw/curves/arc.js.map +1 -1
  81. package/dist/emit/draw/curves/brush.js +1 -1
  82. package/dist/emit/draw/curves/brush.js.map +1 -1
  83. package/dist/emit/draw/curves/curve.js +1 -1
  84. package/dist/emit/draw/curves/curve.js.map +1 -1
  85. package/dist/emit/draw/curves/doubleCurve.js +1 -1
  86. package/dist/emit/draw/curves/doubleCurve.js.map +1 -1
  87. package/dist/emit/draw/curves/highlighter.js +1 -1
  88. package/dist/emit/draw/curves/highlighter.js.map +1 -1
  89. package/dist/emit/draw/curves/pen.js +1 -1
  90. package/dist/emit/draw/curves/pen.js.map +1 -1
  91. package/dist/emit/draw/cycles/cyclicLines.js +1 -1
  92. package/dist/emit/draw/cycles/cyclicLines.js.map +1 -1
  93. package/dist/emit/draw/cycles/sineLine.js +1 -1
  94. package/dist/emit/draw/cycles/sineLine.js.map +1 -1
  95. package/dist/emit/draw/cycles/timeCycles.js +1 -1
  96. package/dist/emit/draw/cycles/timeCycles.js.map +1 -1
  97. package/dist/emit/draw/elliott/elliottCorrectionWave.js +1 -1
  98. package/dist/emit/draw/elliott/elliottCorrectionWave.js.map +1 -1
  99. package/dist/emit/draw/elliott/elliottDoubleCombo.js +1 -1
  100. package/dist/emit/draw/elliott/elliottDoubleCombo.js.map +1 -1
  101. package/dist/emit/draw/elliott/elliottImpulseWave.js +1 -1
  102. package/dist/emit/draw/elliott/elliottImpulseWave.js.map +1 -1
  103. package/dist/emit/draw/elliott/elliottTriangleWave.js +1 -1
  104. package/dist/emit/draw/elliott/elliottTriangleWave.js.map +1 -1
  105. package/dist/emit/draw/elliott/elliottTripleCombo.js +1 -1
  106. package/dist/emit/draw/elliott/elliottTripleCombo.js.map +1 -1
  107. package/dist/emit/draw/fibA/fibChannel.js +1 -1
  108. package/dist/emit/draw/fibA/fibChannel.js.map +1 -1
  109. package/dist/emit/draw/fibA/fibRetracement.js +1 -1
  110. package/dist/emit/draw/fibA/fibRetracement.js.map +1 -1
  111. package/dist/emit/draw/fibA/fibTimeZone.d.ts +1 -2
  112. package/dist/emit/draw/fibA/fibTimeZone.d.ts.map +1 -1
  113. package/dist/emit/draw/fibA/fibTimeZone.js +1 -1
  114. package/dist/emit/draw/fibA/fibTimeZone.js.map +1 -1
  115. package/dist/emit/draw/fibA/fibTrendExtension.js +1 -1
  116. package/dist/emit/draw/fibA/fibTrendExtension.js.map +1 -1
  117. package/dist/emit/draw/fibA/fibWedge.js +1 -1
  118. package/dist/emit/draw/fibA/fibWedge.js.map +1 -1
  119. package/dist/emit/draw/fibB/fibCircles.d.ts +1 -2
  120. package/dist/emit/draw/fibB/fibCircles.d.ts.map +1 -1
  121. package/dist/emit/draw/fibB/fibCircles.js +1 -1
  122. package/dist/emit/draw/fibB/fibCircles.js.map +1 -1
  123. package/dist/emit/draw/fibB/fibSpeedArcs.js +1 -1
  124. package/dist/emit/draw/fibB/fibSpeedArcs.js.map +1 -1
  125. package/dist/emit/draw/fibB/fibSpeedFan.js +1 -1
  126. package/dist/emit/draw/fibB/fibSpeedFan.js.map +1 -1
  127. package/dist/emit/draw/fibB/fibSpiral.d.ts +1 -2
  128. package/dist/emit/draw/fibB/fibSpiral.d.ts.map +1 -1
  129. package/dist/emit/draw/fibB/fibSpiral.js +1 -1
  130. package/dist/emit/draw/fibB/fibSpiral.js.map +1 -1
  131. package/dist/emit/draw/fibB/fibTrendTime.d.ts +1 -2
  132. package/dist/emit/draw/fibB/fibTrendTime.d.ts.map +1 -1
  133. package/dist/emit/draw/fibB/fibTrendTime.js +1 -1
  134. package/dist/emit/draw/fibB/fibTrendTime.js.map +1 -1
  135. package/dist/emit/draw/gann/gannBox.js +1 -1
  136. package/dist/emit/draw/gann/gannBox.js.map +1 -1
  137. package/dist/emit/draw/gann/gannFan.js +1 -1
  138. package/dist/emit/draw/gann/gannFan.js.map +1 -1
  139. package/dist/emit/draw/gann/gannSquare.js +1 -1
  140. package/dist/emit/draw/gann/gannSquare.js.map +1 -1
  141. package/dist/emit/draw/gann/gannSquareFixed.js +1 -1
  142. package/dist/emit/draw/gann/gannSquareFixed.js.map +1 -1
  143. package/dist/emit/draw/handle.d.ts +11 -2
  144. package/dist/emit/draw/handle.d.ts.map +1 -1
  145. package/dist/emit/draw/handle.js +67 -12
  146. package/dist/emit/draw/handle.js.map +1 -1
  147. package/dist/emit/draw/index.js.map +1 -1
  148. package/dist/emit/draw/lines/crossLine.js +1 -1
  149. package/dist/emit/draw/lines/crossLine.js.map +1 -1
  150. package/dist/emit/draw/lines/horizontalLine.d.ts +1 -1
  151. package/dist/emit/draw/lines/horizontalLine.js +1 -1
  152. package/dist/emit/draw/lines/horizontalLine.js.map +1 -1
  153. package/dist/emit/draw/lines/horizontalRay.js +1 -1
  154. package/dist/emit/draw/lines/horizontalRay.js.map +1 -1
  155. package/dist/emit/draw/lines/line.d.ts +1 -1
  156. package/dist/emit/draw/lines/line.d.ts.map +1 -1
  157. package/dist/emit/draw/lines/line.js +2 -3
  158. package/dist/emit/draw/lines/line.js.map +1 -1
  159. package/dist/emit/draw/lines/trendAngle.js +1 -1
  160. package/dist/emit/draw/lines/trendAngle.js.map +1 -1
  161. package/dist/emit/draw/lines/verticalLine.js +1 -1
  162. package/dist/emit/draw/lines/verticalLine.js.map +1 -1
  163. package/dist/emit/draw/namespace.d.ts +5 -4
  164. package/dist/emit/draw/namespace.d.ts.map +1 -1
  165. package/dist/emit/draw/namespace.js +7 -4
  166. package/dist/emit/draw/namespace.js.map +1 -1
  167. package/dist/emit/draw/patterns/abcdPattern.js +1 -1
  168. package/dist/emit/draw/patterns/abcdPattern.js.map +1 -1
  169. package/dist/emit/draw/patterns/cypherPattern.d.ts +1 -2
  170. package/dist/emit/draw/patterns/cypherPattern.d.ts.map +1 -1
  171. package/dist/emit/draw/patterns/cypherPattern.js +1 -1
  172. package/dist/emit/draw/patterns/cypherPattern.js.map +1 -1
  173. package/dist/emit/draw/patterns/headAndShoulders.js +1 -1
  174. package/dist/emit/draw/patterns/headAndShoulders.js.map +1 -1
  175. package/dist/emit/draw/patterns/threeDrivesPattern.js +1 -1
  176. package/dist/emit/draw/patterns/threeDrivesPattern.js.map +1 -1
  177. package/dist/emit/draw/patterns/trianglePattern.d.ts +1 -1
  178. package/dist/emit/draw/patterns/trianglePattern.js +1 -1
  179. package/dist/emit/draw/patterns/trianglePattern.js.map +1 -1
  180. package/dist/emit/draw/patterns/xabcdPattern.js +1 -1
  181. package/dist/emit/draw/patterns/xabcdPattern.js.map +1 -1
  182. package/dist/emit/draw/pitchforks/pitchfan.js +1 -1
  183. package/dist/emit/draw/pitchforks/pitchfan.js.map +1 -1
  184. package/dist/emit/draw/pitchforks/pitchfork.d.ts +1 -1
  185. package/dist/emit/draw/pitchforks/pitchfork.js +2 -2
  186. package/dist/emit/draw/pitchforks/pitchfork.js.map +1 -1
  187. package/dist/emit/draw/pushDrawing.js.map +1 -1
  188. package/dist/emit/draw/subIdAllocator.d.ts +1 -1
  189. package/dist/emit/draw/subIdAllocator.js +1 -1
  190. package/dist/emit/draw/subIdAllocator.js.map +1 -1
  191. package/dist/emit/draw/table/table.d.ts +1 -1
  192. package/dist/emit/draw/table/table.js.map +1 -1
  193. package/dist/emit/emissionsQueue.js.map +1 -1
  194. package/dist/emit/hash.js.map +1 -1
  195. package/dist/emit/hline.js.map +1 -1
  196. package/dist/emit/index.js.map +1 -1
  197. package/dist/emit/logEmission.js.map +1 -1
  198. package/dist/emit/paneResolver.js.map +1 -1
  199. package/dist/emit/plot.d.ts +7 -0
  200. package/dist/emit/plot.d.ts.map +1 -1
  201. package/dist/emit/plot.js +13 -0
  202. package/dist/emit/plot.js.map +1 -1
  203. package/dist/emit/runtimeError.js.map +1 -1
  204. package/dist/execution/dispose.d.ts.map +1 -1
  205. package/dist/execution/dispose.js +16 -0
  206. package/dist/execution/dispose.js.map +1 -1
  207. package/dist/execution/drain.js.map +1 -1
  208. package/dist/execution/index.js.map +1 -1
  209. package/dist/execution/onBarClose.js.map +1 -1
  210. package/dist/execution/onBarTick.js.map +1 -1
  211. package/dist/execution/onHistory.js.map +1 -1
  212. package/dist/execution/runComputeStep.d.ts.map +1 -1
  213. package/dist/execution/runComputeStep.js +10 -1
  214. package/dist/execution/runComputeStep.js.map +1 -1
  215. package/dist/execution/secondaryStream.js.map +1 -1
  216. package/dist/index.d.ts +1 -1
  217. package/dist/index.d.ts.map +1 -1
  218. package/dist/index.js +1 -1
  219. package/dist/index.js.map +1 -1
  220. package/dist/inputs/index.js.map +1 -1
  221. package/dist/inputs/resolveInputs.js.map +1 -1
  222. package/dist/internal.js.map +1 -1
  223. package/dist/persistentStateStore.js.map +1 -1
  224. package/dist/persistentStateStore.runtime.d.ts.map +1 -1
  225. package/dist/persistentStateStore.runtime.js +21 -7
  226. package/dist/persistentStateStore.runtime.js.map +1 -1
  227. package/dist/persistentStateStore.validate.js.map +1 -1
  228. package/dist/primitives.js.map +1 -1
  229. package/dist/request/alignHtfSeriesCache.js.map +1 -1
  230. package/dist/request/alignHtfSeriesToLtf.d.ts +2 -2
  231. package/dist/request/alignHtfSeriesToLtf.js +2 -2
  232. package/dist/request/alignHtfSeriesToLtf.js.map +1 -1
  233. package/dist/request/bucketLtfBarsByMainContainment.js.map +1 -1
  234. package/dist/request/bucketLtfBarsCache.js.map +1 -1
  235. package/dist/request/index.d.ts +2 -1
  236. package/dist/request/index.d.ts.map +1 -1
  237. package/dist/request/index.js +2 -1
  238. package/dist/request/index.js.map +1 -1
  239. package/dist/request/lowerTf.js.map +1 -1
  240. package/dist/request/pushOnce.js.map +1 -1
  241. package/dist/request/requestNamespace.d.ts.map +1 -1
  242. package/dist/request/requestNamespace.js +16 -3
  243. package/dist/request/requestNamespace.js.map +1 -1
  244. package/dist/request/security.d.ts +20 -1
  245. package/dist/request/security.d.ts.map +1 -1
  246. package/dist/request/security.js +62 -23
  247. package/dist/request/security.js.map +1 -1
  248. package/dist/request/securityExprRunner.d.ts +133 -0
  249. package/dist/request/securityExprRunner.d.ts.map +1 -0
  250. package/dist/request/securityExprRunner.js +235 -0
  251. package/dist/request/securityExprRunner.js.map +1 -0
  252. package/dist/request/streamBars.d.ts +14 -1
  253. package/dist/request/streamBars.d.ts.map +1 -1
  254. package/dist/request/streamBars.js +39 -1
  255. package/dist/request/streamBars.js.map +1 -1
  256. package/dist/ringBuffer.d.ts +2 -2
  257. package/dist/ringBuffer.js +1 -1
  258. package/dist/ringBuffer.js.map +1 -1
  259. package/dist/runtimeContext.d.ts +51 -3
  260. package/dist/runtimeContext.d.ts.map +1 -1
  261. package/dist/runtimeContext.js.map +1 -1
  262. package/dist/seriesView.d.ts +43 -18
  263. package/dist/seriesView.d.ts.map +1 -1
  264. package/dist/seriesView.js +66 -43
  265. package/dist/seriesView.js.map +1 -1
  266. package/dist/state/index.d.ts +2 -1
  267. package/dist/state/index.d.ts.map +1 -1
  268. package/dist/state/index.js +2 -1
  269. package/dist/state/index.js.map +1 -1
  270. package/dist/state/lifecycle.d.ts +40 -0
  271. package/dist/state/lifecycle.d.ts.map +1 -1
  272. package/dist/state/lifecycle.js +53 -0
  273. package/dist/state/lifecycle.js.map +1 -1
  274. package/dist/state/seriesPersistence.d.ts +48 -0
  275. package/dist/state/seriesPersistence.d.ts.map +1 -0
  276. package/dist/state/seriesPersistence.js +87 -0
  277. package/dist/state/seriesPersistence.js.map +1 -0
  278. package/dist/state/seriesSlot.d.ts +105 -0
  279. package/dist/state/seriesSlot.d.ts.map +1 -0
  280. package/dist/state/seriesSlot.js +123 -0
  281. package/dist/state/seriesSlot.js.map +1 -0
  282. package/dist/state/stateNamespace.d.ts.map +1 -1
  283. package/dist/state/stateNamespace.js +28 -0
  284. package/dist/state/stateNamespace.js.map +1 -1
  285. package/dist/state/stateSlot.js.map +1 -1
  286. package/dist/stateStore.d.ts +2 -2
  287. package/dist/stateStore.js.map +1 -1
  288. package/dist/streamState.d.ts +26 -20
  289. package/dist/streamState.d.ts.map +1 -1
  290. package/dist/streamState.js +41 -67
  291. package/dist/streamState.js.map +1 -1
  292. package/dist/ta/adl.js +2 -2
  293. package/dist/ta/adl.js.map +1 -1
  294. package/dist/ta/adr.d.ts +3 -3
  295. package/dist/ta/adr.js +5 -5
  296. package/dist/ta/adr.js.map +1 -1
  297. package/dist/ta/adx.d.ts +3 -2
  298. package/dist/ta/adx.d.ts.map +1 -1
  299. package/dist/ta/adx.js +5 -4
  300. package/dist/ta/adx.js.map +1 -1
  301. package/dist/ta/alma.d.ts +6 -4
  302. package/dist/ta/alma.d.ts.map +1 -1
  303. package/dist/ta/alma.js +21 -8
  304. package/dist/ta/alma.js.map +1 -1
  305. package/dist/ta/anchoredVolumeProfile.js.map +1 -1
  306. package/dist/ta/anchoredVwap.d.ts +1 -1
  307. package/dist/ta/anchoredVwap.js +3 -3
  308. package/dist/ta/anchoredVwap.js.map +1 -1
  309. package/dist/ta/ao.js +2 -2
  310. package/dist/ta/ao.js.map +1 -1
  311. package/dist/ta/aroon.js +2 -2
  312. package/dist/ta/aroon.js.map +1 -1
  313. package/dist/ta/aroonOsc.js +2 -2
  314. package/dist/ta/aroonOsc.js.map +1 -1
  315. package/dist/ta/atr.d.ts +3 -2
  316. package/dist/ta/atr.d.ts.map +1 -1
  317. package/dist/ta/atr.js +5 -4
  318. package/dist/ta/atr.js.map +1 -1
  319. package/dist/ta/barssince.js +1 -1
  320. package/dist/ta/barssince.js.map +1 -1
  321. package/dist/ta/bb.d.ts +3 -2
  322. package/dist/ta/bb.d.ts.map +1 -1
  323. package/dist/ta/bb.js +5 -4
  324. package/dist/ta/bb.js.map +1 -1
  325. package/dist/ta/bbPercentB.js +2 -2
  326. package/dist/ta/bbPercentB.js.map +1 -1
  327. package/dist/ta/bbw.js +2 -2
  328. package/dist/ta/bbw.js.map +1 -1
  329. package/dist/ta/bop.js +2 -2
  330. package/dist/ta/bop.js.map +1 -1
  331. package/dist/ta/cci.js +2 -2
  332. package/dist/ta/cci.js.map +1 -1
  333. package/dist/ta/chaikinOsc.d.ts +3 -2
  334. package/dist/ta/chaikinOsc.d.ts.map +1 -1
  335. package/dist/ta/chaikinOsc.js +5 -4
  336. package/dist/ta/chaikinOsc.js.map +1 -1
  337. package/dist/ta/chandeKrollStop.d.ts +1 -1
  338. package/dist/ta/chandeKrollStop.js +3 -3
  339. package/dist/ta/chandeKrollStop.js.map +1 -1
  340. package/dist/ta/chandelier.d.ts +1 -1
  341. package/dist/ta/chandelier.js +3 -3
  342. package/dist/ta/chandelier.js.map +1 -1
  343. package/dist/ta/change.js +1 -1
  344. package/dist/ta/change.js.map +1 -1
  345. package/dist/ta/chop.js +2 -2
  346. package/dist/ta/chop.js.map +1 -1
  347. package/dist/ta/cmf.js +2 -2
  348. package/dist/ta/cmf.js.map +1 -1
  349. package/dist/ta/cmo.js +2 -2
  350. package/dist/ta/cmo.js.map +1 -1
  351. package/dist/ta/connorsRsi.d.ts +1 -1
  352. package/dist/ta/connorsRsi.js +3 -3
  353. package/dist/ta/connorsRsi.js.map +1 -1
  354. package/dist/ta/coppock.js +2 -2
  355. package/dist/ta/coppock.js.map +1 -1
  356. package/dist/ta/crossover.d.ts +3 -2
  357. package/dist/ta/crossover.d.ts.map +1 -1
  358. package/dist/ta/crossover.js +4 -3
  359. package/dist/ta/crossover.js.map +1 -1
  360. package/dist/ta/crossunder.d.ts +3 -2
  361. package/dist/ta/crossunder.d.ts.map +1 -1
  362. package/dist/ta/crossunder.js +4 -3
  363. package/dist/ta/crossunder.js.map +1 -1
  364. package/dist/ta/dema.js +2 -2
  365. package/dist/ta/dema.js.map +1 -1
  366. package/dist/ta/dmi.d.ts +4 -3
  367. package/dist/ta/dmi.d.ts.map +1 -1
  368. package/dist/ta/dmi.js +6 -5
  369. package/dist/ta/dmi.js.map +1 -1
  370. package/dist/ta/donchian.js +2 -2
  371. package/dist/ta/donchian.js.map +1 -1
  372. package/dist/ta/dpo.js +2 -2
  373. package/dist/ta/dpo.js.map +1 -1
  374. package/dist/ta/ema.d.ts +3 -2
  375. package/dist/ta/ema.d.ts.map +1 -1
  376. package/dist/ta/ema.js +5 -4
  377. package/dist/ta/ema.js.map +1 -1
  378. package/dist/ta/envelope.js +2 -2
  379. package/dist/ta/envelope.js.map +1 -1
  380. package/dist/ta/eom.d.ts +3 -1
  381. package/dist/ta/eom.d.ts.map +1 -1
  382. package/dist/ta/eom.js +5 -3
  383. package/dist/ta/eom.js.map +1 -1
  384. package/dist/ta/fisher.js +2 -2
  385. package/dist/ta/fisher.js.map +1 -1
  386. package/dist/ta/fixedRangeVolumeProfile.js.map +1 -1
  387. package/dist/ta/highest.js +1 -1
  388. package/dist/ta/highest.js.map +1 -1
  389. package/dist/ta/highestbars.d.ts +25 -0
  390. package/dist/ta/highestbars.d.ts.map +1 -0
  391. package/dist/ta/highestbars.js +106 -0
  392. package/dist/ta/highestbars.js.map +1 -0
  393. package/dist/ta/historicalVolatility.d.ts +3 -2
  394. package/dist/ta/historicalVolatility.d.ts.map +1 -1
  395. package/dist/ta/historicalVolatility.js +5 -4
  396. package/dist/ta/historicalVolatility.js.map +1 -1
  397. package/dist/ta/hma.js +2 -2
  398. package/dist/ta/hma.js.map +1 -1
  399. package/dist/ta/ichimoku.d.ts +3 -1
  400. package/dist/ta/ichimoku.d.ts.map +1 -1
  401. package/dist/ta/ichimoku.js +5 -3
  402. package/dist/ta/ichimoku.js.map +1 -1
  403. package/dist/ta/index.js.map +1 -1
  404. package/dist/ta/kama.js +2 -2
  405. package/dist/ta/kama.js.map +1 -1
  406. package/dist/ta/keltner.js +2 -2
  407. package/dist/ta/keltner.js.map +1 -1
  408. package/dist/ta/klinger.js +2 -2
  409. package/dist/ta/klinger.js.map +1 -1
  410. package/dist/ta/kst.js +2 -2
  411. package/dist/ta/kst.js.map +1 -1
  412. package/dist/ta/lib/adxFromDi.js +2 -2
  413. package/dist/ta/lib/adxFromDi.js.map +1 -1
  414. package/dist/ta/lib/computeMa.js +2 -2
  415. package/dist/ta/lib/computeMa.js.map +1 -1
  416. package/dist/ta/lib/computeMaOfFloat64.js +2 -2
  417. package/dist/ta/lib/computeMaOfFloat64.js.map +1 -1
  418. package/dist/ta/lib/directionalState.js +2 -2
  419. package/dist/ta/lib/directionalState.js.map +1 -1
  420. package/dist/ta/lib/donchianMid.js +2 -2
  421. package/dist/ta/lib/donchianMid.js.map +1 -1
  422. package/dist/ta/lib/emaFloat64.js +2 -2
  423. package/dist/ta/lib/emaFloat64.js.map +1 -1
  424. package/dist/ta/lib/linearRegression.js +2 -2
  425. package/dist/ta/lib/linearRegression.js.map +1 -1
  426. package/dist/ta/lib/maTypes.js.map +1 -1
  427. package/dist/ta/lib/pearson.js +2 -2
  428. package/dist/ta/lib/pearson.js.map +1 -1
  429. package/dist/ta/lib/pickCandleSource.js +2 -2
  430. package/dist/ta/lib/pickCandleSource.js.map +1 -1
  431. package/dist/ta/lib/readSourceField.js +2 -2
  432. package/dist/ta/lib/readSourceField.js.map +1 -1
  433. package/dist/ta/lib/rollingStddev.js +2 -2
  434. package/dist/ta/lib/rollingStddev.js.map +1 -1
  435. package/dist/ta/lib/smaFloat64.js +2 -2
  436. package/dist/ta/lib/smaFloat64.js.map +1 -1
  437. package/dist/ta/lib/smmaFloat64.js +2 -2
  438. package/dist/ta/lib/smmaFloat64.js.map +1 -1
  439. package/dist/ta/lib/sourceValue.js.map +1 -1
  440. package/dist/ta/lib/trSeries.js +2 -2
  441. package/dist/ta/lib/trSeries.js.map +1 -1
  442. package/dist/ta/lib/volume-profile/bucketEdges.js.map +1 -1
  443. package/dist/ta/lib/volume-profile/bucketizeVolume.js.map +1 -1
  444. package/dist/ta/lib/volume-profile/developingSeries.js.map +1 -1
  445. package/dist/ta/lib/volume-profile/index.js.map +1 -1
  446. package/dist/ta/lib/volume-profile/intercept.js.map +1 -1
  447. package/dist/ta/lib/volume-profile/scaffold.js.map +1 -1
  448. package/dist/ta/lib/volume-profile/tooHeavy.js.map +1 -1
  449. package/dist/ta/lib/volume-profile/types.js.map +1 -1
  450. package/dist/ta/lib/volume-profile/valueArea.js.map +1 -1
  451. package/dist/ta/lib/volume-profile/volumeProfileShared.js.map +1 -1
  452. package/dist/ta/lib/vwmaFloat64.js +2 -2
  453. package/dist/ta/lib/vwmaFloat64.js.map +1 -1
  454. package/dist/ta/lib/wilderDirectional.js +2 -2
  455. package/dist/ta/lib/wilderDirectional.js.map +1 -1
  456. package/dist/ta/lib/wilderSmoothing.js +2 -2
  457. package/dist/ta/lib/wilderSmoothing.js.map +1 -1
  458. package/dist/ta/lib/wmaFloat64.js +2 -2
  459. package/dist/ta/lib/wmaFloat64.js.map +1 -1
  460. package/dist/ta/lowest.js +1 -1
  461. package/dist/ta/lowest.js.map +1 -1
  462. package/dist/ta/lowestbars.d.ts +25 -0
  463. package/dist/ta/lowestbars.d.ts.map +1 -0
  464. package/dist/ta/lowestbars.js +102 -0
  465. package/dist/ta/lowestbars.js.map +1 -0
  466. package/dist/ta/lsma.js +2 -2
  467. package/dist/ta/lsma.js.map +1 -1
  468. package/dist/ta/maRibbon.js +2 -2
  469. package/dist/ta/maRibbon.js.map +1 -1
  470. package/dist/ta/macd.d.ts +3 -2
  471. package/dist/ta/macd.d.ts.map +1 -1
  472. package/dist/ta/macd.js +6 -5
  473. package/dist/ta/macd.js.map +1 -1
  474. package/dist/ta/massIndex.d.ts +3 -2
  475. package/dist/ta/massIndex.d.ts.map +1 -1
  476. package/dist/ta/massIndex.js +5 -4
  477. package/dist/ta/massIndex.js.map +1 -1
  478. package/dist/ta/mcginley.js +2 -2
  479. package/dist/ta/mcginley.js.map +1 -1
  480. package/dist/ta/median.js +2 -2
  481. package/dist/ta/median.js.map +1 -1
  482. package/dist/ta/mfi.d.ts +3 -1
  483. package/dist/ta/mfi.d.ts.map +1 -1
  484. package/dist/ta/mfi.js +5 -3
  485. package/dist/ta/mfi.js.map +1 -1
  486. package/dist/ta/momentum.js +2 -2
  487. package/dist/ta/momentum.js.map +1 -1
  488. package/dist/ta/netVolume.d.ts +3 -1
  489. package/dist/ta/netVolume.d.ts.map +1 -1
  490. package/dist/ta/netVolume.js +5 -3
  491. package/dist/ta/netVolume.js.map +1 -1
  492. package/dist/ta/nvi.d.ts +3 -1
  493. package/dist/ta/nvi.d.ts.map +1 -1
  494. package/dist/ta/nvi.js +5 -3
  495. package/dist/ta/nvi.js.map +1 -1
  496. package/dist/ta/nz.js +1 -1
  497. package/dist/ta/nz.js.map +1 -1
  498. package/dist/ta/obv.js +2 -2
  499. package/dist/ta/obv.js.map +1 -1
  500. package/dist/ta/persistence.d.ts.map +1 -1
  501. package/dist/ta/persistence.js +1 -40
  502. package/dist/ta/persistence.js.map +1 -1
  503. package/dist/ta/pivotsHighLow.js +2 -2
  504. package/dist/ta/pivotsHighLow.js.map +1 -1
  505. package/dist/ta/pivotsStandard.d.ts +1 -1
  506. package/dist/ta/pivotsStandard.js +3 -3
  507. package/dist/ta/pivotsStandard.js.map +1 -1
  508. package/dist/ta/pmo.js +2 -2
  509. package/dist/ta/pmo.js.map +1 -1
  510. package/dist/ta/ppo.d.ts +3 -2
  511. package/dist/ta/ppo.d.ts.map +1 -1
  512. package/dist/ta/ppo.js +5 -4
  513. package/dist/ta/ppo.js.map +1 -1
  514. package/dist/ta/psar.js +2 -2
  515. package/dist/ta/psar.js.map +1 -1
  516. package/dist/ta/pvi.d.ts +3 -1
  517. package/dist/ta/pvi.d.ts.map +1 -1
  518. package/dist/ta/pvi.js +5 -3
  519. package/dist/ta/pvi.js.map +1 -1
  520. package/dist/ta/pvo.d.ts +3 -1
  521. package/dist/ta/pvo.d.ts.map +1 -1
  522. package/dist/ta/pvo.js +5 -3
  523. package/dist/ta/pvo.js.map +1 -1
  524. package/dist/ta/pvt.d.ts +3 -1
  525. package/dist/ta/pvt.d.ts.map +1 -1
  526. package/dist/ta/pvt.js +5 -3
  527. package/dist/ta/pvt.js.map +1 -1
  528. package/dist/ta/registry.d.ts +7 -1
  529. package/dist/ta/registry.d.ts.map +1 -1
  530. package/dist/ta/registry.js +4 -0
  531. package/dist/ta/registry.js.map +1 -1
  532. package/dist/ta/roc.js +2 -2
  533. package/dist/ta/roc.js.map +1 -1
  534. package/dist/ta/rsi.d.ts +3 -2
  535. package/dist/ta/rsi.d.ts.map +1 -1
  536. package/dist/ta/rsi.js +5 -4
  537. package/dist/ta/rsi.js.map +1 -1
  538. package/dist/ta/rvgi.js +2 -2
  539. package/dist/ta/rvgi.js.map +1 -1
  540. package/dist/ta/rvi.d.ts +3 -2
  541. package/dist/ta/rvi.d.ts.map +1 -1
  542. package/dist/ta/rvi.js +5 -4
  543. package/dist/ta/rvi.js.map +1 -1
  544. package/dist/ta/sessionVolumeProfile.js.map +1 -1
  545. package/dist/ta/sma.d.ts +6 -3
  546. package/dist/ta/sma.d.ts.map +1 -1
  547. package/dist/ta/sma.js +8 -5
  548. package/dist/ta/sma.js.map +1 -1
  549. package/dist/ta/smi.js +2 -2
  550. package/dist/ta/smi.js.map +1 -1
  551. package/dist/ta/smma.js +2 -2
  552. package/dist/ta/smma.js.map +1 -1
  553. package/dist/ta/stdev.d.ts +3 -2
  554. package/dist/ta/stdev.d.ts.map +1 -1
  555. package/dist/ta/stdev.js +5 -4
  556. package/dist/ta/stdev.js.map +1 -1
  557. package/dist/ta/stoch.js +2 -2
  558. package/dist/ta/stoch.js.map +1 -1
  559. package/dist/ta/stochRsi.js +2 -2
  560. package/dist/ta/stochRsi.js.map +1 -1
  561. package/dist/ta/supertrend.d.ts +1 -1
  562. package/dist/ta/supertrend.js +3 -3
  563. package/dist/ta/supertrend.js.map +1 -1
  564. package/dist/ta/tema.js +2 -2
  565. package/dist/ta/tema.js.map +1 -1
  566. package/dist/ta/trendStrengthIndex.d.ts +4 -3
  567. package/dist/ta/trendStrengthIndex.d.ts.map +1 -1
  568. package/dist/ta/trendStrengthIndex.js +6 -5
  569. package/dist/ta/trendStrengthIndex.js.map +1 -1
  570. package/dist/ta/trix.d.ts +4 -3
  571. package/dist/ta/trix.d.ts.map +1 -1
  572. package/dist/ta/trix.js +6 -5
  573. package/dist/ta/trix.js.map +1 -1
  574. package/dist/ta/tsi.js +2 -2
  575. package/dist/ta/tsi.js.map +1 -1
  576. package/dist/ta/ulcerIndex.js +2 -2
  577. package/dist/ta/ulcerIndex.js.map +1 -1
  578. package/dist/ta/ultimateOsc.js +2 -2
  579. package/dist/ta/ultimateOsc.js.map +1 -1
  580. package/dist/ta/valuewhen.js +1 -1
  581. package/dist/ta/valuewhen.js.map +1 -1
  582. package/dist/ta/visibleRangeVolumeProfile.d.ts +2 -2
  583. package/dist/ta/visibleRangeVolumeProfile.js +2 -2
  584. package/dist/ta/visibleRangeVolumeProfile.js.map +1 -1
  585. package/dist/ta/vol.js +2 -2
  586. package/dist/ta/vol.js.map +1 -1
  587. package/dist/ta/volatilityStop.d.ts +1 -1
  588. package/dist/ta/volatilityStop.js +3 -3
  589. package/dist/ta/volatilityStop.js.map +1 -1
  590. package/dist/ta/vortex.d.ts +3 -2
  591. package/dist/ta/vortex.d.ts.map +1 -1
  592. package/dist/ta/vortex.js +5 -4
  593. package/dist/ta/vortex.js.map +1 -1
  594. package/dist/ta/vwap.d.ts +3 -3
  595. package/dist/ta/vwap.js +5 -5
  596. package/dist/ta/vwap.js.map +1 -1
  597. package/dist/ta/vwma.js +2 -2
  598. package/dist/ta/vwma.js.map +1 -1
  599. package/dist/ta/williamsFractal.js +2 -2
  600. package/dist/ta/williamsFractal.js.map +1 -1
  601. package/dist/ta/williamsR.js +2 -2
  602. package/dist/ta/williamsR.js.map +1 -1
  603. package/dist/ta/wma.js +2 -2
  604. package/dist/ta/wma.js.map +1 -1
  605. package/dist/ta/zigZag.js +2 -2
  606. package/dist/ta/zigZag.js.map +1 -1
  607. package/dist/views/barstateView.js.map +1 -1
  608. package/dist/views/index.js.map +1 -1
  609. package/dist/views/refreshRuntimeViews.js.map +1 -1
  610. package/dist/views/symInfoView.js.map +1 -1
  611. package/dist/views/timeframeView.js.map +1 -1
  612. package/package.json +3 -3
  613. package/dist/ta/lib/applyOffset.d.ts +0 -19
  614. package/dist/ta/lib/applyOffset.d.ts.map +0 -1
  615. package/dist/ta/lib/applyOffset.js +0 -38
  616. package/dist/ta/lib/applyOffset.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nvi.js","sourceRoot":"","sources":["../../src/ta/nvi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nvi.js","sourceRoot":"","sources":["../../src/ta/nvi.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/nvi.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. The runtime emits the RAW NVI line only;\n// invinite's optional smoothing block is left to the script author\n// (`ta.ema(ta.nvi(), 255)` etc.). The mirror primitive `ta.pvi`\n// re-uses this file's `nviLikeFold` shape with a flipped predicate.\n\nimport type { NviOpts, 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 * Anchored seed value at bar 0 (and after any bar where the\n * accumulator has been carried-forward through NaN inputs).\n *\n * @anchors seedValue\n */\nconst SEED_VALUE = 1000;\n\ntype NviSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n /** Active NVI value across the closed bars so far. */\n value: number;\n /** Most recent finite close. */\n prevClose: number;\n /** Most recent volume (treated as 0 on NaN). */\n prevVolume: number;\n /** Snapshot of `value` BEFORE the most recent close-side update. */\n prevClosedValue: number;\n prevClosedPrevClose: number;\n prevClosedPrevVolume: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.nvi called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): NviSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map(),\n value: SEED_VALUE,\n prevClose: Number.NaN,\n prevVolume: Number.NaN,\n prevClosedValue: SEED_VALUE,\n prevClosedPrevClose: Number.NaN,\n prevClosedPrevVolume: Number.NaN,\n };\n}\n\nfunction viewForOffset(slot: NviSlot, 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 * Fold the bar's `(close, volume)` into the prior NVI state. NaN close\n * carries every field forward (don't advance `prevClose` — the next\n * finite close differences against the last finite one). NaN volume\n * is treated as 0 (matches invinite's `safeVolume` shape). The\n * comparison runs `currV < prevV` (NVI) and only updates when the\n * comparison holds AND `prevClose !== 0`.\n */\nfunction fold(\n inValue: number,\n inPrevClose: number,\n inPrevVolume: number,\n close: number,\n volume: number,\n): { value: number; prevClose: number; prevVolume: number } {\n if (!Number.isFinite(close)) {\n return { value: inValue, prevClose: inPrevClose, prevVolume: inPrevVolume };\n }\n const v = safeVol(volume);\n if (!Number.isFinite(inPrevClose)) {\n // First defined close — seed `prevClose` + `prevVolume`,\n // leave `value` at its 1000 seed.\n return { value: inValue, prevClose: close, prevVolume: v };\n }\n const pv = safeVol(inPrevVolume);\n const shouldUpdate = v < pv;\n if (!shouldUpdate || inPrevClose === 0) {\n return { value: inValue, prevClose: close, prevVolume: v };\n }\n const next = inValue * (1 + (close - inPrevClose) / inPrevClose);\n return { value: next, prevClose: close, prevVolume: v };\n}\n\n/**\n * Negative Volume Index — cumulative percentage-change in close on\n * bars whose volume is strictly LOWER than the prior bar's; bars with\n * equal-or-higher volume carry the prior NVI value unchanged. Seeded\n * at 1000 (anchor — see `SEED_VALUE`); the property tests pin the\n * seed at bar 0.\n *\n * NaN volume is treated as 0 (matches invinite's `safeVolume` shape) —\n * a NaN-volume bar is \"lower\" than any positive-volume bar, so the\n * comparison is exercised. NaN close carries every accumulator field\n * forward without advancing — the next finite close differences\n * against the last finite one.\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close `(value, prevClose, prevVolume)` tuple.\n *\n * @formula nvi[0] = 1000 ;\n * nvi[t] = (volume[t] < volume[t − 1] && prevClose != 0)\n * ? nvi[t − 1] · (1 + (close[t] − close[t − 1]) / close[t − 1])\n * : nvi[t − 1]\n * @warmup 1 (bar 0 emits the 1000 seed)\n * @anchors seedValue\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 n = ta.nvi();\n * // plot(n);\n */\nexport function nvi(slotId: string, opts?: NviOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as NviSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const offset = opts?.offset ?? 0;\n const { close, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n const next = fold(\n slot.prevClosedValue,\n slot.prevClosedPrevClose,\n slot.prevClosedPrevVolume,\n close,\n volume,\n );\n slot.outBuffer.replaceHead(next.value);\n return viewForOffset(slot, offset);\n }\n\n slot.prevClosedValue = slot.value;\n slot.prevClosedPrevClose = slot.prevClose;\n slot.prevClosedPrevVolume = slot.prevVolume;\n const next = fold(slot.value, slot.prevClose, slot.prevVolume, close, volume);\n slot.value = next.value;\n slot.prevClose = next.prevClose;\n slot.prevVolume = next.prevVolume;\n slot.outBuffer.append(slot.value);\n return viewForOffset(slot, offset);\n}\n"]}
package/dist/ta/nz.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
2
  // See the LICENSE file in the repo root for full license text.
3
3
  //
4
- // No invinite source — semantics per Pine `ta.nz`. See PLAN.md §3.1.
4
+ // No invinite source — semantics per Pine `ta.nz`.
5
5
  /**
6
6
  * Replace `NaN` with a fallback. Returns `value` unchanged when it
7
7
  * is not `NaN`; otherwise returns `replacement` (defaults to `0`).
package/dist/ta/nz.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nz.js","sourceRoot":"","sources":["../../src/ta/nz.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,qEAAqE;AAErE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,EAAE,CAAC,KAAa,EAAE,WAAoB;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,IAAI,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"nz.js","sourceRoot":"","sources":["../../src/ta/nz.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,mDAAmD;AAEnD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,EAAE,CAAC,KAAa,EAAE,WAAoB;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,IAAI,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC;AACjB,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// No invinite source — semantics per Pine `ta.nz`.\n\n/**\n * Replace `NaN` with a fallback. Returns `value` unchanged when it\n * is not `NaN`; otherwise returns `replacement` (defaults to `0`).\n * Stateless — does not allocate a slot, does not consult the active\n * runtime context.\n *\n * @formula Number.isNaN(value) ? (replacement ?? 0) : value\n * @warmup 0\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const safe = ta.nz(ta.change(bar.close).current, 0);\n */\nexport function nz(value: number, replacement?: number): number {\n if (Number.isNaN(value)) return replacement ?? 0;\n return value;\n}\n"]}
package/dist/ta/obv.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/obv.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. The runtime emits the RAW OBV cumulative
@@ -1 +1 @@
1
- {"version":3,"file":"obv.js","sourceRoot":"","sources":["../../src/ta/obv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"obv.js","sourceRoot":"","sources":["../../src/ta/obv.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/obv.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. The runtime emits the RAW OBV cumulative\n// only; invinite's optional smoothing block is left to the script\n// author (`ta.ema(ta.obv(), n)` etc.).\n\nimport type { ObvOpts, Series } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\ntype ObvSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n /** Active cumulative OBV across the closed bars so far. */\n cumObv: number;\n /** Most recent finite close (the lookback target for the next delta). */\n prevClose: number;\n /** Snapshot of `cumObv` BEFORE the most recent close-side update. */\n prevClosedCumObv: number;\n /** Snapshot of `prevClose` BEFORE the most recent close-side update. */\n prevClosedPrevClose: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.obv called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number): ObvSlot {\n const outBuffer = new Float64RingBuffer(capacity);\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n cumObv: 0,\n prevClose: Number.NaN,\n prevClosedCumObv: 0,\n prevClosedPrevClose: Number.NaN,\n };\n}\n\nfunction signOfDelta(delta: number): number {\n if (delta > 0) return 1;\n if (delta < 0) return -1;\n return 0;\n}\n\n/**\n * Compute the (cumObv, prevClose) accumulator state AFTER folding the\n * given bar into the prior (inCumObv, inPrevClose) state. NaN close or\n * NaN volume carries the accumulator forward unchanged (matches\n * invinite's `safeVolume(NaN) === 0` shape under the `prevClose === NaN`\n * first-bar guard).\n */\nfunction fold(\n inCumObv: number,\n inPrevClose: number,\n close: number,\n volume: number,\n): { cumObv: number; prevClose: number } {\n if (!Number.isFinite(close)) {\n return { cumObv: inCumObv, prevClose: inPrevClose };\n }\n if (!Number.isFinite(inPrevClose)) {\n // First bar with a defined close — seed `prevClose`, leave\n // `cumObv` at its zero seed.\n return { cumObv: inCumObv, prevClose: close };\n }\n if (!Number.isFinite(volume)) {\n // NaN volume → contribute nothing this bar, but advance\n // `prevClose` so the next delta is well-defined.\n return { cumObv: inCumObv, prevClose: close };\n }\n const direction = signOfDelta(close - inPrevClose);\n return { cumObv: inCumObv + direction * volume, prevClose: close };\n}\n\n/**\n * On-Balance Volume — cumulative volume signed by close-vs-prev-close\n * direction. Renders in its own pane (volume category). Flat closes\n * (delta = 0) contribute nothing; NaN volume carries the accumulator\n * forward without an update (matches invinite's `safeVolume`-style\n * defensive shape). The first bar emits `0` (no prior close to\n * difference against — Pine convention).\n *\n * **Tick mode.** Replays the head bar's contribution against a\n * snapshot of the prior-close (cumObv, prevClose) tuple so a partial-\n * bar tick doesn't pollute the next close's accumulator.\n *\n * @formula obv[t] = obv[t − 1] + sign(close[t] − close[t − 1]) · volume[t]\n * @warmup 1 (needs a prior close to compute the delta; bar 0 emits 0)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta, plot } from \"@invinite-org/chartlang-core\";\n * // const o = ta.obv();\n * // plot(o);\n */\nexport function obv(slotId: string, _opts?: ObvOpts): Series<number> {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as ObvSlot | undefined;\n if (slot === undefined) {\n slot = initSlot(ctx.stream.ohlcv.close.capacity);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const { close, volume } = ctx.stream.bar;\n\n if (ctx.isTick) {\n const next = fold(slot.prevClosedCumObv, slot.prevClosedPrevClose, close, volume);\n slot.outBuffer.replaceHead(next.cumObv);\n return slot.series;\n }\n\n // Close-side: snapshot the prior-close state, then fold in.\n slot.prevClosedCumObv = slot.cumObv;\n slot.prevClosedPrevClose = slot.prevClose;\n const next = fold(slot.cumObv, slot.prevClose, close, volume);\n slot.cumObv = next.cumObv;\n slot.prevClose = next.prevClose;\n slot.outBuffer.append(slot.cumObv);\n return slot.series;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/ta/persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,8BAA8B,CAAC;AAItE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAkTrD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CASzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC1B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACzC,IAAI,CASN"}
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/ta/persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,8BAA8B,CAAC;AAatE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6PrD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CASzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC1B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACzC,IAAI,CASN"}
@@ -1,19 +1,9 @@
1
1
  // Copyright (c) 2026 Invinite. Licensed under the MIT License.
2
2
  // See the LICENSE file in the repo root for full license text.
3
+ import { finiteOrNull, isBufferSnapshot, isInteger, isRecord, restoreBuffer, restoreNumber, serialiseBuffer, } from "../bufferSnapshot.js";
3
4
  import { Float64RingBuffer } from "../ringBuffer.js";
4
5
  import { makeSeriesView } from "../seriesView.js";
5
6
  const TA_SLOT_PREFIX = "ta:";
6
- function isRecord(value) {
7
- return typeof value === "object" && value !== null && !Array.isArray(value);
8
- }
9
- function finiteOrNull(value) {
10
- return Number.isFinite(value) ? value : null;
11
- }
12
- function restoreNumber(value) {
13
- if (value === null)
14
- return Number.NaN;
15
- return typeof value === "number" && Number.isFinite(value) ? value : null;
16
- }
17
7
  /**
18
8
  * Restore a record of named numeric fields, returning `null` if any one
19
9
  * field fails {@link restoreNumber}. Lets restore functions read several
@@ -32,35 +22,6 @@ function restoreNumbers(fields) {
32
22
  }
33
23
  return out;
34
24
  }
35
- function isInteger(value) {
36
- return typeof value === "number" && Number.isInteger(value);
37
- }
38
- function isBufferSnapshot(value) {
39
- if (!isRecord(value))
40
- return false;
41
- if (!isInteger(value.headIndex) || !isInteger(value.filled))
42
- return false;
43
- return (Array.isArray(value.values) &&
44
- value.values.every((entry) => entry === null || (typeof entry === "number" && Number.isFinite(entry))));
45
- }
46
- function serialiseBuffer(buffer) {
47
- const snapshot = buffer.serialiseSnapshotBuffer();
48
- return {
49
- headIndex: snapshot.headIndex,
50
- filled: snapshot.filled,
51
- values: snapshot.values,
52
- };
53
- }
54
- function restoreBuffer(snapshot, capacity) {
55
- const buffer = new Float64RingBuffer(capacity);
56
- try {
57
- buffer.restoreFromSnapshotBuffer(snapshot);
58
- return buffer;
59
- }
60
- catch {
61
- return null;
62
- }
63
- }
64
25
  function baseSlot(outBuffer) {
65
26
  return {
66
27
  outBuffer,
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/ta/persistence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/ta/persistence.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\nimport type { JsonValue, Series } from \"@invinite-org/chartlang-core\";\n\nimport {\n finiteOrNull,\n isBufferSnapshot,\n isInteger,\n isRecord,\n restoreBuffer,\n restoreNumber,\n serialiseBuffer,\n} from \"../bufferSnapshot.js\";\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\nimport type { StreamState } from \"../streamState.js\";\n\nconst TA_SLOT_PREFIX = \"ta:\";\n\ntype RestoredBaseSlot = {\n readonly outBuffer: Float64RingBuffer;\n readonly series: Series<number>;\n readonly shiftedViews: Map<number, Series<number>>;\n};\n\ntype RestoredSmaSlot = RestoredBaseSlot & {\n readonly kind: \"ta.sma\";\n readonly length: number;\n readonly window: Float64RingBuffer;\n sum: number;\n};\n\ntype RestoredEmaSlot = RestoredBaseSlot & {\n readonly kind: \"ta.ema\";\n readonly alpha: number;\n readonly length: number;\n seedSum: number;\n seedCount: number;\n prevEma: number;\n prevClosedEma: number;\n};\n\ntype RestoredRsiSlot = RestoredBaseSlot & {\n readonly kind: \"ta.rsi\";\n readonly length: number;\n seedGainSum: number;\n seedLossSum: number;\n diffCount: number;\n avgGain: number;\n avgLoss: number;\n prevSrc: number;\n prevClosedSrc: number;\n};\n\ntype RestoredTaSlot = RestoredSmaSlot | RestoredEmaSlot | RestoredRsiSlot;\n\n/**\n * Restore a record of named numeric fields, returning `null` if any one\n * field fails {@link restoreNumber}. Lets restore functions read several\n * persisted numbers in one all-or-nothing step instead of an OR-chain of\n * per-field null checks.\n *\n * @internal\n */\nfunction restoreNumbers<K extends string>(\n fields: Readonly<Record<K, unknown>>,\n): Record<K, number> | null {\n const out = {} as Record<K, number>;\n for (const key of Object.keys(fields) as K[]) {\n const restored = restoreNumber(fields[key]);\n if (restored === null) return null;\n out[key] = restored;\n }\n return out;\n}\n\nfunction baseSlot(outBuffer: Float64RingBuffer): RestoredBaseSlot {\n return {\n outBuffer,\n series: makeSeriesView<number>(outBuffer),\n shiftedViews: new Map<number, Series<number>>(),\n };\n}\n\nfunction isFloat64RingBuffer(value: unknown): value is Float64RingBuffer {\n return value instanceof Float64RingBuffer;\n}\n\nfunction serialiseSma(slot: Readonly<Record<string, unknown>>): JsonValue | null {\n if (\n slot.kind !== \"ta.sma\" ||\n typeof slot.length !== \"number\" ||\n typeof slot.sum !== \"number\" ||\n !isFloat64RingBuffer(slot.outBuffer) ||\n !isFloat64RingBuffer(slot.window)\n ) {\n return null;\n }\n return {\n kind: \"ta.sma\",\n length: slot.length,\n outBuffer: serialiseBuffer(slot.outBuffer),\n window: serialiseBuffer(slot.window),\n sum: finiteOrNull(slot.sum),\n };\n}\n\nfunction serialiseEma(slot: Readonly<Record<string, unknown>>): JsonValue | null {\n if (\n slot.kind !== \"ta.ema\" ||\n typeof slot.alpha !== \"number\" ||\n typeof slot.length !== \"number\" ||\n typeof slot.seedSum !== \"number\" ||\n typeof slot.seedCount !== \"number\" ||\n typeof slot.prevEma !== \"number\" ||\n typeof slot.prevClosedEma !== \"number\" ||\n !isFloat64RingBuffer(slot.outBuffer)\n ) {\n return null;\n }\n return {\n kind: \"ta.ema\",\n alpha: finiteOrNull(slot.alpha),\n length: slot.length,\n outBuffer: serialiseBuffer(slot.outBuffer),\n seedSum: finiteOrNull(slot.seedSum),\n seedCount: slot.seedCount,\n prevEma: finiteOrNull(slot.prevEma),\n prevClosedEma: finiteOrNull(slot.prevClosedEma),\n };\n}\n\nfunction serialiseRsi(slot: Readonly<Record<string, unknown>>): JsonValue | null {\n if (\n slot.kind !== \"ta.rsi\" ||\n typeof slot.length !== \"number\" ||\n typeof slot.seedGainSum !== \"number\" ||\n typeof slot.seedLossSum !== \"number\" ||\n typeof slot.diffCount !== \"number\" ||\n typeof slot.avgGain !== \"number\" ||\n typeof slot.avgLoss !== \"number\" ||\n typeof slot.prevSrc !== \"number\" ||\n typeof slot.prevClosedSrc !== \"number\" ||\n !isFloat64RingBuffer(slot.outBuffer)\n ) {\n return null;\n }\n return {\n kind: \"ta.rsi\",\n length: slot.length,\n outBuffer: serialiseBuffer(slot.outBuffer),\n seedGainSum: finiteOrNull(slot.seedGainSum),\n seedLossSum: finiteOrNull(slot.seedLossSum),\n diffCount: slot.diffCount,\n avgGain: finiteOrNull(slot.avgGain),\n avgLoss: finiteOrNull(slot.avgLoss),\n prevSrc: finiteOrNull(slot.prevSrc),\n prevClosedSrc: finiteOrNull(slot.prevClosedSrc),\n };\n}\n\nfunction restoreSma(snapshot: Readonly<Record<string, unknown>>): RestoredSmaSlot | null {\n const outSnapshot = snapshot.outBuffer;\n const windowSnapshot = snapshot.window;\n if (\n snapshot.kind !== \"ta.sma\" ||\n !isInteger(snapshot.length) ||\n !isBufferSnapshot(outSnapshot) ||\n !isBufferSnapshot(windowSnapshot)\n ) {\n return null;\n }\n const sum = restoreNumber(snapshot.sum);\n if (sum === null) return null;\n const outBuffer = restoreBuffer(outSnapshot, outSnapshot.values.length);\n const window = restoreBuffer(windowSnapshot, snapshot.length);\n if (outBuffer === null || window === null) return null;\n return {\n kind: \"ta.sma\",\n ...baseSlot(outBuffer),\n length: snapshot.length,\n window,\n sum,\n };\n}\n\nfunction restoreEma(snapshot: Readonly<Record<string, unknown>>): RestoredEmaSlot | null {\n const outSnapshot = snapshot.outBuffer;\n if (\n snapshot.kind !== \"ta.ema\" ||\n !isInteger(snapshot.length) ||\n !isInteger(snapshot.seedCount) ||\n !isBufferSnapshot(outSnapshot)\n ) {\n return null;\n }\n const numbers = restoreNumbers({\n alpha: snapshot.alpha,\n seedSum: snapshot.seedSum,\n prevEma: snapshot.prevEma,\n prevClosedEma: snapshot.prevClosedEma,\n });\n if (numbers === null) return null;\n const outBuffer = restoreBuffer(outSnapshot, outSnapshot.values.length);\n if (outBuffer === null) return null;\n return {\n kind: \"ta.ema\",\n ...baseSlot(outBuffer),\n alpha: numbers.alpha,\n length: snapshot.length,\n seedSum: numbers.seedSum,\n seedCount: snapshot.seedCount,\n prevEma: numbers.prevEma,\n prevClosedEma: numbers.prevClosedEma,\n };\n}\n\nfunction restoreRsi(snapshot: Readonly<Record<string, unknown>>): RestoredRsiSlot | null {\n const outSnapshot = snapshot.outBuffer;\n if (\n snapshot.kind !== \"ta.rsi\" ||\n !isInteger(snapshot.length) ||\n !isInteger(snapshot.diffCount) ||\n !isBufferSnapshot(outSnapshot)\n ) {\n return null;\n }\n const numbers = restoreNumbers({\n seedGainSum: snapshot.seedGainSum,\n seedLossSum: snapshot.seedLossSum,\n avgGain: snapshot.avgGain,\n avgLoss: snapshot.avgLoss,\n prevSrc: snapshot.prevSrc,\n prevClosedSrc: snapshot.prevClosedSrc,\n });\n if (numbers === null) return null;\n const outBuffer = restoreBuffer(outSnapshot, outSnapshot.values.length);\n if (outBuffer === null) return null;\n return {\n kind: \"ta.rsi\",\n ...baseSlot(outBuffer),\n length: snapshot.length,\n seedGainSum: numbers.seedGainSum,\n seedLossSum: numbers.seedLossSum,\n diffCount: snapshot.diffCount,\n avgGain: numbers.avgGain,\n avgLoss: numbers.avgLoss,\n prevSrc: numbers.prevSrc,\n prevClosedSrc: numbers.prevClosedSrc,\n };\n}\n\nfunction serialiseTaSlot(slot: unknown): JsonValue | null {\n if (!isRecord(slot)) return null;\n if (slot.kind === \"ta.sma\") return serialiseSma(slot);\n if (slot.kind === \"ta.ema\") return serialiseEma(slot);\n if (slot.kind === \"ta.rsi\") return serialiseRsi(slot);\n return null;\n}\n\nfunction restoreTaSlot(snapshot: unknown): RestoredTaSlot | null {\n if (!isRecord(snapshot)) return null;\n if (snapshot.kind === \"ta.sma\") return restoreSma(snapshot);\n if (snapshot.kind === \"ta.ema\") return restoreEma(snapshot);\n if (snapshot.kind === \"ta.rsi\") return restoreRsi(snapshot);\n return null;\n}\n\n/**\n * Return whether a snapshot slot key belongs to the TA persistence namespace.\n *\n * @since 0.5\n * @internal\n * @stable\n * @formula key.startsWith(\"ta:\")\n * @example\n * isTaSlotSnapshotKey(\"ta:slot#0\"); // true\n */\nexport function isTaSlotSnapshotKey(key: string): boolean {\n return key.startsWith(TA_SLOT_PREFIX);\n}\n\n/**\n * Serialise supported `ta.*` runtime slots into JSON-clean snapshot entries.\n *\n * @since 0.5\n * @internal\n * @stable\n * @formula snapshot[`ta:${slotId}`] = serialise(slot) for supported TA slots\n * @example\n * // const entries = serialiseTaSlots(stream);\n * const entries = {};\n * void entries;\n */\nexport function serialiseTaSlots(stream: StreamState): Readonly<Record<string, JsonValue>> {\n const out: Record<string, JsonValue> = {};\n for (const [slotId, slot] of stream.taSlots.entries()) {\n const snapshot = serialiseTaSlot(slot);\n if (snapshot !== null) {\n out[`${TA_SLOT_PREFIX}${slotId}`] = snapshot;\n }\n }\n return Object.freeze(out);\n}\n\n/**\n * Restore supported `ta.*` runtime slots from namespaced snapshot entries.\n *\n * @since 0.5\n * @internal\n * @stable\n * @formula stream.taSlots[slotId] = restore(snapshot[`ta:${slotId}`])\n * @example\n * // restoreTaSlots(stream, snapshot.slots);\n * const restored = true;\n * void restored;\n */\nexport function restoreTaSlots(\n stream: StreamState,\n slots: Readonly<Record<string, unknown>>,\n): void {\n stream.taSlots.clear();\n for (const [key, value] of Object.entries(slots)) {\n if (!isTaSlotSnapshotKey(key)) continue;\n const slot = restoreTaSlot(value);\n if (slot !== null) {\n stream.taSlots.set(key.slice(TA_SLOT_PREFIX.length), slot);\n }\n }\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/pivots-high-low.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. Pivots H/L is self-contained — no
@@ -1 +1 @@
1
- {"version":3,"file":"pivotsHighLow.js","sourceRoot":"","sources":["../../src/ta/pivotsHighLow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pivotsHighLow.js","sourceRoot":"","sources":["../../src/ta/pivotsHighLow.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/pivots-high-low.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. Pivots H/L is self-contained — no\n// composition with `ta.highest` / `ta.lowest` because the centre bar\n// must be EXCLUDED from the windowed strict-extreme comparison AND\n// the tie-break differs between sides (strict-greater on the LEFT,\n// geq on the RIGHT for highs; matches TradingView `ta.pivothigh`).\n// The slot owns a `leftLength + rightLength + 1` ring buffer per\n// side (high / low) and scans it per close. Output deviates from\n// the typical line-style timing in that the value at bar `t`\n// describes bar `c = t − rightLength` (mirrors Williams Fractal's\n// centred-window convention from Task 26).\n\nimport type { PivotsHighLowOpts, PivotsHighLowResult } from \"@invinite-org/chartlang-core\";\n\nimport { Float64RingBuffer } from \"../ringBuffer.js\";\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeSeriesView } from \"../seriesView.js\";\n\nconst DEFAULT_LEFT = 4;\nconst DEFAULT_RIGHT = 4;\n\ntype PivotsHighLowSlot = {\n readonly outputs: PivotsHighLowResult;\n readonly highBuffer: Float64RingBuffer;\n readonly lowBuffer: Float64RingBuffer;\n readonly leftLength: number;\n readonly rightLength: number;\n /**\n * Trailing `leftLength + rightLength + 1` highs. `at(0)` is the\n * most recent close (right-window head); `at(rightLength)` is the\n * centre bar; `at(leftLength + rightLength)` is the oldest\n * left-window bar.\n */\n readonly highWindow: Float64RingBuffer;\n /** Trailing `leftLength + rightLength + 1` lows. */\n readonly lowWindow: Float64RingBuffer;\n /** Number of CLOSED bars folded into the slot so far. */\n barCount: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pivotsHighLow called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(capacity: number, leftLength: number, rightLength: number): PivotsHighLowSlot {\n const highBuffer = new Float64RingBuffer(capacity);\n const lowBuffer = new Float64RingBuffer(capacity);\n const windowSize = leftLength + rightLength + 1;\n return {\n outputs: Object.freeze({\n high: makeSeriesView<number>(highBuffer),\n low: makeSeriesView<number>(lowBuffer),\n }),\n highBuffer,\n lowBuffer,\n leftLength,\n rightLength,\n highWindow: new Float64RingBuffer(windowSize),\n lowWindow: new Float64RingBuffer(windowSize),\n barCount: 0,\n };\n}\n\n/**\n * Scan the centred window for an up-pivot at the centre bar (age\n * `rightLength`). Returns `centreHigh` if the centre's high is\n * strictly greater than every left-side bar AND greater-or-equal to\n * every right-side bar (matches Pine `ta.pivothigh` tie-break —\n * equal-high plateaus resolve to the LATER bar). Returns NaN if any\n * window entry is NaN or the strict/geq check fails. `headHigh` is\n * the substitute for age 0 (the most recent bar); tick replay\n * passes the tick's high there.\n */\nfunction scanUpPivot(\n highWindow: Float64RingBuffer,\n headHigh: number,\n leftLength: number,\n rightLength: number,\n): number {\n const centreAge = rightLength;\n const centreHigh = highWindow.at(centreAge);\n if (!Number.isFinite(centreHigh)) return Number.NaN;\n // Right-side window: ages 0..rightLength-1. Strict-or-equal: any\n // right-side bar with strictly greater high → not a pivot.\n for (let k = 0; k < rightLength; k += 1) {\n const v = k === 0 ? headHigh : highWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v > centreHigh) return Number.NaN;\n }\n // Left-side window: ages centreAge+1..centreAge+leftLength.\n // Strict: any left-side bar with greater-or-equal high → not a\n // pivot.\n for (let k = centreAge + 1; k <= centreAge + leftLength; k += 1) {\n const v = highWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v >= centreHigh) return Number.NaN;\n }\n return centreHigh;\n}\n\n/**\n * Scan the centred window for a down-pivot at the centre bar.\n * Mirrors {@link scanUpPivot} with `<` / `centreLow` (strict-less\n * on left, leq on right).\n */\nfunction scanDownPivot(\n lowWindow: Float64RingBuffer,\n headLow: number,\n leftLength: number,\n rightLength: number,\n): number {\n const centreAge = rightLength;\n const centreLow = lowWindow.at(centreAge);\n if (!Number.isFinite(centreLow)) return Number.NaN;\n for (let k = 0; k < rightLength; k += 1) {\n const v = k === 0 ? headLow : lowWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v < centreLow) return Number.NaN;\n }\n for (let k = centreAge + 1; k <= centreAge + leftLength; k += 1) {\n const v = lowWindow.at(k);\n if (!Number.isFinite(v)) return Number.NaN;\n if (v <= centreLow) return Number.NaN;\n }\n return centreLow;\n}\n\n/**\n * Pivots High Low — centred-window swing-pivot detector with\n * asymmetric `(leftLength, rightLength)` confirmation windows. For\n * each centre bar `c`, marks an **up-pivot** if `bar.high(c)` is\n * strictly greater than every `bar.high` in the `leftLength`-bar\n * left window AND greater-or-equal to every `bar.high` in the\n * `rightLength`-bar right window (matches Pine `ta.pivothigh`\n * tie-break — equal-high plateaus resolve to the LATER bar).\n * Mirrors for **down-pivot** with `bar.low` (strict-less on left,\n * leq on right).\n *\n * Output is centred — at live bar `t`, the value emitted at\n * `high.current` / `low.current` is the pivot status of bar `t −\n * rightLength` (when bar `t` closes, we now have enough right-\n * window bars to confirm bar `t − rightLength`). The most recent\n * `rightLength` slots of each Series are intentionally NaN\n * (pending right-window confirmation). Warmup is `leftLength +\n * rightLength` bars before the first confirmed centre.\n *\n * Outputs encode **price levels**: `high.current` =\n * `bar.high(centre)` when up-pivot, NaN otherwise; `low.current` =\n * `bar.low(centre)` when down-pivot, NaN otherwise. NaN in any\n * window slot → no pivot at the centre. Returns a cached `{ high,\n * low }` record (same identity every bar).\n *\n * @formula high = bar.high(centre) when bar.high(centre) > every left high AND ≥ every right high, NaN otherwise ;\n * low = bar.low(centre) when bar.low(centre) < every left low AND ≤ every right low, NaN otherwise\n * @warmup leftLength + rightLength\n * @anchors leftLength, rightLength\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const p = ta.pivotsHighLow({ leftLength: 4, rightLength: 4 });\n * // plot(p.high);\n * // plot(p.low);\n */\nexport function pivotsHighLow(slotId: string, opts?: PivotsHighLowOpts): PivotsHighLowResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as PivotsHighLowSlot | undefined;\n if (slot === undefined) {\n const leftLength = opts?.leftLength ?? DEFAULT_LEFT;\n const rightLength = opts?.rightLength ?? DEFAULT_RIGHT;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, leftLength, rightLength);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n const windowSize = slot.leftLength + slot.rightLength + 1;\n\n if (ctx.isTick) {\n // Tick: substitute head (age 0) with the tick's high/low; centre\n // is still at age `rightLength` in the closed window. Warmup\n // requires `barCount >= windowSize`.\n if (slot.barCount < windowSize) {\n slot.highBuffer.replaceHead(Number.NaN);\n slot.lowBuffer.replaceHead(Number.NaN);\n } else {\n slot.highBuffer.replaceHead(\n scanUpPivot(slot.highWindow, bar.high, slot.leftLength, slot.rightLength),\n );\n slot.lowBuffer.replaceHead(\n scanDownPivot(slot.lowWindow, bar.low, slot.leftLength, slot.rightLength),\n );\n }\n } else {\n slot.highWindow.append(bar.high);\n slot.lowWindow.append(bar.low);\n slot.barCount += 1;\n if (slot.barCount < windowSize) {\n slot.highBuffer.append(Number.NaN);\n slot.lowBuffer.append(Number.NaN);\n } else {\n // Close-side: head (age 0) IS this bar's high/low — pass\n // `headHigh = highWindow.at(0)` (no substitution).\n slot.highBuffer.append(\n scanUpPivot(\n slot.highWindow,\n slot.highWindow.at(0),\n slot.leftLength,\n slot.rightLength,\n ),\n );\n slot.lowBuffer.append(\n scanDownPivot(\n slot.lowWindow,\n slot.lowWindow.at(0),\n slot.leftLength,\n slot.rightLength,\n ),\n );\n }\n }\n return slot.outputs;\n}\n"]}
@@ -17,7 +17,7 @@ import type { PivotsStandardOpts, PivotsStandardResult } from "@invinite-org/cha
17
17
  * onward.
18
18
  *
19
19
  * **Deferred:** R4 / R5 / S4 / S5 levels (Camarilla's full table
20
- * defines them; Phase 2 ships R1..R3 / S1..S3 only). DeMark /
20
+ * defines them; this primitive ships R1..R3 / S1..S3 only). DeMark /
21
21
  * Traditional formula systems also defer.
22
22
  *
23
23
  * NaN bar leaves the day aggregate unchanged (NaN-aware max / min).
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/pivots-standard.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. Pivots Standard is self-contained — no
@@ -276,7 +276,7 @@ function tickStep(slot, time, _high, _low, _close) {
276
276
  * onward.
277
277
  *
278
278
  * **Deferred:** R4 / R5 / S4 / S5 levels (Camarilla's full table
279
- * defines them; Phase 2 ships R1..R3 / S1..S3 only). DeMark /
279
+ * defines them; this primitive ships R1..R3 / S1..S3 only). DeMark /
280
280
  * Traditional formula systems also defer.
281
281
  *
282
282
  * NaN bar leaves the day aggregate unchanged (NaN-aware max / min).
@@ -1 +1 @@
1
- {"version":3,"file":"pivotsStandard.js","sourceRoot":"","sources":["../../src/ta/pivotsStandard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pivotsStandard.js","sourceRoot":"","sources":["../../src/ta/pivotsStandard.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/pivots-standard.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. Pivots Standard is self-contained — no\n// composition. Session boundaries are detected from `bar.time` via\n// `Math.floor(bar.time / 86_400_000)` (UTC-day key). Invinite's\n// full session-detection machinery (weekly / monthly / yearly /\n// custom session ranges) is reduced to daily-only here — Phase 2\n// ships daily pivots; broader session support could land in a\n// follow-up. Six published formula systems are reduced to four\n// (classic / fibonacci / camarilla / woodie) per task §1; DeMark\n// and Traditional defer. R4 / R5 / S4 / S5 defer per the Phase-2\n// README \"Deferred / Follow-Up Work\" footnote.\n\nimport type {\n PivotsStandardOpts,\n PivotsStandardResult,\n PivotsStandardSystem,\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\";\n\nconst DEFAULT_SYSTEM: PivotsStandardSystem = \"classic\";\n\nconst MS_PER_DAY = 86_400_000;\n\ntype SevenLevels = {\n pp: number;\n r1: number;\n s1: number;\n r2: number;\n s2: number;\n r3: number;\n s3: number;\n};\n\ntype PivotsStandardSlot = {\n readonly outputs: PivotsStandardResult;\n readonly ppBuffer: Float64RingBuffer;\n readonly r1Buffer: Float64RingBuffer;\n readonly s1Buffer: Float64RingBuffer;\n readonly r2Buffer: Float64RingBuffer;\n readonly s2Buffer: Float64RingBuffer;\n readonly r3Buffer: Float64RingBuffer;\n readonly s3Buffer: Float64RingBuffer;\n readonly system: PivotsStandardSystem;\n // Live state.\n barCount: number;\n currentDayKey: number;\n currentDayHigh: number;\n currentDayLow: number;\n currentDayClose: number;\n prevDayHigh: number;\n prevDayLow: number;\n prevDayClose: number;\n // Snapshot (start-of-current-bar).\n prevClosedBarCount: number;\n prevClosedCurrentDayKey: number;\n prevClosedCurrentDayHigh: number;\n prevClosedCurrentDayLow: number;\n prevClosedCurrentDayClose: number;\n prevClosedPrevDayHigh: number;\n prevClosedPrevDayLow: number;\n prevClosedPrevDayClose: number;\n};\n\nconst NAN = Number.NaN;\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pivotsStandard called outside an active script step\");\n }\n return ctx;\n}\n\nfunction makeNaNLevels(): SevenLevels {\n return { pp: NAN, r1: NAN, s1: NAN, r2: NAN, s2: NAN, r3: NAN, s3: NAN };\n}\n\nfunction classic(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + c) / 3;\n const range = h - l;\n return {\n pp: p,\n r1: 2 * p - l,\n s1: 2 * p - h,\n r2: p + range,\n s2: p - range,\n r3: p + 2 * range,\n s3: p - 2 * range,\n };\n}\n\nfunction fibonacci(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + c) / 3;\n const range = h - l;\n return {\n pp: p,\n r1: p + 0.382 * range,\n s1: p - 0.382 * range,\n r2: p + 0.618 * range,\n s2: p - 0.618 * range,\n r3: p + range,\n s3: p - range,\n };\n}\n\n/**\n * Camarilla — R3 / S3 use the (1.1/4) coefficient per the published\n * TradingView formula. R4 / R5 / S4 / S5 defer per the Phase-2\n * README footnote.\n */\nfunction camarilla(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + c) / 3;\n const range = h - l;\n return {\n pp: p,\n r1: c + (1.1 * range) / 12,\n s1: c - (1.1 * range) / 12,\n r2: c + (1.1 * range) / 6,\n s2: c - (1.1 * range) / 6,\n r3: c + (1.1 * range) / 4,\n s3: c - (1.1 * range) / 4,\n };\n}\n\n/**\n * Woodie — pivot point weights the close more heavily ((h+l+2c)/4).\n * R3 / S3 anchor on the daily high / low directly (mirrors invinite's\n * `h + 2(p-l)` / `l - 2(h-p)`).\n */\nfunction woodie(h: number, l: number, c: number): SevenLevels {\n const p = (h + l + 2 * c) / 4;\n const range = h - l;\n return {\n pp: p,\n r1: 2 * p - l,\n s1: 2 * p - h,\n r2: p + range,\n s2: p - range,\n r3: h + 2 * (p - l),\n s3: l - 2 * (h - p),\n };\n}\n\nconst FORMULA_DISPATCH: Readonly<\n Record<PivotsStandardSystem, (h: number, l: number, c: number) => SevenLevels>\n> = Object.freeze({\n classic,\n fibonacci,\n camarilla,\n woodie,\n});\n\nfunction computeLevels(slot: PivotsStandardSlot): SevenLevels {\n return computeLevelsFrom(slot.prevDayHigh, slot.prevDayLow, slot.prevDayClose, slot.system);\n}\n\nfunction computeLevelsFrom(\n prevHigh: number,\n prevLow: number,\n prevClose: number,\n system: PivotsStandardSystem,\n): SevenLevels {\n if (!Number.isFinite(prevHigh) || !Number.isFinite(prevLow) || !Number.isFinite(prevClose)) {\n return makeNaNLevels();\n }\n return FORMULA_DISPATCH[system](prevHigh, prevLow, prevClose);\n}\n\nfunction initSlot(capacity: number, system: PivotsStandardSystem): PivotsStandardSlot {\n const ppBuffer = new Float64RingBuffer(capacity);\n const r1Buffer = new Float64RingBuffer(capacity);\n const s1Buffer = new Float64RingBuffer(capacity);\n const r2Buffer = new Float64RingBuffer(capacity);\n const s2Buffer = new Float64RingBuffer(capacity);\n const r3Buffer = new Float64RingBuffer(capacity);\n const s3Buffer = new Float64RingBuffer(capacity);\n return {\n outputs: Object.freeze({\n pp: makeSeriesView<number>(ppBuffer),\n r1: makeSeriesView<number>(r1Buffer),\n s1: makeSeriesView<number>(s1Buffer),\n r2: makeSeriesView<number>(r2Buffer),\n s2: makeSeriesView<number>(s2Buffer),\n r3: makeSeriesView<number>(r3Buffer),\n s3: makeSeriesView<number>(s3Buffer),\n }),\n ppBuffer,\n r1Buffer,\n s1Buffer,\n r2Buffer,\n s2Buffer,\n r3Buffer,\n s3Buffer,\n system,\n barCount: 0,\n currentDayKey: 0,\n currentDayHigh: NAN,\n currentDayLow: NAN,\n currentDayClose: NAN,\n prevDayHigh: NAN,\n prevDayLow: NAN,\n prevDayClose: NAN,\n prevClosedBarCount: 0,\n prevClosedCurrentDayKey: 0,\n prevClosedCurrentDayHigh: NAN,\n prevClosedCurrentDayLow: NAN,\n prevClosedCurrentDayClose: NAN,\n prevClosedPrevDayHigh: NAN,\n prevClosedPrevDayLow: NAN,\n prevClosedPrevDayClose: NAN,\n };\n}\n\nfunction snapshot(slot: PivotsStandardSlot): void {\n slot.prevClosedBarCount = slot.barCount;\n slot.prevClosedCurrentDayKey = slot.currentDayKey;\n slot.prevClosedCurrentDayHigh = slot.currentDayHigh;\n slot.prevClosedCurrentDayLow = slot.currentDayLow;\n slot.prevClosedCurrentDayClose = slot.currentDayClose;\n slot.prevClosedPrevDayHigh = slot.prevDayHigh;\n slot.prevClosedPrevDayLow = slot.prevDayLow;\n slot.prevClosedPrevDayClose = slot.prevDayClose;\n}\n\n/** NaN-aware max — NaN inputs leave the running aggregate unchanged. */\nfunction safeMax(acc: number, x: number): number {\n if (!Number.isFinite(x)) return acc;\n // Defensive: callers seed `acc` finite before folding, so the\n // `!isFinite(acc)` recovery branch is only reachable if the seed bar\n // contained a NaN high/low — the surrounding pivot pipeline already\n // skips that case.\n /* c8 ignore next */\n if (!Number.isFinite(acc)) return x;\n return x > acc ? x : acc;\n}\n\nfunction safeMin(acc: number, x: number): number {\n if (!Number.isFinite(x)) return acc;\n /* c8 ignore next */\n if (!Number.isFinite(acc)) return x;\n return x < acc ? x : acc;\n}\n\nfunction emitLevels(slot: PivotsStandardSlot, levels: SevenLevels, isTick: boolean): void {\n if (isTick) {\n slot.ppBuffer.replaceHead(levels.pp);\n slot.r1Buffer.replaceHead(levels.r1);\n slot.s1Buffer.replaceHead(levels.s1);\n slot.r2Buffer.replaceHead(levels.r2);\n slot.s2Buffer.replaceHead(levels.s2);\n slot.r3Buffer.replaceHead(levels.r3);\n slot.s3Buffer.replaceHead(levels.s3);\n } else {\n slot.ppBuffer.append(levels.pp);\n slot.r1Buffer.append(levels.r1);\n slot.s1Buffer.append(levels.s1);\n slot.r2Buffer.append(levels.r2);\n slot.s2Buffer.append(levels.s2);\n slot.r3Buffer.append(levels.r3);\n slot.s3Buffer.append(levels.s3);\n }\n}\n\nfunction closeStep(\n slot: PivotsStandardSlot,\n time: number,\n high: number,\n low: number,\n close: number,\n): SevenLevels {\n const dayKey = Math.floor(time / MS_PER_DAY);\n snapshot(slot);\n if (slot.barCount === 0) {\n // Seed bar — start the in-progress day aggregate. No prevDay\n // yet → all outputs NaN.\n slot.barCount = 1;\n slot.currentDayKey = dayKey;\n slot.currentDayHigh = high;\n slot.currentDayLow = low;\n slot.currentDayClose = close;\n return makeNaNLevels();\n }\n if (dayKey !== slot.currentDayKey) {\n // Day boundary fired: promote currentDay → prevDay.\n slot.prevDayHigh = slot.currentDayHigh;\n slot.prevDayLow = slot.currentDayLow;\n slot.prevDayClose = slot.currentDayClose;\n slot.currentDayKey = dayKey;\n slot.currentDayHigh = high;\n slot.currentDayLow = low;\n slot.currentDayClose = close;\n } else {\n // Same day — update aggregate.\n slot.currentDayHigh = safeMax(slot.currentDayHigh, high);\n slot.currentDayLow = safeMin(slot.currentDayLow, low);\n if (Number.isFinite(close)) slot.currentDayClose = close;\n }\n slot.barCount += 1;\n return computeLevels(slot);\n}\n\nfunction tickStep(\n slot: PivotsStandardSlot,\n time: number,\n _high: number,\n _low: number,\n _close: number,\n): SevenLevels {\n if (slot.prevClosedBarCount === 0) {\n return makeNaNLevels();\n }\n // Tick replay from snapshot. Determine if the tick crosses a day\n // boundary relative to the snapshot's currentDayKey.\n const dayKey = Math.floor(time / MS_PER_DAY);\n const snapKey = slot.prevClosedCurrentDayKey;\n const snapPrevHigh = slot.prevClosedPrevDayHigh;\n const snapPrevLow = slot.prevClosedPrevDayLow;\n const snapPrevClose = slot.prevClosedPrevDayClose;\n if (dayKey !== snapKey) {\n // Boundary crossing on the tick — promote snapshot's current\n // day to prev (transient), levels derive from the snapshot's\n // currentDay.\n return computeLevelsFrom(\n slot.prevClosedCurrentDayHigh,\n slot.prevClosedCurrentDayLow,\n slot.prevClosedCurrentDayClose,\n slot.system,\n );\n }\n // Same day — levels still derive from the snapshot's prevDay.\n return computeLevelsFrom(snapPrevHigh, snapPrevLow, snapPrevClose, slot.system);\n}\n\n/**\n * Pivots Standard — classical daily pivot-point levels (P, R1..R3,\n * S1..S3) derived from the previous UTC-day's high / low / close.\n * Four formula systems supported: `\"classic\"` (default),\n * `\"fibonacci\"`, `\"camarilla\"`, `\"woodie\"`. Reads `bar.time` /\n * `bar.high` / `bar.low` / `bar.close` directly; session boundary\n * detection uses `Math.floor(bar.time / 86_400_000)` (UTC-day key).\n * Returns a cached seven-Series `{ pp, r1, s1, r2, s2, r3, s3 }`\n * record (same identity every bar).\n *\n * The runtime aggregates the in-progress day's HLC on every close;\n * when a new UTC-day opens, the in-progress aggregate is promoted\n * to `prevDay` and the new day's pivot levels are computed via the\n * selected formula. Outputs are NaN at every bar in the FIRST UTC\n * day (no `prevDay` available) and finite from the SECOND UTC day\n * onward.\n *\n * **Deferred:** R4 / R5 / S4 / S5 levels (Camarilla's full table\n * defines them; this primitive ships R1..R3 / S1..S3 only). DeMark /\n * Traditional formula systems also defer.\n *\n * NaN bar leaves the day aggregate unchanged (NaN-aware max / min).\n * Tick-mode replays from the snapshot captured at the start of the\n * current bar.\n *\n * @formula pp / r1..r3 / s1..s3 derived from prevDay HLC per system :\n * classic — pp = (h+l+c)/3 ; r1 = 2p − l ; s1 = 2p − h ; r2 = p + (h−l) ; s2 = p − (h−l) ; r3 = p + 2(h−l) ; s3 = p − 2(h−l) ;\n * fibonacci — pp = (h+l+c)/3 ; r1/s1 = p ± 0.382·(h−l) ; r2/s2 = p ± 0.618·(h−l) ; r3/s3 = p ± (h−l) ;\n * camarilla — pp = (h+l+c)/3 ; r1/s1 = c ± 1.1·(h−l)/12 ; r2/s2 = c ± 1.1·(h−l)/6 ; r3/s3 = c ± 1.1·(h−l)/4 ;\n * woodie — pp = (h+l+2c)/4 ; r1 = 2p − l ; s1 = 2p − h ; r2 = p + (h−l) ; s2 = p − (h−l) ; r3 = h + 2(p−l) ; s3 = l − 2(h−p)\n * @warmup 1 UTC-day boundary (every output NaN until the second\n * UTC day opens)\n * @anchors system\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-core\";\n * // const p = ta.pivotsStandard();\n * // plot(p.pp);\n * // plot(p.r1);\n * // plot(p.s1);\n */\nexport function pivotsStandard(slotId: string, opts?: PivotsStandardOpts): PivotsStandardResult {\n const ctx = getCtx();\n let slot = ctx.stream.taSlots.get(slotId) as PivotsStandardSlot | undefined;\n if (slot === undefined) {\n const system = opts?.system ?? DEFAULT_SYSTEM;\n slot = initSlot(ctx.stream.ohlcv.close.capacity, system);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const bar = ctx.stream.bar;\n if (ctx.isTick) {\n const levels = tickStep(slot, bar.time, bar.high, bar.low, bar.close);\n emitLevels(slot, levels, true);\n } else {\n const levels = closeStep(slot, bar.time, bar.high, bar.low, bar.close);\n emitLevels(slot, levels, false);\n }\n return slot.outputs;\n}\n"]}
package/dist/ta/pmo.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/pmo.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
  import { Float64RingBuffer } from "../ringBuffer.js";
9
9
  import { ACTIVE_RUNTIME_CONTEXT } from "../runtimeContext.js";
10
10
  import { makeSeriesView, makeShiftedSeriesView } from "../seriesView.js";
@@ -1 +1 @@
1
- {"version":3,"file":"pmo.js","sourceRoot":"","sources":["../../src/ta/pmo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pmo.js","sourceRoot":"","sources":["../../src/ta/pmo.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/pmo.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n\nimport type { PmoOpts, PmoResult } 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 { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_FIRST = 35;\nconst DEFAULT_SECOND = 20;\nconst DEFAULT_SIGNAL = 10;\n\n/**\n * Carl Swenlin's PMO uses a non-canonical EMA factor for the two\n * inner stages: `α = 2 / length` (NOT the standard `α = 2 / (length + 1)`).\n * The signal-line EMA (stage 5) uses the standard `ta.ema`. Per the\n * published TradingView formula:\n * https://www.tradingview.com/support/solutions/43000773010\n */\ntype SwenlinEmaState = {\n readonly alpha: number;\n readonly length: number;\n seedSum: number;\n seedCount: number;\n prevClosedEma: number;\n};\n\nfunction makeSwenlinState(length: number): SwenlinEmaState {\n return {\n alpha: 2 / length,\n length,\n seedSum: 0,\n seedCount: 0,\n prevClosedEma: Number.NaN,\n };\n}\n\nfunction swenlinClose(state: SwenlinEmaState, src: number): number {\n if (!Number.isFinite(src)) {\n // Forward-hold prior closed EMA — mirrors invinite's\n // pmo.ts:130 \"out[i] = out[i - 1]\" branch.\n return state.prevClosedEma;\n }\n if (state.seedCount < state.length) {\n state.seedSum += src;\n state.seedCount += 1;\n if (state.seedCount < state.length) {\n state.prevClosedEma = Number.NaN;\n return Number.NaN;\n }\n const seedValue = state.seedSum / state.length;\n state.prevClosedEma = seedValue;\n return seedValue;\n }\n const prev = state.prevClosedEma;\n const next = src * state.alpha + prev * (1 - state.alpha);\n state.prevClosedEma = next;\n return next;\n}\n\nfunction swenlinTick(state: SwenlinEmaState, src: number): number {\n if (!Number.isFinite(src)) return state.prevClosedEma;\n if (state.seedCount < state.length) {\n const nextSum = state.seedSum + src;\n const nextCount = state.seedCount + 1;\n // Defensive: the seed-completion branch (`nextCount === length`)\n // is unreachable in normal flow because `swenlinClose` runs\n // first on every bar and would have raised `seedCount` to\n // `length` if this bar completes the seed window — making the\n // outer `seedCount < length` guard false on the tick path.\n /* c8 ignore next 3 */\n if (nextCount < state.length) return Number.NaN;\n return nextSum / state.length;\n }\n return src * state.alpha + state.prevClosedEma * (1 - state.alpha);\n}\n\ntype PmoSlot = {\n readonly result: PmoResult;\n readonly pmoBuf: Float64RingBuffer;\n readonly signalBuf: Float64RingBuffer;\n readonly shiftedResults: Map<number, PmoResult>;\n readonly stage1: SwenlinEmaState;\n readonly stage2: SwenlinEmaState;\n prevSrc: number;\n prevClosedSrc: number;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.pmo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction resultForOffset(slot: PmoSlot, offset: number): PmoResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n pmo: makeShiftedSeriesView<number>(slot.pmoBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction computeRoc1(src: number, prevSrc: number): number {\n if (!Number.isFinite(src) || !Number.isFinite(prevSrc) || prevSrc === 0) {\n return Number.NaN;\n }\n return (src / prevSrc - 1) * 1000;\n}\n\n/**\n * Carl Swenlin's Price Momentum Oscillator (PMO). Three-pass smoothing\n * of the 1-bar ROC, scaled to PMO's characteristic ±10 swing range:\n *\n * 1. `roc1[t] = ((src[t] / src[t-1]) - 1) × 1000`.\n * 2. `ema1 = SwenlinEMA(firstSmoothing)(roc1)` — `α = 2 / firstSmoothing`.\n * 3. `scaled = ema1 × 10`.\n * 4. `pmo = SwenlinEMA(secondSmoothing)(scaled)` — `α = 2 / secondSmoothing`.\n * 5. `signal = EMA(signalLength)(pmo)` — standard `α = 2 / (signalLength + 1)`.\n *\n * The Swenlin EMA factor diverges from canonical `ta.ema`'s `α = 2 /\n * (length + 1)`; without it the PMO output is off by a multiplicative\n * constant. Matches TradingView's published PMO output verbatim.\n *\n * @formula roc1[t] = ((src[t]/src[t-1]) - 1) × 1000 ;\n * ema1[t] = SwenlinEMA(firstSmoothing)(roc1) ;\n * pmo[t] = SwenlinEMA(secondSmoothing)(ema1 × 10) ;\n * signal[t] = EMA(signalLength)(pmo)\n * @warmup firstSmoothing + secondSmoothing − 1 (pmo line); firstSmoothing + secondSmoothing + signalLength − 3 (signal line)\n * @since 0.2\n * @stable\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const p = ta.pmo(\"slot\", bar.close);\n * // plot(p.pmo); plot(p.signal);\n */\nexport function pmo(slotId: string, source: ScalarOrSeries, opts?: PmoOpts): PmoResult {\n const ctx = getCtx();\n const firstSmoothing = opts?.firstSmoothing ?? DEFAULT_FIRST;\n const secondSmoothing = opts?.secondSmoothing ?? DEFAULT_SECOND;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const isTick = ctx.isTick;\n const src = readSourceValue(source);\n\n let slot = ctx.stream.taSlots.get(slotId) as PmoSlot | undefined;\n\n // Stage 1: compute roc1 against the appropriate prev source.\n // The `?? Number.NaN` fallbacks below are defensive: in normal flow\n // the runner does a close-side advance before any tick, so by the\n // time `isTick` is true `slot` exists. On the close path, the\n // first-bar slot is still undefined and we want NaN ROC1.\n const prevForRoc = isTick\n ? /* c8 ignore next */ (slot?.prevClosedSrc ?? Number.NaN)\n : (slot?.prevSrc ?? Number.NaN);\n const roc1 = computeRoc1(src, prevForRoc);\n\n // Stages 2 + 4: Swenlin EMA chain. The stages live on the slot; if\n // slot is undefined this is the first bar and we materialise it.\n if (slot === undefined) {\n const pmoBuf = new Float64RingBuffer(ctx.stream.ohlcv.close.capacity);\n const stage1 = makeSwenlinState(firstSmoothing);\n const stage2 = makeSwenlinState(secondSmoothing);\n const stage1Value = swenlinClose(stage1, roc1);\n // Defensive: stage1Value is always NaN on bar 0 (Swenlin returns\n // NaN inside the seed window) so the `* 10` branch never fires\n // on the first-slot path.\n /* c8 ignore next */\n const scaled = Number.isFinite(stage1Value) ? stage1Value * 10 : Number.NaN;\n const stage2Value = swenlinClose(stage2, scaled);\n pmoBuf.append(stage2Value);\n const signalSeries = ema(signalSlotId, stage2Value, signalLength);\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as {\n outBuffer: Float64RingBuffer;\n };\n slot = {\n result: Object.freeze({\n pmo: makeSeriesView<number>(pmoBuf),\n signal: signalSeries,\n }),\n pmoBuf,\n signalBuf: emaSlot.outBuffer,\n shiftedResults: new Map(),\n stage1,\n stage2,\n prevSrc: src,\n prevClosedSrc: Number.NaN,\n };\n ctx.stream.taSlots.set(slotId, slot);\n return resultForOffset(slot, offset);\n }\n\n // Slot exists — advance / tick the chain.\n const stage1Value = isTick ? swenlinTick(slot.stage1, roc1) : swenlinClose(slot.stage1, roc1);\n const scaled = Number.isFinite(stage1Value) ? stage1Value * 10 : Number.NaN;\n const pmoValue = isTick ? swenlinTick(slot.stage2, scaled) : swenlinClose(slot.stage2, scaled);\n\n // Feed pmoValue into the signal EMA each bar (handles its own tick branch).\n void ema(signalSlotId, pmoValue, signalLength);\n\n if (isTick) {\n slot.pmoBuf.replaceHead(pmoValue);\n } else {\n slot.pmoBuf.append(pmoValue);\n slot.prevClosedSrc = slot.prevSrc;\n slot.prevSrc = src;\n }\n\n return resultForOffset(slot, offset);\n}\n"]}
package/dist/ta/ppo.d.ts CHANGED
@@ -24,8 +24,9 @@ import { type ScalarOrSeries } from "./lib/sourceValue.js";
24
24
  * @since 0.2
25
25
  * @stable
26
26
  *
27
- * `opts.offset` shifts all three outputs in lockstep (PLAN.md §9.1)
28
- * `series.current` on each output returns the value `offset` bars ago.
27
+ * `opts.offset` is a presentation display shift carried to the plot
28
+ * emission as `xShift` for all three outputs in lockstep (`+n` right / future,
29
+ * `−n` left / past); the series values are unshifted.
29
30
  *
30
31
  * @example
31
32
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"ppo.d.ts","sourceRoot":"","sources":["../../src/ta/ppo.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAU,MAAM,8BAA8B,CAAC;AAM/E,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AAqE5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAiCrF"}
1
+ {"version":3,"file":"ppo.d.ts","sourceRoot":"","sources":["../../src/ta/ppo.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAU,MAAM,8BAA8B,CAAC;AAM/E,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AAqE5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAiCrF"}
package/dist/ta/ppo.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/ppo.ts
5
5
  // (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).
6
- // Re-licensed MIT for chartlang. See PLAN.md §3.1 for the
7
- // provenance contract; the math is the reference, the code style is not.
6
+ // Re-licensed MIT for chartlang. The math is the reference, the code
7
+ // style is not.
8
8
  // Structural choices (callsite-id slot, Series<T> proxy, replaceHead
9
9
  // mode) follow chartlang's primitive shape — NOT invinite's
10
10
  // IndicatorPlugin shape. Per §9.4 we fold invinite's private EMA copy
@@ -84,8 +84,9 @@ function ppoValue(fast, slow) {
84
84
  * @since 0.2
85
85
  * @stable
86
86
  *
87
- * `opts.offset` shifts all three outputs in lockstep (PLAN.md §9.1)
88
- * `series.current` on each output returns the value `offset` bars ago.
87
+ * `opts.offset` is a presentation display shift carried to the plot
88
+ * emission as `xShift` for all three outputs in lockstep (`+n` right / future,
89
+ * `−n` left / past); the series values are unshifted.
89
90
  *
90
91
  * @example
91
92
  * // import { ta } from "@invinite-org/chartlang-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"ppo.js","sourceRoot":"","sources":["../../src/ta/ppo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ppo.js","sourceRoot":"","sources":["../../src/ta/ppo.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/ppo.ts\n// (commit 078f41fe2569d659d5aba726da8bcb5d3e2ced02, © Invinite).\n// Re-licensed MIT for chartlang. The math is the reference, the code\n// style is not.\n// Structural choices (callsite-id slot, Series<T> proxy, replaceHead\n// mode) follow chartlang's primitive shape — NOT invinite's\n// IndicatorPlugin shape. Per §9.4 we fold invinite's private EMA copy\n// onto the canonical `ta.ema` primitive via three sub-slots\n// (`${slotId}/fast`, `${slotId}/slow`, `${slotId}/signal`) — same\n// composition pattern as `ta.macd`.\n\nimport type { PpoOpts, PpoResult, 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 { ema } from \"./ema.js\";\nimport { type ScalarOrSeries, readSourceValue } from \"./lib/sourceValue.js\";\n\nconst DEFAULT_FAST = 12;\nconst DEFAULT_SLOW = 26;\nconst DEFAULT_SIGNAL = 9;\n\ntype PpoSlot = {\n readonly result: PpoResult;\n readonly ppoBuf: Float64RingBuffer;\n readonly histBuf: Float64RingBuffer;\n /**\n * Reference to the signal-EMA sub-slot's output ring buffer.\n * Captured at first call so per-offset shifted signal views can be\n * constructed without re-entering `ema()` (which would double-\n * advance the sub-slot's compute on every bar). Same pattern as\n * `macd.ts`.\n */\n readonly signalBuf: Float64RingBuffer;\n /** Per-offset frozen `PpoResult` cache (identity-preserving for `offset === 0`). */\n readonly shiftedResults: Map<number, PpoResult>;\n};\n\nfunction getCtx(): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(\"ta.ppo called outside an active script step\");\n }\n return ctx;\n}\n\nfunction initSlot(\n capacity: number,\n signalSeries: Series<number>,\n signalBuf: Float64RingBuffer,\n): PpoSlot {\n const ppoBuf = new Float64RingBuffer(capacity);\n const histBuf = new Float64RingBuffer(capacity);\n return {\n result: Object.freeze({\n ppo: makeSeriesView<number>(ppoBuf),\n signal: signalSeries,\n hist: makeSeriesView<number>(histBuf),\n }),\n ppoBuf,\n histBuf,\n signalBuf,\n shiftedResults: new Map(),\n };\n}\n\nfunction resultForOffset(slot: PpoSlot, offset: number): PpoResult {\n if (offset === 0) return slot.result;\n let cached = slot.shiftedResults.get(offset);\n if (cached === undefined) {\n cached = Object.freeze({\n ppo: makeShiftedSeriesView<number>(slot.ppoBuf, offset),\n signal: makeShiftedSeriesView<number>(slot.signalBuf, offset),\n hist: makeShiftedSeriesView<number>(slot.histBuf, offset),\n });\n slot.shiftedResults.set(offset, cached);\n }\n return cached;\n}\n\nfunction ppoValue(fast: number, slow: number): number {\n if (!Number.isFinite(fast) || !Number.isFinite(slow) || slow === 0) return Number.NaN;\n return (100 * (fast - slow)) / slow;\n}\n\n/**\n * Percentage Price Oscillator — same shape as MACD but normalised by\n * the slow EMA so the histogram + lines are scale-invariant across\n * symbols. Composes three `ta.ema` sub-slots (`${slotId}/fast`,\n * `${slotId}/slow`, `${slotId}/signal`); a fix to `ema` flows into\n * PPO for free. Multi-output: `{ ppo, signal, hist }`. The registry\n * records `primarySeriesKey: \"ppo\"`, `visibleSeriesKeys: [\"ppo\",\n * \"signal\", \"hist\"]`, and `yDomain: { kind: \"auto\" }` via\n * `TA_REGISTRY_METADATA`.\n *\n * Defaults `{ fastLength: 12, slowLength: 26, signalLength: 9 }`\n * (Appel-era — matches MACD). `slow === 0` (degenerate price stream)\n * emits `NaN` at the PPO line, which propagates to hist; signal can\n * still be defined off prior PPO values.\n *\n * @formula fast = ema(source, fastLength) ;\n * slow = ema(source, slowLength) ;\n * ppo = 100 · (fast − slow) / slow ; NaN if slow === 0 ;\n * signal = ema(ppo, signalLength) ;\n * hist = ppo − signal\n * @warmup slowLength + signalLength − 2\n * @since 0.2\n * @stable\n *\n * `opts.offset` is a presentation display shift carried to the plot\n * emission as `xShift` for all three outputs in lockstep (`+n` right / future,\n * `−n` left / past); the series values are unshifted.\n *\n * @example\n * // import { ta } from \"@invinite-org/chartlang-runtime\";\n * // const p = ta.ppo(\"slot\", bar.close);\n * // const head = p.hist.current;\n * // const lagged = ta.ppo(\"slot2\", bar.close, { offset: 5 });\n */\nexport function ppo(slotId: string, source: ScalarOrSeries, opts?: PpoOpts): PpoResult {\n const ctx = getCtx();\n const fastLength = opts?.fastLength ?? DEFAULT_FAST;\n const slowLength = opts?.slowLength ?? DEFAULT_SLOW;\n const signalLength = opts?.signalLength ?? DEFAULT_SIGNAL;\n const offset = opts?.offset ?? 0;\n const signalSlotId = `${slotId}/signal`;\n const src = readSourceValue(source);\n const fastSeries = ema(`${slotId}/fast`, src, fastLength);\n const slowSeries = ema(`${slotId}/slow`, src, slowLength);\n const pv = ppoValue(fastSeries.current, slowSeries.current);\n // Feed PPO scalar into the signal EMA. Always call with the\n // un-shifted (default) view — offset shifting for the composite\n // PpoResult happens via `resultForOffset`, which reads directly off\n // the signal-EMA's outBuffer (captured below).\n const signalSeries = ema(signalSlotId, pv, signalLength);\n\n let slot = ctx.stream.taSlots.get(slotId) as PpoSlot | undefined;\n if (slot === undefined) {\n const emaSlot = ctx.stream.taSlots.get(signalSlotId) as { outBuffer: Float64RingBuffer };\n slot = initSlot(ctx.stream.ohlcv.close.capacity, signalSeries, emaSlot.outBuffer);\n ctx.stream.taSlots.set(slotId, slot);\n }\n const sig = signalSeries.current;\n const histValue = Number.isFinite(pv) && Number.isFinite(sig) ? pv - sig : Number.NaN;\n if (ctx.isTick) {\n slot.ppoBuf.replaceHead(pv);\n slot.histBuf.replaceHead(histValue);\n } else {\n slot.ppoBuf.append(pv);\n slot.histBuf.append(histValue);\n }\n return resultForOffset(slot, offset);\n}\n"]}
package/dist/ta/psar.js CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
  // Ported from invinite/src/components/trading-chart/indicators/psar.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. PSAR reads `bar.high` / `bar.low` /