@363045841yyt/klinechart-core 0.8.8 → 0.8.9

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 (571) hide show
  1. package/dist/controllers/index.d.ts +1 -1
  2. package/dist/controllers/index.d.ts.map +1 -1
  3. package/dist/controllers/types.d.ts +2 -2
  4. package/dist/controllers/types.d.ts.map +1 -1
  5. package/dist/data-fetchers/dataBuffer.d.ts +6 -0
  6. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  7. package/dist/data-fetchers/dataBuffer.js +50 -3
  8. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  9. package/dist/engine/chart.d.ts +0 -1
  10. package/dist/engine/chart.d.ts.map +1 -1
  11. package/dist/engine/chart.js +0 -42
  12. package/dist/engine/chart.js.map +1 -1
  13. package/dist/engine/controller/interaction.d.ts +62 -0
  14. package/dist/engine/controller/interaction.d.ts.map +1 -1
  15. package/dist/engine/controller/interaction.js +158 -74
  16. package/dist/engine/controller/interaction.js.map +1 -1
  17. package/dist/engine/data/chartDataManager.d.ts +3 -0
  18. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  19. package/dist/engine/data/chartDataManager.js +13 -4
  20. package/dist/engine/data/chartDataManager.js.map +1 -1
  21. package/dist/engine/drawing/index.d.ts +2 -5
  22. package/dist/engine/drawing/index.d.ts.map +1 -1
  23. package/dist/engine/drawing/index.js +2 -33
  24. package/dist/engine/drawing/index.js.map +1 -1
  25. package/dist/engine/drawing/interaction.js +1 -1
  26. package/dist/engine/drawing/interaction.js.map +1 -1
  27. package/dist/engine/drawing/linearRegression.d.ts +6 -0
  28. package/dist/engine/drawing/linearRegression.d.ts.map +1 -0
  29. package/dist/engine/drawing/linearRegression.js +34 -0
  30. package/dist/engine/drawing/linearRegression.js.map +1 -0
  31. package/dist/engine/drawing/plugin.d.ts.map +1 -1
  32. package/dist/engine/drawing/plugin.js +104 -94
  33. package/dist/engine/drawing/plugin.js.map +1 -1
  34. package/dist/engine/indicators/calculators/_shared.d.ts +3 -0
  35. package/dist/engine/indicators/calculators/_shared.d.ts.map +1 -0
  36. package/dist/engine/indicators/calculators/_shared.js +45 -0
  37. package/dist/engine/indicators/calculators/_shared.js.map +1 -0
  38. package/dist/engine/indicators/calculators/bands.d.ts +44 -0
  39. package/dist/engine/indicators/calculators/bands.d.ts.map +1 -0
  40. package/dist/engine/indicators/calculators/bands.js +268 -0
  41. package/dist/engine/indicators/calculators/bands.js.map +1 -0
  42. package/dist/engine/indicators/calculators/index.d.ts +33 -0
  43. package/dist/engine/indicators/calculators/index.d.ts.map +1 -0
  44. package/dist/engine/indicators/calculators/index.js +19 -0
  45. package/dist/engine/indicators/calculators/index.js.map +1 -0
  46. package/dist/engine/indicators/calculators/movingAverages.d.ts +21 -0
  47. package/dist/engine/indicators/calculators/movingAverages.d.ts.map +1 -0
  48. package/dist/engine/indicators/calculators/movingAverages.js +143 -0
  49. package/dist/engine/indicators/calculators/movingAverages.js.map +1 -0
  50. package/dist/engine/indicators/calculators/oscillators.d.ts +29 -0
  51. package/dist/engine/indicators/calculators/oscillators.d.ts.map +1 -0
  52. package/dist/engine/indicators/calculators/oscillators.js +349 -0
  53. package/dist/engine/indicators/calculators/oscillators.js.map +1 -0
  54. package/dist/engine/indicators/calculators/patterns.d.ts +54 -0
  55. package/dist/engine/indicators/calculators/patterns.d.ts.map +1 -0
  56. package/dist/engine/indicators/calculators/patterns.js +214 -0
  57. package/dist/engine/indicators/calculators/patterns.js.map +1 -0
  58. package/dist/engine/indicators/calculators/volatility.d.ts +6 -0
  59. package/dist/engine/indicators/calculators/volatility.d.ts.map +1 -0
  60. package/dist/engine/indicators/calculators/volatility.js +114 -0
  61. package/dist/engine/indicators/calculators/volatility.js.map +1 -0
  62. package/dist/engine/indicators/calculators/volume.d.ts +21 -0
  63. package/dist/engine/indicators/calculators/volume.d.ts.map +1 -0
  64. package/dist/engine/indicators/calculators/volume.js +218 -0
  65. package/dist/engine/indicators/calculators/volume.js.map +1 -0
  66. package/dist/engine/indicators/calculators.d.ts +1 -361
  67. package/dist/engine/indicators/calculators.d.ts.map +1 -1
  68. package/dist/engine/indicators/calculators.js +1 -1787
  69. package/dist/engine/indicators/calculators.js.map +1 -1
  70. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  71. package/dist/engine/indicators/chartIndicatorManager.js +3 -44
  72. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  73. package/dist/engine/indicators/indicatorRegistry.d.ts +8 -0
  74. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  75. package/dist/engine/indicators/indicatorRegistry.js +16 -0
  76. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  77. package/dist/engine/indicators/indicatorRuntime.js +2 -2
  78. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  79. package/dist/engine/indicators/scheduler.d.ts +2 -2
  80. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  81. package/dist/engine/indicators/scheduler.js +15 -155
  82. package/dist/engine/indicators/scheduler.js.map +1 -1
  83. package/dist/engine/indicators/{atrState.d.ts → state/atrState.d.ts} +1 -1
  84. package/dist/engine/indicators/state/atrState.d.ts.map +1 -0
  85. package/dist/engine/indicators/{atrState.js → state/atrState.js} +1 -1
  86. package/dist/engine/indicators/state/atrState.js.map +1 -0
  87. package/dist/engine/indicators/{bollState.d.ts → state/bollState.d.ts} +4 -2
  88. package/dist/engine/indicators/state/bollState.d.ts.map +1 -0
  89. package/dist/engine/indicators/{bollState.js → state/bollState.js} +5 -3
  90. package/dist/engine/indicators/state/bollState.js.map +1 -0
  91. package/dist/engine/indicators/{cciState.d.ts → state/cciState.d.ts} +1 -1
  92. package/dist/engine/indicators/state/cciState.d.ts.map +1 -0
  93. package/dist/engine/indicators/{cciState.js → state/cciState.js} +1 -1
  94. package/dist/engine/indicators/state/cciState.js.map +1 -0
  95. package/dist/engine/indicators/{chaikinVolState.d.ts → state/chaikinVolState.d.ts} +1 -1
  96. package/dist/engine/indicators/state/chaikinVolState.d.ts.map +1 -0
  97. package/dist/engine/indicators/{chaikinVolState.js → state/chaikinVolState.js} +1 -1
  98. package/dist/engine/indicators/state/chaikinVolState.js.map +1 -0
  99. package/dist/engine/indicators/{cmfState.d.ts → state/cmfState.d.ts} +1 -1
  100. package/dist/engine/indicators/state/cmfState.d.ts.map +1 -0
  101. package/dist/engine/indicators/{cmfState.js → state/cmfState.js} +1 -1
  102. package/dist/engine/indicators/state/cmfState.js.map +1 -0
  103. package/dist/engine/indicators/{demaState.d.ts → state/demaState.d.ts} +1 -1
  104. package/dist/engine/indicators/state/demaState.d.ts.map +1 -0
  105. package/dist/engine/indicators/{demaState.js → state/demaState.js} +1 -1
  106. package/dist/engine/indicators/state/demaState.js.map +1 -0
  107. package/dist/engine/indicators/{donchianState.d.ts → state/donchianState.d.ts} +1 -1
  108. package/dist/engine/indicators/state/donchianState.d.ts.map +1 -0
  109. package/dist/engine/indicators/{donchianState.js → state/donchianState.js} +1 -1
  110. package/dist/engine/indicators/state/donchianState.js.map +1 -0
  111. package/dist/engine/indicators/{eneState.d.ts → state/eneState.d.ts} +4 -2
  112. package/dist/engine/indicators/state/eneState.d.ts.map +1 -0
  113. package/dist/engine/indicators/{eneState.js → state/eneState.js} +5 -3
  114. package/dist/engine/indicators/state/eneState.js.map +1 -0
  115. package/dist/engine/indicators/{expmaState.d.ts → state/expmaState.d.ts} +4 -2
  116. package/dist/engine/indicators/state/expmaState.d.ts.map +1 -0
  117. package/dist/engine/indicators/{expmaState.js → state/expmaState.js} +5 -3
  118. package/dist/engine/indicators/state/expmaState.js.map +1 -0
  119. package/dist/engine/indicators/{fastkState.d.ts → state/fastkState.d.ts} +1 -1
  120. package/dist/engine/indicators/state/fastkState.d.ts.map +1 -0
  121. package/dist/engine/indicators/{fastkState.js → state/fastkState.js} +1 -1
  122. package/dist/engine/indicators/state/fastkState.js.map +1 -0
  123. package/dist/engine/indicators/{fibState.d.ts → state/fibState.d.ts} +1 -1
  124. package/dist/engine/indicators/state/fibState.d.ts.map +1 -0
  125. package/dist/engine/indicators/{fibState.js → state/fibState.js} +1 -1
  126. package/dist/engine/indicators/state/fibState.js.map +1 -0
  127. package/dist/engine/indicators/{hmaState.d.ts → state/hmaState.d.ts} +1 -1
  128. package/dist/engine/indicators/state/hmaState.d.ts.map +1 -0
  129. package/dist/engine/indicators/{hmaState.js → state/hmaState.js} +1 -1
  130. package/dist/engine/indicators/state/hmaState.js.map +1 -0
  131. package/dist/engine/indicators/{hvState.d.ts → state/hvState.d.ts} +1 -1
  132. package/dist/engine/indicators/state/hvState.d.ts.map +1 -0
  133. package/dist/engine/indicators/{hvState.js → state/hvState.js} +1 -1
  134. package/dist/engine/indicators/state/hvState.js.map +1 -0
  135. package/dist/engine/indicators/{ichimokuState.d.ts → state/ichimokuState.d.ts} +1 -1
  136. package/dist/engine/indicators/state/ichimokuState.d.ts.map +1 -0
  137. package/dist/engine/indicators/{ichimokuState.js → state/ichimokuState.js} +1 -1
  138. package/dist/engine/indicators/state/ichimokuState.js.map +1 -0
  139. package/dist/engine/indicators/{kamaState.d.ts → state/kamaState.d.ts} +1 -1
  140. package/dist/engine/indicators/state/kamaState.d.ts.map +1 -0
  141. package/dist/engine/indicators/{kamaState.js → state/kamaState.js} +1 -1
  142. package/dist/engine/indicators/state/kamaState.js.map +1 -0
  143. package/dist/engine/indicators/{keltnerState.d.ts → state/keltnerState.d.ts} +1 -1
  144. package/dist/engine/indicators/state/keltnerState.d.ts.map +1 -0
  145. package/dist/engine/indicators/{keltnerState.js → state/keltnerState.js} +1 -1
  146. package/dist/engine/indicators/state/keltnerState.js.map +1 -0
  147. package/dist/engine/indicators/{kstState.d.ts → state/kstState.d.ts} +2 -2
  148. package/dist/engine/indicators/state/kstState.d.ts.map +1 -0
  149. package/dist/engine/indicators/{kstState.js → state/kstState.js} +1 -1
  150. package/dist/engine/indicators/state/kstState.js.map +1 -0
  151. package/dist/engine/indicators/{maState.d.ts → state/maState.d.ts} +1 -1
  152. package/dist/engine/indicators/state/maState.d.ts.map +1 -0
  153. package/dist/engine/indicators/{maState.js → state/maState.js} +1 -1
  154. package/dist/engine/indicators/state/maState.js.map +1 -0
  155. package/dist/engine/indicators/{macdState.d.ts → state/macdState.d.ts} +3 -19
  156. package/dist/engine/indicators/state/macdState.d.ts.map +1 -0
  157. package/dist/engine/indicators/state/macdState.js.map +1 -0
  158. package/dist/engine/indicators/{mfiState.d.ts → state/mfiState.d.ts} +1 -1
  159. package/dist/engine/indicators/state/mfiState.d.ts.map +1 -0
  160. package/dist/engine/indicators/{mfiState.js → state/mfiState.js} +1 -1
  161. package/dist/engine/indicators/state/mfiState.js.map +1 -0
  162. package/dist/engine/indicators/{momState.d.ts → state/momState.d.ts} +1 -1
  163. package/dist/engine/indicators/state/momState.d.ts.map +1 -0
  164. package/dist/engine/indicators/{momState.js → state/momState.js} +1 -1
  165. package/dist/engine/indicators/state/momState.js.map +1 -0
  166. package/dist/engine/indicators/{obvState.d.ts → state/obvState.d.ts} +1 -1
  167. package/dist/engine/indicators/state/obvState.d.ts.map +1 -0
  168. package/dist/engine/indicators/{obvState.js → state/obvState.js} +1 -1
  169. package/dist/engine/indicators/state/obvState.js.map +1 -0
  170. package/dist/engine/indicators/{parkinsonState.d.ts → state/parkinsonState.d.ts} +1 -1
  171. package/dist/engine/indicators/state/parkinsonState.d.ts.map +1 -0
  172. package/dist/engine/indicators/{parkinsonState.js → state/parkinsonState.js} +1 -1
  173. package/dist/engine/indicators/state/parkinsonState.js.map +1 -0
  174. package/dist/engine/indicators/{pivotState.d.ts → state/pivotState.d.ts} +1 -1
  175. package/dist/engine/indicators/state/pivotState.d.ts.map +1 -0
  176. package/dist/engine/indicators/{pivotState.js → state/pivotState.js} +1 -1
  177. package/dist/engine/indicators/state/pivotState.js.map +1 -0
  178. package/dist/engine/indicators/{pvtState.d.ts → state/pvtState.d.ts} +1 -1
  179. package/dist/engine/indicators/state/pvtState.d.ts.map +1 -0
  180. package/dist/engine/indicators/{pvtState.js → state/pvtState.js} +1 -1
  181. package/dist/engine/indicators/state/pvtState.js.map +1 -0
  182. package/dist/engine/indicators/{rocState.d.ts → state/rocState.d.ts} +1 -1
  183. package/dist/engine/indicators/state/rocState.d.ts.map +1 -0
  184. package/dist/engine/indicators/{rocState.js → state/rocState.js} +1 -1
  185. package/dist/engine/indicators/state/rocState.js.map +1 -0
  186. package/dist/engine/indicators/{rsiState.d.ts → state/rsiState.d.ts} +4 -1
  187. package/dist/engine/indicators/state/rsiState.d.ts.map +1 -0
  188. package/dist/engine/indicators/{rsiState.js → state/rsiState.js} +7 -4
  189. package/dist/engine/indicators/state/rsiState.js.map +1 -0
  190. package/dist/engine/indicators/{sarState.d.ts → state/sarState.d.ts} +1 -1
  191. package/dist/engine/indicators/state/sarState.d.ts.map +1 -0
  192. package/dist/engine/indicators/{sarState.js → state/sarState.js} +1 -1
  193. package/dist/engine/indicators/state/sarState.js.map +1 -0
  194. package/dist/engine/indicators/{stochState.d.ts → state/stochState.d.ts} +2 -2
  195. package/dist/engine/indicators/state/stochState.d.ts.map +1 -0
  196. package/dist/engine/indicators/{stochState.js → state/stochState.js} +1 -1
  197. package/dist/engine/indicators/state/stochState.js.map +1 -0
  198. package/dist/engine/indicators/{structureState.d.ts → state/structureState.d.ts} +1 -1
  199. package/dist/engine/indicators/state/structureState.d.ts.map +1 -0
  200. package/dist/engine/indicators/{structureState.js → state/structureState.js} +1 -1
  201. package/dist/engine/indicators/state/structureState.js.map +1 -0
  202. package/dist/engine/indicators/{supertrendState.d.ts → state/supertrendState.d.ts} +1 -1
  203. package/dist/engine/indicators/state/supertrendState.d.ts.map +1 -0
  204. package/dist/engine/indicators/{supertrendState.js → state/supertrendState.js} +1 -1
  205. package/dist/engine/indicators/state/supertrendState.js.map +1 -0
  206. package/dist/engine/indicators/{temaState.d.ts → state/temaState.d.ts} +1 -1
  207. package/dist/engine/indicators/state/temaState.d.ts.map +1 -0
  208. package/dist/engine/indicators/{temaState.js → state/temaState.js} +1 -1
  209. package/dist/engine/indicators/state/temaState.js.map +1 -0
  210. package/dist/engine/indicators/{trixState.d.ts → state/trixState.d.ts} +1 -1
  211. package/dist/engine/indicators/state/trixState.d.ts.map +1 -0
  212. package/dist/engine/indicators/{trixState.js → state/trixState.js} +1 -1
  213. package/dist/engine/indicators/state/trixState.js.map +1 -0
  214. package/dist/engine/indicators/{vmaState.d.ts → state/vmaState.d.ts} +1 -1
  215. package/dist/engine/indicators/state/vmaState.d.ts.map +1 -0
  216. package/dist/engine/indicators/{vmaState.js → state/vmaState.js} +1 -1
  217. package/dist/engine/indicators/state/vmaState.js.map +1 -0
  218. package/dist/engine/indicators/{volumeProfileState.d.ts → state/volumeProfileState.d.ts} +1 -1
  219. package/dist/engine/indicators/state/volumeProfileState.d.ts.map +1 -0
  220. package/dist/engine/indicators/{volumeProfileState.js → state/volumeProfileState.js} +1 -1
  221. package/dist/engine/indicators/state/volumeProfileState.js.map +1 -0
  222. package/dist/engine/indicators/{vwapState.d.ts → state/vwapState.d.ts} +1 -1
  223. package/dist/engine/indicators/state/vwapState.d.ts.map +1 -0
  224. package/dist/engine/indicators/{vwapState.js → state/vwapState.js} +1 -1
  225. package/dist/engine/indicators/state/vwapState.js.map +1 -0
  226. package/dist/engine/indicators/{wmaState.d.ts → state/wmaState.d.ts} +1 -1
  227. package/dist/engine/indicators/state/wmaState.d.ts.map +1 -0
  228. package/dist/engine/indicators/{wmaState.js → state/wmaState.js} +1 -1
  229. package/dist/engine/indicators/state/wmaState.js.map +1 -0
  230. package/dist/engine/indicators/{wmsrState.d.ts → state/wmsrState.d.ts} +1 -1
  231. package/dist/engine/indicators/state/wmsrState.d.ts.map +1 -0
  232. package/dist/engine/indicators/{wmsrState.js → state/wmsrState.js} +1 -1
  233. package/dist/engine/indicators/state/wmsrState.js.map +1 -0
  234. package/dist/engine/indicators/{zonesState.d.ts → state/zonesState.d.ts} +1 -1
  235. package/dist/engine/indicators/state/zonesState.d.ts.map +1 -0
  236. package/dist/engine/indicators/{zonesState.js → state/zonesState.js} +1 -1
  237. package/dist/engine/indicators/state/zonesState.js.map +1 -0
  238. package/dist/engine/indicators/stateComposer.d.ts +39 -39
  239. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  240. package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -1
  241. package/dist/engine/indicators/visibleStateComposers.js +192 -31
  242. package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
  243. package/dist/engine/layout/pane.js +2 -2
  244. package/dist/engine/layout/pane.js.map +1 -1
  245. package/dist/engine/paneRenderer.d.ts +2 -6
  246. package/dist/engine/paneRenderer.d.ts.map +1 -1
  247. package/dist/engine/paneRenderer.js.map +1 -1
  248. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  249. package/dist/engine/render/chartRenderer.js +7 -2
  250. package/dist/engine/render/chartRenderer.js.map +1 -1
  251. package/dist/engine/renderers/Indicator/atr.js +2 -2
  252. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  253. package/dist/engine/renderers/Indicator/cci.js +1 -1
  254. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  255. package/dist/engine/renderers/Indicator/chaikinVol.js +1 -1
  256. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  257. package/dist/engine/renderers/Indicator/cmf.js +1 -1
  258. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  259. package/dist/engine/renderers/Indicator/dema.js +1 -1
  260. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  261. package/dist/engine/renderers/Indicator/donchian.js +1 -1
  262. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  263. package/dist/engine/renderers/Indicator/fastk.js +1 -1
  264. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  265. package/dist/engine/renderers/Indicator/fib.js +1 -1
  266. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  267. package/dist/engine/renderers/Indicator/hma.js +1 -1
  268. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  269. package/dist/engine/renderers/Indicator/hv.js +2 -2
  270. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  271. package/dist/engine/renderers/Indicator/ichimoku.js +95 -92
  272. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  273. package/dist/engine/renderers/Indicator/kama.js +1 -1
  274. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  275. package/dist/engine/renderers/Indicator/keltner.js +1 -1
  276. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  277. package/dist/engine/renderers/Indicator/kst.js +2 -2
  278. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  279. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  280. package/dist/engine/renderers/Indicator/macd.js +1 -1
  281. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  282. package/dist/engine/renderers/Indicator/mfi.js +1 -1
  283. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  284. package/dist/engine/renderers/Indicator/mom.js +2 -2
  285. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  286. package/dist/engine/renderers/Indicator/obv.js +1 -1
  287. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  288. package/dist/engine/renderers/Indicator/parkinson.js +2 -2
  289. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  290. package/dist/engine/renderers/Indicator/pivot.js +1 -1
  291. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  292. package/dist/engine/renderers/Indicator/pvt.js +1 -1
  293. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  294. package/dist/engine/renderers/Indicator/roc.js +1 -1
  295. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  296. package/dist/engine/renderers/Indicator/rsi.js +1 -1
  297. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  298. package/dist/engine/renderers/Indicator/sar.js +1 -1
  299. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  300. package/dist/engine/renderers/Indicator/stoch.js +1 -1
  301. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  302. package/dist/engine/renderers/Indicator/structure.js +1 -1
  303. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  304. package/dist/engine/renderers/Indicator/supertrend.js +1 -1
  305. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  306. package/dist/engine/renderers/Indicator/tema.js +1 -1
  307. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  308. package/dist/engine/renderers/Indicator/trix.js +2 -2
  309. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  310. package/dist/engine/renderers/Indicator/vma.js +2 -2
  311. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  312. package/dist/engine/renderers/Indicator/volumeProfile.js +1 -1
  313. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  314. package/dist/engine/renderers/Indicator/vwap.js +1 -1
  315. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  316. package/dist/engine/renderers/Indicator/wma.js +1 -1
  317. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  318. package/dist/engine/renderers/Indicator/wmsr.js +1 -1
  319. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  320. package/dist/engine/renderers/Indicator/zones.js +1 -1
  321. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  322. package/dist/engine/renderers/candle.d.ts.map +1 -1
  323. package/dist/engine/renderers/candle.js +94 -60
  324. package/dist/engine/renderers/candle.js.map +1 -1
  325. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  326. package/dist/engine/renderers/extremaMarkers.js +5 -6
  327. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  328. package/dist/engine/renderers/gridLines.js +1 -1
  329. package/dist/engine/renderers/gridLines.js.map +1 -1
  330. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -1
  331. package/dist/engine/renderers/leftYAxis.js +24 -3
  332. package/dist/engine/renderers/leftYAxis.js.map +1 -1
  333. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  334. package/dist/engine/renderers/timeAxis.js +2 -0
  335. package/dist/engine/renderers/timeAxis.js.map +1 -1
  336. package/dist/engine/renderers/timeShare.js +1 -1
  337. package/dist/engine/renderers/timeShare.js.map +1 -1
  338. package/dist/engine/viewport/chartViewportManager.d.ts +34 -1
  339. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  340. package/dist/engine/viewport/chartViewportManager.js +57 -22
  341. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  342. package/dist/mcp/chartBridge.js +1 -1
  343. package/dist/mcp/chartBridge.js.map +1 -1
  344. package/dist/plugin/types.d.ts +4 -0
  345. package/dist/plugin/types.d.ts.map +1 -1
  346. package/dist/plugin/types.js.map +1 -1
  347. package/dist/utils/dateFormat.d.ts +2 -2
  348. package/dist/utils/dateFormat.d.ts.map +1 -1
  349. package/dist/utils/dateFormat.js +6 -6
  350. package/dist/utils/dateFormat.js.map +1 -1
  351. package/dist/utils/kLineDraw/axis.d.ts +4 -0
  352. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  353. package/dist/utils/kLineDraw/axis.js +2 -2
  354. package/dist/utils/kLineDraw/axis.js.map +1 -1
  355. package/dist/utils/volumePrice.d.ts.map +1 -1
  356. package/dist/utils/volumePrice.js +20 -3
  357. package/dist/utils/volumePrice.js.map +1 -1
  358. package/dist/version.d.ts +1 -1
  359. package/dist/version.js +1 -1
  360. package/package.json +1 -1
  361. package/src/controllers/createChartController.ts +2 -2
  362. package/src/controllers/index.ts +1 -1
  363. package/src/controllers/types.ts +2 -2
  364. package/src/data-fetchers/__tests__/dataBuffer.test.ts +135 -0
  365. package/src/data-fetchers/dataBuffer.ts +61 -9
  366. package/src/engine/chart.ts +0 -43
  367. package/src/engine/controller/interaction.ts +186 -76
  368. package/src/engine/data/chartDataManager.ts +16 -4
  369. package/src/engine/drawing/index.ts +2 -36
  370. package/src/engine/drawing/interaction.ts +1 -1
  371. package/src/engine/drawing/linearRegression.ts +36 -0
  372. package/src/engine/drawing/plugin.ts +160 -97
  373. package/src/engine/indicators/__tests__/calculators.test.ts +9 -1
  374. package/src/engine/indicators/__tests__/indicatorRegistry.test.ts +10 -5
  375. package/src/engine/indicators/__tests__/scheduler.test.ts +12 -12
  376. package/src/engine/indicators/__tests__/soa.test.ts +46 -12
  377. package/src/engine/indicators/calculators/_shared.ts +44 -0
  378. package/src/engine/indicators/calculators/bands.ts +365 -0
  379. package/src/engine/indicators/calculators/index.ts +37 -0
  380. package/src/engine/indicators/calculators/movingAverages.ts +189 -0
  381. package/src/engine/indicators/calculators/oscillators.ts +446 -0
  382. package/src/engine/indicators/calculators/patterns.ts +287 -0
  383. package/src/engine/indicators/calculators/volatility.ts +150 -0
  384. package/src/engine/indicators/calculators/volume.ts +248 -0
  385. package/src/engine/indicators/calculators.ts +1 -2460
  386. package/src/engine/indicators/chartIndicatorManager.ts +3 -44
  387. package/src/engine/indicators/indicatorRegistry.ts +15 -0
  388. package/src/engine/indicators/indicatorRuntime.ts +2 -2
  389. package/src/engine/indicators/scheduler.ts +39 -154
  390. package/src/engine/indicators/{atrState.ts → state/atrState.ts} +2 -2
  391. package/src/engine/indicators/{bollState.ts → state/bollState.ts} +8 -5
  392. package/src/engine/indicators/{cciState.ts → state/cciState.ts} +2 -2
  393. package/src/engine/indicators/{chaikinVolState.ts → state/chaikinVolState.ts} +2 -2
  394. package/src/engine/indicators/{cmfState.ts → state/cmfState.ts} +2 -2
  395. package/src/engine/indicators/{demaState.ts → state/demaState.ts} +2 -2
  396. package/src/engine/indicators/{donchianState.ts → state/donchianState.ts} +2 -2
  397. package/src/engine/indicators/{eneState.ts → state/eneState.ts} +8 -5
  398. package/src/engine/indicators/{expmaState.ts → state/expmaState.ts} +8 -5
  399. package/src/engine/indicators/{fastkState.ts → state/fastkState.ts} +2 -2
  400. package/src/engine/indicators/{fibState.ts → state/fibState.ts} +2 -2
  401. package/src/engine/indicators/{hmaState.ts → state/hmaState.ts} +2 -2
  402. package/src/engine/indicators/{hvState.ts → state/hvState.ts} +2 -2
  403. package/src/engine/indicators/{ichimokuState.ts → state/ichimokuState.ts} +2 -2
  404. package/src/engine/indicators/{kamaState.ts → state/kamaState.ts} +2 -2
  405. package/src/engine/indicators/{keltnerState.ts → state/keltnerState.ts} +2 -2
  406. package/src/engine/indicators/{kstState.ts → state/kstState.ts} +3 -3
  407. package/src/engine/indicators/{maState.ts → state/maState.ts} +2 -2
  408. package/src/engine/indicators/{macdState.ts → state/macdState.ts} +3 -20
  409. package/src/engine/indicators/{mfiState.ts → state/mfiState.ts} +2 -2
  410. package/src/engine/indicators/{momState.ts → state/momState.ts} +2 -2
  411. package/src/engine/indicators/{obvState.ts → state/obvState.ts} +2 -2
  412. package/src/engine/indicators/{parkinsonState.ts → state/parkinsonState.ts} +2 -2
  413. package/src/engine/indicators/{pivotState.ts → state/pivotState.ts} +2 -2
  414. package/src/engine/indicators/{pvtState.ts → state/pvtState.ts} +2 -2
  415. package/src/engine/indicators/{rocState.ts → state/rocState.ts} +2 -2
  416. package/src/engine/indicators/{rsiState.ts → state/rsiState.ts} +9 -5
  417. package/src/engine/indicators/{sarState.ts → state/sarState.ts} +2 -2
  418. package/src/engine/indicators/{stochState.ts → state/stochState.ts} +3 -3
  419. package/src/engine/indicators/{structureState.ts → state/structureState.ts} +2 -2
  420. package/src/engine/indicators/{supertrendState.ts → state/supertrendState.ts} +2 -2
  421. package/src/engine/indicators/{temaState.ts → state/temaState.ts} +2 -2
  422. package/src/engine/indicators/{trixState.ts → state/trixState.ts} +2 -2
  423. package/src/engine/indicators/{vmaState.ts → state/vmaState.ts} +2 -2
  424. package/src/engine/indicators/{volumeProfileState.ts → state/volumeProfileState.ts} +2 -2
  425. package/src/engine/indicators/{vwapState.ts → state/vwapState.ts} +2 -2
  426. package/src/engine/indicators/{wmaState.ts → state/wmaState.ts} +2 -2
  427. package/src/engine/indicators/{wmsrState.ts → state/wmsrState.ts} +2 -2
  428. package/src/engine/indicators/{zonesState.ts → state/zonesState.ts} +2 -2
  429. package/src/engine/indicators/stateComposer.ts +39 -39
  430. package/src/engine/indicators/visibleStateComposers.ts +203 -30
  431. package/src/engine/layout/pane.ts +2 -2
  432. package/src/engine/paneRenderer.ts +2 -6
  433. package/src/engine/render/chartRenderer.ts +7 -2
  434. package/src/engine/renderers/Indicator/__tests__/createSubIndicatorRenderer.test.ts +1 -1
  435. package/src/engine/renderers/Indicator/atr.ts +3 -3
  436. package/src/engine/renderers/Indicator/boll.ts +1 -1
  437. package/src/engine/renderers/Indicator/cci.ts +2 -2
  438. package/src/engine/renderers/Indicator/chaikinVol.ts +2 -2
  439. package/src/engine/renderers/Indicator/cmf.ts +2 -2
  440. package/src/engine/renderers/Indicator/dema.ts +2 -2
  441. package/src/engine/renderers/Indicator/donchian.ts +2 -2
  442. package/src/engine/renderers/Indicator/ene.ts +1 -1
  443. package/src/engine/renderers/Indicator/expma.ts +1 -1
  444. package/src/engine/renderers/Indicator/fastk.ts +2 -2
  445. package/src/engine/renderers/Indicator/fib.ts +2 -2
  446. package/src/engine/renderers/Indicator/hma.ts +2 -2
  447. package/src/engine/renderers/Indicator/hv.ts +3 -3
  448. package/src/engine/renderers/Indicator/ichimoku.ts +111 -85
  449. package/src/engine/renderers/Indicator/kama.ts +3 -3
  450. package/src/engine/renderers/Indicator/keltner.ts +4 -4
  451. package/src/engine/renderers/Indicator/kst.ts +5 -5
  452. package/src/engine/renderers/Indicator/ma.ts +2 -2
  453. package/src/engine/renderers/Indicator/macd.ts +40 -40
  454. package/src/engine/renderers/Indicator/mfi.ts +3 -3
  455. package/src/engine/renderers/Indicator/mom.ts +4 -4
  456. package/src/engine/renderers/Indicator/obv.ts +3 -3
  457. package/src/engine/renderers/Indicator/parkinson.ts +5 -5
  458. package/src/engine/renderers/Indicator/pivot.ts +4 -4
  459. package/src/engine/renderers/Indicator/pvt.ts +3 -3
  460. package/src/engine/renderers/Indicator/roc.ts +3 -3
  461. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  462. package/src/engine/renderers/Indicator/sar.ts +3 -3
  463. package/src/engine/renderers/Indicator/stoch.ts +4 -4
  464. package/src/engine/renderers/Indicator/structure.ts +24 -24
  465. package/src/engine/renderers/Indicator/supertrend.ts +4 -4
  466. package/src/engine/renderers/Indicator/tema.ts +3 -3
  467. package/src/engine/renderers/Indicator/trix.ts +34 -34
  468. package/src/engine/renderers/Indicator/vma.ts +3 -3
  469. package/src/engine/renderers/Indicator/volumeProfile.ts +28 -28
  470. package/src/engine/renderers/Indicator/vwap.ts +3 -3
  471. package/src/engine/renderers/Indicator/wma.ts +3 -3
  472. package/src/engine/renderers/Indicator/wmsr.ts +3 -3
  473. package/src/engine/renderers/Indicator/zones.ts +6 -6
  474. package/src/engine/renderers/__tests__/boll.renderer.test.ts +1 -1
  475. package/src/engine/renderers/__tests__/ene.renderer.test.ts +1 -1
  476. package/src/engine/renderers/__tests__/expma.renderer.test.ts +1 -1
  477. package/src/engine/renderers/__tests__/ma.renderer.test.ts +1 -1
  478. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +4 -4
  479. package/src/engine/renderers/candle.ts +112 -70
  480. package/src/engine/renderers/extremaMarkers.ts +5 -3
  481. package/src/engine/renderers/gridLines.ts +1 -1
  482. package/src/engine/renderers/leftYAxis.ts +26 -3
  483. package/src/engine/renderers/timeAxis.ts +2 -0
  484. package/src/engine/renderers/timeShare.ts +10 -10
  485. package/src/engine/viewport/chartViewportManager.ts +61 -26
  486. package/src/mcp/chartBridge.ts +1 -1
  487. package/src/plugin/types.ts +4 -0
  488. package/src/utils/__tests__/dateFormat.test.ts +164 -0
  489. package/src/utils/dateFormat.ts +12 -6
  490. package/src/utils/kLineDraw/axis.ts +6 -2
  491. package/src/utils/volumePrice.ts +19 -3
  492. package/src/version.ts +1 -1
  493. package/dist/engine/indicators/atrState.d.ts.map +0 -1
  494. package/dist/engine/indicators/atrState.js.map +0 -1
  495. package/dist/engine/indicators/bollState.d.ts.map +0 -1
  496. package/dist/engine/indicators/bollState.js.map +0 -1
  497. package/dist/engine/indicators/cciState.d.ts.map +0 -1
  498. package/dist/engine/indicators/cciState.js.map +0 -1
  499. package/dist/engine/indicators/chaikinVolState.d.ts.map +0 -1
  500. package/dist/engine/indicators/chaikinVolState.js.map +0 -1
  501. package/dist/engine/indicators/cmfState.d.ts.map +0 -1
  502. package/dist/engine/indicators/cmfState.js.map +0 -1
  503. package/dist/engine/indicators/demaState.d.ts.map +0 -1
  504. package/dist/engine/indicators/demaState.js.map +0 -1
  505. package/dist/engine/indicators/donchianState.d.ts.map +0 -1
  506. package/dist/engine/indicators/donchianState.js.map +0 -1
  507. package/dist/engine/indicators/eneState.d.ts.map +0 -1
  508. package/dist/engine/indicators/eneState.js.map +0 -1
  509. package/dist/engine/indicators/expmaState.d.ts.map +0 -1
  510. package/dist/engine/indicators/expmaState.js.map +0 -1
  511. package/dist/engine/indicators/fastkState.d.ts.map +0 -1
  512. package/dist/engine/indicators/fastkState.js.map +0 -1
  513. package/dist/engine/indicators/fibState.d.ts.map +0 -1
  514. package/dist/engine/indicators/fibState.js.map +0 -1
  515. package/dist/engine/indicators/hmaState.d.ts.map +0 -1
  516. package/dist/engine/indicators/hmaState.js.map +0 -1
  517. package/dist/engine/indicators/hvState.d.ts.map +0 -1
  518. package/dist/engine/indicators/hvState.js.map +0 -1
  519. package/dist/engine/indicators/ichimokuState.d.ts.map +0 -1
  520. package/dist/engine/indicators/ichimokuState.js.map +0 -1
  521. package/dist/engine/indicators/kamaState.d.ts.map +0 -1
  522. package/dist/engine/indicators/kamaState.js.map +0 -1
  523. package/dist/engine/indicators/keltnerState.d.ts.map +0 -1
  524. package/dist/engine/indicators/keltnerState.js.map +0 -1
  525. package/dist/engine/indicators/kstState.d.ts.map +0 -1
  526. package/dist/engine/indicators/kstState.js.map +0 -1
  527. package/dist/engine/indicators/maState.d.ts.map +0 -1
  528. package/dist/engine/indicators/maState.js.map +0 -1
  529. package/dist/engine/indicators/macdState.d.ts.map +0 -1
  530. package/dist/engine/indicators/macdState.js.map +0 -1
  531. package/dist/engine/indicators/mfiState.d.ts.map +0 -1
  532. package/dist/engine/indicators/mfiState.js.map +0 -1
  533. package/dist/engine/indicators/momState.d.ts.map +0 -1
  534. package/dist/engine/indicators/momState.js.map +0 -1
  535. package/dist/engine/indicators/obvState.d.ts.map +0 -1
  536. package/dist/engine/indicators/obvState.js.map +0 -1
  537. package/dist/engine/indicators/parkinsonState.d.ts.map +0 -1
  538. package/dist/engine/indicators/parkinsonState.js.map +0 -1
  539. package/dist/engine/indicators/pivotState.d.ts.map +0 -1
  540. package/dist/engine/indicators/pivotState.js.map +0 -1
  541. package/dist/engine/indicators/pvtState.d.ts.map +0 -1
  542. package/dist/engine/indicators/pvtState.js.map +0 -1
  543. package/dist/engine/indicators/rocState.d.ts.map +0 -1
  544. package/dist/engine/indicators/rocState.js.map +0 -1
  545. package/dist/engine/indicators/rsiState.d.ts.map +0 -1
  546. package/dist/engine/indicators/rsiState.js.map +0 -1
  547. package/dist/engine/indicators/sarState.d.ts.map +0 -1
  548. package/dist/engine/indicators/sarState.js.map +0 -1
  549. package/dist/engine/indicators/stochState.d.ts.map +0 -1
  550. package/dist/engine/indicators/stochState.js.map +0 -1
  551. package/dist/engine/indicators/structureState.d.ts.map +0 -1
  552. package/dist/engine/indicators/structureState.js.map +0 -1
  553. package/dist/engine/indicators/supertrendState.d.ts.map +0 -1
  554. package/dist/engine/indicators/supertrendState.js.map +0 -1
  555. package/dist/engine/indicators/temaState.d.ts.map +0 -1
  556. package/dist/engine/indicators/temaState.js.map +0 -1
  557. package/dist/engine/indicators/trixState.d.ts.map +0 -1
  558. package/dist/engine/indicators/trixState.js.map +0 -1
  559. package/dist/engine/indicators/vmaState.d.ts.map +0 -1
  560. package/dist/engine/indicators/vmaState.js.map +0 -1
  561. package/dist/engine/indicators/volumeProfileState.d.ts.map +0 -1
  562. package/dist/engine/indicators/volumeProfileState.js.map +0 -1
  563. package/dist/engine/indicators/vwapState.d.ts.map +0 -1
  564. package/dist/engine/indicators/vwapState.js.map +0 -1
  565. package/dist/engine/indicators/wmaState.d.ts.map +0 -1
  566. package/dist/engine/indicators/wmaState.js.map +0 -1
  567. package/dist/engine/indicators/wmsrState.d.ts.map +0 -1
  568. package/dist/engine/indicators/wmsrState.js.map +0 -1
  569. package/dist/engine/indicators/zonesState.d.ts.map +0 -1
  570. package/dist/engine/indicators/zonesState.js.map +0 -1
  571. /package/dist/engine/indicators/{macdState.js → state/macdState.js} +0 -0
