@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,207 @@
1
+ import { KLineChartError } from '../errors';
2
+ /** Compute true range for a bar against the prior close. */
3
+ const trueRange = (bar, prevClose) => {
4
+ const hl = bar.high - bar.low;
5
+ if (prevClose === null)
6
+ return hl;
7
+ const hc = Math.abs(bar.high - prevClose);
8
+ const lc = Math.abs(bar.low - prevClose);
9
+ return Math.max(hl, hc, lc);
10
+ };
11
+ /**
12
+ * Build a Renko transform.
13
+ *
14
+ * The transform supports both `transform(input, config)` and `appendBar(bar)`.
15
+ * The config passed to `transform` is also captured for subsequent
16
+ * `appendBar` calls — so the typical flow is:
17
+ *
18
+ * const r = createRenko()
19
+ * const history = r.transform(historicalBars, { brickSize: 10 })
20
+ * // ...later, as ticks arrive:
21
+ * const newBricks = r.appendBar(liveBar)
22
+ */
23
+ export function createRenko() {
24
+ let state = {
25
+ lastBrickClose: null,
26
+ lastDirection: null,
27
+ nextIndex: 0,
28
+ trWindow: [],
29
+ prevClose: null,
30
+ lastBrickSize: null,
31
+ };
32
+ let activeConfig = { brickSize: 1 };
33
+ /**
34
+ * Return the current effective brick size given the active config and the
35
+ * current ATR window. Returns `null` when ATR mode is enabled but the
36
+ * window hasn't filled yet (no bricks can form until we have a brick
37
+ * size).
38
+ */
39
+ const currentBrickSize = () => {
40
+ if (activeConfig.useATR) {
41
+ const period = activeConfig.useATR.period;
42
+ if (state.trWindow.length < period)
43
+ return null;
44
+ let sum = 0;
45
+ // Use only the most recent `period` entries — older history is
46
+ // not part of the rolling ATR (Wilder's smoothing is a separate
47
+ // discussion; we use the simple rolling mean which is the
48
+ // baseline TradingView ATR-Renko shows).
49
+ for (let i = state.trWindow.length - period; i < state.trWindow.length; i++) {
50
+ sum += state.trWindow[i] ?? 0;
51
+ }
52
+ return sum / period;
53
+ }
54
+ return activeConfig.brickSize ?? null;
55
+ };
56
+ /**
57
+ * Try to emit bricks from a single input bar. The bar's `close` is the
58
+ * trigger; we ignore intra-bar high/low for brick formation because Renko
59
+ * is canonically a *close-only* construction. (Using high/low works on
60
+ * tick data but creates phantom bricks on OHLC bars.)
61
+ */
62
+ const emitBricksFromBar = (bar, sourceIndex) => {
63
+ const out = [];
64
+ const brickSize = currentBrickSize();
65
+ if (brickSize === null || brickSize <= 0)
66
+ return out;
67
+ // Initialise the "last brick close" lazily on the first bar — we
68
+ // anchor it to the bar's close so the first non-trivial move starts
69
+ // brick formation. (Anchoring to `open` would mean the very first bar
70
+ // could itself form a brick, which differs from the convention.)
71
+ if (state.lastBrickClose === null) {
72
+ state.lastBrickClose = bar.close;
73
+ return out;
74
+ }
75
+ const close = bar.close;
76
+ let firstBrickInThisBar = true;
77
+ // Keep stepping bricks until the close no longer satisfies the
78
+ // threshold. Each iteration emits one brick and advances state.
79
+ // Loop bound: at most ceil(|close - lastBrickClose| / brickSize) — a
80
+ // hard upper bound prevents pathological infinite loops if brickSize
81
+ // becomes zero mid-iteration.
82
+ let safety = 0;
83
+ while (safety++ < 1_000_000) {
84
+ const last = state.lastBrickClose;
85
+ if (last === null)
86
+ break;
87
+ const diff = close - last;
88
+ // Continuation needs 1×, reversal needs 2×. First-ever brick uses 1×.
89
+ let upThreshold;
90
+ let downThreshold;
91
+ if (state.lastDirection === 'up') {
92
+ upThreshold = brickSize;
93
+ downThreshold = -2 * brickSize;
94
+ }
95
+ else if (state.lastDirection === 'down') {
96
+ upThreshold = 2 * brickSize;
97
+ downThreshold = -brickSize;
98
+ }
99
+ else {
100
+ upThreshold = brickSize;
101
+ downThreshold = -brickSize;
102
+ }
103
+ if (diff >= upThreshold) {
104
+ const newClose = last + brickSize;
105
+ out.push({
106
+ timestamp: bar.timestamp,
107
+ open: last,
108
+ close: newClose,
109
+ high: newClose,
110
+ low: last,
111
+ volume: firstBrickInThisBar ? bar.volume : 0,
112
+ sourceBarIndexStart: sourceIndex,
113
+ sourceBarIndexEnd: sourceIndex,
114
+ meta: { direction: 'up', brickSize },
115
+ });
116
+ state.lastBrickClose = newClose;
117
+ state.lastDirection = 'up';
118
+ state.lastBrickSize = brickSize;
119
+ firstBrickInThisBar = false;
120
+ continue;
121
+ }
122
+ if (diff <= downThreshold) {
123
+ const newClose = last - brickSize;
124
+ out.push({
125
+ timestamp: bar.timestamp,
126
+ open: last,
127
+ close: newClose,
128
+ high: last,
129
+ low: newClose,
130
+ volume: firstBrickInThisBar ? bar.volume : 0,
131
+ sourceBarIndexStart: sourceIndex,
132
+ sourceBarIndexEnd: sourceIndex,
133
+ meta: { direction: 'down', brickSize },
134
+ });
135
+ state.lastBrickClose = newClose;
136
+ state.lastDirection = 'down';
137
+ state.lastBrickSize = brickSize;
138
+ firstBrickInThisBar = false;
139
+ continue;
140
+ }
141
+ break;
142
+ }
143
+ return out;
144
+ };
145
+ const consumeBar = (bar) => {
146
+ const sourceIndex = state.nextIndex;
147
+ // Update TR window BEFORE checking brick formation so the first ATR
148
+ // window's worth of bars participate in brick sizing as soon as
149
+ // possible.
150
+ const tr = trueRange(bar, state.prevClose);
151
+ state.trWindow.push(tr);
152
+ // Cap the window growth to twice the period for memory bound;
153
+ // anything older is never read.
154
+ if (activeConfig.useATR) {
155
+ const period = activeConfig.useATR.period;
156
+ if (state.trWindow.length > period * 2) {
157
+ state.trWindow = state.trWindow.slice(state.trWindow.length - period);
158
+ }
159
+ }
160
+ else if (state.trWindow.length > 2048) {
161
+ // For non-ATR mode we don't need the window at all — clear it.
162
+ state.trWindow = [];
163
+ }
164
+ state.prevClose = bar.close;
165
+ const emitted = emitBricksFromBar(bar, sourceIndex);
166
+ state.nextIndex = sourceIndex + 1;
167
+ return emitted;
168
+ };
169
+ const resetState = () => {
170
+ state = {
171
+ lastBrickClose: null,
172
+ lastDirection: null,
173
+ nextIndex: 0,
174
+ trWindow: [],
175
+ prevClose: null,
176
+ lastBrickSize: null,
177
+ };
178
+ };
179
+ return {
180
+ typeId: 'renko',
181
+ transform(input, config) {
182
+ // Validate: at least one mode must be set with sane values.
183
+ if (!config.useATR && (config.brickSize === undefined || config.brickSize <= 0)) {
184
+ throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: config requires brickSize > 0 or useATR { period }');
185
+ }
186
+ if (config.useATR && config.useATR.period < 1) {
187
+ throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: useATR.period must be >= 1');
188
+ }
189
+ activeConfig = config;
190
+ resetState();
191
+ const out = [];
192
+ for (const bar of input) {
193
+ const fresh = consumeBar(bar);
194
+ for (const b of fresh)
195
+ out.push(b);
196
+ }
197
+ return out;
198
+ },
199
+ appendBar(bar) {
200
+ return consumeBar(bar);
201
+ },
202
+ reset() {
203
+ resetState();
204
+ },
205
+ };
206
+ }
207
+ //# sourceMappingURL=renko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renko.js","sourceRoot":"","sources":["../../src/chartTypes/renko.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Chart-type transformers — public type contract.
3
+ *
4
+ * A "chart type" in TradingView (Heikin Ashi, Renko, P&F, Range Bars, etc.) is
5
+ * a **data transform**, not a different renderer. Every output is still
6
+ * OHLCV-shaped, so the same candle renderer paints all of them. This package
7
+ * is therefore deliberately headless: rendering belongs to the
8
+ * Renderer/Scene layer (see `docs/ROADMAP.md` §0).
9
+ *
10
+ * Why this matters for the WebGPU path: because the output is OHLCV, the
11
+ * existing instanced-quad K-line vertex pipeline (see `docs/ROADMAP.md` §2.3)
12
+ * draws Heikin Ashi / Renko / P&F / Range Bars at the same throughput as raw
13
+ * candles — no new render path, no new shader.
14
+ *
15
+ * ## Two transforms in one interface — batch vs incremental
16
+ *
17
+ * Every transform here supports two modes:
18
+ *
19
+ * - **Batch** (`transform`): pure function over an OHLCV slice. Re-derives the
20
+ * output from scratch. Use this for chart loads / history scrolls.
21
+ * - **Incremental** (`appendBar`): consume one live bar at a time, emit zero
22
+ * or more output bars, and update internal state. Use this for streaming
23
+ * quotes.
24
+ *
25
+ * Calling `appendBar` repeatedly over the same sequence must produce **bit-for-
26
+ * bit identical** output to a single `transform` over that sequence. The test
27
+ * suite enforces this with a randomised property test on a ≥30-bar input.
28
+ *
29
+ * ## A note on time semantics
30
+ *
31
+ * Renko, P&F and Range Bars all break the "one input bar = one output bar"
32
+ * assumption. We preserve provenance with `sourceBarIndexStart` /
33
+ * `sourceBarIndexEnd` so callers can map back to the source series for
34
+ * tooltips, x-axis labels, and event correlation. The `timestamp` on a
35
+ * derived bar is the timestamp of the source bar that **closed** it (i.e. the
36
+ * trigger).
37
+ */
38
+ /** Standard OHLCV row. Timestamps are epoch milliseconds. */
39
+ export interface OHLCV {
40
+ timestamp: number;
41
+ open: number;
42
+ high: number;
43
+ low: number;
44
+ close: number;
45
+ volume: number;
46
+ }
47
+ /**
48
+ * One output bar from a chart-type transform. Extends `OHLCV` so it can flow
49
+ * through the same scale / renderer pipeline as raw candles.
50
+ *
51
+ * `sourceBarIndexStart` / `sourceBarIndexEnd` mark which input rows were
52
+ * aggregated into this output row (inclusive). For 1:1 transforms (Heikin
53
+ * Ashi) they are equal. For aggregating transforms (Renko, P&F, Range Bars)
54
+ * they describe a range of source rows. For "fanning" transforms — one input
55
+ * bar that produces multiple output bars (large-gap Renko, oversized Range
56
+ * bar) — every fanned-out output row shares the same start/end index.
57
+ */
58
+ export interface TransformedBar extends OHLCV {
59
+ /** Lowest source index folded into this output bar (inclusive). */
60
+ sourceBarIndexStart: number;
61
+ /** Highest source index folded into this output bar (inclusive). */
62
+ sourceBarIndexEnd: number;
63
+ /**
64
+ * Transform-specific metadata. Marked `Readonly` so consumers can rely on
65
+ * structural sharing — a transform must never mutate metadata after
66
+ * emitting it.
67
+ */
68
+ meta?: Readonly<Record<string, unknown>>;
69
+ }
70
+ /**
71
+ * Common shape for all chart-type transformers.
72
+ *
73
+ * `transform` is pure — it does NOT mutate `input` and (for stateful
74
+ * transforms) calling it resets internal state first so the result depends
75
+ * only on `input` + `config`.
76
+ *
77
+ * `appendBar` is incremental — it does mutate internal state. Calling
78
+ * `reset()` returns the transform to its initial state.
79
+ *
80
+ * `typeId` is a stable, human-readable identifier used by the scene/registry.
81
+ */
82
+ export interface ChartTypeTransform<TConfig = unknown> {
83
+ readonly typeId: string;
84
+ transform(input: ReadonlyArray<OHLCV>, config: TConfig): ReadonlyArray<TransformedBar>;
85
+ /**
86
+ * Append one input bar and emit zero, one, or many output bars.
87
+ *
88
+ * Implementations that do not support incremental mode omit this method.
89
+ * For Heikin Ashi the output is always exactly one bar per call. For
90
+ * Renko / Range Bars / P&F the count can be 0..N depending on whether the
91
+ * new bar triggers brick/box formation.
92
+ */
93
+ appendBar?(input: OHLCV): ReadonlyArray<TransformedBar>;
94
+ /** Drop internal state. Idempotent. Safe to call on stateless transforms. */
95
+ reset?(): void;
96
+ }
97
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chartTypes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,KAAK;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAe,SAAQ,KAAK;IACzC,mEAAmE;IACnE,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB,CAAC,OAAO,GAAG,OAAO;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA;IACtF;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA;IACvD,6EAA6E;IAC7E,KAAK,CAAC,IAAI,IAAI,CAAA;CACjB"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Chart-type transformers — public type contract.
3
+ *
4
+ * A "chart type" in TradingView (Heikin Ashi, Renko, P&F, Range Bars, etc.) is
5
+ * a **data transform**, not a different renderer. Every output is still
6
+ * OHLCV-shaped, so the same candle renderer paints all of them. This package
7
+ * is therefore deliberately headless: rendering belongs to the
8
+ * Renderer/Scene layer (see `docs/ROADMAP.md` §0).
9
+ *
10
+ * Why this matters for the WebGPU path: because the output is OHLCV, the
11
+ * existing instanced-quad K-line vertex pipeline (see `docs/ROADMAP.md` §2.3)
12
+ * draws Heikin Ashi / Renko / P&F / Range Bars at the same throughput as raw
13
+ * candles — no new render path, no new shader.
14
+ *
15
+ * ## Two transforms in one interface — batch vs incremental
16
+ *
17
+ * Every transform here supports two modes:
18
+ *
19
+ * - **Batch** (`transform`): pure function over an OHLCV slice. Re-derives the
20
+ * output from scratch. Use this for chart loads / history scrolls.
21
+ * - **Incremental** (`appendBar`): consume one live bar at a time, emit zero
22
+ * or more output bars, and update internal state. Use this for streaming
23
+ * quotes.
24
+ *
25
+ * Calling `appendBar` repeatedly over the same sequence must produce **bit-for-
26
+ * bit identical** output to a single `transform` over that sequence. The test
27
+ * suite enforces this with a randomised property test on a ≥30-bar input.
28
+ *
29
+ * ## A note on time semantics
30
+ *
31
+ * Renko, P&F and Range Bars all break the "one input bar = one output bar"
32
+ * assumption. We preserve provenance with `sourceBarIndexStart` /
33
+ * `sourceBarIndexEnd` so callers can map back to the source series for
34
+ * tooltips, x-axis labels, and event correlation. The `timestamp` on a
35
+ * derived bar is the timestamp of the source bar that **closed** it (i.e. the
36
+ * trigger).
37
+ */
38
+ export {};
39
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chartTypes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Pure math: anchored VWAP + volume-weighted standard-deviation bands.
3
+ *
4
+ * Used by `createAnchoredVwapController` for the from-scratch path
5
+ * (`setBars`, `addAnchor`, `updateAnchor` when `barIndex` changes). The
6
+ * controller's incremental `appendBar` reuses the same formulas via
7
+ * running sums; the controller's tests pin equivalence between the two
8
+ * paths.
9
+ *
10
+ * Math summary (formal derivation in `docs/ROADMAP.md` §3):
11
+ *
12
+ * typicalPrice(j) = (H[j] + L[j] + C[j]) / 3
13
+ * vwp(j) = typicalPrice(j) * V[j]
14
+ * sumVwp(i) = Σ_{j=a..i} vwp(j)
15
+ * sumVol(i) = Σ_{j=a..i} V[j]
16
+ * AVWAP(i) = sumVwp(i) / sumVol(i) (when sumVol > 0)
17
+ *
18
+ * ─── important subtlety ─────────────────────────────────────────────────
19
+ * The standard-deviation bands MUST use the **prevailing** AVWAP(j) at
20
+ * each bar j ∈ [a..i], NOT the final AVWAP(i). Naive implementations that
21
+ * reuse the final mean understate the deviation early in the anchor and
22
+ * overstate it late — the bands wind up visibly off-centre on long
23
+ * anchors. The dedicated test
24
+ * `computeAnchoredVwap.test.ts → "bands use prevailing AVWAP at j"` pins
25
+ * this and would catch a regression to the wrong formula.
26
+ *
27
+ * sqDev(j) = (typicalPrice(j) - AVWAP(j))^2 * V[j]
28
+ * sumSqDev(i) = Σ_{j=a..i} sqDev(j)
29
+ * variance(i) = sumSqDev(i) / sumVol(i)
30
+ * stdDev(i) = sqrt(variance(i))
31
+ * upper1(i) = AVWAP(i) + stdDev(i)
32
+ * lower1(i) = AVWAP(i) - stdDev(i)
33
+ * upper2(i) = AVWAP(i) + 2 * stdDev(i)
34
+ * lower2(i) = AVWAP(i) - 2 * stdDev(i)
35
+ *
36
+ * Zero-volume handling:
37
+ * - A bar with `volume === 0` contributes 0 to numerator, 0 to
38
+ * denominator, and 0 to the squared-deviation sum. The cumulative
39
+ * volume is unchanged.
40
+ * - If the cumulative volume is still > 0 at this bar (i.e. there was a
41
+ * prior non-zero bar) the AVWAP and bands **carry forward** the prior
42
+ * values — they are still mathematically well-defined.
43
+ * - If the cumulative volume is 0 (i.e. the anchor bar itself has
44
+ * volume 0 and every subsequent bar so far has volume 0 too), the
45
+ * point's `vwap` and band fields are `NaN`. The series still has an
46
+ * entry for the bar — `barIndex` and `cumulativeVolume` are filled in.
47
+ */
48
+ import type { AVWAPBar, AVWAPPoint } from './types';
49
+ /**
50
+ * Compute the Anchored VWAP series for `bars`, anchored at
51
+ * `anchorIndex` (inclusive). Returns one `AVWAPPoint` per bar from
52
+ * `bars[anchorIndex]` through `bars[bars.length - 1]`.
53
+ *
54
+ * @param bars the bar series; the anchor must lie inside it
55
+ * @param anchorIndex 0-based index of the anchor bar (must satisfy
56
+ * `0 <= anchorIndex < bars.length`)
57
+ * @param includeBands when `false`, the four band fields equal `vwap` and
58
+ * the (cheaper) one-pass cumulative-volume math is
59
+ * used. The second pass that drives the bands is
60
+ * skipped entirely.
61
+ *
62
+ * @throws RangeError when `anchorIndex` is out of range and `bars` is
63
+ * non-empty. An empty `bars` array returns `[]` even
64
+ * if `anchorIndex` would otherwise be invalid — this
65
+ * mirrors the "no data, no work" convention used by
66
+ * the volume-profile controller.
67
+ *
68
+ * @internal — building block used by the corresponding controller
69
+ * factory. Reachable today via the top-level `@klinechart-quant/core`
70
+ * barrel but **NOT part of the supported public API**. typedoc / api-
71
+ * extractor hide it from generated docs. Prefer the controller
72
+ * factory (e.g. `createVolumeProfileController`) for stable user code.
73
+ * Closes API audit BLOCKER-002 (export * leakage taxonomy).
74
+ */
75
+ export declare function computeAnchoredVwap(bars: ReadonlyArray<AVWAPBar>, anchorIndex: number, includeBands: boolean): ReadonlyArray<AVWAPPoint>;
76
+ //# sourceMappingURL=computeAnchoredVwap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeAnchoredVwap.d.ts","sourceRoot":"","sources":["../../../src/components/anchoredVwap/computeAnchoredVwap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGnD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,GACtB,aAAa,CAAC,UAAU,CAAC,CA4F3B"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Pure math: anchored VWAP + volume-weighted standard-deviation bands.
3
+ *
4
+ * Used by `createAnchoredVwapController` for the from-scratch path
5
+ * (`setBars`, `addAnchor`, `updateAnchor` when `barIndex` changes). The
6
+ * controller's incremental `appendBar` reuses the same formulas via
7
+ * running sums; the controller's tests pin equivalence between the two
8
+ * paths.
9
+ *
10
+ * Math summary (formal derivation in `docs/ROADMAP.md` §3):
11
+ *
12
+ * typicalPrice(j) = (H[j] + L[j] + C[j]) / 3
13
+ * vwp(j) = typicalPrice(j) * V[j]
14
+ * sumVwp(i) = Σ_{j=a..i} vwp(j)
15
+ * sumVol(i) = Σ_{j=a..i} V[j]
16
+ * AVWAP(i) = sumVwp(i) / sumVol(i) (when sumVol > 0)
17
+ *
18
+ * ─── important subtlety ─────────────────────────────────────────────────
19
+ * The standard-deviation bands MUST use the **prevailing** AVWAP(j) at
20
+ * each bar j ∈ [a..i], NOT the final AVWAP(i). Naive implementations that
21
+ * reuse the final mean understate the deviation early in the anchor and
22
+ * overstate it late — the bands wind up visibly off-centre on long
23
+ * anchors. The dedicated test
24
+ * `computeAnchoredVwap.test.ts → "bands use prevailing AVWAP at j"` pins
25
+ * this and would catch a regression to the wrong formula.
26
+ *
27
+ * sqDev(j) = (typicalPrice(j) - AVWAP(j))^2 * V[j]
28
+ * sumSqDev(i) = Σ_{j=a..i} sqDev(j)
29
+ * variance(i) = sumSqDev(i) / sumVol(i)
30
+ * stdDev(i) = sqrt(variance(i))
31
+ * upper1(i) = AVWAP(i) + stdDev(i)
32
+ * lower1(i) = AVWAP(i) - stdDev(i)
33
+ * upper2(i) = AVWAP(i) + 2 * stdDev(i)
34
+ * lower2(i) = AVWAP(i) - 2 * stdDev(i)
35
+ *
36
+ * Zero-volume handling:
37
+ * - A bar with `volume === 0` contributes 0 to numerator, 0 to
38
+ * denominator, and 0 to the squared-deviation sum. The cumulative
39
+ * volume is unchanged.
40
+ * - If the cumulative volume is still > 0 at this bar (i.e. there was a
41
+ * prior non-zero bar) the AVWAP and bands **carry forward** the prior
42
+ * values — they are still mathematically well-defined.
43
+ * - If the cumulative volume is 0 (i.e. the anchor bar itself has
44
+ * volume 0 and every subsequent bar so far has volume 0 too), the
45
+ * point's `vwap` and band fields are `NaN`. The series still has an
46
+ * entry for the bar — `barIndex` and `cumulativeVolume` are filled in.
47
+ */
48
+ import { KLineChartError } from '../../errors';
49
+ /**
50
+ * Compute the Anchored VWAP series for `bars`, anchored at
51
+ * `anchorIndex` (inclusive). Returns one `AVWAPPoint` per bar from
52
+ * `bars[anchorIndex]` through `bars[bars.length - 1]`.
53
+ *
54
+ * @param bars the bar series; the anchor must lie inside it
55
+ * @param anchorIndex 0-based index of the anchor bar (must satisfy
56
+ * `0 <= anchorIndex < bars.length`)
57
+ * @param includeBands when `false`, the four band fields equal `vwap` and
58
+ * the (cheaper) one-pass cumulative-volume math is
59
+ * used. The second pass that drives the bands is
60
+ * skipped entirely.
61
+ *
62
+ * @throws RangeError when `anchorIndex` is out of range and `bars` is
63
+ * non-empty. An empty `bars` array returns `[]` even
64
+ * if `anchorIndex` would otherwise be invalid — this
65
+ * mirrors the "no data, no work" convention used by
66
+ * the volume-profile controller.
67
+ *
68
+ * @internal — building block used by the corresponding controller
69
+ * factory. Reachable today via the top-level `@klinechart-quant/core`
70
+ * barrel but **NOT part of the supported public API**. typedoc / api-
71
+ * extractor hide it from generated docs. Prefer the controller
72
+ * factory (e.g. `createVolumeProfileController`) for stable user code.
73
+ * Closes API audit BLOCKER-002 (export * leakage taxonomy).
74
+ */
75
+ export function computeAnchoredVwap(bars, anchorIndex, includeBands) {
76
+ if (bars.length === 0)
77
+ return [];
78
+ if (anchorIndex < 0 || anchorIndex >= bars.length) {
79
+ throw new KLineChartError('AVWAP_ANCHOR_OUT_OF_RANGE', `anchoredVwap: anchorIndex ${anchorIndex} is out of range ` +
80
+ `for bars of length ${bars.length}`);
81
+ }
82
+ const out = [];
83
+ // Running sums, advanced bar-by-bar.
84
+ let sumVwp = 0;
85
+ let sumVol = 0;
86
+ let sumSqDev = 0;
87
+ // `prevVwap` carries forward when a bar has zero volume but the
88
+ // cumulative volume so far is > 0. Initial value `NaN` flags the
89
+ // "anchor bar volume 0" case (see the docstring).
90
+ let prevVwap = Number.NaN;
91
+ for (let i = anchorIndex; i < bars.length; i++) {
92
+ const bar = bars[i];
93
+ // Guard against sparse arrays / undefined entries. `Float64Array`
94
+ // would never have this hole, but plain arrays might.
95
+ if (bar === undefined)
96
+ continue;
97
+ const tp = (bar.high + bar.low + bar.close) / 3;
98
+ const v = bar.volume;
99
+ // First update cumulative volume + vwp. A v === 0 bar is a no-op
100
+ // here and the running totals stay where they were.
101
+ if (v > 0) {
102
+ sumVwp += tp * v;
103
+ sumVol += v;
104
+ }
105
+ let vwap;
106
+ if (sumVol > 0) {
107
+ vwap = sumVwp / sumVol;
108
+ prevVwap = vwap;
109
+ }
110
+ else {
111
+ // No volume ever ingested — emit NaN. This only happens when
112
+ // the anchor bar and every bar since it has v === 0.
113
+ vwap = Number.NaN;
114
+ }
115
+ // Bands: the *prevailing* AVWAP at bar j is the mean used to weigh
116
+ // sqDev. That's exactly the `vwap` we just computed. Important:
117
+ // if v === 0 the squared-deviation contribution is also 0, so we
118
+ // can skip the term entirely (which also avoids touching `tp`
119
+ // when `vwap` is NaN).
120
+ if (includeBands && v > 0 && Number.isFinite(vwap)) {
121
+ const diff = tp - vwap;
122
+ sumSqDev += diff * diff * v;
123
+ }
124
+ let upper1 = vwap;
125
+ let lower1 = vwap;
126
+ let upper2 = vwap;
127
+ let lower2 = vwap;
128
+ if (includeBands && sumVol > 0 && Number.isFinite(vwap)) {
129
+ const variance = sumSqDev / sumVol;
130
+ // Numerical safety: variance can be a tiny negative on
131
+ // catastrophic cancellation. Treat as 0.
132
+ const stdDev = Math.sqrt(variance > 0 ? variance : 0);
133
+ upper1 = vwap + stdDev;
134
+ lower1 = vwap - stdDev;
135
+ upper2 = vwap + 2 * stdDev;
136
+ lower2 = vwap - 2 * stdDev;
137
+ }
138
+ out.push({
139
+ barIndex: i,
140
+ vwap,
141
+ upper1,
142
+ lower1,
143
+ upper2,
144
+ lower2,
145
+ cumulativeVolume: sumVol,
146
+ });
147
+ // `prevVwap` is kept up to date for documentation/clarity even
148
+ // though we don't currently read it (the `sumVol > 0` branch above
149
+ // assigns directly). Left in place to make the carry-forward
150
+ // semantics explicit to future readers.
151
+ void prevVwap;
152
+ }
153
+ return out;
154
+ }
155
+ //# sourceMappingURL=computeAnchoredVwap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeAnchoredVwap.js","sourceRoot":"","sources":["../../../src/components/anchoredVwap/computeAnchoredVwap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
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
+ import type { AnchoredVwapController, AVWAPBar } from './types';
24
+ export interface AnchoredVwapControllerInit {
25
+ initialBars?: ReadonlyArray<AVWAPBar>;
26
+ }
27
+ export declare function createAnchoredVwapController(opts?: AnchoredVwapControllerInit): AnchoredVwapController;
28
+ //# sourceMappingURL=createAnchoredVwapController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAnchoredVwapController.d.ts","sourceRoot":"","sources":["../../../src/components/anchoredVwap/createAnchoredVwapController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAGR,sBAAsB,EACtB,QAAQ,EAEX,MAAM,SAAS,CAAA;AAuBhB,MAAM,WAAW,0BAA0B;IACvC,WAAW,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CACxC;AAED,wBAAgB,4BAA4B,CACxC,IAAI,CAAC,EAAE,0BAA0B,GAClC,sBAAsB,CAySxB"}