@363045841yyt/klinechart-core 0.8.13 → 0.8.14-alpha.2

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 (743) hide show
  1. package/dist/alerts/createAlertController.d.ts.map +1 -1
  2. package/dist/alerts/createAlertController.js +3 -3
  3. package/dist/alerts/createAlertController.js.map +1 -1
  4. package/dist/chartTypes/pointAndFigure.js +1 -1
  5. package/dist/chartTypes/pointAndFigure.js.map +1 -1
  6. package/dist/chartTypes/rangeBars.js +1 -1
  7. package/dist/chartTypes/rangeBars.js.map +1 -1
  8. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -1
  9. package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -1
  10. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -1
  11. package/dist/components/anchoredVwap/createAnchoredVwapController.js +4 -4
  12. package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -1
  13. package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -1
  14. package/dist/components/crosshairSync/createCrosshairSync.js +1 -1
  15. package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -1
  16. package/dist/components/footprint/createFootprintController.d.ts.map +1 -1
  17. package/dist/components/footprint/createFootprintController.js +1 -1
  18. package/dist/components/footprint/createFootprintController.js.map +1 -1
  19. package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -1
  20. package/dist/components/mtfOverlay/createMtfController.js +1 -1
  21. package/dist/components/mtfOverlay/createMtfController.js.map +1 -1
  22. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -1
  23. package/dist/components/orderBookHeatmap/createHeatmapController.js +3 -3
  24. package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -1
  25. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -1
  26. package/dist/components/orderBookHeatmap/createOrderBookState.js +1 -3
  27. package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -1
  28. package/dist/components/orderBookHeatmap/deltaArchive.js +1 -1
  29. package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -1
  30. package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -1
  31. package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -1
  32. package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -1
  33. package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -1
  34. package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -1
  35. package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -1
  36. package/dist/config/chartSettings.d.ts +19 -3
  37. package/dist/config/chartSettings.d.ts.map +1 -1
  38. package/dist/config/chartSettings.js +19 -1
  39. package/dist/config/chartSettings.js.map +1 -1
  40. package/dist/controllers/createChartController.d.ts.map +1 -1
  41. package/dist/controllers/createChartController.js +25 -3
  42. package/dist/controllers/createChartController.js.map +1 -1
  43. package/dist/controllers/createDrawingController.d.ts.map +1 -1
  44. package/dist/controllers/createDrawingController.js.map +1 -1
  45. package/dist/controllers/createIndicatorSelectorController.d.ts.map +1 -1
  46. package/dist/controllers/createIndicatorSelectorController.js +1 -1
  47. package/dist/controllers/createIndicatorSelectorController.js.map +1 -1
  48. package/dist/controllers/createToolbarController.d.ts.map +1 -1
  49. package/dist/controllers/createToolbarController.js.map +1 -1
  50. package/dist/controllers/types.d.ts +11 -7
  51. package/dist/controllers/types.d.ts.map +1 -1
  52. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  53. package/dist/data-fetchers/baostock.js.map +1 -1
  54. package/dist/data-fetchers/binance.d.ts.map +1 -1
  55. package/dist/data-fetchers/binance.js.map +1 -1
  56. package/dist/data-fetchers/dataBuffer.d.ts +11 -28
  57. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  58. package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
  59. package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
  60. package/dist/data-fetchers/dataBuffer.js +80 -172
  61. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  62. package/dist/data-fetchers/dataBufferTypes.d.ts +33 -2
  63. package/dist/data-fetchers/dataBufferTypes.d.ts.map +1 -1
  64. package/dist/data-fetchers/depthConnector.d.ts +1 -1
  65. package/dist/data-fetchers/depthConnector.d.ts.map +1 -1
  66. package/dist/data-fetchers/depthConnector.js.map +1 -1
  67. package/dist/data-fetchers/fetchScheduler.d.ts +12 -0
  68. package/dist/data-fetchers/fetchScheduler.d.ts.map +1 -0
  69. package/dist/data-fetchers/fetchScheduler.js +47 -0
  70. package/dist/data-fetchers/fetchScheduler.js.map +1 -0
  71. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts +5 -0
  72. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  73. package/dist/data-fetchers/fetcherDefinitionRegistry.js +12 -2
  74. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  75. package/dist/data-fetchers/gotdx.js.map +1 -1
  76. package/dist/data-fetchers/hundred-mock.d.ts.map +1 -1
  77. package/dist/data-fetchers/hundred-mock.js.map +1 -1
  78. package/dist/data-fetchers/index.d.ts +1 -1
  79. package/dist/data-fetchers/index.d.ts.map +1 -1
  80. package/dist/data-fetchers/kLineDataStore.d.ts +21 -0
  81. package/dist/data-fetchers/kLineDataStore.d.ts.map +1 -0
  82. package/dist/data-fetchers/kLineDataStore.js +77 -0
  83. package/dist/data-fetchers/kLineDataStore.js.map +1 -0
  84. package/dist/data-fetchers/router.d.ts.map +1 -1
  85. package/dist/data-fetchers/router.js.map +1 -1
  86. package/dist/data-fetchers/thousand-mock.d.ts.map +1 -1
  87. package/dist/data-fetchers/thousand-mock.js.map +1 -1
  88. package/dist/data-fetchers/timeKeyIndex.d.ts +10 -0
  89. package/dist/data-fetchers/timeKeyIndex.d.ts.map +1 -0
  90. package/dist/data-fetchers/timeKeyIndex.js +34 -0
  91. package/dist/data-fetchers/timeKeyIndex.js.map +1 -0
  92. package/dist/data-fetchers/timeShareBuffer.d.ts +3 -4
  93. package/dist/data-fetchers/timeShareBuffer.d.ts.map +1 -1
  94. package/dist/data-fetchers/timeShareBuffer.js +5 -5
  95. package/dist/data-fetchers/timeShareBuffer.js.map +1 -1
  96. package/dist/data-fetchers/tradingview.js.map +1 -1
  97. package/dist/engine/chart.d.ts +7 -5
  98. package/dist/engine/chart.d.ts.map +1 -1
  99. package/dist/engine/chart.js +9 -3
  100. package/dist/engine/chart.js.map +1 -1
  101. package/dist/engine/controller/interaction.d.ts +1 -1
  102. package/dist/engine/controller/interaction.d.ts.map +1 -1
  103. package/dist/engine/controller/interaction.js +1 -1
  104. package/dist/engine/controller/interaction.js.map +1 -1
  105. package/dist/engine/controller/pinchTracker.js +2 -2
  106. package/dist/engine/controller/pinchTracker.js.map +1 -1
  107. package/dist/engine/data/chartDataManager.d.ts +23 -26
  108. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  109. package/dist/engine/data/chartDataManager.js +174 -414
  110. package/dist/engine/data/chartDataManager.js.map +1 -1
  111. package/dist/engine/data/comparisonManager.d.ts +36 -0
  112. package/dist/engine/data/comparisonManager.d.ts.map +1 -0
  113. package/dist/engine/data/comparisonManager.js +165 -0
  114. package/dist/engine/data/comparisonManager.js.map +1 -0
  115. package/dist/engine/data/fetchBatchScheduler.d.ts +12 -0
  116. package/dist/engine/data/fetchBatchScheduler.d.ts.map +1 -0
  117. package/dist/engine/data/fetchBatchScheduler.js +54 -0
  118. package/dist/engine/data/fetchBatchScheduler.js.map +1 -0
  119. package/dist/engine/data/incrementalLoadHint.d.ts +25 -0
  120. package/dist/engine/data/incrementalLoadHint.d.ts.map +1 -0
  121. package/dist/engine/data/incrementalLoadHint.js +91 -0
  122. package/dist/engine/data/incrementalLoadHint.js.map +1 -0
  123. package/dist/engine/data/scrollCompensator.d.ts +26 -0
  124. package/dist/engine/data/scrollCompensator.d.ts.map +1 -0
  125. package/dist/engine/data/scrollCompensator.js +80 -0
  126. package/dist/engine/data/scrollCompensator.js.map +1 -0
  127. package/dist/engine/drawing/AnchorCollector.d.ts +1 -1
  128. package/dist/engine/drawing/AnchorCollector.d.ts.map +1 -1
  129. package/dist/engine/drawing/AnchorCollector.js.map +1 -1
  130. package/dist/engine/drawing/DragHandler.d.ts +1 -1
  131. package/dist/engine/drawing/DragHandler.d.ts.map +1 -1
  132. package/dist/engine/drawing/DragHandler.js.map +1 -1
  133. package/dist/engine/drawing/DrawingState.d.ts +1 -1
  134. package/dist/engine/drawing/DrawingState.d.ts.map +1 -1
  135. package/dist/engine/drawing/HitTester.d.ts +1 -1
  136. package/dist/engine/drawing/HitTester.d.ts.map +1 -1
  137. package/dist/engine/drawing/HitTester.js +1 -1
  138. package/dist/engine/drawing/HitTester.js.map +1 -1
  139. package/dist/engine/drawing/PreviewRenderer.d.ts +1 -1
  140. package/dist/engine/drawing/PreviewRenderer.d.ts.map +1 -1
  141. package/dist/engine/drawing/PreviewRenderer.js.map +1 -1
  142. package/dist/engine/drawing/coordinateUtils.d.ts +1 -1
  143. package/dist/engine/drawing/coordinateUtils.d.ts.map +1 -1
  144. package/dist/engine/drawing/interaction.d.ts +1 -1
  145. package/dist/engine/drawing/interaction.d.ts.map +1 -1
  146. package/dist/engine/drawing/interaction.js +3 -3
  147. package/dist/engine/drawing/interaction.js.map +1 -1
  148. package/dist/engine/drawing/plugin.d.ts.map +1 -1
  149. package/dist/engine/drawing/plugin.js +1 -1
  150. package/dist/engine/drawing/plugin.js.map +1 -1
  151. package/dist/engine/indicators/calculators/bands.d.ts.map +1 -1
  152. package/dist/engine/indicators/calculators/bands.js.map +1 -1
  153. package/dist/engine/indicators/calculators/movingAverages.d.ts.map +1 -1
  154. package/dist/engine/indicators/calculators/movingAverages.js.map +1 -1
  155. package/dist/engine/indicators/calculators/oscillators.d.ts.map +1 -1
  156. package/dist/engine/indicators/calculators/oscillators.js.map +1 -1
  157. package/dist/engine/indicators/calculators/volatility.d.ts.map +1 -1
  158. package/dist/engine/indicators/calculators/volatility.js.map +1 -1
  159. package/dist/engine/indicators/chartIndicatorManager.d.ts +4 -4
  160. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  161. package/dist/engine/indicators/chartIndicatorManager.js +4 -4
  162. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  163. package/dist/engine/indicators/indicator.worker.js +1 -1
  164. package/dist/engine/indicators/indicator.worker.js.map +1 -1
  165. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts +1 -1
  166. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  167. package/dist/engine/indicators/indicatorDefinitionRegistry.js +1 -1
  168. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  169. package/dist/engine/indicators/indicatorMetadata.d.ts +1 -1
  170. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  171. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  172. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  173. package/dist/engine/indicators/indicatorRegistry.js +2 -2
  174. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  175. package/dist/engine/indicators/indicatorRuntime.d.ts.map +1 -1
  176. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  177. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  178. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  179. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  180. package/dist/engine/indicators/scheduler.js +5 -6
  181. package/dist/engine/indicators/scheduler.js.map +1 -1
  182. package/dist/engine/indicators/stateComposer.d.ts +29 -29
  183. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  184. package/dist/engine/indicators/stateComposer.js.map +1 -1
  185. package/dist/engine/indicators/visibleStateComposers.js +2 -2
  186. package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
  187. package/dist/engine/indicators/workerProtocol.d.ts.map +1 -1
  188. package/dist/engine/indicators/workerProtocol.js.map +1 -1
  189. package/dist/engine/layout/chartPaneLayout.d.ts +2 -2
  190. package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
  191. package/dist/engine/layout/chartPaneLayout.js +1 -1
  192. package/dist/engine/layout/chartPaneLayout.js.map +1 -1
  193. package/dist/engine/layout/pane.d.ts +2 -2
  194. package/dist/engine/layout/pane.d.ts.map +1 -1
  195. package/dist/engine/layout/pane.js +1 -1
  196. package/dist/engine/layout/pane.js.map +1 -1
  197. package/dist/engine/marker/registry.js +2 -2
  198. package/dist/engine/marker/registry.js.map +1 -1
  199. package/dist/engine/modes/kLineMode.d.ts +2 -2
  200. package/dist/engine/modes/kLineMode.d.ts.map +1 -1
  201. package/dist/engine/modes/kLineMode.js.map +1 -1
  202. package/dist/engine/modes/timeShareMode.d.ts +2 -2
  203. package/dist/engine/modes/timeShareMode.d.ts.map +1 -1
  204. package/dist/engine/modes/timeShareMode.js +1 -1
  205. package/dist/engine/modes/timeShareMode.js.map +1 -1
  206. package/dist/engine/modes/types.d.ts +1 -1
  207. package/dist/engine/modes/types.d.ts.map +1 -1
  208. package/dist/engine/paneRenderer.d.ts +1 -1
  209. package/dist/engine/paneRenderer.d.ts.map +1 -1
  210. package/dist/engine/paneRenderer.js.map +1 -1
  211. package/dist/engine/render/chartRenderer.d.ts +7 -7
  212. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  213. package/dist/engine/render/chartRenderer.js +15 -15
  214. package/dist/engine/render/chartRenderer.js.map +1 -1
  215. package/dist/engine/render/layers/candleLayer.d.ts +1 -1
  216. package/dist/engine/render/layers/candleLayer.d.ts.map +1 -1
  217. package/dist/engine/render/layers/candleLayer.js.map +1 -1
  218. package/dist/engine/render/layers/comparisonLineLayer.d.ts +1 -1
  219. package/dist/engine/render/layers/comparisonLineLayer.d.ts.map +1 -1
  220. package/dist/engine/render/layers/comparisonLineLayer.js.map +1 -1
  221. package/dist/engine/render/layers/crosshairLayer.d.ts +1 -1
  222. package/dist/engine/render/layers/crosshairLayer.d.ts.map +1 -1
  223. package/dist/engine/render/layers/crosshairLayer.js.map +1 -1
  224. package/dist/engine/render/layers/customMarkersLayer.d.ts +1 -1
  225. package/dist/engine/render/layers/customMarkersLayer.d.ts.map +1 -1
  226. package/dist/engine/render/layers/customMarkersLayer.js.map +1 -1
  227. package/dist/engine/render/layers/extremaMarkersLayer.d.ts +1 -1
  228. package/dist/engine/render/layers/extremaMarkersLayer.d.ts.map +1 -1
  229. package/dist/engine/render/layers/extremaMarkersLayer.js.map +1 -1
  230. package/dist/engine/render/layers/gridLinesLayer.d.ts +1 -1
  231. package/dist/engine/render/layers/gridLinesLayer.d.ts.map +1 -1
  232. package/dist/engine/render/layers/gridLinesLayer.js.map +1 -1
  233. package/dist/engine/render/layers/lastPriceLabelLayer.d.ts +1 -1
  234. package/dist/engine/render/layers/lastPriceLabelLayer.d.ts.map +1 -1
  235. package/dist/engine/render/layers/lastPriceLabelLayer.js.map +1 -1
  236. package/dist/engine/render/layers/lastPriceLineLayer.d.ts +1 -1
  237. package/dist/engine/render/layers/lastPriceLineLayer.d.ts.map +1 -1
  238. package/dist/engine/render/layers/lastPriceLineLayer.js.map +1 -1
  239. package/dist/engine/render/layers/leftYAxisLayer.d.ts +1 -1
  240. package/dist/engine/render/layers/leftYAxisLayer.d.ts.map +1 -1
  241. package/dist/engine/render/layers/leftYAxisLayer.js.map +1 -1
  242. package/dist/engine/render/layers/mainIndicatorLegendLayer.d.ts +1 -1
  243. package/dist/engine/render/layers/mainIndicatorLegendLayer.d.ts.map +1 -1
  244. package/dist/engine/render/layers/mainIndicatorLegendLayer.js.map +1 -1
  245. package/dist/engine/render/layers/yAxisLayer.d.ts +1 -1
  246. package/dist/engine/render/layers/yAxisLayer.d.ts.map +1 -1
  247. package/dist/engine/render/layers/yAxisLayer.js.map +1 -1
  248. package/dist/engine/renderers/Indicator/atr.js +3 -3
  249. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  250. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  251. package/dist/engine/renderers/Indicator/boll.js +2 -2
  252. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  253. package/dist/engine/renderers/Indicator/cci.js +3 -3
  254. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  255. package/dist/engine/renderers/Indicator/chaikinVol.js +3 -3
  256. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  257. package/dist/engine/renderers/Indicator/cmf.js +4 -4
  258. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  259. package/dist/engine/renderers/Indicator/dema.js +3 -3
  260. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  261. package/dist/engine/renderers/Indicator/donchian.js +2 -2
  262. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  263. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  264. package/dist/engine/renderers/Indicator/ene.js +2 -2
  265. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  266. package/dist/engine/renderers/Indicator/expma.js +1 -1
  267. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  268. package/dist/engine/renderers/Indicator/fastk.js +4 -4
  269. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  270. package/dist/engine/renderers/Indicator/fib.js +2 -2
  271. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  272. package/dist/engine/renderers/Indicator/hma.js +3 -3
  273. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  274. package/dist/engine/renderers/Indicator/hv.js +3 -3
  275. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  276. package/dist/engine/renderers/Indicator/ichimoku.js +2 -2
  277. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  278. package/dist/engine/renderers/Indicator/kama.js +3 -3
  279. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  280. package/dist/engine/renderers/Indicator/keltner.js +2 -2
  281. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  282. package/dist/engine/renderers/Indicator/kst.js +3 -3
  283. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  284. package/dist/engine/renderers/Indicator/ma.js +2 -2
  285. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  286. package/dist/engine/renderers/Indicator/macd.js +2 -2
  287. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  288. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  289. package/dist/engine/renderers/Indicator/mfi.js +4 -4
  290. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  291. package/dist/engine/renderers/Indicator/mom.js +3 -3
  292. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  293. package/dist/engine/renderers/Indicator/obv.js +2 -2
  294. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  295. package/dist/engine/renderers/Indicator/parkinson.js +3 -3
  296. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  297. package/dist/engine/renderers/Indicator/pivot.js +2 -2
  298. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  299. package/dist/engine/renderers/Indicator/pvt.js +2 -2
  300. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  301. package/dist/engine/renderers/Indicator/roc.js +2 -2
  302. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  303. package/dist/engine/renderers/Indicator/rsi.js +3 -3
  304. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  305. package/dist/engine/renderers/Indicator/sar.js +2 -2
  306. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  307. package/dist/engine/renderers/Indicator/scale/atr_scale.d.ts.map +1 -1
  308. package/dist/engine/renderers/Indicator/scale/atr_scale.js.map +1 -1
  309. package/dist/engine/renderers/Indicator/scale/cci_scale.d.ts.map +1 -1
  310. package/dist/engine/renderers/Indicator/scale/cci_scale.js.map +1 -1
  311. package/dist/engine/renderers/Indicator/scale/fastk_scale.d.ts.map +1 -1
  312. package/dist/engine/renderers/Indicator/scale/fastk_scale.js.map +1 -1
  313. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  314. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +2 -2
  315. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  316. package/dist/engine/renderers/Indicator/scale/kst_scale.d.ts.map +1 -1
  317. package/dist/engine/renderers/Indicator/scale/kst_scale.js.map +1 -1
  318. package/dist/engine/renderers/Indicator/scale/macd_scale.d.ts.map +1 -1
  319. package/dist/engine/renderers/Indicator/scale/macd_scale.js.map +1 -1
  320. package/dist/engine/renderers/Indicator/scale/mom_scale.d.ts.map +1 -1
  321. package/dist/engine/renderers/Indicator/scale/mom_scale.js.map +1 -1
  322. package/dist/engine/renderers/Indicator/scale/rsi_scale.d.ts.map +1 -1
  323. package/dist/engine/renderers/Indicator/scale/rsi_scale.js.map +1 -1
  324. package/dist/engine/renderers/Indicator/scale/stoch_scale.d.ts.map +1 -1
  325. package/dist/engine/renderers/Indicator/scale/stoch_scale.js.map +1 -1
  326. package/dist/engine/renderers/Indicator/scale/volume_scale.d.ts.map +1 -1
  327. package/dist/engine/renderers/Indicator/scale/volume_scale.js.map +1 -1
  328. package/dist/engine/renderers/Indicator/scale/wmsr_scale.d.ts.map +1 -1
  329. package/dist/engine/renderers/Indicator/scale/wmsr_scale.js.map +1 -1
  330. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts +1 -1
  331. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -1
  332. package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -1
  333. package/dist/engine/renderers/Indicator/stoch.js +4 -4
  334. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  335. package/dist/engine/renderers/Indicator/structure.js +4 -4
  336. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  337. package/dist/engine/renderers/Indicator/supertrend.js +2 -2
  338. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  339. package/dist/engine/renderers/Indicator/tema.js +3 -3
  340. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  341. package/dist/engine/renderers/Indicator/trix.js +3 -3
  342. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  343. package/dist/engine/renderers/Indicator/vma.js +4 -4
  344. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  345. package/dist/engine/renderers/Indicator/volumeProfile.js +3 -3
  346. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  347. package/dist/engine/renderers/Indicator/vwap.js +2 -2
  348. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  349. package/dist/engine/renderers/Indicator/wma.js +3 -3
  350. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  351. package/dist/engine/renderers/Indicator/wmsr.js +3 -3
  352. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  353. package/dist/engine/renderers/Indicator/zones.js +4 -4
  354. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  355. package/dist/engine/renderers/candle.js +1 -1
  356. package/dist/engine/renderers/candle.js.map +1 -1
  357. package/dist/engine/renderers/crosshair.js +1 -1
  358. package/dist/engine/renderers/crosshair.js.map +1 -1
  359. package/dist/engine/renderers/customMarkers.js.map +1 -1
  360. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  361. package/dist/engine/renderers/extremaMarkers.js +59 -13
  362. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  363. package/dist/engine/renderers/gridLines.js +2 -2
  364. package/dist/engine/renderers/gridLines.js.map +1 -1
  365. package/dist/engine/renderers/lastPrice.js.map +1 -1
  366. package/dist/engine/renderers/leftYAxis.js +2 -2
  367. package/dist/engine/renderers/leftYAxis.js.map +1 -1
  368. package/dist/engine/renderers/paneTitle.d.ts.map +1 -1
  369. package/dist/engine/renderers/paneTitle.js +1 -1
  370. package/dist/engine/renderers/paneTitle.js.map +1 -1
  371. package/dist/engine/renderers/subVolume.js.map +1 -1
  372. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  373. package/dist/engine/renderers/timeAxis.js +1 -1
  374. package/dist/engine/renderers/timeAxis.js.map +1 -1
  375. package/dist/engine/renderers/timeShare.js.map +1 -1
  376. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  377. package/dist/engine/renderers/yAxis.js +2 -2
  378. package/dist/engine/renderers/yAxis.js.map +1 -1
  379. package/dist/engine/scale/priceScale.d.ts +1 -1
  380. package/dist/engine/scale/priceScale.d.ts.map +1 -1
  381. package/dist/engine/scale/priceScale.js.map +1 -1
  382. package/dist/engine/subPaneManager.d.ts +4 -4
  383. package/dist/engine/subPaneManager.d.ts.map +1 -1
  384. package/dist/engine/subPaneManager.js +5 -5
  385. package/dist/engine/subPaneManager.js.map +1 -1
  386. package/dist/engine/utils/tickPosition.d.ts.map +1 -1
  387. package/dist/engine/utils/tickPosition.js +1 -1
  388. package/dist/engine/utils/tickPosition.js.map +1 -1
  389. package/dist/engine/viewport/chartViewportManager.d.ts +1 -1
  390. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  391. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  392. package/dist/input/gesture.d.ts.map +1 -1
  393. package/dist/input/gesture.js +1 -1
  394. package/dist/input/gesture.js.map +1 -1
  395. package/dist/input/keyboard.d.ts.map +1 -1
  396. package/dist/input/keyboard.js +1 -1
  397. package/dist/input/keyboard.js.map +1 -1
  398. package/dist/mcp/chartBridge.d.ts.map +1 -1
  399. package/dist/mcp/chartBridge.js +1 -1
  400. package/dist/mcp/chartBridge.js.map +1 -1
  401. package/dist/plugin/PluginHost.d.ts.map +1 -1
  402. package/dist/plugin/PluginHost.js +2 -2
  403. package/dist/plugin/PluginHost.js.map +1 -1
  404. package/dist/plugin/PluginRegistry.d.ts.map +1 -1
  405. package/dist/plugin/PluginRegistry.js +1 -1
  406. package/dist/plugin/PluginRegistry.js.map +1 -1
  407. package/dist/plugin/rendererPluginManager.d.ts +1 -1
  408. package/dist/plugin/rendererPluginManager.d.ts.map +1 -1
  409. package/dist/plugin/rendererPluginManager.js +1 -1
  410. package/dist/plugin/rendererPluginManager.js.map +1 -1
  411. package/dist/plugin/types.d.ts +1 -1
  412. package/dist/plugin/types.d.ts.map +1 -1
  413. package/dist/render/createWebGLRenderer.d.ts +2 -2
  414. package/dist/render/createWebGLRenderer.d.ts.map +1 -1
  415. package/dist/render/createWebGLRenderer.js.map +1 -1
  416. package/dist/render/createWebGLSurfaceBackend.d.ts +1 -1
  417. package/dist/render/createWebGLSurfaceBackend.d.ts.map +1 -1
  418. package/dist/render/createWebGLSurfaceBackend.js.map +1 -1
  419. package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -1
  420. package/dist/renderer-tier/detectRendererTier.js.map +1 -1
  421. package/dist/renderer-tier/selectBackend.d.ts.map +1 -1
  422. package/dist/renderer-tier/selectBackend.js +1 -1
  423. package/dist/renderer-tier/selectBackend.js.map +1 -1
  424. package/dist/replay/createReplayController.d.ts.map +1 -1
  425. package/dist/replay/createReplayController.js +1 -1
  426. package/dist/replay/createReplayController.js.map +1 -1
  427. package/dist/scale/createPriceScale.d.ts.map +1 -1
  428. package/dist/scale/createPriceScale.js +1 -1
  429. package/dist/scale/createPriceScale.js.map +1 -1
  430. package/dist/scale/createTimeScale.d.ts.map +1 -1
  431. package/dist/scale/createTimeScale.js +1 -1
  432. package/dist/scale/createTimeScale.js.map +1 -1
  433. package/dist/scene/createLayerFromPlugin.d.ts.map +1 -1
  434. package/dist/scene/createLayerFromPlugin.js.map +1 -1
  435. package/dist/scene/createScene.d.ts.map +1 -1
  436. package/dist/scene/createScene.js +1 -1
  437. package/dist/scene/createScene.js.map +1 -1
  438. package/dist/scene/layerRegistry.js +1 -1
  439. package/dist/scene/layerRegistry.js.map +1 -1
  440. package/dist/scene/types.d.ts +1 -1
  441. package/dist/scene/types.d.ts.map +1 -1
  442. package/dist/scheduler/createFrameBudget.d.ts.map +1 -1
  443. package/dist/scheduler/createFrameBudget.js +1 -1
  444. package/dist/scheduler/createFrameBudget.js.map +1 -1
  445. package/dist/semantic/controller.d.ts +2 -2
  446. package/dist/semantic/controller.d.ts.map +1 -1
  447. package/dist/semantic/controller.js +2 -2
  448. package/dist/semantic/controller.js.map +1 -1
  449. package/dist/tokens/colorPresetSettings.d.ts +15 -2
  450. package/dist/tokens/colorPresetSettings.d.ts.map +1 -1
  451. package/dist/tokens/colorPresetSettings.js +16 -0
  452. package/dist/tokens/colorPresetSettings.js.map +1 -1
  453. package/dist/tokens/theme-china.d.ts +1 -1
  454. package/dist/tokens/theme-china.d.ts.map +1 -1
  455. package/dist/tokens/theme-china.js +2 -2
  456. package/dist/tokens/theme-china.js.map +1 -1
  457. package/dist/tokens/theme-dark.d.ts.map +1 -1
  458. package/dist/tokens/theme-dark.js.map +1 -1
  459. package/dist/tokens/theme-light.d.ts.map +1 -1
  460. package/dist/tokens/theme-light.js.map +1 -1
  461. package/dist/utils/kLineDraw/axis.d.ts +1 -1
  462. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  463. package/dist/utils/kLineDraw/axis.js +3 -3
  464. package/dist/utils/kLineDraw/axis.js.map +1 -1
  465. package/dist/version.d.ts +1 -1
  466. package/dist/version.d.ts.map +1 -1
  467. package/dist/version.js +1 -1
  468. package/dist/version.js.map +1 -1
  469. package/package.json +2 -1
  470. package/src/__bench__/indicators.bench.ts +7 -7
  471. package/src/__bench__/orderBookHeatmap.bench.ts +1 -0
  472. package/src/__bench__/scale.bench.ts +1 -0
  473. package/src/__bench__/signal.bench.ts +1 -0
  474. package/src/__bench__/volumeProfile.bench.ts +1 -0
  475. package/src/__tests__/depthPipeline.test.ts +3 -2
  476. package/src/__tests__/errors.test.ts +2 -2
  477. package/src/__tests__/signal.test.ts +1 -0
  478. package/src/alerts/__tests__/controller.test.ts +1 -0
  479. package/src/alerts/__tests__/predicates.test.ts +1 -0
  480. package/src/alerts/__tests__/ruleSchema.test.ts +1 -0
  481. package/src/alerts/createAlertController.ts +4 -3
  482. package/src/chartTypes/__tests__/heikinAshi.test.ts +2 -1
  483. package/src/chartTypes/__tests__/pointAndFigure.test.ts +1 -0
  484. package/src/chartTypes/__tests__/rangeBars.test.ts +1 -0
  485. package/src/chartTypes/__tests__/renko.test.ts +1 -0
  486. package/src/chartTypes/pointAndFigure.ts +1 -1
  487. package/src/chartTypes/rangeBars.ts +1 -1
  488. package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +1 -1
  489. package/src/components/anchoredVwap/__tests__/controller.test.ts +1 -1
  490. package/src/components/anchoredVwap/computeAnchoredVwap.ts +2 -1
  491. package/src/components/anchoredVwap/createAnchoredVwapController.ts +5 -4
  492. package/src/components/crosshairSync/createCrosshairSync.ts +1 -1
  493. package/src/components/footprint/__tests__/aggressor.test.ts +1 -0
  494. package/src/components/footprint/__tests__/controller.test.ts +1 -0
  495. package/src/components/footprint/__tests__/perBarStats.test.ts +1 -0
  496. package/src/components/footprint/createFootprintController.ts +2 -1
  497. package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +1 -0
  498. package/src/components/mtfOverlay/__tests__/controller.test.ts +1 -0
  499. package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +1 -0
  500. package/src/components/mtfOverlay/createMtfController.ts +2 -1
  501. package/src/components/orderBookHeatmap/createHeatmapController.ts +4 -3
  502. package/src/components/orderBookHeatmap/createOrderBookState.ts +3 -3
  503. package/src/components/orderBookHeatmap/deltaArchive.ts +1 -1
  504. package/src/components/orderBookHeatmap/logColorScale.ts +2 -1
  505. package/src/components/orderBookHeatmap/snapshotRing.ts +2 -1
  506. package/src/components/volumeProfile/__tests__/valueArea.test.ts +1 -1
  507. package/src/components/volumeProfile/createVolumeProfileController.ts +2 -1
  508. package/src/config/chartSettings.ts +36 -6
  509. package/src/controllers/__tests__/drawing.test.ts +1 -0
  510. package/src/controllers/__tests__/indicatorSelector.test.ts +1 -0
  511. package/src/controllers/__tests__/toolbar.test.ts +1 -0
  512. package/src/controllers/createChartController.ts +36 -13
  513. package/src/controllers/createDrawingController.ts +1 -0
  514. package/src/controllers/createIndicatorSelectorController.ts +2 -1
  515. package/src/controllers/createToolbarController.ts +1 -0
  516. package/src/controllers/types.ts +11 -6
  517. package/src/data-fetchers/__tests__/binance.test.ts +1 -0
  518. package/src/data-fetchers/__tests__/dataBuffer.test.ts +21 -15
  519. package/src/data-fetchers/__tests__/depthConnector.test.ts +2 -1
  520. package/src/data-fetchers/__tests__/fetcherRegistry.test.ts +2 -1
  521. package/src/data-fetchers/baostock.ts +2 -1
  522. package/src/data-fetchers/binance.ts +1 -0
  523. package/src/data-fetchers/dataBuffer.effects.ts +2 -1
  524. package/src/data-fetchers/dataBuffer.ts +107 -204
  525. package/src/data-fetchers/dataBufferTypes.ts +42 -2
  526. package/src/data-fetchers/depthConnector.ts +2 -1
  527. package/src/data-fetchers/fetchScheduler.ts +53 -0
  528. package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -3
  529. package/src/data-fetchers/gotdx.ts +1 -0
  530. package/src/data-fetchers/hundred-mock.ts +1 -0
  531. package/src/data-fetchers/index.ts +1 -1
  532. package/src/data-fetchers/kLineDataStore.ts +96 -0
  533. package/src/data-fetchers/router.ts +2 -1
  534. package/src/data-fetchers/thousand-mock.ts +1 -0
  535. package/src/data-fetchers/timeKeyIndex.ts +39 -0
  536. package/src/data-fetchers/timeShareBuffer.ts +15 -12
  537. package/src/data-fetchers/tradingview.ts +2 -1
  538. package/src/engine/__tests__/chart.dpr.test.ts +3 -1
  539. package/src/engine/__tests__/paneRenderer.resize.test.ts +1 -0
  540. package/src/engine/__tests__/subPaneManager.test.ts +3 -2
  541. package/src/engine/chart.ts +24 -13
  542. package/src/engine/controller/__tests__/interaction.dpr.test.ts +1 -0
  543. package/src/engine/controller/interaction.ts +5 -3
  544. package/src/engine/controller/pinchTracker.ts +2 -2
  545. package/src/engine/data/chartDataManager.ts +189 -466
  546. package/src/engine/data/comparisonManager.ts +211 -0
  547. package/src/engine/data/fetchBatchScheduler.ts +82 -0
  548. package/src/engine/data/incrementalLoadHint.ts +105 -0
  549. package/src/engine/data/scrollCompensator.ts +93 -0
  550. package/src/engine/draw/__tests__/pixelAlign.spec.ts +1 -0
  551. package/src/engine/drawing/AnchorCollector.ts +1 -1
  552. package/src/engine/drawing/DragHandler.ts +2 -1
  553. package/src/engine/drawing/DrawingState.ts +1 -1
  554. package/src/engine/drawing/HitTester.ts +3 -2
  555. package/src/engine/drawing/PreviewRenderer.ts +2 -1
  556. package/src/engine/drawing/coordinateUtils.ts +1 -1
  557. package/src/engine/drawing/interaction.ts +4 -4
  558. package/src/engine/drawing/plugin.ts +3 -2
  559. package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +2 -2
  560. package/src/engine/indicators/__tests__/atr.test.ts +3 -1
  561. package/src/engine/indicators/__tests__/calculators.test.ts +3 -1
  562. package/src/engine/indicators/__tests__/chartIndicatorManager.test.ts +2 -1
  563. package/src/engine/indicators/__tests__/cmf-mfi.test.ts +2 -0
  564. package/src/engine/indicators/__tests__/dema.test.ts +3 -1
  565. package/src/engine/indicators/__tests__/donchian.test.ts +2 -0
  566. package/src/engine/indicators/__tests__/hma.test.ts +3 -1
  567. package/src/engine/indicators/__tests__/ichimoku.test.ts +2 -0
  568. package/src/engine/indicators/__tests__/indicatorDefinitionRegistry.test.ts +1 -0
  569. package/src/engine/indicators/__tests__/indicatorRegistry.test.ts +2 -1
  570. package/src/engine/indicators/__tests__/kama.test.ts +3 -1
  571. package/src/engine/indicators/__tests__/keltner.test.ts +2 -0
  572. package/src/engine/indicators/__tests__/pivot-fib.test.ts +2 -0
  573. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -0
  574. package/src/engine/indicators/__tests__/roc.test.ts +2 -0
  575. package/src/engine/indicators/__tests__/sar.test.ts +2 -0
  576. package/src/engine/indicators/__tests__/scheduler.test.ts +7 -5
  577. package/src/engine/indicators/__tests__/soa.test.ts +10 -8
  578. package/src/engine/indicators/__tests__/stateComposer.test.ts +3 -2
  579. package/src/engine/indicators/__tests__/structure.test.ts +4 -1
  580. package/src/engine/indicators/__tests__/supertrend.test.ts +2 -0
  581. package/src/engine/indicators/__tests__/tema.test.ts +3 -1
  582. package/src/engine/indicators/__tests__/trix.test.ts +2 -0
  583. package/src/engine/indicators/__tests__/volatility.test.ts +2 -0
  584. package/src/engine/indicators/__tests__/volume.test.ts +2 -0
  585. package/src/engine/indicators/__tests__/volumeProfile.test.ts +2 -0
  586. package/src/engine/indicators/__tests__/vwap.test.ts +2 -0
  587. package/src/engine/indicators/__tests__/wma.test.ts +3 -1
  588. package/src/engine/indicators/__tests__/zones.test.ts +4 -1
  589. package/src/engine/indicators/calculators/bands.ts +1 -0
  590. package/src/engine/indicators/calculators/movingAverages.ts +1 -0
  591. package/src/engine/indicators/calculators/oscillators.ts +1 -0
  592. package/src/engine/indicators/calculators/volatility.ts +1 -0
  593. package/src/engine/indicators/chartIndicatorManager.ts +13 -11
  594. package/src/engine/indicators/indicator.worker.ts +4 -3
  595. package/src/engine/indicators/indicatorDefinitionRegistry.ts +4 -3
  596. package/src/engine/indicators/indicatorMetadata.ts +2 -1
  597. package/src/engine/indicators/indicatorRegistry.ts +4 -3
  598. package/src/engine/indicators/indicatorRuntime.ts +1 -0
  599. package/src/engine/indicators/registerBuiltins.ts +1 -0
  600. package/src/engine/indicators/scheduler.ts +47 -44
  601. package/src/engine/indicators/stateComposer.ts +31 -30
  602. package/src/engine/indicators/visibleStateComposers.ts +2 -2
  603. package/src/engine/indicators/workerProtocol.ts +1 -0
  604. package/src/engine/layout/chartPaneLayout.ts +3 -2
  605. package/src/engine/layout/pane.ts +3 -3
  606. package/src/engine/marker/registry.ts +2 -2
  607. package/src/engine/modes/kLineMode.ts +3 -2
  608. package/src/engine/modes/timeShareMode.ts +4 -3
  609. package/src/engine/modes/types.ts +1 -1
  610. package/src/engine/paneRenderer.ts +1 -1
  611. package/src/engine/render/chartRenderer.ts +25 -23
  612. package/src/engine/render/layers/candleLayer.ts +1 -1
  613. package/src/engine/render/layers/comparisonLineLayer.ts +1 -1
  614. package/src/engine/render/layers/crosshairLayer.ts +1 -1
  615. package/src/engine/render/layers/customMarkersLayer.ts +1 -1
  616. package/src/engine/render/layers/extremaMarkersLayer.ts +1 -1
  617. package/src/engine/render/layers/gridLinesLayer.ts +1 -1
  618. package/src/engine/render/layers/lastPriceLabelLayer.ts +1 -1
  619. package/src/engine/render/layers/lastPriceLineLayer.ts +1 -1
  620. package/src/engine/render/layers/leftYAxisLayer.ts +1 -1
  621. package/src/engine/render/layers/mainIndicatorLegendLayer.ts +1 -1
  622. package/src/engine/render/layers/yAxisLayer.ts +1 -1
  623. package/src/engine/renderers/Indicator/__tests__/createSubIndicatorRenderer.test.ts +2 -1
  624. package/src/engine/renderers/Indicator/atr.ts +5 -4
  625. package/src/engine/renderers/Indicator/boll.ts +4 -3
  626. package/src/engine/renderers/Indicator/cci.ts +5 -4
  627. package/src/engine/renderers/Indicator/chaikinVol.ts +6 -5
  628. package/src/engine/renderers/Indicator/cmf.ts +6 -5
  629. package/src/engine/renderers/Indicator/dema.ts +6 -5
  630. package/src/engine/renderers/Indicator/donchian.ts +3 -3
  631. package/src/engine/renderers/Indicator/ene.ts +4 -3
  632. package/src/engine/renderers/Indicator/expma.ts +3 -3
  633. package/src/engine/renderers/Indicator/fastk.ts +6 -5
  634. package/src/engine/renderers/Indicator/fib.ts +3 -3
  635. package/src/engine/renderers/Indicator/hma.ts +6 -5
  636. package/src/engine/renderers/Indicator/hv.ts +5 -4
  637. package/src/engine/renderers/Indicator/ichimoku.ts +3 -3
  638. package/src/engine/renderers/Indicator/kama.ts +6 -5
  639. package/src/engine/renderers/Indicator/keltner.ts +3 -3
  640. package/src/engine/renderers/Indicator/kst.ts +7 -5
  641. package/src/engine/renderers/Indicator/ma.ts +5 -5
  642. package/src/engine/renderers/Indicator/macd.ts +5 -4
  643. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +2 -2
  644. package/src/engine/renderers/Indicator/mfi.ts +6 -5
  645. package/src/engine/renderers/Indicator/mom.ts +5 -4
  646. package/src/engine/renderers/Indicator/obv.ts +5 -4
  647. package/src/engine/renderers/Indicator/parkinson.ts +5 -4
  648. package/src/engine/renderers/Indicator/pivot.ts +3 -3
  649. package/src/engine/renderers/Indicator/pvt.ts +5 -4
  650. package/src/engine/renderers/Indicator/roc.ts +5 -4
  651. package/src/engine/renderers/Indicator/rsi.ts +7 -5
  652. package/src/engine/renderers/Indicator/sar.ts +3 -3
  653. package/src/engine/renderers/Indicator/scale/atr_scale.ts +1 -0
  654. package/src/engine/renderers/Indicator/scale/cci_scale.ts +1 -0
  655. package/src/engine/renderers/Indicator/scale/fastk_scale.ts +1 -0
  656. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +2 -2
  657. package/src/engine/renderers/Indicator/scale/kst_scale.ts +1 -0
  658. package/src/engine/renderers/Indicator/scale/macd_scale.ts +1 -0
  659. package/src/engine/renderers/Indicator/scale/mom_scale.ts +1 -0
  660. package/src/engine/renderers/Indicator/scale/rsi_scale.ts +1 -0
  661. package/src/engine/renderers/Indicator/scale/stoch_scale.ts +1 -0
  662. package/src/engine/renderers/Indicator/scale/volume_scale.ts +1 -0
  663. package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +1 -0
  664. package/src/engine/renderers/Indicator/shared/titleInfo.ts +1 -1
  665. package/src/engine/renderers/Indicator/stoch.ts +8 -6
  666. package/src/engine/renderers/Indicator/structure.ts +7 -7
  667. package/src/engine/renderers/Indicator/supertrend.ts +6 -6
  668. package/src/engine/renderers/Indicator/tema.ts +6 -5
  669. package/src/engine/renderers/Indicator/trix.ts +6 -6
  670. package/src/engine/renderers/Indicator/vma.ts +6 -5
  671. package/src/engine/renderers/Indicator/volumeProfile.ts +7 -7
  672. package/src/engine/renderers/Indicator/vwap.ts +5 -4
  673. package/src/engine/renderers/Indicator/wma.ts +6 -5
  674. package/src/engine/renderers/Indicator/wmsr.ts +5 -4
  675. package/src/engine/renderers/Indicator/zones.ts +5 -5
  676. package/src/engine/renderers/__tests__/boll.renderer.test.ts +3 -1
  677. package/src/engine/renderers/__tests__/ene.renderer.test.ts +2 -0
  678. package/src/engine/renderers/__tests__/expma.renderer.test.ts +3 -1
  679. package/src/engine/renderers/__tests__/ma.renderer.test.ts +3 -1
  680. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +6 -4
  681. package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +1 -0
  682. package/src/engine/renderers/candle.ts +3 -3
  683. package/src/engine/renderers/crosshair.ts +1 -1
  684. package/src/engine/renderers/customMarkers.ts +2 -2
  685. package/src/engine/renderers/extremaMarkers.ts +85 -35
  686. package/src/engine/renderers/gridLines.ts +2 -2
  687. package/src/engine/renderers/lastPrice.ts +1 -1
  688. package/src/engine/renderers/leftYAxis.ts +2 -2
  689. package/src/engine/renderers/paneTitle.ts +4 -3
  690. package/src/engine/renderers/subVolume.ts +2 -1
  691. package/src/engine/renderers/timeAxis.ts +1 -1
  692. package/src/engine/renderers/timeShare.ts +1 -1
  693. package/src/engine/renderers/yAxis.ts +3 -4
  694. package/src/engine/scale/__tests__/logFormula.spec.ts +1 -0
  695. package/src/engine/scale/priceScale.ts +2 -1
  696. package/src/engine/subPaneManager.ts +14 -10
  697. package/src/engine/utils/__tests__/tickPosition.test.ts +1 -0
  698. package/src/engine/utils/tickPosition.ts +2 -1
  699. package/src/engine/viewport/chartViewportManager.ts +1 -1
  700. package/src/indicators/__tests__/maFamily.test.ts +4 -3
  701. package/src/indicators/__tests__/oscillators.test.ts +3 -2
  702. package/src/input/gesture.ts +1 -1
  703. package/src/input/keyboard.ts +1 -1
  704. package/src/mcp/chartBridge.ts +5 -2
  705. package/src/plugin/PluginHost.ts +6 -5
  706. package/src/plugin/PluginRegistry.ts +2 -1
  707. package/src/plugin/rendererPluginManager.ts +3 -2
  708. package/src/plugin/types.ts +1 -1
  709. package/src/render/__tests__/contract.test.ts +1 -0
  710. package/src/render/__tests__/webglRenderer.fallback.test.ts +1 -0
  711. package/src/render/__tests__/webglRenderer.test.ts +1 -0
  712. package/src/render/__tests__/webglSurfaceBackend.test.ts +1 -0
  713. package/src/render/createWebGLRenderer.ts +4 -3
  714. package/src/render/createWebGLSurfaceBackend.ts +2 -1
  715. package/src/renderer-tier/__tests__/selectBackend.test.ts +1 -1
  716. package/src/renderer-tier/detectRendererTier.ts +1 -0
  717. package/src/renderer-tier/selectBackend.ts +2 -1
  718. package/src/replay/__tests__/controller.test.ts +1 -0
  719. package/src/replay/__tests__/timeline.test.ts +1 -0
  720. package/src/replay/createReplayController.ts +2 -1
  721. package/src/scale/__tests__/anchoredZoom.test.ts +1 -0
  722. package/src/scale/__tests__/originShift.test.ts +1 -0
  723. package/src/scale/__tests__/priceScale.test.ts +1 -0
  724. package/src/scale/__tests__/timeScale.test.ts +1 -0
  725. package/src/scale/createPriceScale.ts +2 -1
  726. package/src/scale/createTimeScale.ts +2 -1
  727. package/src/scene/__tests__/layerFromPlugin.test.ts +2 -1
  728. package/src/scene/__tests__/layerRegistry.test.ts +1 -0
  729. package/src/scene/__tests__/scene.test.ts +2 -1
  730. package/src/scene/createLayerFromPlugin.ts +1 -0
  731. package/src/scene/createScene.ts +2 -1
  732. package/src/scene/layerRegistry.ts +1 -1
  733. package/src/scene/types.ts +1 -1
  734. package/src/scheduler/createFrameBudget.ts +1 -1
  735. package/src/semantic/__tests__/controller.test.ts +1 -0
  736. package/src/semantic/controller.ts +10 -6
  737. package/src/tokens/colorPresetSettings.ts +21 -2
  738. package/src/tokens/theme-china.ts +3 -3
  739. package/src/tokens/theme-dark.ts +1 -1
  740. package/src/tokens/theme-light.ts +1 -1
  741. package/src/utils/__tests__/dateFormat.test.ts +1 -0
  742. package/src/utils/kLineDraw/axis.ts +5 -5
  743. package/src/version.ts +1 -1