@@ -14,6 +14,27 @@ interface PointerLocation {
14
14
  mouseY: number
15
15
  }
16
16
 
17
+ /** 悬停上下文 — 由 resolveHoverContext 创建,传递给后续所有子步骤 */
18
+ interface HoverContext {
19
+ mouseX: number
20
+ mouseY: number
21
+ plotWidth: number
22
+ plotHeight: number
23
+ viewWidth: number
24
+ viewHeight: number
25
+ scrollLeft: number
26
+ dpr: number
27
+ worldX: number
28
+ }
29
+
30
+ /** 最近邻 K 线 bar — 由 findNearestBar 返回 */
31
+ interface NearestBar {
32
+ localIdx: number
33
+ globalIdx: number
34
+ kLineStartX: number
35
+ widthLogical: number
36
+ }
37
+
17
38
  export interface InteractionSnapshot {
18
39
  crosshairPos: { x: number; y: number } | null
19
40
  crosshairIndex: number | null
@@ -633,9 +654,51 @@ export class InteractionController {
633
654
  this.activePaneId = pane?.id || null
634
655
  }
635
656
 
657
+ /**
658
+ * 指针悬停检测(coordinator)
659
+ *
660
+ * 每次指针移动时触发,按优先级依次检测:
661
+ * 边界 → pane 分隔器 → marker → K 线 bar → 十字线定位 → candle 命中 → tooltip。
662
+ * 每个步骤都可能提前 return,无需执行后续检测。
663
+ */
636
664
  private updatePlotHoverFromPoint(clientX: number, clientY: number) {
665
+ const ctx = this.resolveHoverContext(clientX, clientY)
666
+ if (!ctx) return
667
+
668
+ if (this.handleSeparatorHit(ctx)) return
669
+ if (this.handleMarkerHit(ctx)) return
670
+
671
+ const bar = this.findNearestBar(ctx)
672
+ if (!bar) {
673
+ this.clearHover()
674
+ return
675
+ }
676
+
677
+ this.positionCrosshair(ctx, bar)
678
+
679
+ if (this.chart.currentPeriod === 'timeshare') {
680
+ this.handleTimeshareHover(ctx, bar)
681
+ return
682
+ }
683
+
684
+ if (!this.hitTestCandle(ctx, bar)) {
685
+ this.hoveredIndex = null
686
+ return
687
+ }
688
+
689
+ this.hoveredIndex = bar.globalIdx
690
+ this.updateTooltip(ctx)
691
+ }
692
+
693
+ /**
694
+ * 解析悬停上下文
695
+ *
696
+ * 将 client 坐标转换为 plot 坐标,并做边界检查。
697
+ * 返回 null 表示指针不在 plot 区域内。
698
+ */
699
+ private resolveHoverContext(clientX: number, clientY: number): HoverContext | null {
637
700
  const location = this.getPlotPointerLocation(clientX, clientY)
638
- if (!location) return
701
+ if (!location) return null
639
702
 
640
703
  const { mouseX, mouseY } = location
641
704
  const container = this.chart.getDom().container
@@ -644,17 +707,26 @@ export class InteractionController {
644
707
  const viewHeight = viewport?.viewHeight ?? Math.max(1, Math.round(container.clientHeight))
645
708
  const plotWidth = viewport?.plotWidth ?? viewWidth
646
709
  const plotHeight = viewport?.plotHeight ?? viewHeight
710
+
647
711
  if (mouseX < 0 || mouseY < 0 || mouseX > plotWidth || mouseY > plotHeight) {
648
712
  this.clearHover()
649
- return
713
+ return null
650
714
  }
651
715
 
652
- this.hoveredRightAxisPaneId = null
653
-
654
716
  const scrollLeft = this.chart.getLogicalScrollLeft()
655
717
  const dpr = this.chart.getCurrentDpr()
656
718
 
657
- const separatorUpperPaneId = this.hitTestPaneSeparator(mouseY)
719
+ return { mouseX, mouseY, plotWidth, plotHeight, viewWidth, viewHeight, scrollLeft, dpr, worldX: scrollLeft + mouseX }
720
+ }
721
+
722
+ /**
723
+ * 检测 pane 分隔器悬停
724
+ *
725
+ * 若指针悬浮在 pane 分隔条上,清除十字线状态并返回 true。
726
+ */
727
+ private handleSeparatorHit(ctx: HoverContext): boolean {
728
+ this.hoveredRightAxisPaneId = null
729
+ const separatorUpperPaneId = this.hitTestPaneSeparator(ctx.mouseY)
658
730
  this.hoveredSeparatorUpperPaneId = separatorUpperPaneId
659
731
  if (separatorUpperPaneId) {
660
732
  this.crosshairPos = null
@@ -662,30 +734,45 @@ export class InteractionController {
662
734
  this.crosshairPrice = null
663
735
  this.hoveredIndex = null
664
736
  this.activePaneId = null
665
- return
737
+ return true
666
738
  }
739
+ return false
740
+ }
667
741
 
742
+ /**
743
+ * 检测 marker 悬停
744
+ *
745
+ * 若指针悬浮在 marker 上,清除十字线状态并返回 true。
746
+ */
747
+ private handleMarkerHit(ctx: HoverContext): boolean {
668
748
  const markerManager = this.chart.getMarkerManager()
669
- const worldX = scrollLeft + mouseX
670
- if (this.markerState.updateHoverFromPoint(worldX, mouseX, mouseY, markerManager)) {
749
+ if (this.markerState.updateHoverFromPoint(ctx.worldX, ctx.mouseX, ctx.mouseY, markerManager)) {
671
750
  this.crosshairPos = null
672
751
  this.crosshairIndex = null
673
752
  this.crosshairPrice = null
674
753
  this.hoveredIndex = null
675
- return
754
+ return true
676
755
  }
756
+ return false
757
+ }
677
758
 
678
- if (!this.kLinePositions || !this.visibleRange || !this.kWidthPx) {
679
- this.clearHover()
680
- return
681
- }
759
+ /**
760
+ * 查找最近邻 K 线 bar
761
+ *
762
+ * 使用二分搜索在 kLinePositions 中定位指针最近的 K 线 bar。
763
+ * 若无 kLinePositions、visibleRange 或 kWidthPx,返回 null。
764
+ */
765
+ private findNearestBar(ctx: HoverContext): NearestBar | null {
766
+ if (!this.kLinePositions || !this.visibleRange || !this.kWidthPx) return null
682
767
 
768
+ const { worldX, mouseY, dpr } = ctx
683
769
  const kWidthLogical = this.kWidthPx / dpr
770
+ const positions = this.kLinePositions
684
771
 
685
- let lo = 0, hi = this.kLinePositions.length
772
+ let lo = 0, hi = positions.length
686
773
  while (lo < hi) {
687
774
  const mid = (lo + hi) >> 1
688
- if (this.kLinePositions[mid]! < worldX) {
775
+ if (positions[mid]! < worldX) {
689
776
  lo = mid + 1
690
777
  } else {
691
778
  hi = mid
@@ -693,69 +780,86 @@ export class InteractionController {
693
780
  }
694
781
 
695
782
  let localIdx = lo
696
- if (lo > 0 && lo < this.kLinePositions.length) {
697
- const prevCenter = this.kLinePositions[lo - 1]! + kWidthLogical / 2
698
- const currCenter = this.kLinePositions[lo]! + kWidthLogical / 2
783
+ if (lo > 0 && lo < positions.length) {
784
+ const prevCenter = positions[lo - 1]! + kWidthLogical / 2
785
+ const currCenter = positions[lo]! + kWidthLogical / 2
699
786
  if (Math.abs(worldX - prevCenter) < Math.abs(worldX - currCenter)) {
700
787
  localIdx = lo - 1
701
788
  }
702
- } else if (lo === this.kLinePositions.length && this.kLinePositions.length > 0) {
703
- localIdx = this.kLinePositions.length - 1
789
+ } else if (lo === positions.length && positions.length > 0) {
790
+ localIdx = positions.length - 1
704
791
  }
705
792
 
706
- const idx = localIdx + this.visibleRange.start
707
- const data = this.chart.getRenderData()
793
+ return {
794
+ localIdx,
795
+ globalIdx: localIdx + this.visibleRange.start,
796
+ kLineStartX: positions[localIdx]!,
797
+ widthLogical: kWidthLogical,
798
+ }
799
+ }
708
800
 
801
+ /**
802
+ * 定位十字线
803
+ *
804
+ * 根据最近邻 bar 设置 crosshairIndex、crosshairPos(snap 到 K 线中心)
805
+ * 以及 crosshairPrice(鼠标 Y → 价格)。
806
+ * 索引无效时清除十字线状态。
807
+ */
808
+ private positionCrosshair(ctx: HoverContext, bar: NearestBar): void {
809
+ const { mouseX, mouseY, scrollLeft, plotWidth, plotHeight, dpr } = ctx
709
810
  const pane = this.getPaneByY(mouseY)
710
811
  this.activePaneId = pane?.id || null
711
812
 
712
- if (idx >= 0 && idx < (data?.length ?? 0)) {
713
- this.crosshairIndex = idx
813
+ if (bar.globalIdx < 0 || bar.globalIdx >= (this.chart.getRenderData()?.length ?? 0)) {
814
+ this.crosshairIndex = null
815
+ this.crosshairPos = null
816
+ this.crosshairPrice = null
817
+ return
818
+ }
714
819
 
715
- const centerX = this.kLineCenters?.[localIdx] ?? this.kLinePositions[localIdx]! + (this.kWidthPx! / dpr) / 2
716
- const snappedX = centerX - scrollLeft
820
+ this.crosshairIndex = bar.globalIdx
717
821
 
718
- this.crosshairPos = {
719
- x: Math.min(Math.max(snappedX, 0), plotWidth),
720
- y: Math.min(Math.max(mouseY, 0), plotHeight),
721
- }
822
+ const centerX = this.kLineCenters?.[bar.localIdx] ?? bar.kLineStartX + bar.widthLogical / 2
823
+ const snappedX = centerX - scrollLeft
722
824
 
723
- if (pane) {
724
- const localY = mouseY - pane.top
725
- this.crosshairPrice = pane.yAxis.yToPrice(localY)
726
- } else {
727
- this.crosshairPrice = null
728
- }
825
+ this.crosshairPos = {
826
+ x: Math.min(Math.max(snappedX, 0), plotWidth),
827
+ y: Math.min(Math.max(mouseY, 0), plotHeight),
828
+ }
729
829
 
730
- if (this.chart.currentPeriod === 'timeshare') {
731
- this.hoveredIndex = idx
732
- const tooltipResult = computeTooltipPosition({
733
- mouseX,
734
- mouseY,
735
- viewWidth,
736
- viewHeight,
737
- plotWidth,
738
- plotHeight,
739
- tooltipSize: this.tooltipSize,
740
- useAnchorPositioning: this.useTooltipAnchorPositioning,
741
- })
742
- if (tooltipResult.anchorPlacement) {
743
- this.tooltipAnchorPlacement = tooltipResult.anchorPlacement
744
- }
745
- this.tooltipPos = tooltipResult.pos
746
- return
747
- }
830
+ if (pane) {
831
+ const localY = mouseY - pane.top
832
+ this.crosshairPrice = pane.yAxis.yToPrice(localY)
748
833
  } else {
749
- this.crosshairIndex = null
750
- this.crosshairPos = null
751
834
  this.crosshairPrice = null
752
835
  }
836
+ }
753
837
 
754
- const k = typeof this.crosshairIndex === 'number' ? data[this.crosshairIndex] as KLineData : undefined
755
- if (!k || !pane || !pane.capabilities.candleHitTest) {
756
- this.hoveredIndex = null
757
- return
758
- }
838
+ /**
839
+ * 分时模式悬停处理
840
+ *
841
+ * 分时模式下直接设置 hoveredIndex 并计算 tooltip 位置后返回,
842
+ * 不执行 candle body/wick 命中检测。
843
+ */
844
+ private handleTimeshareHover(ctx: HoverContext, bar: NearestBar): void {
845
+ this.hoveredIndex = bar.globalIdx
846
+ this.updateTooltip(ctx)
847
+ }
848
+
849
+ /**
850
+ * Candle 实体/影线命中检测
851
+ *
852
+ * 检测指针是否落在 K 线实体内或影线上。
853
+ * 小实体(< 8px)会扩展命中区域以保证可用性。
854
+ * 未命中时返回 false。
855
+ */
856
+ private hitTestCandle(ctx: HoverContext, bar: NearestBar): boolean {
857
+ const { mouseY, worldX, dpr } = ctx
858
+ const data = this.chart.getRenderData()
859
+ const k = typeof this.crosshairIndex === 'number' ? data?.[this.crosshairIndex] as KLineData | undefined : undefined
860
+ const pane = this.getPaneByY(mouseY)
861
+
862
+ if (!k || !pane || !pane.capabilities.candleHitTest) return false
759
863
 
760
864
  const localY = mouseY - pane.top
761
865
  const openY = pane.yAxis.priceToY(k.open)
@@ -765,29 +869,35 @@ export class InteractionController {
765
869
  const bodyTop = Math.min(openY, closeY)
766
870
  const bodyBottom = Math.max(openY, closeY)
767
871
 
768
- const kLineStartX = this.kLinePositions[localIdx]!
769
- const inUnitX = worldX - kLineStartX
770
- const cxLogical = kWidthLogical / 2
872
+ const inUnitX = worldX - bar.kLineStartX
873
+ const cxLogical = bar.widthLogical / 2
771
874
 
772
875
  const MIN_BODY_HIT_HEIGHT = 8
773
876
  const bodyHeight = Math.abs(bodyBottom - bodyTop)
774
- const effectiveBodyTop = bodyHeight < MIN_BODY_HIT_HEIGHT ? (bodyTop + bodyBottom) / 2 - MIN_BODY_HIT_HEIGHT / 2 : bodyTop
775
- const effectiveBodyBottom = bodyHeight < MIN_BODY_HIT_HEIGHT ? (bodyTop + bodyBottom) / 2 + MIN_BODY_HIT_HEIGHT / 2 : bodyBottom
877
+ const effectiveBodyTop = bodyHeight < MIN_BODY_HIT_HEIGHT
878
+ ? (bodyTop + bodyBottom) / 2 - MIN_BODY_HIT_HEIGHT / 2
879
+ : bodyTop
880
+ const effectiveBodyBottom = bodyHeight < MIN_BODY_HIT_HEIGHT
881
+ ? (bodyTop + bodyBottom) / 2 + MIN_BODY_HIT_HEIGHT / 2
882
+ : bodyBottom
776
883
 
777
884
  const HIT_WICK_HALF_EXTENDED = 3
778
885
 
779
- const hitBody = localY >= effectiveBodyTop && localY <= effectiveBodyBottom &&
780
- inUnitX >= 0 && inUnitX <= kWidthLogical
781
- const hitWick = Math.abs(inUnitX - cxLogical) <= HIT_WICK_HALF_EXTENDED &&
782
- localY >= Math.min(highY, lowY) && localY <= Math.max(highY, lowY)
886
+ const hitBody = localY >= effectiveBodyTop && localY <= effectiveBodyBottom
887
+ && inUnitX >= 0 && inUnitX <= bar.widthLogical
888
+ const hitWick = Math.abs(inUnitX - cxLogical) <= HIT_WICK_HALF_EXTENDED
889
+ && localY >= Math.min(highY, lowY) && localY <= Math.max(highY, lowY)
783
890
 
784
- if (!hitBody && !hitWick) {
785
- this.hoveredIndex = null
786
- return
787
- }
788
-
789
- this.hoveredIndex = this.crosshairIndex
891
+ return hitBody || hitWick
892
+ }
790
893
 
894
+ /**
895
+ * 更新 tooltip 位置
896
+ *
897
+ * 使用 computeTooltipPosition 计算 tooltip 的显示位置和锚点方向。
898
+ */
899
+ private updateTooltip(ctx: HoverContext): void {
900
+ const { mouseX, mouseY, viewWidth, viewHeight, plotWidth, plotHeight } = ctx
791
901
  const tooltipResult = computeTooltipPosition({
792
902
  mouseX,
793
903
  mouseY,
@@ -1,7 +1,7 @@
1
1
  import type { KLineData, TimeShareData } from '../../types/price'
2
2
  import type { SymbolSpec, DataFetcher, CustomDataSource } from '../../controllers/types'
3
3
  import { createSignal, type Signal } from '../../reactivity/signal'
4
- import { DataBuffer } from '../../data-fetchers/dataBuffer'
4
+ import { DataBuffer, getPeriodDays } from '../../data-fetchers/dataBuffer'
5
5
  import { TimeShareBuffer } from '../../data-fetchers/timeShareBuffer'
6
6
  import type { DataBufferLike } from '../../data-fetchers/dataBufferTypes'
7
7
  import type { TimeShareFetcherFn } from '../../data-fetchers/types'
@@ -42,6 +42,8 @@ function bufKey(type: string, symbol: string, period?: string): string {
42
42
  }
43
43
 
44
44
  export class ChartDataManager {
45
+ static readonly TRAILING_SLOTS = 30
46
+
45
47
  private _dataFetcher: DataFetcher | null = null
46
48
  private _timeShareFetcher: TimeShareFetcherFn | null = null
47
49
 
@@ -366,6 +368,14 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
366
368
  return [...this._dataSignal.peek()]
367
369
  }
368
370
 
371
+ getMonthKeys(): Int32Array | null {
372
+ return this.getActiveDataBuffer()?.getMonthKeys() ?? null
373
+ }
374
+
375
+ getDayKeys(): Int32Array | null {
376
+ return this.getActiveDataBuffer()?.getDayKeys() ?? null
377
+ }
378
+
369
379
  getTimeShareData(): TimeShareData[] {
370
380
  const buf = this.getActiveTimeShareBuffer()
371
381
  return buf ? buf.getRawData() : []
@@ -537,10 +547,12 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
537
547
  const range = this.computeRawVisibleRange() ?? this.lastRawVisibleRange
538
548
 
539
549
  const MS_PER_DAY = 86_400_000
550
+ const spec = buf.currentSpec
551
+ const gapDays = getPeriodDays(spec?.period)
540
552
  let firstVisibleTs: number | undefined
541
553
 
542
554
  if (range.start < 0 && this._dataFetcher) {
543
- const earlierThanEarliest = window.earliestTs - 365 * MS_PER_DAY
555
+ const earlierThanEarliest = window.earliestTs - gapDays * MS_PER_DAY
544
556
  buf.ensureRange(earlierThanEarliest, window.earliestTs)
545
557
  firstVisibleTs = data[0]?.timestamp
546
558
  } else if (range.start < data.length) {
@@ -875,7 +887,7 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
875
887
  const viewWidth = this.deps.getViewport()?.plotWidth ?? 0
876
888
  const dpr = this.deps.getEffectiveDpr()
877
889
  const { startXPx, unitPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
878
- const dataPlotWidth = (startXPx + dataLength * unitPx) / dpr
890
+ const dataPlotWidth = (startXPx + (dataLength + ChartDataManager.TRAILING_SLOTS) * unitPx) / dpr
879
891
  return this.getLeftLoadBufferWidth() + Math.max(dataPlotWidth, viewWidth)
880
892
  }
881
893
 
@@ -886,7 +898,7 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
886
898
  const dpr = this.deps.getEffectiveDpr()
887
899
  const opt = this.deps.getOption()
888
900
  const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
889
- const lastKLineEndPx = (startXPx + dataLength * unitPx) / dpr
901
+ const lastKLineEndPx = (startXPx + (dataLength + ChartDataManager.TRAILING_SLOTS) * unitPx) / dpr
890
902
  const viewport = this.deps.getViewport()
891
903
  const clientWidth = viewport?.viewWidth
892
904
  ?? (this.deps.getObservedSize().width > 0 ? this.deps.getObservedSize().width : undefined)
@@ -229,42 +229,8 @@ function formatSigned(value: number, digits = 2): string {
229
229
  return value > 0 ? `+${fixed}` : fixed
230
230
  }
231
231
 
232
- export function computeLinearRegression(values: number[]): { slope: number; intercept: number; stdDev: number } | null {
233
- const n = values.length
234
- if (n < 2) return null
235
-
236
- let sumX = 0
237
- let sumY = 0
238
- let sumXY = 0
239
- let sumXX = 0
240
- for (let i = 0; i < n; i++) {
241
- const x = i
242
- const y = values[i]!
243
- sumX += x
244
- sumY += y
245
- sumXY += x * y
246
- sumXX += x * x
247
- }
248
-
249
- const denominator = n * sumXX - sumX * sumX
250
- if (denominator === 0) return null
251
-
252
- const slope = (n * sumXY - sumX * sumY) / denominator
253
- const intercept = (sumY - slope * sumX) / n
254
-
255
- let variance = 0
256
- for (let i = 0; i < n; i++) {
257
- const fitted = intercept + slope * i
258
- const diff = values[i]! - fitted
259
- variance += diff * diff
260
- }
261
-
262
- return {
263
- slope,
264
- intercept,
265
- stdDev: Math.sqrt(variance / n),
266
- }
267
- }
232
+ import { computeLinearRegression } from './linearRegression'
233
+ export { computeLinearRegression }
268
234
 
269
235
  export function createDefaultPrimitiveRendererSet(): PrimitiveRendererSet {
270
236
  return {
@@ -1,7 +1,7 @@
1
1
  import type { DrawingObject, DrawingKind, DrawingAnchor, DrawingStyle } from '../../plugin'
2
2
  import type { DrawingChartAdapter } from '../../controllers/types'
3
3
  import { getPhysicalKLineConfig } from '../utils/klineConfig'
4
- import { computeLinearRegression } from './index'
4
+ import { computeLinearRegression } from './linearRegression'
5
5
 
6
6
  export type DrawingToolId =
7
7
  | 'cursor'
@@ -0,0 +1,36 @@
1
+ export function computeLinearRegression(values: number[]): { slope: number; intercept: number; stdDev: number } | null {
2
+ const n = values.length
3
+ if (n < 2) return null
4
+
5
+ let sumX = 0
6
+ let sumY = 0
7
+ let sumXY = 0
8
+ let sumXX = 0
9
+ for (let i = 0; i < n; i++) {
10
+ const x = i
11
+ const y = values[i]!
12
+ sumX += x
13
+ sumY += y
14
+ sumXY += x * y
15
+ sumXX += x * x
16
+ }
17
+
18
+ const denominator = n * sumXX - sumX * sumX
19
+ if (denominator === 0) return null
20
+
21
+ const slope = (n * sumXY - sumX * sumY) / denominator
22
+ const intercept = (sumY - slope * sumX) / n
23
+
24
+ let variance = 0
25
+ for (let i = 0; i < n; i++) {
26
+ const fitted = intercept + slope * i
27
+ const diff = values[i]! - fitted
28
+ variance += diff * diff
29
+ }
30
+
31
+ return {
32
+ slope,
33
+ intercept,
34
+ stdDev: Math.sqrt(variance / n),
35
+ }
36
+ }