@363045841yyt/klinechart-core 0.8.11-alpha.0 → 0.8.12

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 (578) hide show
  1. package/dist/alerts/createAlertController.d.ts +30 -0
  2. package/dist/alerts/createAlertController.d.ts.map +1 -0
  3. package/dist/alerts/createAlertController.js +261 -0
  4. package/dist/alerts/createAlertController.js.map +1 -0
  5. package/dist/alerts/index.d.ts +5 -0
  6. package/dist/alerts/index.d.ts.map +1 -0
  7. package/dist/alerts/index.js +4 -0
  8. package/dist/alerts/index.js.map +1 -0
  9. package/dist/alerts/predicates.d.ts +28 -0
  10. package/dist/alerts/predicates.d.ts.map +1 -0
  11. package/dist/alerts/predicates.js +211 -0
  12. package/dist/alerts/predicates.js.map +1 -0
  13. package/dist/alerts/rollingVolume.d.ts +15 -0
  14. package/dist/alerts/rollingVolume.d.ts.map +1 -0
  15. package/dist/alerts/rollingVolume.js +42 -0
  16. package/dist/alerts/rollingVolume.js.map +1 -0
  17. package/dist/alerts/ruleSchema.d.ts +42 -0
  18. package/dist/alerts/ruleSchema.d.ts.map +1 -0
  19. package/dist/alerts/ruleSchema.js +240 -0
  20. package/dist/alerts/ruleSchema.js.map +1 -0
  21. package/dist/alerts/types.d.ts +169 -0
  22. package/dist/alerts/types.d.ts.map +1 -0
  23. package/dist/alerts/types.js +24 -0
  24. package/dist/alerts/types.js.map +1 -0
  25. package/dist/chartTypes/heikinAshi.d.ts +49 -0
  26. package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
  27. package/dist/chartTypes/heikinAshi.js +94 -0
  28. package/dist/chartTypes/heikinAshi.js.map +1 -0
  29. package/dist/chartTypes/index.d.ts +6 -0
  30. package/dist/chartTypes/index.d.ts.map +1 -0
  31. package/dist/chartTypes/index.js +5 -0
  32. package/dist/chartTypes/index.js.map +1 -0
  33. package/dist/chartTypes/pointAndFigure.d.ts +83 -0
  34. package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
  35. package/dist/chartTypes/pointAndFigure.js +159 -0
  36. package/dist/chartTypes/pointAndFigure.js.map +1 -0
  37. package/dist/chartTypes/rangeBars.d.ts +61 -0
  38. package/dist/chartTypes/rangeBars.d.ts.map +1 -0
  39. package/dist/chartTypes/rangeBars.js +181 -0
  40. package/dist/chartTypes/rangeBars.js.map +1 -0
  41. package/dist/chartTypes/renko.d.ts +94 -0
  42. package/dist/chartTypes/renko.d.ts.map +1 -0
  43. package/dist/chartTypes/renko.js +207 -0
  44. package/dist/chartTypes/renko.js.map +1 -0
  45. package/dist/chartTypes/types.d.ts +97 -0
  46. package/dist/chartTypes/types.d.ts.map +1 -0
  47. package/dist/chartTypes/types.js +39 -0
  48. package/dist/chartTypes/types.js.map +1 -0
  49. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
  50. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
  51. package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
  52. package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
  53. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
  54. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
  55. package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
  56. package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
  57. package/dist/components/anchoredVwap/index.d.ts +11 -0
  58. package/dist/components/anchoredVwap/index.d.ts.map +1 -0
  59. package/dist/components/anchoredVwap/index.js +10 -0
  60. package/dist/components/anchoredVwap/index.js.map +1 -0
  61. package/dist/components/anchoredVwap/types.d.ts +171 -0
  62. package/dist/components/anchoredVwap/types.d.ts.map +1 -0
  63. package/dist/components/anchoredVwap/types.js +25 -0
  64. package/dist/components/anchoredVwap/types.js.map +1 -0
  65. package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
  66. package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
  67. package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
  68. package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
  69. package/dist/components/crosshairSync/index.d.ts +2 -0
  70. package/dist/components/crosshairSync/index.d.ts.map +1 -0
  71. package/dist/components/crosshairSync/index.js +2 -0
  72. package/dist/components/crosshairSync/index.js.map +1 -0
  73. package/dist/components/footprint/aggressor.d.ts +89 -0
  74. package/dist/components/footprint/aggressor.d.ts.map +1 -0
  75. package/dist/components/footprint/aggressor.js +106 -0
  76. package/dist/components/footprint/aggressor.js.map +1 -0
  77. package/dist/components/footprint/createFootprintController.d.ts +29 -0
  78. package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
  79. package/dist/components/footprint/createFootprintController.js +264 -0
  80. package/dist/components/footprint/createFootprintController.js.map +1 -0
  81. package/dist/components/footprint/index.d.ts +7 -0
  82. package/dist/components/footprint/index.d.ts.map +1 -0
  83. package/dist/components/footprint/index.js +4 -0
  84. package/dist/components/footprint/index.js.map +1 -0
  85. package/dist/components/footprint/perBarStats.d.ts +63 -0
  86. package/dist/components/footprint/perBarStats.d.ts.map +1 -0
  87. package/dist/components/footprint/perBarStats.js +123 -0
  88. package/dist/components/footprint/perBarStats.js.map +1 -0
  89. package/dist/components/footprint/types.d.ts +197 -0
  90. package/dist/components/footprint/types.d.ts.map +1 -0
  91. package/dist/components/footprint/types.js +23 -0
  92. package/dist/components/footprint/types.js.map +1 -0
  93. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
  94. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
  95. package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
  96. package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
  97. package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
  98. package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
  99. package/dist/components/mtfOverlay/createMtfController.js +134 -0
  100. package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
  101. package/dist/components/mtfOverlay/index.d.ts +19 -0
  102. package/dist/components/mtfOverlay/index.d.ts.map +1 -0
  103. package/dist/components/mtfOverlay/index.js +18 -0
  104. package/dist/components/mtfOverlay/index.js.map +1 -0
  105. package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
  106. package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
  107. package/dist/components/mtfOverlay/resampleBars.js +93 -0
  108. package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
  109. package/dist/components/mtfOverlay/types.d.ts +132 -0
  110. package/dist/components/mtfOverlay/types.d.ts.map +1 -0
  111. package/dist/components/mtfOverlay/types.js +22 -0
  112. package/dist/components/mtfOverlay/types.js.map +1 -0
  113. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
  114. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
  115. package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
  116. package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
  117. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
  118. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
  119. package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
  120. package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
  121. package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
  122. package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
  123. package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
  124. package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
  125. package/dist/components/orderBookHeatmap/index.d.ts +13 -0
  126. package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
  127. package/dist/components/orderBookHeatmap/index.js +12 -0
  128. package/dist/components/orderBookHeatmap/index.js.map +1 -0
  129. package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
  130. package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
  131. package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
  132. package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
  133. package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
  134. package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
  135. package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
  136. package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
  137. package/dist/components/orderBookHeatmap/types.d.ts +128 -0
  138. package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
  139. package/dist/components/orderBookHeatmap/types.js +16 -0
  140. package/dist/components/orderBookHeatmap/types.js.map +1 -0
  141. package/dist/components/volumeProfile/binning.d.ts +54 -0
  142. package/dist/components/volumeProfile/binning.d.ts.map +1 -0
  143. package/dist/components/volumeProfile/binning.js +123 -0
  144. package/dist/components/volumeProfile/binning.js.map +1 -0
  145. package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
  146. package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
  147. package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
  148. package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
  149. package/dist/components/volumeProfile/index.d.ts +6 -0
  150. package/dist/components/volumeProfile/index.d.ts.map +1 -0
  151. package/dist/components/volumeProfile/index.js +5 -0
  152. package/dist/components/volumeProfile/index.js.map +1 -0
  153. package/dist/components/volumeProfile/poc.d.ts +35 -0
  154. package/dist/components/volumeProfile/poc.d.ts.map +1 -0
  155. package/dist/components/volumeProfile/poc.js +51 -0
  156. package/dist/components/volumeProfile/poc.js.map +1 -0
  157. package/dist/components/volumeProfile/types.d.ts +138 -0
  158. package/dist/components/volumeProfile/types.d.ts.map +1 -0
  159. package/dist/components/volumeProfile/types.js +19 -0
  160. package/dist/components/volumeProfile/types.js.map +1 -0
  161. package/dist/components/volumeProfile/valueArea.d.ts +58 -0
  162. package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
  163. package/dist/components/volumeProfile/valueArea.js +172 -0
  164. package/dist/components/volumeProfile/valueArea.js.map +1 -0
  165. package/dist/controllers/createChartController.d.ts.map +1 -1
  166. package/dist/controllers/createChartController.js +22 -11
  167. package/dist/controllers/createChartController.js.map +1 -1
  168. package/dist/controllers/types.d.ts +3 -1
  169. package/dist/controllers/types.d.ts.map +1 -1
  170. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  171. package/dist/data-fetchers/baostock.js +2 -1
  172. package/dist/data-fetchers/baostock.js.map +1 -1
  173. package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
  174. package/dist/data-fetchers/dataBuffer.effects.js +2 -1
  175. package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
  176. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  177. package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
  178. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  179. package/dist/data-fetchers/gotdx.js +4 -3
  180. package/dist/data-fetchers/gotdx.js.map +1 -1
  181. package/dist/data-fetchers/router.d.ts.map +1 -1
  182. package/dist/data-fetchers/router.js +4 -3
  183. package/dist/data-fetchers/router.js.map +1 -1
  184. package/dist/data-fetchers/tradingview.js +3 -2
  185. package/dist/data-fetchers/tradingview.js.map +1 -1
  186. package/dist/engine/chart.d.ts +13 -0
  187. package/dist/engine/chart.d.ts.map +1 -1
  188. package/dist/engine/chart.js +109 -0
  189. package/dist/engine/chart.js.map +1 -1
  190. package/dist/engine/data/chartDataManager.d.ts +1 -0
  191. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  192. package/dist/engine/data/chartDataManager.js +27 -4
  193. package/dist/engine/data/chartDataManager.js.map +1 -1
  194. package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
  195. package/dist/engine/drawing/toolConfig.js +2 -1
  196. package/dist/engine/drawing/toolConfig.js.map +1 -1
  197. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  198. package/dist/engine/indicators/chartIndicatorManager.js +2 -1
  199. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  200. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  201. package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
  202. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  203. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  204. package/dist/engine/indicators/indicatorMetadata.js +2 -1
  205. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  206. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  207. package/dist/engine/indicators/indicatorRegistry.js +6 -5
  208. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  209. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  210. package/dist/engine/indicators/registerBuiltins.js +2 -1
  211. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  212. package/dist/engine/indicators/scheduler.d.ts +6 -0
  213. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  214. package/dist/engine/indicators/scheduler.js +12 -0
  215. package/dist/engine/indicators/scheduler.js.map +1 -1
  216. package/dist/engine/indicators/soa.d.ts.map +1 -1
  217. package/dist/engine/indicators/soa.js +2 -1
  218. package/dist/engine/indicators/soa.js.map +1 -1
  219. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  220. package/dist/engine/indicators/stateComposer.js +2 -1
  221. package/dist/engine/indicators/stateComposer.js.map +1 -1
  222. package/dist/engine/subPaneManager.d.ts.map +1 -1
  223. package/dist/engine/subPaneManager.js +2 -1
  224. package/dist/engine/subPaneManager.js.map +1 -1
  225. package/dist/engine/utils/chartZoomController.d.ts +2 -0
  226. package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
  227. package/dist/engine/utils/chartZoomController.js +5 -1
  228. package/dist/engine/utils/chartZoomController.js.map +1 -1
  229. package/dist/errors-help.d.ts +72 -0
  230. package/dist/errors-help.d.ts.map +1 -0
  231. package/dist/errors-help.js +149 -0
  232. package/dist/errors-help.js.map +1 -0
  233. package/dist/errors.d.ts +64 -0
  234. package/dist/errors.d.ts.map +1 -0
  235. package/dist/errors.js +61 -0
  236. package/dist/errors.js.map +1 -0
  237. package/dist/index.d.ts +18 -0
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +22 -0
  240. package/dist/index.js.map +1 -1
  241. package/dist/indicators/alma.d.ts +27 -0
  242. package/dist/indicators/alma.d.ts.map +1 -0
  243. package/dist/indicators/alma.js +36 -0
  244. package/dist/indicators/alma.js.map +1 -0
  245. package/dist/indicators/awesomeOscillator.d.ts +19 -0
  246. package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
  247. package/dist/indicators/awesomeOscillator.js +36 -0
  248. package/dist/indicators/awesomeOscillator.js.map +1 -0
  249. package/dist/indicators/dpo.d.ts +17 -0
  250. package/dist/indicators/dpo.d.ts.map +1 -0
  251. package/dist/indicators/dpo.js +24 -0
  252. package/dist/indicators/dpo.js.map +1 -0
  253. package/dist/indicators/fisherTransform.d.ts +26 -0
  254. package/dist/indicators/fisherTransform.d.ts.map +1 -0
  255. package/dist/indicators/fisherTransform.js +44 -0
  256. package/dist/indicators/fisherTransform.js.map +1 -0
  257. package/dist/indicators/frama.d.ts +25 -0
  258. package/dist/indicators/frama.d.ts.map +1 -0
  259. package/dist/indicators/frama.js +61 -0
  260. package/dist/indicators/frama.js.map +1 -0
  261. package/dist/indicators/index.d.ts +24 -0
  262. package/dist/indicators/index.d.ts.map +1 -0
  263. package/dist/indicators/index.js +26 -0
  264. package/dist/indicators/index.js.map +1 -0
  265. package/dist/indicators/lsma.d.ts +21 -0
  266. package/dist/indicators/lsma.d.ts.map +1 -0
  267. package/dist/indicators/lsma.js +37 -0
  268. package/dist/indicators/lsma.js.map +1 -0
  269. package/dist/indicators/schaffTrendCycle.d.ts +24 -0
  270. package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
  271. package/dist/indicators/schaffTrendCycle.js +70 -0
  272. package/dist/indicators/schaffTrendCycle.js.map +1 -0
  273. package/dist/indicators/stochRSI.d.ts +24 -0
  274. package/dist/indicators/stochRSI.d.ts.map +1 -0
  275. package/dist/indicators/stochRSI.js +86 -0
  276. package/dist/indicators/stochRSI.js.map +1 -0
  277. package/dist/indicators/t3.d.ts +31 -0
  278. package/dist/indicators/t3.d.ts.map +1 -0
  279. package/dist/indicators/t3.js +63 -0
  280. package/dist/indicators/t3.js.map +1 -0
  281. package/dist/indicators/ultimateOscillator.d.ts +26 -0
  282. package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
  283. package/dist/indicators/ultimateOscillator.js +59 -0
  284. package/dist/indicators/ultimateOscillator.js.map +1 -0
  285. package/dist/indicators/vidya.d.ts +24 -0
  286. package/dist/indicators/vidya.d.ts.map +1 -0
  287. package/dist/indicators/vidya.js +54 -0
  288. package/dist/indicators/vidya.js.map +1 -0
  289. package/dist/indicators/zlema.d.ts +16 -0
  290. package/dist/indicators/zlema.d.ts.map +1 -0
  291. package/dist/indicators/zlema.js +26 -0
  292. package/dist/indicators/zlema.js.map +1 -0
  293. package/dist/input/gesture.d.ts +125 -0
  294. package/dist/input/gesture.d.ts.map +1 -0
  295. package/dist/input/gesture.js +249 -0
  296. package/dist/input/gesture.js.map +1 -0
  297. package/dist/input/index.d.ts +9 -0
  298. package/dist/input/index.d.ts.map +1 -0
  299. package/dist/input/index.js +9 -0
  300. package/dist/input/index.js.map +1 -0
  301. package/dist/input/keyboard.d.ts +140 -0
  302. package/dist/input/keyboard.d.ts.map +1 -0
  303. package/dist/input/keyboard.js +260 -0
  304. package/dist/input/keyboard.js.map +1 -0
  305. package/dist/mcp/chartBridge.d.ts +2 -2
  306. package/dist/mcp/chartBridge.d.ts.map +1 -1
  307. package/dist/mcp/chartBridge.js +27 -21
  308. package/dist/mcp/chartBridge.js.map +1 -1
  309. package/dist/plugin/PluginHost.d.ts +0 -3
  310. package/dist/plugin/PluginHost.d.ts.map +1 -1
  311. package/dist/plugin/PluginHost.js +7 -3
  312. package/dist/plugin/PluginHost.js.map +1 -1
  313. package/dist/plugin/PluginRegistry.d.ts +0 -3
  314. package/dist/plugin/PluginRegistry.d.ts.map +1 -1
  315. package/dist/plugin/PluginRegistry.js +5 -1
  316. package/dist/plugin/PluginRegistry.js.map +1 -1
  317. package/dist/render/Renderer.d.ts +116 -0
  318. package/dist/render/Renderer.d.ts.map +1 -0
  319. package/dist/render/Renderer.js +31 -0
  320. package/dist/render/Renderer.js.map +1 -0
  321. package/dist/render/SurfaceBackend.d.ts +83 -0
  322. package/dist/render/SurfaceBackend.d.ts.map +1 -0
  323. package/dist/render/SurfaceBackend.js +27 -0
  324. package/dist/render/SurfaceBackend.js.map +1 -0
  325. package/dist/render/index.d.ts +12 -0
  326. package/dist/render/index.d.ts.map +1 -0
  327. package/dist/render/index.js +11 -0
  328. package/dist/render/index.js.map +1 -0
  329. package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
  330. package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
  331. package/dist/renderer-tier/detectRendererTier.js +143 -0
  332. package/dist/renderer-tier/detectRendererTier.js.map +1 -0
  333. package/dist/renderer-tier/index.d.ts +12 -0
  334. package/dist/renderer-tier/index.d.ts.map +1 -0
  335. package/dist/renderer-tier/index.js +12 -0
  336. package/dist/renderer-tier/index.js.map +1 -0
  337. package/dist/renderer-tier/selectBackend.d.ts +106 -0
  338. package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
  339. package/dist/renderer-tier/selectBackend.js +113 -0
  340. package/dist/renderer-tier/selectBackend.js.map +1 -0
  341. package/dist/renderer-tier/types.d.ts +50 -0
  342. package/dist/renderer-tier/types.d.ts.map +1 -0
  343. package/dist/renderer-tier/types.js +24 -0
  344. package/dist/renderer-tier/types.js.map +1 -0
  345. package/dist/replay/createReplayController.d.ts +3 -0
  346. package/dist/replay/createReplayController.d.ts.map +1 -0
  347. package/dist/replay/createReplayController.js +251 -0
  348. package/dist/replay/createReplayController.js.map +1 -0
  349. package/dist/replay/index.d.ts +5 -0
  350. package/dist/replay/index.d.ts.map +1 -0
  351. package/dist/replay/index.js +3 -0
  352. package/dist/replay/index.js.map +1 -0
  353. package/dist/replay/timeline.d.ts +50 -0
  354. package/dist/replay/timeline.d.ts.map +1 -0
  355. package/dist/replay/timeline.js +104 -0
  356. package/dist/replay/timeline.js.map +1 -0
  357. package/dist/replay/types.d.ts +94 -0
  358. package/dist/replay/types.d.ts.map +1 -0
  359. package/dist/replay/types.js +21 -0
  360. package/dist/replay/types.js.map +1 -0
  361. package/dist/scale/anchoredZoom.d.ts +64 -0
  362. package/dist/scale/anchoredZoom.d.ts.map +1 -0
  363. package/dist/scale/anchoredZoom.js +67 -0
  364. package/dist/scale/anchoredZoom.js.map +1 -0
  365. package/dist/scale/createPriceScale.d.ts +49 -0
  366. package/dist/scale/createPriceScale.d.ts.map +1 -0
  367. package/dist/scale/createPriceScale.js +175 -0
  368. package/dist/scale/createPriceScale.js.map +1 -0
  369. package/dist/scale/createTimeScale.d.ts +27 -0
  370. package/dist/scale/createTimeScale.d.ts.map +1 -0
  371. package/dist/scale/createTimeScale.js +139 -0
  372. package/dist/scale/createTimeScale.js.map +1 -0
  373. package/dist/scale/index.d.ts +6 -0
  374. package/dist/scale/index.d.ts.map +1 -0
  375. package/dist/scale/index.js +5 -0
  376. package/dist/scale/index.js.map +1 -0
  377. package/dist/scale/originShift.d.ts +69 -0
  378. package/dist/scale/originShift.d.ts.map +1 -0
  379. package/dist/scale/originShift.js +41 -0
  380. package/dist/scale/originShift.js.map +1 -0
  381. package/dist/scale/types.d.ts +90 -0
  382. package/dist/scale/types.d.ts.map +1 -0
  383. package/dist/scale/types.js +17 -0
  384. package/dist/scale/types.js.map +1 -0
  385. package/dist/scene/createScene.d.ts +22 -0
  386. package/dist/scene/createScene.d.ts.map +1 -0
  387. package/dist/scene/createScene.js +114 -0
  388. package/dist/scene/createScene.js.map +1 -0
  389. package/dist/scene/index.d.ts +13 -0
  390. package/dist/scene/index.d.ts.map +1 -0
  391. package/dist/scene/index.js +11 -0
  392. package/dist/scene/index.js.map +1 -0
  393. package/dist/scene/layerRegistry.d.ts +83 -0
  394. package/dist/scene/layerRegistry.d.ts.map +1 -0
  395. package/dist/scene/layerRegistry.js +43 -0
  396. package/dist/scene/layerRegistry.js.map +1 -0
  397. package/dist/scene/types.d.ts +128 -0
  398. package/dist/scene/types.d.ts.map +1 -0
  399. package/dist/scene/types.js +21 -0
  400. package/dist/scene/types.js.map +1 -0
  401. package/dist/scheduler/createFrameBudget.d.ts +91 -0
  402. package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
  403. package/dist/scheduler/createFrameBudget.js +232 -0
  404. package/dist/scheduler/createFrameBudget.js.map +1 -0
  405. package/dist/scheduler/index.d.ts +2 -0
  406. package/dist/scheduler/index.d.ts.map +1 -0
  407. package/dist/scheduler/index.js +2 -0
  408. package/dist/scheduler/index.js.map +1 -0
  409. package/dist/tokens/themeToCssVars.d.ts.map +1 -1
  410. package/dist/tokens/themeToCssVars.js +2 -28
  411. package/dist/tokens/themeToCssVars.js.map +1 -1
  412. package/dist/version.d.ts +1 -1
  413. package/dist/version.d.ts.map +1 -1
  414. package/dist/version.js +1 -1
  415. package/dist/version.js.map +1 -1
  416. package/package.json +1 -1
  417. package/src/__bench__/indicators.bench.ts +215 -0
  418. package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
  419. package/src/__bench__/scale.bench.ts +80 -0
  420. package/src/__bench__/signal.bench.ts +41 -0
  421. package/src/__bench__/volumeProfile.bench.ts +66 -0
  422. package/src/__tests__/errors-help.test.ts +184 -0
  423. package/src/__tests__/errors.test.ts +187 -0
  424. package/src/alerts/__tests__/controller.test.ts +231 -0
  425. package/src/alerts/__tests__/predicates.test.ts +374 -0
  426. package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
  427. package/src/alerts/createAlertController.ts +312 -0
  428. package/src/alerts/index.ts +18 -0
  429. package/src/alerts/predicates.ts +231 -0
  430. package/src/alerts/rollingVolume.ts +51 -0
  431. package/src/alerts/ruleSchema.ts +278 -0
  432. package/src/alerts/types.ts +177 -0
  433. package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
  434. package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
  435. package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
  436. package/src/chartTypes/__tests__/renko.test.ts +160 -0
  437. package/src/chartTypes/heikinAshi.ts +116 -0
  438. package/src/chartTypes/index.ts +5 -0
  439. package/src/chartTypes/pointAndFigure.ts +278 -0
  440. package/src/chartTypes/rangeBars.ts +303 -0
  441. package/src/chartTypes/renko.ts +311 -0
  442. package/src/chartTypes/types.ts +99 -0
  443. package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
  444. package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
  445. package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
  446. package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
  447. package/src/components/anchoredVwap/index.ts +17 -0
  448. package/src/components/anchoredVwap/types.ts +187 -0
  449. package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
  450. package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
  451. package/src/components/crosshairSync/index.ts +5 -0
  452. package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
  453. package/src/components/footprint/__tests__/controller.test.ts +130 -0
  454. package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
  455. package/src/components/footprint/aggressor.ts +165 -0
  456. package/src/components/footprint/createFootprintController.ts +338 -0
  457. package/src/components/footprint/index.ts +21 -0
  458. package/src/components/footprint/perBarStats.ts +137 -0
  459. package/src/components/footprint/types.ts +232 -0
  460. package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
  461. package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
  462. package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
  463. package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
  464. package/src/components/mtfOverlay/createMtfController.ts +180 -0
  465. package/src/components/mtfOverlay/index.ts +26 -0
  466. package/src/components/mtfOverlay/resampleBars.ts +134 -0
  467. package/src/components/mtfOverlay/types.ts +148 -0
  468. package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
  469. package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
  470. package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
  471. package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
  472. package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
  473. package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
  474. package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
  475. package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
  476. package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
  477. package/src/components/orderBookHeatmap/index.ts +25 -0
  478. package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
  479. package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
  480. package/src/components/orderBookHeatmap/types.ts +168 -0
  481. package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
  482. package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
  483. package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
  484. package/src/components/volumeProfile/binning.ts +133 -0
  485. package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
  486. package/src/components/volumeProfile/index.ts +12 -0
  487. package/src/components/volumeProfile/poc.ts +53 -0
  488. package/src/components/volumeProfile/types.ts +148 -0
  489. package/src/components/volumeProfile/valueArea.ts +187 -0
  490. package/src/controllers/createChartController.ts +23 -10
  491. package/src/controllers/types.ts +5 -1
  492. package/src/data-fetchers/baostock.ts +2 -1
  493. package/src/data-fetchers/dataBuffer.effects.ts +3 -1
  494. package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
  495. package/src/data-fetchers/gotdx.ts +4 -3
  496. package/src/data-fetchers/router.ts +6 -3
  497. package/src/data-fetchers/tradingview.ts +3 -2
  498. package/src/engine/chart.ts +126 -3
  499. package/src/engine/data/chartDataManager.ts +26 -4
  500. package/src/engine/drawing/toolConfig.ts +2 -1
  501. package/src/engine/indicators/chartIndicatorManager.ts +2 -1
  502. package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
  503. package/src/engine/indicators/indicatorMetadata.ts +2 -1
  504. package/src/engine/indicators/indicatorRegistry.ts +6 -5
  505. package/src/engine/indicators/registerBuiltins.ts +2 -1
  506. package/src/engine/indicators/scheduler.ts +15 -0
  507. package/src/engine/indicators/soa.ts +2 -1
  508. package/src/engine/indicators/stateComposer.ts +2 -1
  509. package/src/engine/subPaneManager.ts +2 -1
  510. package/src/engine/utils/chartZoomController.ts +7 -1
  511. package/src/errors-help.ts +218 -0
  512. package/src/errors.ts +128 -0
  513. package/src/index.ts +37 -0
  514. package/src/indicators/__tests__/maFamily.test.ts +159 -0
  515. package/src/indicators/__tests__/oscillators.test.ts +150 -0
  516. package/src/indicators/alma.ts +61 -0
  517. package/src/indicators/awesomeOscillator.ts +54 -0
  518. package/src/indicators/dpo.ts +37 -0
  519. package/src/indicators/fisherTransform.ts +63 -0
  520. package/src/indicators/frama.ts +87 -0
  521. package/src/indicators/index.ts +39 -0
  522. package/src/indicators/lsma.ts +58 -0
  523. package/src/indicators/schaffTrendCycle.ts +92 -0
  524. package/src/indicators/stochRSI.ts +108 -0
  525. package/src/indicators/t3.ts +96 -0
  526. package/src/indicators/ultimateOscillator.ts +83 -0
  527. package/src/indicators/vidya.ts +80 -0
  528. package/src/indicators/zlema.ts +41 -0
  529. package/src/input/__tests__/gesture.test.ts +271 -0
  530. package/src/input/__tests__/keyboard.test.ts +317 -0
  531. package/src/input/gesture.ts +357 -0
  532. package/src/input/index.ts +26 -0
  533. package/src/input/keyboard.ts +373 -0
  534. package/src/mcp/chartBridge.ts +98 -72
  535. package/src/plugin/PluginHost.ts +4 -3
  536. package/src/plugin/PluginRegistry.ts +2 -1
  537. package/src/render/Renderer.ts +127 -0
  538. package/src/render/SurfaceBackend.ts +94 -0
  539. package/src/render/__tests__/contract.test.ts +176 -0
  540. package/src/render/index.ts +27 -0
  541. package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
  542. package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
  543. package/src/renderer-tier/detectRendererTier.ts +168 -0
  544. package/src/renderer-tier/index.ts +30 -0
  545. package/src/renderer-tier/selectBackend.ts +201 -0
  546. package/src/renderer-tier/types.ts +59 -0
  547. package/src/replay/__tests__/controller.test.ts +309 -0
  548. package/src/replay/__tests__/timeline.test.ts +99 -0
  549. package/src/replay/createReplayController.ts +302 -0
  550. package/src/replay/index.ts +15 -0
  551. package/src/replay/timeline.ts +106 -0
  552. package/src/replay/types.ts +107 -0
  553. package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
  554. package/src/scale/__tests__/originShift.test.ts +97 -0
  555. package/src/scale/__tests__/priceScale.test.ts +219 -0
  556. package/src/scale/__tests__/timeScale.test.ts +119 -0
  557. package/src/scale/anchoredZoom.ts +104 -0
  558. package/src/scale/createPriceScale.ts +226 -0
  559. package/src/scale/createTimeScale.ts +150 -0
  560. package/src/scale/index.ts +9 -0
  561. package/src/scale/originShift.ts +111 -0
  562. package/src/scale/types.ts +100 -0
  563. package/src/scene/__tests__/layerRegistry.test.ts +207 -0
  564. package/src/scene/__tests__/scene.test.ts +411 -0
  565. package/src/scene/createScene.ts +117 -0
  566. package/src/scene/index.ts +29 -0
  567. package/src/scene/layerRegistry.ts +117 -0
  568. package/src/scene/types.ts +143 -0
  569. package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
  570. package/src/scheduler/createFrameBudget.ts +316 -0
  571. package/src/scheduler/index.ts +7 -0
  572. package/src/tokens/themeToCssVars.ts +3 -1
  573. package/src/version.ts +1 -1
  574. package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
  575. package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
  576. package/dist/data-fetchers/gotdx/gotdx.js +0 -7
  577. package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
  578. package/src/data-fetchers/gotdx/gotdx.ts +0 -6