@@ -1,15 +1,20 @@
1
- import type { KLineData, TimeShareData } from '../../types/price'
2
1
  import type { SymbolSpec, SymbolInfo, DataFetcher, CustomDataSource } from '../../controllers/types'
3
- import { createSignal, type Signal } from '../../reactivity/signal'
4
2
  import { DataBuffer } from '../../data-fetchers/dataBuffer'
5
3
  import { getPeriodDays } from '../../data-fetchers/dataBuffer.effects'
4
+ import type { KLineBuffer, DataChange } from '../../data-fetchers/dataBufferTypes'
6
5
  import { TimeShareBuffer } from '../../data-fetchers/timeShareBuffer'
7
- import type { DataBufferLike } from '../../data-fetchers/dataBufferTypes'
8
6
  import type { TimeShareFetcherFn } from '../../data-fetchers/types'
7
+ import { createSignal, type Signal } from '../../reactivity/signal'
8
+ import type { KLineData, TimeShareData } from '../../types/price'
9
9
  import type { ChartDom, Viewport } from '../chartTypes'
10
10
  import type { VisibleRange, UpdateLevel } from '../layout/pane'
11
- import { getVisibleRange } from '../viewport/viewport'
12
11
  import { getPhysicalKLineConfig } from '../utils/klineConfig'
