@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
@@ -12,6 +12,7 @@
12
12
  * - Tear down DOM + listeners on dispose().
13
13
  */
14
14
 
15
+ import { KLineChartError } from '../errors'
15
16
  import { createSignal, type Signal } from '../reactivity'
16
17
  import type {
17
18
  ChartController,
@@ -223,7 +224,7 @@ function mapInteractionSnapshot(snapshot: LegacyInteractionSnapshot): Interactio
223
224
  function buildDom(container: HTMLElement): MountedDom {
224
225
  const ownerDoc = container.ownerDocument
225
226
  if (!ownerDoc) {
226
- throw new Error(
227
+ throw new KLineChartError('CONTROLLER_CONFIG_INVALID',
227
228
  '[createChartController] container has no ownerDocument; cannot build DOM scaffold',
228
229
  )
229
230
  }
@@ -236,11 +237,11 @@ function buildDom(container: HTMLElement): MountedDom {
236
237
  chartContainer = ownerDoc.createElement('div')
237
238
  chartContainer.style.width = '100%'
238
239
  chartContainer.style.height = '100%'
239
- chartContainer.style.position = 'relative'
240
- chartContainer.style.overflow = 'auto'
241
240
  container.appendChild(chartContainer)
242
241
  containerCreatedByUs = true
243
242
  }
243
+ chartContainer.style.position = 'relative'
244
+ chartContainer.style.overflow = 'auto'
244
245
 
245
246
  const scrollContent = ownerDoc.createElement('div')
246
247
  scrollContent.className = 'klc-scroll-content'
@@ -296,10 +297,10 @@ function buildDom(container: HTMLElement): MountedDom {
296
297
 
297
298
  export async function createChartController(opts: ChartMountOptions): Promise<ChartController> {
298
299
  if (!opts) {
299
- throw new Error('[createChartController] opts is required')
300
+ throw new KLineChartError('CONTROLLER_CONFIG_INVALID', '[createChartController] opts is required')
300
301
  }
301
302
  if (!opts.container) {
302
- throw new Error('[createChartController] opts.container must be a non-null HTMLElement')
303
+ throw new KLineChartError('CONTROLLER_CONFIG_INVALID', '[createChartController] opts.container must be a non-null HTMLElement')
303
304
  }
304
305
 
305
306
  await loadBuiltinIndicators()
@@ -317,6 +318,15 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
317
318
  }
318
319
  : buildDom(opts.container)
319
320
 
321
+ // ── Fix 0×0 sizing for buildDom()-created right axis host ──
322
+ if (!hasExistingDom && mounted.rightAxisLayer) {
323
+ const hostWidth =
324
+ (opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth) +
325
+ (opts.priceLabelWidth ?? DEFAULT_OPTS.priceLabelWidth)
326
+ mounted.rightAxisLayer.style.bottom = '0'
327
+ mounted.rightAxisLayer.style.width = hostWidth + 'px'
328
+ }
329
+
320
330
  const initialZoomLevel = opts.initialZoomLevel ?? DEFAULT_OPTS.initialZoomLevel
321
331
  const zoomLevelCount = opts.zoomLevels ?? DEFAULT_OPTS.zoomLevels
322
332
 
@@ -372,7 +382,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
372
382
  kGap: currentKGap,
373
383
  })
374
384
 
375
- const data: Signal<ReadonlyArray<KLineData>> = createSignal(opts.data)
385
+ const data: Signal<ReadonlyArray<KLineData>> = createSignal(opts.data ?? [])
376
386
  const dataLoading: Signal<boolean> = createSignal(false)
377
387
 
378
388
  const symbols: Signal<ReadonlyArray<SymbolSpec>> = chart.symbols
@@ -402,10 +412,12 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
402
412
  /* tolerate jsdom */
403
413
  }
404
414
 
405
- try {
406
- chart.setData([...opts.data])
407
- } catch {
408
- /* tolerate first-paint racing */
415
+ if (opts.data) {
416
+ try {
417
+ chart.setData([...opts.data])
418
+ } catch {
419
+ /* tolerate first-paint racing */
420
+ }
409
421
  }
410
422
 
411
423
  // Apply initial DataFetcher
@@ -906,6 +918,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
906
918
  comparisonColors,
907
919
  comparisonLoading,
908
920
  catalog: DEFAULT_INDICATOR_CATALOG,
921
+ alertController: chart.alertController,
909
922
  setSymbols,
910
923
  addComparisonSymbol,
911
924
  removeComparisonSymbol,
@@ -12,6 +12,7 @@ import type { Signal } from '../reactivity'
12
12
  import type { CustomMarkerEntity } from '../engine/marker/registry'
13
13
  import type { PaneSpec } from '../engine/chartTypes'
14
14
  import type { InteractionSnapshot } from '../engine/chart'
15
+ import type { AlertController } from '../alerts/types'
15
16
 
16
17
  // Controller-owned public surface. Legacy engine types may mirror these
17
18
  // shapes internally, but adapters depend only on core-defined contracts.
@@ -215,7 +216,7 @@ export interface DrawingControllerCallbacks {
215
216
 
216
217
  export interface ChartMountOptions {
217
218
  container: HTMLElement
218
- data: ReadonlyArray<KLineData>
219
+ data?: ReadonlyArray<KLineData>
219
220
  symbols?: ReadonlyArray<SymbolSpec>
220
221
  dataFetcher?: DataFetcher
221
222
  initialZoomLevel?: number
@@ -267,6 +268,9 @@ export interface ChartController extends DrawingChartAdapter {
267
268
  // indicator catalog (static — adapters use for picker UI)
268
269
  readonly catalog: ReadonlyArray<IndicatorDefinition>
269
270
 
271
+ // ---- Alerts ----
272
+ readonly alertController: AlertController
273
+
270
274
  // ---- Data ----
271
275
  setSymbols(next: ReadonlyArray<SymbolSpec>): void
272
276
  addComparisonSymbol(spec: SymbolSpec): void
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../errors'
1
2
  import type { KLineData } from '../controllers/types'
2
3
  import { DataFetcher } from './fetcherDefinitionRegistry'
3
4
  import type { FetchConfig } from './types'
@@ -27,7 +28,7 @@ async function fetchBaoStock(
27
28
  try {
28
29
  const res = await fetch(url)
29
30
  if (!res.ok) {
30
- throw new Error(`[baostock] fetch failed: ${res.status} ${res.statusText}`)
31
+ throw new KLineChartError('FETCH_FAILED', `[baostock] fetch failed: ${res.status} ${res.statusText}`)
31
32
  }
32
33
  const json = await res.json()
33
34
  return (json.data ?? json).map(
@@ -1,5 +1,6 @@
1
1
  import { Context, Effect, pipe, Schedule } from 'effect'
2
2
  import type { Effect as EffectType } from 'effect/Effect'
3
+ import { KLineChartError } from '../errors'
3
4
  import type { KLineData, SymbolSpec } from '../controllers/types'
4
5
  import type { TimeShareData } from '../types/price'
5
6
 
@@ -83,7 +84,8 @@ export const fetchKLine = (
83
84
  )
84
85
  if (data.length === 0) {
85
86
  return yield* Effect.fail(
86
- new Error(
87
+ new KLineChartError(
88
+ 'FETCH_FAILED',
87
89
  `[DataBuffer] empty data for ${spec.symbol} ${formatDate(startTs)}~${formatDate(endTs)}`,
88
90
  ),
89
91
  )
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../errors'
1
2
  import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn, TimeShareFetcherFn } from './types'
2
3
 
3
4
  type DataFetcherClass = {
@@ -12,7 +13,7 @@ export function DataFetcher(config: DataFetcherDefinitionConfig) {
12
13
  return function <T extends DataFetcherClass>(value: T, context: ClassDecoratorContext<T>): T {
13
14
  context.addInitializer(function (this: T) {
14
15
  if (typeof this.fetcher !== 'function') {
15
- throw new Error(
16
+ throw new KLineChartError('NOT_REGISTERED',
16
17
  `[DataFetcher] '${config.name}' definition must expose static fetcher`,
17
18
  )
18
19
  }
@@ -1,4 +1,5 @@
1
1
  import type { KLineData, TimeShareData } from '../controllers/types'
2
+ import { KLineChartError } from '../errors'
2
3
  import { DataFetcher } from './fetcherDefinitionRegistry'
3
4
  import type { FetchConfig, TimeShareFetchConfig } from './types'
4
5
 
@@ -60,7 +61,7 @@ async function fetchGotdxHistoryTick(
60
61
  headers: { 'Content-Type': 'application/json' },
61
62
  body: JSON.stringify(body),
62
63
  })
63
- if (!res.ok) throw new Error(`[gotdx] history-tick failed: ${res.status} ${res.statusText}`)
64
+ if (!res.ok) throw new KLineChartError('FETCH_FAILED', `[gotdx] history-tick failed: ${res.status} ${res.statusText}`)
64
65
  const list: Array<{ timestamp: string; Price: number; Avg: number; Vol: number }> = await res.json()
65
66
  return list.map((item) => ({
66
67
  timestamp: new Date(item.timestamp).getTime(),
@@ -157,7 +158,7 @@ async function fetchGotdx(
157
158
  headers: { 'Content-Type': 'application/json' },
158
159
  body: JSON.stringify(body),
159
160
  })
160
- if (!res.ok) throw new Error(`[gotdx] ex/kline-by-date failed: ${res.status} ${res.statusText}`)
161
+ if (!res.ok) throw new KLineChartError('FETCH_FAILED', `[gotdx] ex/kline-by-date failed: ${res.status} ${res.statusText}`)
161
162
  const list: ExKLineItem[] = await res.json()
162
163
  return list.map((item) => mapExItem(item, config.symbol))
163
164
  }
@@ -179,7 +180,7 @@ async function fetchGotdx(
179
180
  headers: { 'Content-Type': 'application/json' },
180
181
  body: JSON.stringify(body),
181
182
  })
182
- if (!res.ok) throw new Error(`[gotdx] stock/kline-by-date failed: ${res.status} ${res.statusText}`)
183
+ if (!res.ok) throw new KLineChartError('FETCH_FAILED', `[gotdx] stock/kline-by-date failed: ${res.status} ${res.statusText}`)
183
184
  const list: SecurityBar[] = await res.json()
184
185
  return list.map((item) => mapBar(item, config.symbol))
185
186
  }
@@ -1,5 +1,6 @@
1
1
  import type { DataFetcher } from '../controllers/types'
2
2
  import type { TimeShareFetcherFn } from './types'
3
+ import { KLineChartError } from '../errors'
3
4
  import { getRegisteredFetcher, fetcherSupportsPeriod, getTimeShareFetcher } from './fetcherDefinitionRegistry'
4
5
 
5
6
  const FALLBACK_SOURCE = 'baostock'
@@ -13,7 +14,8 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
13
14
  const fallback = getRegisteredFetcher(FALLBACK_SOURCE)
14
15
  if (!fallback) {
15
16
  return Promise.reject(
16
- new Error(
17
+ new KLineChartError(
18
+ 'FETCH_FAILED',
17
19
  `[DataFetcher] no fetcher registered for "${source}" and no fallback available`,
18
20
  ),
19
21
  )
@@ -23,7 +25,8 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
23
25
 
24
26
  if (!fetcherSupportsPeriod(source, config.period)) {
25
27
  return Promise.reject(
26
- new Error(
28
+ new KLineChartError(
29
+ 'FETCH_FAILED',
27
30
  `[DataFetcher] "${source}" does not support period "${config.period}". Supported: ${def.capabilities?.join(', ') ?? 'none'}`,
28
31
  ),
29
32
  )
@@ -36,7 +39,7 @@ export const routerTimeShareFetcher: TimeShareFetcherFn = (source, config) => {
36
39
  const fetcher = getTimeShareFetcher(source)
37
40
  if (!fetcher) {
38
41
  return Promise.reject(
39
- new Error(`[DataFetcher] "${source}" does not support timeshare data fetching`),
42
+ new KLineChartError('FETCH_FAILED', `[DataFetcher] "${source}" does not support timeshare data fetching`),
40
43
  )
41
44
  }
42
45
  return fetcher(source, config)
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../errors'
1
2
  import type { KLineData } from '../controllers/types'
2
3
  import { DataFetcher } from './fetcherDefinitionRegistry'
3
4
  import type { FetchConfig } from './types'
@@ -34,11 +35,11 @@ async function fetchTradingview(
34
35
  try {
35
36
  const res = await fetch(url)
36
37
  if (!res.ok) {
37
- throw new Error(`[tradingview] fetch failed: ${res.status} ${res.statusText}`)
38
+ throw new KLineChartError('FETCH_FAILED', `[tradingview] fetch failed: ${res.status} ${res.statusText}`)
38
39
  }
39
40
  const json = await res.json()
40
41
  if (!json.success) {
41
- throw new Error(`[tradingview] API error: ${json.error_msg}`)
42
+ throw new KLineChartError('FETCH_FAILED', `[tradingview] API error: ${json.error_msg}`)
42
43
  }
43
44
  if (json.warning) {
44
45
  console.warn(`[tradingview] ${json.warning}`)
@@ -4,7 +4,7 @@ import { createSignal, type Signal, type Computed } from '../reactivity/signal'
4
4
  import type { SymbolSpec, CustomDataSource } from '../controllers/types'
5
5
  import { ChartDataManager } from './data/chartDataManager'
6
6
  import { ChartPaneLayout } from './layout/chartPaneLayout'
7
- import { UpdateLevel } from './layout/pane'
7
+ import { UpdateLevel, type VisibleRange } from './layout/pane'
8
8
  import type { ScaleType } from './utils/tickPosition'
9
9
  import { InteractionController, type InteractionSnapshot } from './controller/interaction'
10
10
  export type { InteractionSnapshot }
@@ -32,6 +32,15 @@ import {
32
32
  wrapPaneInfo,
33
33
  } from '../plugin'
34
34
  import type { SubIndicatorType } from './renderers/Indicator'
35
+ import type { AlertController, MarketSnapshot } from '../alerts/types'
36
+ import { createAlertController } from '../alerts'
37
+ import {
38
+ createVolumeLookbacks,
39
+ pushToVolumeLookbacks,
40
+ type VolumeLookbacks,
41
+ } from '../alerts/rollingVolume'
42
+ import { resolveStateKey } from './indicators/indicatorMetadata'
43
+ import type { IndicatorMetadata } from './indicators/indicatorMetadata'
35
44
 
36
45
 
37
46
  // 重新导出以保持向后兼容
@@ -83,8 +92,17 @@ export class Chart {
83
92
  private _modeSavedKGap = 0
84
93
  private _modeSavedZoomLevel = 0
85
94
 
86
- /** 分时模式激活前的 pane Y 轴刻度类型(退出分时时恢复) */
87
- private _savedScaleTypes: Map<string, ScaleType> | undefined
95
+ /** 分时模式激活前的 pane Y 轴刻度类型(退出分时时恢复) */
96
+ private _savedScaleTypes: Map<string, ScaleType> | undefined
97
+
98
+ /** 上次预警评估的最新 K 线时间戳(用于去重) */
99
+ private _lastAlertTimestamp: number | null = null
100
+
101
+ /** 预警控制器 */
102
+ readonly alertController: AlertController
103
+
104
+ /** 滚动成交量窗口(惰性初始化) */
105
+ private _volumeLookbacks: VolumeLookbacks | null = null
88
106
 
89
107
  /**
90
108
  * 启用主图指标
@@ -189,6 +207,8 @@ export class Chart {
189
207
  },
190
208
  })
191
209
 
210
+ this.alertController = createAlertController()
211
+
192
212
  this.dataManager = new ChartDataManager({
193
213
  getOption: () => this.opt,
194
214
  getEffectiveDpr: () => this.viewportManager.getEffectiveDpr(),
@@ -217,12 +237,15 @@ export class Chart {
217
237
  }
218
238
  }
219
239
  },
240
+ onDataProcessed: (data, range) => this.evaluateAlerts(data, range), // Alert 管线绑定
220
241
  })
221
242
 
222
243
  this.zoomController = new ChartZoomController({
223
244
  getLogicalScrollLeft: () => this.viewportManager.getLogicalScrollLeft(),
224
245
  getCurrentDpr: () => this.viewportManager.getEffectiveDpr(),
225
246
  getLeftLoadBufferWidth: () => this.dataManager.getLeftLoadBufferWidth(),
247
+ getContentWidth: () => this.dataManager.getContentWidth(),
248
+ getClientWidth: () => this.viewportManager.getViewport()?.viewWidth ?? this.dom.container?.clientWidth ?? 0,
226
249
  setScrollLeft: (v) => { this.viewportManager.setScrollLeft(v) },
227
250
  onZoomCommitted: (result) => {
228
251
  this.opt = { ...this.opt, kWidth: result.kWidth, kGap: result.kGap }
@@ -264,6 +287,12 @@ export class Chart {
264
287
  setPendingIndicatorDataUpdate: (v) => { this.dataManager.pendingIndicatorDataUpdate = v },
265
288
  })
266
289
 
290
+ // Worker 异步结果就绪后串联 Alert 管线
291
+ this.indicatorManager.indicatorSchedulerAccessor.setOnResultsApplied(() => {
292
+ const data = this.dataManager.getInternalData()
293
+ this.evaluateAlerts(data, this.dataManager.lastVisibleRange)
294
+ })
295
+
267
296
  // 初始化渲染器
268
297
  this.renderer = new ChartRenderer({
269
298
  getDom: () => this.dom,
@@ -687,6 +716,97 @@ export class Chart {
687
716
  return this.indicatorManager.indicatorSchedulerAccessor
688
717
  }
689
718
 
719
+ /** 获取预警控制器 */
720
+ getAlertController(): AlertController {
721
+ return this.alertController
722
+ }
723
+
724
+ /** 数据就绪时触发预警评估 */
725
+ private evaluateAlerts(data: KLineData[], range: VisibleRange): void {
726
+ const latest = data[data.length - 1]
727
+ if (!latest) return
728
+ // 去重:同一根 K 线只评估一次(增量加载/Worker 重复回调时跳过)
729
+ if (latest.timestamp === this._lastAlertTimestamp) return
730
+ this._lastAlertTimestamp = latest.timestamp
731
+
732
+ // 推进滚动量滑窗(仅在新 K 线到达时)
733
+ let lookbacks = this._volumeLookbacks
734
+ if (!lookbacks) {
735
+ lookbacks = createVolumeLookbacks([5, 10, 20, 60])
736
+ this._volumeLookbacks = lookbacks
737
+ }
738
+ pushToVolumeLookbacks(lookbacks, latest.volume ?? 0)
739
+
740
+ const snapshot = this.buildMarketSnapshot(data)
741
+ if (!snapshot) return
742
+ const events = this.alertController.evaluate(snapshot, Date.now())
743
+ if (events.length > 0) {
744
+ console.log('[Alerts] fired:', events)
745
+ }
746
+ }
747
+
748
+ /** 构建预警引擎所需的当前市场快照 */
749
+ private buildMarketSnapshot(data: KLineData[]): MarketSnapshot | null {
750
+ const latest = data[data.length - 1]
751
+ if (!latest) return null
752
+
753
+ if (latest.volume === undefined) return null
754
+
755
+ const bar = {
756
+ timestamp: latest.timestamp,
757
+ open: latest.open,
758
+ high: latest.high,
759
+ low: latest.low,
760
+ close: latest.close,
761
+ volume: latest.volume,
762
+ }
763
+
764
+ const indicators: Record<string, number> = {}
765
+ const scheduler = this.getIndicatorScheduler()
766
+ for (const meta of scheduler.getAllIndicators()) {
767
+ const paneId = meta.defaultPaneId === 'main' ? 'main' : meta.defaultPaneId
768
+ const stateKey = resolveStateKey(meta.stateKey, paneId)
769
+ const state = this.pluginHost.getSharedState<any>(stateKey)
770
+ if (!state?.series) continue
771
+ const series = state.series
772
+ if (Array.isArray(series)) {
773
+ const val = series[series.length - 1]
774
+ if (typeof val === 'number' && Number.isFinite(val)) {
775
+ indicators[meta.name] = val
776
+ }
777
+ } else if (typeof series === 'object') {
778
+ const keys = Object.keys(series)
779
+ if (keys.length > 0) {
780
+ const lastKey = keys[keys.length - 1]!
781
+ const arr = series[lastKey]
782
+ if (Array.isArray(arr)) {
783
+ const val = arr[arr.length - 1]
784
+ if (typeof val === 'number' && Number.isFinite(val)) {
785
+ indicators[meta.name] = val
786
+ }
787
+ }
788
+ }
789
+ }
790
+ }
791
+
792
+ // 只读滚动量(由 evaluateAlerts 推进滑窗)
793
+ const rollingVolume: Record<number, number> = {}
794
+ if (this._volumeLookbacks) {
795
+ for (const [size, calc] of this._volumeLookbacks) {
796
+ rollingVolume[size] = calc.mean
797
+ }
798
+ }
799
+
800
+ return {
801
+ bar,
802
+ indicators,
803
+ rollingVolume,
804
+ volumeProfile: undefined,
805
+ orderBook: undefined,
806
+ footprint: undefined,
807
+ }
808
+ }
809
+
690
810
  getLogicalSlotCount(): number {
691
811
  return this.dataManager.getLogicalSlotCount()
692
812
  }
@@ -772,6 +892,7 @@ export class Chart {
772
892
  this.layoutManager.destroy()
773
893
  this.sharedWebGLSurface.destroy()
774
894
  this.indicatorManager.destroy()
895
+ this.alertController.dispose()
775
896
  await this.pluginHost.destroy()
776
897
  }
777
898
 
@@ -896,6 +1017,8 @@ export class Chart {
896
1017
  }
897
1018
 
898
1019
  setSymbols(specs: ReadonlyArray<SymbolSpec>): void {
1020
+ // 品种/周期切换时重置最新 K 线时间戳,确保新数据触发预警
1021
+ this._lastAlertTimestamp = null
899
1022
  const primaryPeriod = specs[0]?.period
900
1023
  if (primaryPeriod) {
901
1024
  this.setActiveMode(primaryPeriod === 'timeshare' ? this._timeShareMode : this._kLineMode)
@@ -31,6 +31,7 @@ export interface DataDependencies {
31
31
  setPendingIndicatorDataUpdate: (v: boolean) => void
32
32
  isPointerDown: () => boolean
33
33
  onTimeShareDataReady: (dataLength: number) => void
34
+ onDataProcessed?: (data: KLineData[], range: VisibleRange) => void
34
35
  }
35
36
 
36
37
  const BUF_PRIMARY = 'main'
@@ -184,7 +185,19 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
184
185
  this.pendingPrependedCount = 0
185
186
 
186
187
  if (prependedCount === 0 && this.deps.getCachedScrollLeft() < this.getLeftLoadBufferWidth()) {
187
- this.deps.setScrollLeft(this.getLeftLoadBufferWidth())
188
+ const scrollLeft = this.deps.getCachedScrollLeft()
189
+ if (scrollLeft <= 0) {
190
+ this.deps.setScrollLeft(this.getLeftLoadBufferWidth())
191
+ } else {
192
+ const dpr = this.deps.getEffectiveDpr()
193
+ const opt = this.deps.getOption()
194
+ const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
195
+ const totalDataWidth = (startXPx + bufferData.length * unitPx) / dpr
196
+ const leftBuffer = this.getLeftLoadBufferWidth()
197
+ if (scrollLeft >= leftBuffer + totalDataWidth) {
198
+ this.deps.setScrollLeft(leftBuffer)
199
+ }
200
+ }
188
201
  }
189
202
 
190
203
  if ((prevDataLength ?? this._dataSignal.peek().length) === 0 && bufferData.length > 0) {
@@ -216,6 +229,8 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
216
229
  if (indicatorsReady) {
217
230
  this.pendingIndicatorDataUpdate = false
218
231
  this.deps.scheduleDraw()
232
+ // Alert 管线入口:Chart 构造时绑定 → evaluateAlerts()
233
+ this.deps.onDataProcessed?.(bufferData, this.lastVisibleRange)
219
234
  } else {
220
235
  this.pendingIndicatorDataUpdate = true
221
236
  }
@@ -899,16 +914,23 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
899
914
  const dpr = this.deps.getEffectiveDpr()
900
915
  const opt = this.deps.getOption()
901
916
  const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
902
- const lastKLineEndPx = (startXPx + (dataLength + ChartDataManager.TRAILING_SLOTS) * unitPx) / dpr
917
+ const lastKLineEndPx = (startXPx + dataLength * unitPx) / dpr
903
918
  const viewport = this.deps.getViewport()
904
919
  const clientWidth = viewport?.viewWidth
905
920
  ?? (this.deps.getObservedSize().width > 0 ? this.deps.getObservedSize().width : undefined)
906
921
  ?? Math.round(this.deps.getDom().container?.clientWidth ?? 0)
907
922
  if (clientWidth <= 0) return
908
- const target = this.getLeftLoadBufferWidth() + Math.max(0, lastKLineEndPx - clientWidth)
923
+ const leftBuffer = this.getLeftLoadBufferWidth()
924
+ let target: number
925
+ if (lastKLineEndPx <= clientWidth) {
926
+ // 数据不足以填满一屏 → 右对齐:最后一根 K 线固定在右侧
927
+ target = leftBuffer - (clientWidth - lastKLineEndPx)
928
+ } else {
929
+ target = leftBuffer + (lastKLineEndPx - clientWidth)
930
+ }
909
931
  const contentWidth = this.getContentWidth()
910
932
  const maxScroll = Math.max(0, contentWidth - clientWidth)
911
- const scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr
933
+ const scrollLeft = Math.round(Math.max(0, Math.min(target, maxScroll)) * dpr) / dpr
912
934
  this.deps.setScrollLeft(scrollLeft)
913
935
  this.deps.scheduleDraw()
914
936
  }
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../../errors'
1
2
  import type { DrawingKind } from '../../plugin'
2
3
 
3
4
  // ---- Tool ID type ----
@@ -63,7 +64,7 @@ export function getAnchorCountForTool(toolId: DrawingToolId): 1 | 2 | 3 | null {
63
64
  export function getDrawingKind(toolId: DrawingToolId): DrawingKind {
64
65
  switch (toolId) {
65
66
  case 'cursor':
66
- throw new Error('cursor is not a drawing kind')
67
+ throw new KLineChartError('INVALID_PARAM', 'cursor is not a drawing kind')
67
68
  case 'h-line':
68
69
  return 'horizontal-line'
69
70
  case 'h-ray':
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../../errors'
1
2
  import type { KLineData } from '../../types/price'
2
3
  import { createSignal, computed, type Signal, type Computed } from '../../reactivity/signal'
3
4
  import type { IndicatorInstance, SubPaneInfo, PaneSpec, ChartOptions } from '../chartTypes'
@@ -375,7 +376,7 @@ export class ChartIndicatorManager {
375
376
 
376
377
  const definition = this.indicatorScheduler.getIndicatorMetadata(indicatorId)
377
378
  if (!definition) {
378
- throw new Error(`[Chart] Unknown indicator: ${indicatorId}`)
379
+ throw new KLineChartError('NOT_REGISTERED', `[Chart] Unknown indicator: ${indicatorId}`)
379
380
  }
380
381
  const renderer = createSubIndicatorRenderer({ indicatorId, paneId, definition, params })
381
382
  const rendererName = renderer.name
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../../errors'
1
2
  import type {
2
3
  IndicatorMetadata,
3
4
  IndicatorCategory,
@@ -73,7 +74,7 @@ export function Indicator(config: IndicatorDefinitionConfig) {
73
74
  context.addInitializer(function (this: T) {
74
75
  const rendererFactory = this.rendererFactory
75
76
  if (typeof rendererFactory !== 'function') {
76
- throw new Error(`[Indicator] '${config.name}' definition must expose static rendererFactory`)
77
+ throw new KLineChartError('INVALID_PARAM', `[Indicator] '${config.name}' definition must expose static rendererFactory`)
77
78
  }
78
79
 
79
80
  const normalizedName = normalizeIndicatorId(config.name)
@@ -5,6 +5,7 @@
5
5
  * 每个指标通过 metadata 描述其状态 key、渲染器工厂等元信息
6
6
  */
7
7
 
8
+ import { KLineChartError } from '../../errors'
8
9
  import type { PluginHost, RendererPluginWithHost } from '../../plugin'
9
10
  import type { IndicatorConfigSnapshot, IndicatorSeriesBundle } from './workerProtocol'
10
11
  import type { KLineData } from '../../types/price'
@@ -272,7 +273,7 @@ export interface IndicatorMetadata<T = unknown> {
272
273
  export function resolveStateKey(stateKey: StateKey, paneId?: string): string {
273
274
  if (typeof stateKey === 'function') {
274
275
  if (!paneId) {
275
- throw new Error('[IndicatorMetadata] Pane ID required for dynamic state key')
276
+ throw new KLineChartError('INVALID_PARAM', '[IndicatorMetadata] Pane ID required for dynamic state key')
276
277
  }
277
278
  return stateKey(paneId)
278
279
  }
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../../errors'
1
2
  import type { IndicatorMetadata } from './indicatorMetadata'
2
3
  import { getRegisteredIndicatorDefinitions } from './indicatorDefinitionRegistry'
3
4
 
@@ -52,20 +53,20 @@ export class IndicatorRegistry {
52
53
  register<T>(meta: IndicatorMetadata<T>): void {
53
54
  // 验证必填字段
54
55
  if (!meta.name || typeof meta.name !== 'string') {
55
- throw new Error('[IndicatorRegistry] Indicator name is required')
56
+ throw new KLineChartError('INVALID_PARAM', '[IndicatorRegistry] Indicator name is required')
56
57
  }
57
58
 
58
59
  if (!meta.displayName) {
59
- throw new Error(`[IndicatorRegistry] displayName is required for indicator '${meta.name}'`)
60
+ throw new KLineChartError('INVALID_PARAM', `[IndicatorRegistry] displayName is required for indicator '${meta.name}'`)
60
61
  }
61
62
 
62
63
  if (!meta.rendererFactory || typeof meta.rendererFactory !== 'function') {
63
- throw new Error(`[IndicatorRegistry] rendererFactory is required for indicator '${meta.name}'`)
64
+ throw new KLineChartError('INVALID_PARAM', `[IndicatorRegistry] rendererFactory is required for indicator '${meta.name}'`)
64
65
  }
65
66
 
66
67
  const normalizedName = this.normalize(meta.name)
67
68
  if (!normalizedName) {
68
- throw new Error('[IndicatorRegistry] Indicator name is required')
69
+ throw new KLineChartError('INVALID_PARAM', '[IndicatorRegistry] Indicator name is required')
69
70
  }
70
71
 
71
72
  // 检查重复注册
@@ -112,7 +113,7 @@ export class IndicatorRegistry {
112
113
  getRequired(name: string): IndicatorMetadata {
113
114
  const meta = this.get(name)
114
115
  if (!meta) {
115
- throw new Error(`[IndicatorRegistry] Unknown indicator '${name}'`)
116
+ throw new KLineChartError('NOT_REGISTERED', `[IndicatorRegistry] Unknown indicator '${name}'`)
116
117
  }
117
118
  return meta
118
119
  }
@@ -1,3 +1,4 @@
1
+ import { KLineChartError } from '../../errors'
1
2
  import { getRegisteredIndicatorDefinitions } from './indicatorDefinitionRegistry'
2
3
 
3
4
  let loaded = false
@@ -52,7 +53,7 @@ export async function loadBuiltinIndicators(): Promise<void> {
52
53
 
53
54
  export function getBuiltinIndicatorDefinitions() {
54
55
  if (!loaded) {
55
- throw new Error(
56
+ throw new KLineChartError('INVALID_STATE',
56
57
  'Builtin indicators not loaded yet. Call await loadBuiltinIndicators() first.',
57
58
  )
58
59
  }