@@ -0,0 +1,358 @@
1
+ /**
2
+ * Anchored VWAP controller — framework-agnostic, signal-based, multi-anchor.
3
+ *
4
+ * Mirrors the dispose-guard pattern from
5
+ * `createIndicatorSelectorController` and `createVolumeProfileController` so
6
+ * React/Vue/Angular adapters bridge identically. The controller is pure
7
+ * data — no DOM, no rendering, no canvas.
8
+ *
9
+ * Why multi-anchor with per-anchor running sums:
10
+ * TradingView's lower tiers cap the number of simultaneous anchors at
11
+ * 3 because each AVWAP is recomputed from scratch on every new bar. By
12
+ * keeping per-anchor `sumVwp` / `sumVol` / `sumSqDev` totals we drop
13
+ * `appendBar` from O(bars-since-anchor) to O(1) per anchor — anchors
14
+ * become cheap enough to keep many open at once.
15
+ *
16
+ * Equivalence guarantee:
17
+ * The point produced by `appendBar` is bit-for-bit identical (to
18
+ * floating-point precision) to the point that `computeAnchoredVwap`
19
+ * would produce on the same bar at the same anchor — same operands
20
+ * added in the same order. The controller test
21
+ * `appendBar incrementally matches full recompute` pins this.
22
+ */
23
+
24
+ import { createSignal, type Signal } from '../../reactivity'
25
+ import { computeAnchoredVwap } from './computeAnchoredVwap'
26
+ import type {
27
+ ActiveAnchor,
28
+ AnchorDefinition,
29
+ AnchoredVwapController,
30
+ AVWAPBar,
31
+ AVWAPPoint,
32
+ } from './types'
33
+
34
+ // ---------------------------------------------------------------------------
35
+ // Internal state per anchor
36
+ // ---------------------------------------------------------------------------
37
+
38
+ /**
39
+ * Mutable per-anchor scratch. We keep this separate from `ActiveAnchor` so
40
+ * the public signal value only exposes the immutable view (definition +
41
+ * series) and consumers can rely on structural sharing where it matters.
42
+ */
43
+ interface AnchorState {
44
+ definition: AnchorDefinition
45
+ // Running cumulative sums from the anchor up to and including the last
46
+ // bar processed. These are what make `appendBar` O(1).
47
+ sumVwp: number
48
+ sumVol: number
49
+ sumSqDev: number
50
+ // The series produced so far. Each `appendBar` pushes one new point.
51
+ // Held mutable internally; surfaced as ReadonlyArray.
52
+ series: AVWAPPoint[]
53
+ }
54
+
55
+ export interface AnchoredVwapControllerInit {
56
+ initialBars?: ReadonlyArray<AVWAPBar>
57
+ }
58
+
59
+ export function createAnchoredVwapController(
60
+ opts?: AnchoredVwapControllerInit,
61
+ ): AnchoredVwapController {
62
+ // -------------------------------------------------------------------
63
+ // Internal mutable state — never exposed directly.
64
+ // -------------------------------------------------------------------
65
+ // Defensive copy: the caller may reuse the array they pass us. We
66
+ // capture a snapshot so `appendBar` can extend it without surprising
67
+ // the caller.
68
+ let bars: AVWAPBar[] = opts?.initialBars
69
+ ? opts.initialBars.slice()
70
+ : []
71
+ const anchorStates = new Map<string, AnchorState>()
72
+
73
+ // -------------------------------------------------------------------
74
+ // Public signal — re-emitted on every structural change.
75
+ // -------------------------------------------------------------------
76
+ const anchors: Signal<ReadonlyArray<ActiveAnchor>> = createSignal<
77
+ ReadonlyArray<ActiveAnchor>
78
+ >([])
79
+
80
+ /**
81
+ * Rebuild the public signal value from the current `anchorStates`. We
82
+ * pass a fresh array reference each time so `Object.is` in
83
+ * `signal.set` triggers a notify.
84
+ */
85
+ function publish(): void {
86
+ const next: ActiveAnchor[] = []
87
+ for (const a of anchorStates.values()) {
88
+ next.push({
89
+ definition: a.definition,
90
+ // Snapshot the series so consumers see an immutable
91
+ // view; future `appendBar` mutations on `a.series` will
92
+ // only be observed by the next `publish`.
93
+ series: a.series.slice(),
94
+ })
95
+ }
96
+ anchors.set(next)
97
+ }
98
+
99
+ // -------------------------------------------------------------------
100
+ // Math helpers — share one definition of the per-bar arithmetic so
101
+ // `appendBar` and `recomputeAnchor` cannot drift.
102
+ // -------------------------------------------------------------------
103
+
104
+ /**
105
+ * Recompute an anchor's series from scratch by walking the bars from
106
+ * `definition.barIndex`. Also resets the running sums so subsequent
107
+ * `appendBar` calls extend the same totals.
108
+ *
109
+ * `null` is a sentinel meaning "anchor is out of range for the
110
+ * current bars" — the caller drops a point-free entry.
111
+ */
112
+ function recomputeAnchor(state: AnchorState): void {
113
+ const def = state.definition
114
+ // Out-of-range anchor: leave the running sums at zero and emit an
115
+ // empty series. We deliberately do NOT throw — callers might be
116
+ // mid-stream and an out-of-range anchor is a valid transient
117
+ // state (e.g. user dragged the anchor past the loaded window).
118
+ if (
119
+ bars.length === 0 ||
120
+ def.barIndex < 0 ||
121
+ def.barIndex >= bars.length
122
+ ) {
123
+ state.sumVwp = 0
124
+ state.sumVol = 0
125
+ state.sumSqDev = 0
126
+ state.series = []
127
+ return
128
+ }
129
+
130
+ // Use the shared pure function so behaviour stays identical.
131
+ const series = computeAnchoredVwap(
132
+ bars,
133
+ def.barIndex,
134
+ def.includeBands,
135
+ )
136
+ // Reconstruct the running sums by replaying the same arithmetic
137
+ // — we need them for the next `appendBar`. This is the only
138
+ // place where the controller duplicates the math; the cost is
139
+ // unavoidable because `computeAnchoredVwap` does not expose its
140
+ // internal sums.
141
+ let sumVwp = 0
142
+ let sumVol = 0
143
+ let sumSqDev = 0
144
+ for (let i = def.barIndex; i < bars.length; i++) {
145
+ const bar = bars[i]
146
+ if (bar === undefined) continue
147
+ const v = bar.volume
148
+ if (v > 0) {
149
+ const tp = (bar.high + bar.low + bar.close) / 3
150
+ sumVwp += tp * v
151
+ sumVol += v
152
+ // Prevailing AVWAP at this bar — same operands as the
153
+ // pure function, same addition order.
154
+ if (def.includeBands && sumVol > 0) {
155
+ const vwap = sumVwp / sumVol
156
+ const diff = tp - vwap
157
+ sumSqDev += diff * diff * v
158
+ }
159
+ }
160
+ }
161
+ state.sumVwp = sumVwp
162
+ state.sumVol = sumVol
163
+ state.sumSqDev = sumSqDev
164
+ state.series = series.slice()
165
+ }
166
+
167
+ /**
168
+ * Extend an anchor's series by one bar incrementally — O(1) per call.
169
+ * The new bar's absolute index in `bars` is the caller's
170
+ * responsibility to compute; we take it as a parameter so
171
+ * `appendBar` can be straight-line.
172
+ */
173
+ function extendAnchorByOne(
174
+ state: AnchorState,
175
+ bar: AVWAPBar,
176
+ absIndex: number,
177
+ ): void {
178
+ const def = state.definition
179
+ // Skip anchors that haven't started yet (anchor is in the future
180
+ // relative to this new bar).
181
+ if (absIndex < def.barIndex) return
182
+ // Skip anchors with no anchor inside the loaded window.
183
+ if (def.barIndex < 0) return
184
+
185
+ const v = bar.volume
186
+ const tp = (bar.high + bar.low + bar.close) / 3
187
+
188
+ if (v > 0) {
189
+ state.sumVwp += tp * v
190
+ state.sumVol += v
191
+ }
192
+
193
+ let vwap = Number.NaN
194
+ if (state.sumVol > 0) {
195
+ vwap = state.sumVwp / state.sumVol
196
+ }
197
+
198
+ // Bands: prevailing AVWAP at this bar — same arithmetic as
199
+ // `recomputeAnchor` and `computeAnchoredVwap`.
200
+ if (
201
+ def.includeBands &&
202
+ v > 0 &&
203
+ state.sumVol > 0 &&
204
+ Number.isFinite(vwap)
205
+ ) {
206
+ const diff = tp - vwap
207
+ state.sumSqDev += diff * diff * v
208
+ }
209
+
210
+ let upper1 = vwap
211
+ let lower1 = vwap
212
+ let upper2 = vwap
213
+ let lower2 = vwap
214
+ if (
215
+ def.includeBands &&
216
+ state.sumVol > 0 &&
217
+ Number.isFinite(vwap)
218
+ ) {
219
+ const variance = state.sumSqDev / state.sumVol
220
+ const stdDev = Math.sqrt(variance > 0 ? variance : 0)
221
+ upper1 = vwap + stdDev
222
+ lower1 = vwap - stdDev
223
+ upper2 = vwap + 2 * stdDev
224
+ lower2 = vwap - 2 * stdDev
225
+ }
226
+
227
+ state.series.push({
228
+ barIndex: absIndex,
229
+ vwap,
230
+ upper1,
231
+ lower1,
232
+ upper2,
233
+ lower2,
234
+ cumulativeVolume: state.sumVol,
235
+ })
236
+ }
237
+
238
+ // -------------------------------------------------------------------
239
+ // Lifecycle — kick off any initial anchors (none today, but reserved).
240
+ // -------------------------------------------------------------------
241
+ if (bars.length > 0) {
242
+ // No anchors yet — publish empty so subscribers see a defined
243
+ // starting value.
244
+ publish()
245
+ }
246
+
247
+ // -------------------------------------------------------------------
248
+ // Public mutators
249
+ // -------------------------------------------------------------------
250
+
251
+ function setBars(nextBars: ReadonlyArray<AVWAPBar>): void {
252
+ bars = nextBars.slice()
253
+ for (const state of anchorStates.values()) {
254
+ recomputeAnchor(state)
255
+ }
256
+ publish()
257
+ }
258
+
259
+ function addAnchor(def: AnchorDefinition): string | null {
260
+ // Replace-in-place on id collision. The brief allows either
261
+ // semantics; we choose replace because UIs that drag an anchor
262
+ // onto an existing one expect the existing one to update, not
263
+ // to throw.
264
+ const state: AnchorState = {
265
+ definition: { ...def },
266
+ sumVwp: 0,
267
+ sumVol: 0,
268
+ sumSqDev: 0,
269
+ series: [],
270
+ }
271
+ recomputeAnchor(state)
272
+ anchorStates.set(def.id, state)
273
+ publish()
274
+ return def.id
275
+ }
276
+
277
+ function removeAnchor(id: string): boolean {
278
+ const existed = anchorStates.delete(id)
279
+ if (existed) publish()
280
+ return existed
281
+ }
282
+
283
+ function updateAnchor(
284
+ id: string,
285
+ patch: Partial<Omit<AnchorDefinition, 'id'>>,
286
+ ): boolean {
287
+ const state = anchorStates.get(id)
288
+ if (state === undefined) return false
289
+
290
+ const prev = state.definition
291
+ // Merge into a fresh definition object — never mutate the
292
+ // existing one (immutability convention).
293
+ const nextDef: AnchorDefinition = {
294
+ ...prev,
295
+ ...patch,
296
+ id: prev.id,
297
+ }
298
+ state.definition = nextDef
299
+
300
+ // Recompute only when the math-affecting fields change.
301
+ const mathDirty =
302
+ (patch.barIndex !== undefined &&
303
+ patch.barIndex !== prev.barIndex) ||
304
+ (patch.includeBands !== undefined &&
305
+ patch.includeBands !== prev.includeBands)
306
+ if (mathDirty) {
307
+ recomputeAnchor(state)
308
+ }
309
+ publish()
310
+ return true
311
+ }
312
+
313
+ function appendBar(bar: AVWAPBar): void {
314
+ const absIndex = bars.length
315
+ bars.push(bar)
316
+ for (const state of anchorStates.values()) {
317
+ extendAnchorByOne(state, bar, absIndex)
318
+ }
319
+ publish()
320
+ }
321
+
322
+ // -------------------------------------------------------------------
323
+ // Dispose — silence mutators (same pattern as the rest of the codebase)
324
+ // -------------------------------------------------------------------
325
+ let disposed = false
326
+ function dispose(): void {
327
+ if (disposed) return
328
+ disposed = true
329
+ }
330
+
331
+ function guard<T extends (...args: never[]) => unknown>(
332
+ fn: T,
333
+ fallback: ReturnType<T>,
334
+ ): T {
335
+ return ((...args: Parameters<T>): ReturnType<T> => {
336
+ if (disposed) return fallback
337
+ return fn(...args) as ReturnType<T>
338
+ }) as T
339
+ }
340
+
341
+ const guardedSetBars = guard(setBars, undefined as void)
342
+ const guardedAppendBar = guard(appendBar, undefined as void)
343
+
344
+ return {
345
+ anchors,
346
+ // Canonical verbs (API audit BLOCKER-001 harmonisation): `setData`
347
+ // for full replacement + `append` for single-item extension. Old
348
+ // names preserved as aliases for the deprecation window.
349
+ setData: guardedSetBars,
350
+ append: guardedAppendBar,
351
+ setBars: guardedSetBars,
352
+ addAnchor: guard(addAnchor, null),
353
+ removeAnchor: guard(removeAnchor, false),
354
+ updateAnchor: guard(updateAnchor, false),
355
+ appendBar: guardedAppendBar,
356
+ dispose,
357
+ }
358
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Public surface of the Anchored VWAP module.
3
+ *
4
+ * Consumers should import from this barrel. The barrel is re-exported from
5
+ * `packages/core/src/index.ts` so the public package surface stays a single
6
+ * import line.
7
+ */
8
+
9
+ export { computeAnchoredVwap } from './computeAnchoredVwap'
10
+ export { createAnchoredVwapController } from './createAnchoredVwapController'
11
+ export type {
12
+ ActiveAnchor,
13
+ AnchorDefinition,
14
+ AnchoredVwapController,
15
+ AVWAPBar,
16
+ AVWAPPoint,
17
+ } from './types'
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Anchored VWAP — public type contract.
3
+ *
4
+ * Anchored VWAP (AVWAP) is a volume-weighted average price calculation that
5
+ * starts from a specific, user-chosen anchor bar rather than rolling over a
6
+ * fixed window. Institutional traders anchor to earnings prints, swing
7
+ * highs/lows, session opens, or macro events and read the resulting line as
8
+ * a "fair price" reference from that moment forward. The ±1σ / ±2σ bands
9
+ * around the AVWAP form a volume-weighted standard-deviation envelope that
10
+ * is widely used for mean-reversion entries and exits.
11
+ *
12
+ * TradingView restricts the **number** of simultaneous AVWAP anchors on
13
+ * lower tiers; this controller is multi-anchor by design — every anchor
14
+ * tracks its own cumulative sums so incremental `appendBar` is O(1) per
15
+ * anchor per bar.
16
+ *
17
+ * This module owns the **data model + math only**. Rendering belongs to the
18
+ * `@klinechart-quant/core` Renderer/Scene layer (or a Vue/React adapter).
19
+ *
20
+ * See `docs/ROADMAP.md` §3 for the broader controller layering this fits
21
+ * into. The dispose-guard pattern follows
22
+ * `createIndicatorSelectorController.ts`.
23
+ */
24
+
25
+ import type { Signal } from '../../reactivity'
26
+
27
+ /**
28
+ * Minimum bar shape consumed by `computeAnchoredVwap`. Matches the
29
+ * cross-renderer KLineData subset used elsewhere in core. We intentionally
30
+ * do NOT require `open` or `timestamp` so callers can stream from any
31
+ * source.
32
+ */
33
+ export interface AVWAPBar {
34
+ high: number
35
+ low: number
36
+ close: number
37
+ volume: number
38
+ }
39
+
40
+ /**
41
+ * A single point of an Anchored VWAP series — one entry per bar from the
42
+ * anchor index (inclusive) through the end of the input.
43
+ *
44
+ * `barIndex` is the absolute bar index in the original input array (NOT a
45
+ * series-relative offset). Renderers map it directly onto their X-axis.
46
+ *
47
+ * When bands are disabled (`includeBands: false`) the four band fields are
48
+ * set equal to `vwap` so consumers do not need a `null` check.
49
+ *
50
+ * When a bar contributes no volume and there is no prior AVWAP (i.e. the
51
+ * anchor bar itself has `volume === 0`), every numeric field of the
52
+ * resulting point is `NaN`. See `computeAnchoredVwap.ts` for the
53
+ * carry-forward rules.
54
+ */
55
+ export interface AVWAPPoint {
56
+ /** Absolute bar index in the input series. */
57
+ barIndex: number
58
+ /** Volume-weighted average price from anchor up to this bar. */
59
+ vwap: number
60
+ /** vwap + 1σ. Equals vwap when bands are disabled. */
61
+ upper1: number
62
+ /** vwap − 1σ. Equals vwap when bands are disabled. */
63
+ lower1: number
64
+ /** vwap + 2σ. Equals vwap when bands are disabled. */
65
+ upper2: number
66
+ /** vwap − 2σ. Equals vwap when bands are disabled. */
67
+ lower2: number
68
+ /** Running sum of volume from the anchor to this bar. Useful for
69
+ * diagnostics, exhaustion checks, and adapter overlays. */
70
+ cumulativeVolume: number
71
+ }
72
+
73
+ /**
74
+ * Definition of an anchor instance. Multiple anchors can be active at the
75
+ * same time (e.g. one per session, one per earnings, one per swing low).
76
+ *
77
+ * `id` must be unique within the controller; the controller treats a
78
+ * collision on `addAnchor` as a replace-in-place to keep the API
79
+ * idempotent.
80
+ */
81
+ export interface AnchorDefinition {
82
+ /** Stable id. Caller-supplied; treat as opaque. */
83
+ id: string
84
+ /** Human-readable label (e.g. "Earnings Beat 2024-Q1"). */
85
+ label: string
86
+ /** Anchor position as an index into the controller's bar series. */
87
+ barIndex: number
88
+ /** Optional colour hint for the adapter — not used by the math. */
89
+ color?: string
90
+ /** Whether to compute the ±1σ / ±2σ bands for this anchor. */
91
+ includeBands: boolean
92
+ }
93
+
94
+ /**
95
+ * An anchor together with its computed AVWAP series. The series is a
96
+ * snapshot — calling `setBars`, `appendBar`, or `updateAnchor` produces a
97
+ * fresh array (immutability convention).
98
+ */
99
+ export interface ActiveAnchor {
100
+ definition: AnchorDefinition
101
+ series: ReadonlyArray<AVWAPPoint>
102
+ }
103
+
104
+ /**
105
+ * Framework-agnostic controller — mirrors the shape of
106
+ * `VolumeProfileController` and `IndicatorSelectorController` (signals for
107
+ * state, plain functions for mutations, idempotent `dispose`).
108
+ *
109
+ * Why this design:
110
+ * - Multi-anchor: every anchor tracks its own running sums so
111
+ * `appendBar` is O(anchors) per tick, not O(anchors × bars).
112
+ * - Signal-based: any adapter (React `useSyncExternalStore`, Vue effect,
113
+ * Angular `toSignal`) can bridge without coupling to a framework.
114
+ * - Dispose-guard: mutators become silent no-ops after `dispose`, so a
115
+ * component that unmounts mid-stream cannot leak updates into a stale
116
+ * listener.
117
+ */
118
+ export interface AnchoredVwapController {
119
+ /** All currently active anchors with their up-to-date series. */
120
+ readonly anchors: Signal<ReadonlyArray<ActiveAnchor>>
121
+
122
+ /**
123
+ * Replace the underlying bar series and recompute every active anchor
124
+ * from scratch — canonical method, aligned with the cross-controller
125
+ * `setData()` convention (MtfController). Closes API audit BLOCKER-001
126
+ * (5-verb intake proliferation).
127
+ */
128
+ setData(bars: ReadonlyArray<AVWAPBar>): void
129
+
130
+ /**
131
+ * @deprecated since 0.1.0-alpha.1 — use {@link AnchoredVwapController.setData}.
132
+ * Preserved as a non-removing alias for at least 6 months.
133
+ */
134
+ setBars(bars: ReadonlyArray<AVWAPBar>): void
135
+
136
+ /**
137
+ * Add an anchor and compute its series immediately. Returns the
138
+ * anchor's id (the same one passed in `def.id`). If an anchor with the
139
+ * same id already exists it is **replaced** — that keeps the API
140
+ * idempotent and matches what UIs expect when the user drags an anchor
141
+ * onto an existing one.
142
+ *
143
+ * Returns `null` after dispose.
144
+ */
145
+ addAnchor(def: AnchorDefinition): string | null
146
+
147
+ /**
148
+ * Remove an anchor by id. Returns `true` when an anchor was actually
149
+ * removed, `false` when the id was unknown (or after dispose).
150
+ */
151
+ removeAnchor(id: string): boolean
152
+
153
+ /**
154
+ * Patch an anchor in place. Any of `label`, `barIndex`, `color`, and
155
+ * `includeBands` may change; the series is recomputed whenever
156
+ * `barIndex` or `includeBands` changes (a pure label change is a
157
+ * lightweight metadata swap).
158
+ *
159
+ * Returns `false` when the id is unknown (or after dispose).
160
+ */
161
+ updateAnchor(
162
+ id: string,
163
+ patch: Partial<Omit<AnchorDefinition, 'id'>>,
164
+ ): boolean
165
+
166
+ /**
167
+ * Append a single new bar — canonical method, aligned with the
168
+ * cross-controller `append()` convention (MtfController). Each anchor's
169
+ * series is extended **incrementally** by one point — the running
170
+ * cumulative sums make this O(1) per anchor per call. A full
171
+ * `computeAnchoredVwap` after N appends produces the same result; see
172
+ * the controller test that pins this equivalence.
173
+ */
174
+ append(bar: AVWAPBar): void
175
+
176
+ /**
177
+ * @deprecated since 0.1.0-alpha.1 — use {@link AnchoredVwapController.append}.
178
+ * Preserved as a non-removing alias for at least 6 months.
179
+ */
180
+ appendBar(bar: AVWAPBar): void
181
+
182
+ /**
183
+ * Stop emitting. Subsequent mutator calls are silent no-ops; previously
184
+ * attached subscribers receive no further notifications. Idempotent.
185
+ */
186
+ dispose(): void
187
+ }