12
+ import { getVisibleRange } from '../viewport/viewport'
13
+
14
+ import { ComparisonManager } from './comparisonManager'
15
+ import { FetchBatchScheduler } from './fetchBatchScheduler'
16
+ import { IncrementalLoadHint } from './incrementalLoadHint'
17
+ import { ScrollCompensator } from './scrollCompensator'
13
18
 
14
19
  const COMPARISON_PALETTE = ['#f59e0b', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16', '#f97316']
15
20
  const DEFAULT_COMPARISON_COLOR = '#f59e0b'
@@ -49,7 +54,8 @@ export class ChartDataManager {
49
54
  private _dataFetcher: DataFetcher | null = null
50
55
  private _timeShareFetcher: TimeShareFetcherFn | null = null
51
56
 
52
- private _buffers = new Map<string, any>()
57
+ private _klineBuffers = new Map<string, KLineBuffer>()
58
+ private _tsBuffers = new Map<string, TimeShareBuffer>()
53
59
  private _activeBufferKey: string | null = null
54
60
  private _activeBufferUnsub: (() => void) | null = null
55
61
 
@@ -61,29 +67,13 @@ export class ChartDataManager {
61
67
 
62
68
  private _currentSpec: SymbolSpec | null = null
63
69
 
64
- // Comparison-specific state (still needed for rendering pass-through)
65
- private _comparisonSpecs: SymbolSpec[] = []
66
- private _comparisonData: Map<string, KLineData[]> = new Map()
67
- private _comparisonColors: Map<string, string> = new Map()
68
- private _comparisonColorsSignal = createSignal<ReadonlyMap<string, string>>(new Map())
69
- private _comparisonLoadingSignal = createSignal<boolean>(false)
70
- // Track loading per-comparison buffer (keyed by buffer key)
71
- private _cmpLoadingUnsubs = new Map<string, () => void>()
72
-
73
- private _pendingFetches: Array<{
74
- source: string
75
- spec: SymbolSpec
76
- startTs: number
77
- endTs: number
78
- resolve: (data: ReadonlyArray<KLineData>) => void
79
- reject: (err: Error) => void
80
- }> = []
81
-
82
- private _batchFlushScheduled = false
83
-
84
- private incrementalLoadHintEl: HTMLDivElement | null = null
85
- private incrementalLoadHintTimer: number | null = null
86
- private pendingPrependedCount = 0
70
+ private _batchScheduler = new FetchBatchScheduler()
71
+ private _scrollCompensator: ScrollCompensator
72
+ private _comparisonManager: ComparisonManager
73
+ private _loadHint: IncrementalLoadHint
74
+
75
+ private _savedScrollLeft: number | null = null
76
+ private _preCustomSpec: SymbolSpec | null = null
87
77
 
88
78
  lastVisibleRange: VisibleRange = { start: 0, end: 0 }
89
79
  lastRawVisibleRange: VisibleRange = { start: 0, end: 0 }
@@ -93,22 +83,42 @@ export class ChartDataManager {
93
83
 
94
84
  constructor(deps: DataDependencies) {
95
85
  this.deps = deps
86
+ this._scrollCompensator = new ScrollCompensator(deps)
87
+ this._loadHint = new IncrementalLoadHint(deps)
88
+ this._comparisonManager = new ComparisonManager({
89
+ createComparisonBuffer: (spec) => this._createCmpBuffer(spec),
90
+ disposeBuffer: (key) => this.disposeBuffer(key),
91
+ getKLineBuffer: (key) => this._klineBuffers.get(key),
92
+ hasKLineBuffer: (key) => this._klineBuffers.has(key),
93
+ getKLineBufferKeys: () => [...this._klineBuffers.keys()],
94
+ scheduleDraw: () => this.deps.scheduleDraw(),
95
+ })
96
96
  }
97
97
 
98
98
  // ── Buffer helpers ──
99
99
 
100
+ private _lookupBuffer(key: string): KLineBuffer | TimeShareBuffer | undefined {
101
+ if (key.startsWith(BUF_TIMESHARE)) return this._tsBuffers.get(key)
102
+ return this._klineBuffers.get(key)
103
+ }
104
+
105
+ private _lookupKLineBuffer(key: string): KLineBuffer | undefined {
106
+ return this._klineBuffers.get(key)
107
+ }
108
+
100
109
  private activateBuffer(key: string): void {
101
110
  if (this._activeBufferKey === key) return
102
111
  this._activeBufferUnsub?.()
103
112
  this._activeBufferKey = key
104
- const buf = this._buffers.get(key) as DataBufferLike | undefined
113
+ const buf = this._lookupBuffer(key)
105
114
  if (buf) {
106
- this._dataSignal.set([...(buf.data.peek() as unknown[])])
115
+ this._dataSignal.set([...(buf.data.peek() as DataChange).data as unknown[]])
107
116
  this._loadingSignal.set(buf.loading.peek())
108
117
  const unsubData = buf.data.subscribe(() => {
118
+ const change = buf.data.peek() as DataChange
109
119
  const prevDataLength = this._dataSignal.peek().length
110
- this._dataSignal.set([...(buf.data.peek() as unknown[])])
111
- this.onBufferDataChanged(key, prevDataLength)
120
+ this._dataSignal.set([...(change.data as unknown[])])
121
+ this.onBufferDataChanged(key, prevDataLength, change.prependedCount)
112
122
  })
113
123
  const unsubLoading = buf.loading.subscribe(() => {
114
124
  this._loadingSignal.set(buf.loading.peek())
@@ -125,81 +135,85 @@ export class ChartDataManager {
125
135
  }
126
136
 
127
137
  private disposeBuffer(key: string): void {
128
- const buf = this._buffers.get(key)
138
+ const buf = this._lookupBuffer(key)
129
139
  if (!buf) return
130
- const unsub = this._cmpLoadingUnsubs.get(key)
131
- unsub?.()
132
- const loadingUnsub = this._cmpLoadingUnsubs.get(`loading:${key}`)
133
- loadingUnsub?.()
134
- this._cmpLoadingUnsubs.delete(key)
135
- this._cmpLoadingUnsubs.delete(`loading:${key}`)
136
140
  buf.dispose()
137
- this._buffers.delete(key)
141
+ if (key.startsWith(BUF_TIMESHARE)) this._tsBuffers.delete(key)
142
+ else this._klineBuffers.delete(key)
138
143
  }
139
144
 
140
- private getActiveDataBuffer(): DataBuffer | null {
141
- const buf = this._activeBufferKey ? this._buffers.get(this._activeBufferKey) : null
142
- return buf instanceof DataBuffer ? buf : null
145
+ private getActiveDataBuffer(): KLineBuffer | null {
146
+ return this._activeBufferKey && !this._activeBufferKey.startsWith(BUF_TIMESHARE)
147
+ ? (this._klineBuffers.get(this._activeBufferKey) ?? null)
148
+ : null
143
149
  }
144
150
 
145
151
  private getActiveTimeShareBuffer(): TimeShareBuffer | null {
146
- const buf = this._activeBufferKey ? this._buffers.get(this._activeBufferKey) : null
147
- return buf instanceof TimeShareBuffer ? buf : null
152
+ return this._activeBufferKey?.startsWith(BUF_TIMESHARE) === true
153
+ ? (this._tsBuffers.get(this._activeBufferKey) ?? null)
154
+ : null
148
155
  }
149
156
 
150
- private getPrimaryDataBuffer(symbol: string, period: string): DataBuffer {
157
+ private getPrimaryDataBuffer(symbol: string, period: string): KLineBuffer {
151
158
  const key = bufKey(BUF_PRIMARY, symbol, period)
152
- let buf = this._buffers.get(key) as DataBuffer | undefined
159
+ let buf = this._klineBuffers.get(key)
153
160
  if (!buf) {
154
- buf = new DataBuffer()
161
+ buf = this._createKLineBuffer()
155
162
  buf.setFetcher(this._dataFetcher)
156
163
  if (this._dataFetcher) {
157
- buf.setRequestFetch(this._createBatchHandler(this._dataFetcher))
164
+ buf.setRequestFetch(this._batchScheduler.createHandler())
158
165
  }
159
- this._buffers.set(key, buf)
166
+ this._klineBuffers.set(key, buf)
160
167
  } else {
161
168
  buf.setFetcher(this._dataFetcher)
162
169
  if (this._dataFetcher) {
163
- buf.setRequestFetch(this._createBatchHandler(this._dataFetcher))
170
+ buf.setRequestFetch(this._batchScheduler.createHandler())
164
171
  }
165
172
  }
166
173
  return buf
167
174
  }
168
175
 
169
- // ── Buffer data change handler ──
176
+ private _createKLineBuffer(): KLineBuffer {
177
+ return new DataBuffer()
178
+ }
170
179
 
171
- private onBufferDataChanged(key: string, prevDataLength?: number): void {
172
- const buf = this._buffers.get(key)
173
- if (!buf) return
180
+ private _createCmpBuffer(spec: SymbolSpec): { key: string; buffer: KLineBuffer } {
181
+ const key = bufKey(BUF_COMPARISON, spec.symbol, spec.period)
182
+ const buffer = this._createKLineBuffer()
183
+ buffer.setFetcher(this._dataFetcher)
184
+ if (this._dataFetcher) {
185
+ buffer.setRequestFetch(this._batchScheduler.createHandler())
186
+ }
187
+ this._klineBuffers.set(key, buffer)
188
+ return { key, buffer }
189
+ }
174
190
 
175
- if (buf instanceof DataBuffer) {
176
- this.onKLineBufferChanged(key, buf, prevDataLength)
177
- } else if (buf instanceof TimeShareBuffer) {
178
- this.onTimeShareBufferChanged(key, buf)
191
+ // ── Buffer data change handler ──
192
+
193
+ private onBufferDataChanged(key: string, prevDataLength?: number, prependedCount?: number): void {
194
+ if (key.startsWith(BUF_TIMESHARE)) {
195
+ this.onTimeShareBufferChanged()
196
+ return
179
197
  }
198
+ const buf = this._klineBuffers.get(key)
199
+ if (!buf) return
200
+ this.onKLineBufferChanged(key, buf, prevDataLength, prependedCount ?? 0)
180
201
  }
181
202
 
182
- private onKLineBufferChanged(key: string, buf: DataBuffer, prevDataLength?: number): void {
203
+ private onKLineBufferChanged(
204
+ key: string,
205
+ buf: KLineBuffer,
206
+ prevDataLength?: number,
207
+ prependedCount: number = 0,
208
+ ): void {
183
209
  if (!key.startsWith('main:')) return
184
210
 
185
211
  const bufferData = buf.getRawData() as KLineData[]
186
- const prependedCount = this.pendingPrependedCount
187
- this.pendingPrependedCount = 0
188
212
 
189
- if (prependedCount === 0 && this.deps.getCachedScrollLeft() < this.getLeftLoadBufferWidth()) {
190
- const scrollLeft = this.deps.getCachedScrollLeft()
191
- if (scrollLeft <= 0) {
192
- this.deps.setScrollLeft(this.getLeftLoadBufferWidth())
193
- } else {
194
- const dpr = this.deps.getEffectiveDpr()
195
- const opt = this.deps.getOption()
196
- const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
197
- const totalDataWidth = (startXPx + bufferData.length * unitPx) / dpr
198
- const leftBuffer = this.getLeftLoadBufferWidth()
199
- if (scrollLeft >= leftBuffer + totalDataWidth) {
200
- this.deps.setScrollLeft(leftBuffer)
201
- }
202
- }
213
+ if (prependedCount > 0) {
214
+ this._scrollCompensator.compensatePrepend(prependedCount)
215
+ } else {
216
+ this._scrollCompensator.adjustScrollAfterDataChange(bufferData.length)
203
217
  }
204
218
 
205
219
  if ((prevDataLength ?? this._dataSignal.peek().length) === 0 && bufferData.length > 0) {
@@ -236,16 +250,15 @@ export class ChartDataManager {
236
250
  if (indicatorsReady) {
237
251
  this.pendingIndicatorDataUpdate = false
238
252
  this.deps.scheduleDraw()
239
- // Alert 管线入口:Chart 构造时绑定 → evaluateAlerts()
240
253
  this.deps.onDataProcessed?.(bufferData, this.lastVisibleRange)
241
254
  } else {
242
255
  this.pendingIndicatorDataUpdate = true
243
256
  }
244
257
 
245
- this.showIncrementalLoadHint(prependedCount)
258
+ this._loadHint.show(prependedCount, this.getLeftLoadBufferWidth())
246
259
  }
247
260
 
248
- private onTimeShareBufferChanged(_key: string, _buf: TimeShareBuffer): void {
261
+ private onTimeShareBufferChanged(): void {
249
262
  const data = this._dataSignal.peek() as TimeShareData[]
250
263
  this.lastVisibleRange = { start: 0, end: data.length }
251
264
  this.lastRawVisibleRange = { start: 0, end: data.length }
@@ -255,19 +268,10 @@ export class ChartDataManager {
255
268
 
256
269
  // ── Internal helpers ──
257
270
 
258
- private getScrollContentHost(): HTMLDivElement | null {
259
- return this.deps.getDom().scrollContent ?? this.deps.getDom().container ?? null
260
- }
261
-
262
271
  getLeftLoadBufferWidth(): number {
263
272
  const buf = this.getActiveDataBuffer()
264
273
  const dataLength = buf ? buf.getRawData().length : 0
265
- if (dataLength === 0) return 0
266
- const plotWidth =
267
- this.deps.getViewport()?.plotWidth ??
268
- (this.deps.getObservedSize().width > 0 ? this.deps.getObservedSize().width : undefined) ??
269
- Math.round(this.deps.getDom().container?.clientWidth ?? 0)
270
- return Math.max(0, plotWidth)
274
+ return this._scrollCompensator.getLeftLoadBufferWidth(dataLength)
271
275
  }
272
276
 
273
277
  private getActiveKLineLength(): number {
@@ -285,76 +289,6 @@ export class ChartDataManager {
285
289
  return getVisibleRange(vp.scrollLeft, vp.plotWidth, opt.kWidth, opt.kGap, dataLength, vp.dpr)
286
290
  }
287
291
 
288
- private getTrailingSlotCount(): number {
289
- return 24
290
- }
291
-
292
- private clearIncrementalLoadHintTimer(): void {
293
- if (this.incrementalLoadHintTimer !== null) {
294
- window.clearTimeout(this.incrementalLoadHintTimer)
295
- this.incrementalLoadHintTimer = null
296
- }
297
- }
298
-
299
- private hideIncrementalLoadHint(): void {
300
- const hint = this.incrementalLoadHintEl
301
- if (!hint) return
302
- hint.style.opacity = '0'
303
- hint.style.filter = 'blur(10px)'
304
- }
305
-
306
- private ensureIncrementalLoadHint(): HTMLDivElement | null {
307
- const host = this.getScrollContentHost()
308
- if (!host) return null
309
- if (this.incrementalLoadHintEl && this.incrementalLoadHintEl.isConnected) {
310
- return this.incrementalLoadHintEl
311
- }
312
- const ownerDoc = host.ownerDocument
313
- if (!ownerDoc) return null
314
- const hint = ownerDoc.createElement('div')
315
- hint.className = 'klc-incremental-load-hint'
316
- hint.style.position = 'absolute'
317
- hint.style.top = '0'
318
- hint.style.height = '0px'
319
- hint.style.width = '0px'
320
- hint.style.pointerEvents = 'none'
321
- hint.style.opacity = '0'
322
- hint.style.filter = 'blur(10px)'
323
- hint.style.transition = 'opacity 420ms ease, filter 420ms ease'
324
- hint.style.background = 'rgba(71, 91, 132, 0.5)'
325
- hint.style.zIndex = '3'
326
- hint.style.willChange = 'opacity, filter, width'
327
- host.appendChild(hint)
328
- this.incrementalLoadHintEl = hint
329
- return hint
330
- }
331
-
332
- private showIncrementalLoadHint(count: number): void {
333
- if (count <= 0) return
334
- const hint = this.ensureIncrementalLoadHint()
335
- if (!hint) return
336
- this.clearIncrementalLoadHintTimer()
337
- const dpr = this.deps.getEffectiveDpr()
338
- const opt = this.deps.getOption()
339
- const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
340
- hint.style.left = `${this.getLeftLoadBufferWidth()}px`
341
- const width = (startXPx + count * unitPx) / dpr
342
- hint.style.width = `${Math.max(0, width)}px`
343
- hint.style.height = `${Math.max(
344
- 0,
345
- this.deps.getViewport()?.viewHeight ?? this.deps.getDom().container?.clientHeight ?? 0,
346
- )}px`
347
- hint.getBoundingClientRect()
348
- hint.style.opacity = '1'
349
- hint.style.filter = 'blur(0px)'
350
- this.incrementalLoadHintTimer = window.setTimeout(() => {
351
- this.hideIncrementalLoadHint()
352
- this.incrementalLoadHintTimer = null
353
- }, 900)
354
- }
355
-
356
- // ── Public accessors ──
357
-
358
292
  /** Unified data signal — always reflects the active buffer's data */
359
293
  get data(): Signal<ReadonlyArray<KLineData>> {
360
294
  return this._dataSignal as Signal<ReadonlyArray<KLineData>>
@@ -380,7 +314,7 @@ export class ChartDataManager {
380
314
  registerSymbols(infos: ReadonlyArray<SymbolInfo>): void {
381
315
  const current = new Map(this._symbolCatalog.peek().map((s) => [s.code, s]))
382
316
  for (const info of infos) current.set(info.code, info)
383
- this._symbolCatalog.set(Array.from(current.values()))
317
+ this._symbolCatalog.set([...current.values()])
384
318
  }
385
319
 
386
320
  /** Remove a symbol from the catalog by code. */
@@ -437,43 +371,35 @@ export class ChartDataManager {
437
371
  }
438
372
 
439
373
  getComparisonData(): Map<string, KLineData[]> {
440
- return this._comparisonData
374
+ return this._comparisonManager.data
441
375
  }
442
376
 
443
377
  getComparisonSpecs(): SymbolSpec[] {
444
- return this._comparisonSpecs
378
+ return this._comparisonManager.specs
445
379
  }
446
380
 
447
- get dataBuffer(): DataBuffer {
381
+ get dataBuffer(): KLineBuffer {
448
382
  const buf = this.getActiveDataBuffer()
449
383
  if (buf) return buf
450
- // Fallback: create a primary buffer if none exists yet
451
384
  const key = bufKey(BUF_PRIMARY, '', 'daily')
452
- let fallback = this._buffers.get(key) as DataBuffer | undefined
385
+ let fallback = this._klineBuffers.get(key)
453
386
  if (!fallback) {
454
- fallback = new DataBuffer()
455
- this._buffers.set(key, fallback)
387
+ fallback = this._createKLineBuffer()
388
+ this._klineBuffers.set(key, fallback)
456
389
  }
457
390
  return fallback
458
391
  }
459
392
 
460
393
  get comparisonColors(): Signal<ReadonlyMap<string, string>> {
461
- return this._comparisonColorsSignal
394
+ return this._comparisonManager.colorsSignal
462
395
  }
463
396
 
464
397
  get comparisonLoading(): Signal<boolean> {
465
- return this._comparisonLoadingSignal
398
+ return this._comparisonManager.loadingSignal
466
399
  }
467
400
 
468
401
  getComparisonColors(): Map<string, string> {
469
- return this._comparisonColors
470
- }
471
-
472
- private recomputeComparisonLoading(): void {
473
- const anyLoading = Array.from(this._buffers.entries()).some(
474
- ([k, b]) => k.startsWith(BUF_COMPARISON) && b instanceof DataBuffer && b.loading.peek(),
475
- )
476
- this._comparisonLoadingSignal.set(anyLoading)
402
+ return this._comparisonManager.getColors()
477
403
  }
478
404
 
479
405
  // ── Data updates (KLine) ──
@@ -514,79 +440,20 @@ export class ChartDataManager {
514
440
 
515
441
  setDataFetcher(fetcher: DataFetcher | null): void {
516
442
  this._dataFetcher = fetcher
443
+ this._batchScheduler.setFetcher(fetcher)
517
444
  if (!fetcher) {
518
- for (const [key, buf] of this._buffers) {
519
- if (buf instanceof DataBuffer) {
520
- const dataBuf = buf as DataBuffer
521
- dataBuf.setRequestFetch(null)
522
- }
445
+ for (const [, buf] of this._klineBuffers) {
446
+ buf.setRequestFetch(null)
523
447
  }
524
448
  return
525
449
  }
526
- const handler = this._createBatchHandler(fetcher)
527
- for (const [key, buf] of this._buffers) {
528
- if (buf instanceof DataBuffer) {
529
- const dataBuf = buf as DataBuffer
530
- dataBuf.setRequestFetch(handler)
531
- }
450
+ const handler = this._batchScheduler.createHandler()
451
+ for (const [, buf] of this._klineBuffers) {
452
+ buf.setRequestFetch(handler)
532
453
  }
533
454
  }
534
455
 
535
- private _createBatchHandler(
536
- fetcher: DataFetcher,
537
- ): (spec: SymbolSpec, startTs: number, endTs: number) => Promise<ReadonlyArray<KLineData>> {
538
- return (spec, startTs, endTs) =>
539
- new Promise<ReadonlyArray<KLineData>>((resolve, reject) => {
540
- if (!spec.source) {
541
- reject(
542
- new Error(
543
- `[DataFetcher] source is required but was not provided for symbol "${spec.symbol}"`,
544
- ),
545
- )
546
- return
547
- }
548
- this._pendingFetches.push({
549
- source: spec.source,
550
- spec,
551
- startTs,
552
- endTs,
553
- resolve,
554
- reject,
555
- })
556
- this._scheduleBatchFlush()
557
- })
558
- }
559
-
560
- private _scheduleBatchFlush(): void {
561
- if (this._batchFlushScheduled) return
562
- this._batchFlushScheduled = true
563
- Promise.resolve().then(() => this._flushBatch())
564
- }
565
-
566
- private async _flushBatch(): Promise<void> {
567
- this._batchFlushScheduled = false
568
- const batch = this._pendingFetches.splice(0)
569
- if (batch.length === 0 || !this._dataFetcher) return
570
- const fetcher = this._dataFetcher
571
- const CONCURRENCY = 4
572
- for (let i = 0; i < batch.length; i += CONCURRENCY) {
573
- const chunk = batch.slice(i, i + CONCURRENCY)
574
- await Promise.allSettled(
575
- chunk.map(({ source, spec, startTs, endTs, resolve, reject }) =>
576
- fetcher(source, {
577
- symbol: spec.symbol,
578
- startDate: batchFormatDate(startTs),
579
- endDate: batchFormatDate(endTs),
580
- period: spec.period ?? 'daily',
581
- adjust: spec.adjust ?? 'none',
582
- exchange: spec.exchange,
583
- }).then(resolve, reject),
584
- ),
585
- )
586
- }
587
- }
588
-
589
- checkVisibleRangeGap(): void {
456
+ checkVisibleRangeGap(): void {
590
457
  const buf = this.getActiveDataBuffer()
591
458
  if (!buf) return
592
459
  const data = buf.getRawData()
@@ -613,171 +480,39 @@ export class ChartDataManager {
613
480
 
614
481
  if (firstVisibleTs === undefined) return
615
482
 
616
- for (const [key, b] of this._buffers) {
617
- if (key.startsWith(BUF_COMPARISON) && b instanceof DataBuffer) {
618
- b.ensureRange(firstVisibleTs, window.earliestTs)
619
- }
620
- }
483
+ this._comparisonManager.ensureRange(firstVisibleTs, window.earliestTs)
621
484
  }
622
485
 
623
486
  // ── Comparison management ──
624
487
 
625
488
  private syncComparisonBuffers(specs: ReadonlyArray<SymbolSpec>): void {
626
- this._comparisonSpecs = [...specs]
627
- const nextKeys = new Set(specs.map((spec) => spec.symbol))
628
-
629
- // Remove buffers for removed comparisons
630
- for (const [key, buf] of this._buffers) {
631
- if (!key.startsWith(BUF_COMPARISON)) continue
632
- const symbol = key.split(':')[1]!
633
- if (nextKeys.has(symbol)) continue
634
- this.disposeBuffer(key)
635
- this._comparisonData.delete(symbol)
636
- }
637
-
638
- if (!this._dataFetcher) return
639
-
640
489
  const primaryBuf = this.getActiveDataBuffer()
641
-
642
- for (const spec of specs) {
643
- const key = bufKey(BUF_COMPARISON, spec.symbol, spec.period)
644
- const symbol = spec.symbol
645
- let buf = this._buffers.get(key) as DataBuffer | undefined
646
- if (!buf) {
647
- const newBuffer = new DataBuffer()
648
- newBuffer.setFetcher(this._dataFetcher)
649
- if (this._dataFetcher) {
650
- newBuffer.setRequestFetch(this._createBatchHandler(this._dataFetcher))
651
- }
652
- this._buffers.set(key, newBuffer)
653
-
654
- const unsubscribe = newBuffer.data.subscribe(() => {
655
- this._comparisonData.set(symbol, [...newBuffer.getRawData()])
656
- this.deps.scheduleDraw()
657
- })
658
- this._cmpLoadingUnsubs.set(key, unsubscribe)
659
-
660
- const unsubLoading = newBuffer.loading.subscribe(() => this.recomputeComparisonLoading())
661
- // Store loading unsubscribe with a special key
662
- this._cmpLoadingUnsubs.set(`loading:${key}`, unsubLoading)
663
-
664
- buf = newBuffer
665
- } else {
666
- buf.setFetcher(this._dataFetcher)
667
- if (this._dataFetcher) {
668
- buf.setRequestFetch(this._createBatchHandler(this._dataFetcher))
669
- }
670
- }
671
- const mainEarliest = primaryBuf?.loadedWindow?.earliestTs
672
- buf.setSymbol(spec, mainEarliest)
673
- }
490
+ this._comparisonManager.syncBuffers(specs, primaryBuf?.loadedWindow?.earliestTs)
674
491
  }
675
492
 
676
493
  private clearComparisonBuffers(): void {
677
- for (const [key, buf] of this._buffers) {
678
- if (key.startsWith(BUF_COMPARISON)) {
679
- this.disposeBuffer(key)
680
- }
681
- }
682
- this._comparisonData.clear()
683
- this._comparisonColors.clear()
684
- this._comparisonColorsSignal.set(new Map())
685
- this._comparisonLoadingSignal.set(false)
686
- this._comparisonSpecs = []
494
+ this._comparisonManager.clearAll()
687
495
  }
688
496
 
689
497
  addComparisonSymbol(spec: SymbolSpec): void {
690
- const symbol = spec.symbol
691
- const key = bufKey(BUF_COMPARISON, symbol, spec.period)
692
-
693
- // Check if already exists
694
- for (const k of this._buffers.keys()) {
695
- if (k.startsWith(BUF_COMPARISON) && k.split(':')[1] === symbol) return
696
- }
697
-
698
- this._comparisonSpecs.push(spec)
699
-
700
- const color =
701
- COMPARISON_PALETTE[this._comparisonColors.size % COMPARISON_PALETTE.length] ??
702
- DEFAULT_COMPARISON_COLOR
703
- this._comparisonColors.set(symbol, color)
704
- this._comparisonColorsSignal.set(new Map(this._comparisonColors))
705
-
706
- if (!this._dataFetcher) return
707
-
708
- const newBuffer = new DataBuffer()
709
- newBuffer.setFetcher(this._dataFetcher)
710
- if (this._dataFetcher) {
711
- newBuffer.setRequestFetch(this._createBatchHandler(this._dataFetcher))
712
- }
713
- this._buffers.set(key, newBuffer)
714
- const unsubscribe = newBuffer.data.subscribe(() => {
715
- this._comparisonData.set(symbol, [...newBuffer.getRawData()])
716
- this.deps.scheduleDraw()
498
+ this._comparisonManager.addSymbol(spec, () => {
499
+ const allSpecs = this._symbolsSignal.peek()
500
+ this._symbolsSignal.set([allSpecs[0]!, ...this._comparisonManager.specs])
717
501
  })
718
- this._cmpLoadingUnsubs.set(key, unsubscribe)
719
- const unsubLoading = newBuffer.loading.subscribe(() => this.recomputeComparisonLoading())
720
- this._cmpLoadingUnsubs.set(`loading:${key}`, unsubLoading)
721
- const primaryBuf = this.getActiveDataBuffer()
722
- const mainEarliest = primaryBuf?.loadedWindow?.earliestTs
723
- newBuffer.setSymbol(spec, mainEarliest)
724
- this._symbolsSignal.set([this._symbolsSignal.peek()[0]!, ...this._comparisonSpecs])
725
502
  }
726
503
 
727
504
  setComparisonData(symbol: string, data: KLineData[]): void {
728
- const period = this.currentPeriod
729
- const key = bufKey(BUF_COMPARISON, symbol, period)
730
-
731
- const existing = this._buffers.get(key) as DataBuffer | undefined
732
- if (!existing) {
733
- const buffer = new DataBuffer()
734
- this._buffers.set(key, buffer)
735
-
736
- const unsub = buffer.data.subscribe(() => {
737
- this._comparisonData.set(symbol, [...buffer.getRawData()])
738
- this.deps.scheduleDraw()
739
- })
740
- this._cmpLoadingUnsubs.set(key, unsub)
741
-
742
- const unsubLoading = buffer.loading.subscribe(() => this.recomputeComparisonLoading())
743
- this._cmpLoadingUnsubs.set(`loading:${key}`, unsubLoading)
744
-
745
- const color =
746
- COMPARISON_PALETTE[this._comparisonColors.size % COMPARISON_PALETTE.length] ??
747
- DEFAULT_COMPARISON_COLOR
748
- this._comparisonColors.set(symbol, color)
749
- this._comparisonColorsSignal.set(new Map(this._comparisonColors))
750
-
751
- const spec: SymbolSpec = { symbol, period }
752
- this._comparisonSpecs.push(spec)
753
- const mainSpec = this._symbolsSignal.peek()[0]
754
- this._symbolsSignal.set(
755
- mainSpec ? [mainSpec, ...this._comparisonSpecs] : [...this._comparisonSpecs],
756
- )
757
-
758
- buffer.setInlineData(data)
759
- return
760
- }
761
- existing.setInlineData(data)
505
+ this._comparisonManager.setData(symbol, data, (key) => {
506
+ this._symbolsSignal.set([
507
+ this._symbolsSignal.peek()[0]!,
508
+ ...this._comparisonManager.specs,
509
+ ])
510
+ })
762
511
  }
763
512
 
764
513
  removeComparisonSymbol(symbol: string): void {
765
- let found = false
766
- for (const [key, buf] of this._buffers) {
767
- if (key.startsWith(BUF_COMPARISON) && key.split(':')[1] === symbol) {
768
- this.disposeBuffer(key)
769
- found = true
770
- break
771
- }
772
- }
773
- if (!found) return
774
-
775
- this._comparisonData.delete(symbol)
776
- this._comparisonColors.delete(symbol)
777
- this._comparisonColorsSignal.set(new Map(this._comparisonColors))
778
- this._comparisonSpecs = this._comparisonSpecs.filter((s) => s.symbol !== symbol)
779
- this._symbolsSignal.set([this._symbolsSignal.peek()[0]!, ...this._comparisonSpecs])
780
- this.recomputeComparisonLoading()
514
+ if (!this._comparisonManager.removeSymbol(symbol)) return
515
+ this._symbolsSignal.set([this._symbolsSignal.peek()[0]!, ...this._comparisonManager.specs])
781
516
  this.deps.scheduleDraw()
782
517
  }
783
518
 
@@ -805,7 +540,7 @@ export class ChartDataManager {
805
540
  const spec = this._currentSpec
806
541
  if (spec) {
807
542
  const key = bufKey(BUF_TIMESHARE, spec.symbol)
808
- this._buffers.set(key, tsBuf)
543
+ this._tsBuffers.set(key, tsBuf)
809
544
  this.activateBuffer(key)
810
545
  tsBuf.load(spec)
811
546
  }
@@ -819,19 +554,37 @@ export class ChartDataManager {
819
554
  return
820
555
  }
821
556
  const next = { ...current, period }
822
- this.setSymbols([next, ...this._comparisonSpecs])
557
+ this.setSymbols([next, ...this._comparisonManager.specs])
558
+ }
559
+
560
+ /**
561
+ * 归一化 K 线周期别名,防止无效 period 进入引擎
562
+ * "day" → "daily",其余保持原值
563
+ */
564
+ private static normalizePeriod(period?: string): string {
565
+ if (!period) return 'daily'
566
+ const alias = period.toLowerCase().trim()
567
+ if (alias === 'day') return 'daily'
568
+ return period
823
569
  }
824
570
 
825
571
  applyCustomData(source: CustomDataSource): void {
572
+ const plainData = source.data.map((d) => ({ ...d }))
573
+
574
+ // 首次调用时保存原始 spec,用于切回 Fetcher 时恢复
575
+ if (!this._preCustomSpec) {
576
+ this._preCustomSpec = { ...(this._currentSpec ?? this._symbolsSignal.peek()[0] ?? { symbol: '' }) }
577
+ }
578
+
579
+ // 每次都切到 custom 品种,注册到目录,填入数据
826
580
  const spec: SymbolSpec = {
827
- symbol: source.symbol ?? this._currentSpec?.symbol ?? '',
828
- period: source.period ?? this._currentSpec?.period ?? 'daily',
581
+ symbol: source.symbol ?? '',
582
+ period: ChartDataManager.normalizePeriod(source.period),
829
583
  incremental: false,
830
584
  source: source.source ?? 'custom',
831
585
  }
832
- this.setSymbols([spec, ...this._comparisonSpecs])
586
+ this.setSymbols([spec, ...this._comparisonManager.specs])
833
587
 
834
- // Auto-register the custom symbol into the available catalog so it appears in UI pickers.
835
588
  const symbolCode = spec.symbol
836
589
  if (symbolCode) {
837
590
  this.registerSymbols([
@@ -844,10 +597,9 @@ export class ChartDataManager {
844
597
  ])
845
598
  }
846
599
 
847
- const plainData = source.data.map((d) => ({ ...d }))
848
600
  this.setData(plainData)
849
601
  if (source.comparisons) {
850
- for (const key of this._comparisonData.keys()) {
602
+ for (const key of this._comparisonManager.data.keys()) {
851
603
  if (!source.comparisons[key]) this.removeComparisonSymbol(key)
852
604
  }
853
605
  for (const [symbol, data] of Object.entries(source.comparisons)) {
@@ -859,6 +611,21 @@ export class ChartDataManager {
859
611
  }
860
612
  }
861
613
 
614
+ resetToFetcher(spec: SymbolSpec): void {
615
+ if (this._activeBufferKey && !this._activeBufferKey.startsWith(BUF_TIMESHARE)) {
616
+ this.disposeBuffer(this._activeBufferKey)
617
+ }
618
+ this._dataSignal.set([])
619
+ this.lastVisibleRange = { start: 0, end: 0 }
620
+ this.lastRawVisibleRange = { start: 0, end: 0 }
621
+ this._savedScrollLeft = null
622
+ this.setSymbols([spec, ...this._comparisonManager.specs])
623
+ }
624
+
625
+ getPreCustomSpec(): SymbolSpec | null {
626
+ return this._preCustomSpec
627
+ }
628
+
862
629
  // ── Main symbol switching ──
863
630
 
864
631
  setSymbols(specs: ReadonlyArray<SymbolSpec>): void {
@@ -879,23 +646,21 @@ export class ChartDataManager {
879
646
  if (primary.period === 'timeshare') {
880
647
  // Switch to timeshare mode
881
648
  this.clearComparisonBuffers()
882
- // Dispose primary KLine buffer
883
- for (const [key, buf] of this._buffers) {
884
- if (key.startsWith(BUF_PRIMARY)) {
885
- this.disposeBuffer(key)
886
- }
887
- }
649
+ // Save scroll position so we can restore it when returning to K-line mode
650
+ this._savedScrollLeft = this.deps.getCachedScrollLeft()
651
+ // Keep primary KLine buffer in memory — don't dispose it,
652
+ // so data and scroll position are preserved when user returns
888
653
  this._dataSignal.set([])
889
654
  this.lastVisibleRange = { start: 0, end: 0 }
890
655
  this.lastRawVisibleRange = { start: 0, end: 0 }
891
656
 
892
657
  // Get or create timeshare buffer
893
658
  const tsKey = bufKey(BUF_TIMESHARE, primary.symbol)
894
- let tsBuf = this._buffers.get(tsKey) as TimeShareBuffer | undefined
659
+ let tsBuf = this._tsBuffers.get(tsKey)
895
660
  if (!tsBuf) {
896
661
  tsBuf = new TimeShareBuffer()
897
662
  tsBuf.setFetcher(this._timeShareFetcher)
898
- this._buffers.set(tsKey, tsBuf)
663
+ this._tsBuffers.set(tsKey, tsBuf)
899
664
  }
900
665
  this.activateBuffer(tsKey)
901
666
  tsBuf.load(primary)
@@ -904,10 +669,8 @@ export class ChartDataManager {
904
669
 
905
670
  // KLine mode
906
671
  // Dispose timeshare buffer
907
- for (const [key, buf] of this._buffers) {
908
- if (key.startsWith(BUF_TIMESHARE)) {
909
- this.disposeBuffer(key)
910
- }
672
+ for (const [key] of this._tsBuffers) {
673
+ this.disposeBuffer(key)
911
674
  }
912
675
 
913
676
  this.loadKLineSymbols(specs)
@@ -936,7 +699,12 @@ export class ChartDataManager {
936
699
  incremental: spec.incremental ?? buf.currentSpec?.incremental ?? true,
937
700
  })
938
701
  this.deps.resetInteraction()
939
- this.scrollToRight()
702
+ if (this._savedScrollLeft !== null) {
703
+ this.deps.setScrollLeft(this._savedScrollLeft)
704
+ this._savedScrollLeft = null
705
+ } else {
706
+ this.scrollToRight()
707
+ }
940
708
  return
941
709
  }
942
710
 
@@ -947,16 +715,6 @@ export class ChartDataManager {
947
715
  )
948
716
  }
949
717
 
950
- buf.onPrepend = (count: number) => {
951
- this.pendingPrependedCount = count
952
- const dpr = this.deps.getEffectiveDpr()
953
- const opt = this.deps.getOption()
954
- const { unitPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
955
- const compensation = (count * unitPx) / dpr
956
- const nextScrollLeft = this.deps.getCachedScrollLeft() + compensation
957
- this.deps.setScrollLeft(nextScrollLeft)
958
- }
959
-
960
718
  buf.setSymbol(spec)
961
719
  }
962
720
 
@@ -972,47 +730,20 @@ export class ChartDataManager {
972
730
  const buf = this.getActiveDataBuffer()
973
731
  const dataLength = buf ? buf.getRawData().length : 0
974
732
  if (dataLength === 0) return 0
975
- const opt = this.deps.getOption()
976
- const viewWidth = this.deps.getViewport()?.plotWidth ?? 0
977
- const dpr = this.deps.getEffectiveDpr()
978
- const { startXPx, unitPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
979
- const dataPlotWidth = (startXPx + (dataLength + ChartDataManager.TRAILING_SLOTS) * unitPx) / dpr
980
- return this.getLeftLoadBufferWidth() + Math.max(dataPlotWidth, viewWidth)
733
+ return this._scrollCompensator.getContentWidth(dataLength)
981
734
  }
982
735
 
983
736
  scrollToRight(): void {
984
737
  const buf = this.getActiveDataBuffer()
985
738
  const dataLength = buf ? buf.getRawData().length : 0
986
- if (dataLength === 0) return
987
- const dpr = this.deps.getEffectiveDpr()
988
- const opt = this.deps.getOption()
989
- const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
990
- const lastKLineEndPx = (startXPx + dataLength * unitPx) / dpr
991
- const viewport = this.deps.getViewport()
992
- const clientWidth =
993
- viewport?.viewWidth ??
994
- (this.deps.getObservedSize().width > 0 ? this.deps.getObservedSize().width : undefined) ??
995
- Math.round(this.deps.getDom().container?.clientWidth ?? 0)
996
- if (clientWidth <= 0) return
997
- const leftBuffer = this.getLeftLoadBufferWidth()
998
- let target: number
999
- if (lastKLineEndPx <= clientWidth) {
1000
- // 数据不足以填满一屏 → 右对齐:最后一根 K 线固定在右侧
1001
- target = leftBuffer - (clientWidth - lastKLineEndPx)
1002
- } else {
1003
- target = leftBuffer + (lastKLineEndPx - clientWidth)
1004
- }
1005
- const contentWidth = this.getContentWidth()
1006
- const maxScroll = Math.max(0, contentWidth - clientWidth)
1007
- const scrollLeft = Math.round(Math.max(0, Math.min(target, maxScroll)) * dpr) / dpr
1008
- this.deps.setScrollLeft(scrollLeft)
739
+ this._scrollCompensator.scrollToRight(dataLength)
1009
740
  this.deps.scheduleDraw()
1010
741
  }
1011
742
 
1012
743
  // ── Comparison price range ──
1013
744
 
1014
745
  getComparisonEquivalentPriceRange(range: VisibleRange): { min: number; max: number } | null {
1015
- if (this._comparisonSpecs.length === 0 || this._comparisonData.size === 0) return null
746
+ if (this._comparisonManager.specs.length === 0 || this._comparisonManager.data.size === 0) return null
1016
747
  const buf = this.getActiveDataBuffer()
1017
748
  const internalData = buf ? buf.getRawData() : []
1018
749
  const baseIndex = Math.max(0, range.start)
@@ -1024,8 +755,8 @@ export class ChartDataManager {
1024
755
  let min = Number.POSITIVE_INFINITY
1025
756
  let max = Number.NEGATIVE_INFINITY
1026
757
 
1027
- for (const spec of this._comparisonSpecs) {
1028
- const data = this._comparisonData.get(spec.symbol)
758
+ for (const spec of this._comparisonManager.specs) {
759
+ const data = this._comparisonManager.data.get(spec.symbol)
1029
760
  if (!data?.length) continue
1030
761
 
1031
762
  const baseline = baseDate
@@ -1063,7 +794,7 @@ export class ChartDataManager {
1063
794
  getLogicalSlotCount(): number {
1064
795
  const buf = this.getActiveDataBuffer()
1065
796
  const dataLength = buf ? buf.getRawData().length : 0
1066
- return dataLength + this.getTrailingSlotCount()
797
+ return dataLength + 24
1067
798
  }
1068
799
 
1069
800
  getTimestampAtLogicalIndex(index: number): number | null {
@@ -1097,7 +828,10 @@ export class ChartDataManager {
1097
828
  }
1098
829
 
1099
830
  private disposeAllBuffers(): void {
1100
- for (const key of this._buffers.keys()) {
831
+ for (const key of this._klineBuffers.keys()) {
832
+ this.disposeBuffer(key)
833
+ }
834
+ for (const key of this._tsBuffers.keys()) {
1101
835
  this.disposeBuffer(key)
1102
836
  }
1103
837
  }
@@ -1105,10 +839,7 @@ export class ChartDataManager {
1105
839
  destroy(): void {
1106
840
  this._activeBufferUnsub?.()
1107
841
  this.disposeAllBuffers()
1108
- this.clearIncrementalLoadHintTimer()
1109
- this.incrementalLoadHintEl?.remove()
1110
- this.incrementalLoadHintEl = null
1111
- this.pendingPrependedCount = 0
842
+ this._loadHint.destroy()
1112
843
  }
1113
844
  }
1114
845
 
@@ -1131,11 +862,3 @@ function findComparisonBaselineByTimestamp(
1131
862
  }
1132
863
  return null
1133
864
  }
1134
-
1135
- function batchFormatDate(ts: number): string {
1136
- const d = new Date(ts)
1137
- const y = d.getFullYear()
1138
- const m = String(d.getMonth() + 1).padStart(2, '0')
1139
- const day = String(d.getDate()).padStart(2, '0')
1140
- return `${y}-${m}-${day}`
1141
- }