@363045841yyt/klinechart-core 0.8.7 → 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 (590) hide show
  1. package/dist/config/chartSettings.d.ts +2 -5
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +1 -2
  4. package/dist/config/chartSettings.js.map +1 -1
  5. package/dist/controllers/createChartController.d.ts.map +1 -1
  6. package/dist/controllers/createChartController.js +7 -0
  7. package/dist/controllers/createChartController.js.map +1 -1
  8. package/dist/controllers/index.d.ts +1 -1
  9. package/dist/controllers/index.d.ts.map +1 -1
  10. package/dist/controllers/types.d.ts +4 -2
  11. package/dist/controllers/types.d.ts.map +1 -1
  12. package/dist/data-fetchers/dataBuffer.d.ts +6 -0
  13. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  14. package/dist/data-fetchers/dataBuffer.js +50 -3
  15. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  16. package/dist/engine/chart.d.ts +3 -1
  17. package/dist/engine/chart.d.ts.map +1 -1
  18. package/dist/engine/chart.js +9 -45
  19. package/dist/engine/chart.js.map +1 -1
  20. package/dist/engine/controller/interaction.d.ts +62 -0
  21. package/dist/engine/controller/interaction.d.ts.map +1 -1
  22. package/dist/engine/controller/interaction.js +159 -75
  23. package/dist/engine/controller/interaction.js.map +1 -1
  24. package/dist/engine/data/chartDataManager.d.ts +4 -3
  25. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  26. package/dist/engine/data/chartDataManager.js +39 -41
  27. package/dist/engine/data/chartDataManager.js.map +1 -1
  28. package/dist/engine/drawing/index.d.ts +2 -5
  29. package/dist/engine/drawing/index.d.ts.map +1 -1
  30. package/dist/engine/drawing/index.js +2 -33
  31. package/dist/engine/drawing/index.js.map +1 -1
  32. package/dist/engine/drawing/interaction.js +1 -1
  33. package/dist/engine/drawing/interaction.js.map +1 -1
  34. package/dist/engine/drawing/linearRegression.d.ts +6 -0
  35. package/dist/engine/drawing/linearRegression.d.ts.map +1 -0
  36. package/dist/engine/drawing/linearRegression.js +34 -0
  37. package/dist/engine/drawing/linearRegression.js.map +1 -0
  38. package/dist/engine/drawing/plugin.d.ts.map +1 -1
  39. package/dist/engine/drawing/plugin.js +104 -94
  40. package/dist/engine/drawing/plugin.js.map +1 -1
  41. package/dist/engine/indicators/calculators/_shared.d.ts +3 -0
  42. package/dist/engine/indicators/calculators/_shared.d.ts.map +1 -0
  43. package/dist/engine/indicators/calculators/_shared.js +45 -0
  44. package/dist/engine/indicators/calculators/_shared.js.map +1 -0
  45. package/dist/engine/indicators/calculators/bands.d.ts +44 -0
  46. package/dist/engine/indicators/calculators/bands.d.ts.map +1 -0
  47. package/dist/engine/indicators/calculators/bands.js +268 -0
  48. package/dist/engine/indicators/calculators/bands.js.map +1 -0
  49. package/dist/engine/indicators/calculators/index.d.ts +33 -0
  50. package/dist/engine/indicators/calculators/index.d.ts.map +1 -0
  51. package/dist/engine/indicators/calculators/index.js +19 -0
  52. package/dist/engine/indicators/calculators/index.js.map +1 -0
  53. package/dist/engine/indicators/calculators/movingAverages.d.ts +21 -0
  54. package/dist/engine/indicators/calculators/movingAverages.d.ts.map +1 -0
  55. package/dist/engine/indicators/calculators/movingAverages.js +143 -0
  56. package/dist/engine/indicators/calculators/movingAverages.js.map +1 -0
  57. package/dist/engine/indicators/calculators/oscillators.d.ts +29 -0
  58. package/dist/engine/indicators/calculators/oscillators.d.ts.map +1 -0
  59. package/dist/engine/indicators/calculators/oscillators.js +349 -0
  60. package/dist/engine/indicators/calculators/oscillators.js.map +1 -0
  61. package/dist/engine/indicators/calculators/patterns.d.ts +54 -0
  62. package/dist/engine/indicators/calculators/patterns.d.ts.map +1 -0
  63. package/dist/engine/indicators/calculators/patterns.js +214 -0
  64. package/dist/engine/indicators/calculators/patterns.js.map +1 -0
  65. package/dist/engine/indicators/calculators/volatility.d.ts +6 -0
  66. package/dist/engine/indicators/calculators/volatility.d.ts.map +1 -0
  67. package/dist/engine/indicators/calculators/volatility.js +114 -0
  68. package/dist/engine/indicators/calculators/volatility.js.map +1 -0
  69. package/dist/engine/indicators/calculators/volume.d.ts +21 -0
  70. package/dist/engine/indicators/calculators/volume.d.ts.map +1 -0
  71. package/dist/engine/indicators/calculators/volume.js +218 -0
  72. package/dist/engine/indicators/calculators/volume.js.map +1 -0
  73. package/dist/engine/indicators/calculators.d.ts +1 -361
  74. package/dist/engine/indicators/calculators.d.ts.map +1 -1
  75. package/dist/engine/indicators/calculators.js +1 -1787
  76. package/dist/engine/indicators/calculators.js.map +1 -1
  77. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  78. package/dist/engine/indicators/chartIndicatorManager.js +3 -44
  79. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  80. package/dist/engine/indicators/indicatorRegistry.d.ts +8 -0
  81. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  82. package/dist/engine/indicators/indicatorRegistry.js +16 -0
  83. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  84. package/dist/engine/indicators/indicatorRuntime.js +2 -2
  85. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  86. package/dist/engine/indicators/scheduler.d.ts +2 -2
  87. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  88. package/dist/engine/indicators/scheduler.js +15 -155
  89. package/dist/engine/indicators/scheduler.js.map +1 -1
  90. package/dist/engine/indicators/{atrState.d.ts → state/atrState.d.ts} +1 -1
  91. package/dist/engine/indicators/state/atrState.d.ts.map +1 -0
  92. package/dist/engine/indicators/{atrState.js → state/atrState.js} +1 -1
  93. package/dist/engine/indicators/state/atrState.js.map +1 -0
  94. package/dist/engine/indicators/{bollState.d.ts → state/bollState.d.ts} +4 -2
  95. package/dist/engine/indicators/state/bollState.d.ts.map +1 -0
  96. package/dist/engine/indicators/{bollState.js → state/bollState.js} +5 -3
  97. package/dist/engine/indicators/state/bollState.js.map +1 -0
  98. package/dist/engine/indicators/{cciState.d.ts → state/cciState.d.ts} +1 -1
  99. package/dist/engine/indicators/state/cciState.d.ts.map +1 -0
  100. package/dist/engine/indicators/{cciState.js → state/cciState.js} +1 -1
  101. package/dist/engine/indicators/state/cciState.js.map +1 -0
  102. package/dist/engine/indicators/{chaikinVolState.d.ts → state/chaikinVolState.d.ts} +1 -1
  103. package/dist/engine/indicators/state/chaikinVolState.d.ts.map +1 -0
  104. package/dist/engine/indicators/{chaikinVolState.js → state/chaikinVolState.js} +1 -1
  105. package/dist/engine/indicators/state/chaikinVolState.js.map +1 -0
  106. package/dist/engine/indicators/{cmfState.d.ts → state/cmfState.d.ts} +1 -1
  107. package/dist/engine/indicators/state/cmfState.d.ts.map +1 -0
  108. package/dist/engine/indicators/{cmfState.js → state/cmfState.js} +1 -1
  109. package/dist/engine/indicators/state/cmfState.js.map +1 -0
  110. package/dist/engine/indicators/{demaState.d.ts → state/demaState.d.ts} +1 -1
  111. package/dist/engine/indicators/state/demaState.d.ts.map +1 -0
  112. package/dist/engine/indicators/{demaState.js → state/demaState.js} +1 -1
  113. package/dist/engine/indicators/state/demaState.js.map +1 -0
  114. package/dist/engine/indicators/{donchianState.d.ts → state/donchianState.d.ts} +1 -1
  115. package/dist/engine/indicators/state/donchianState.d.ts.map +1 -0
  116. package/dist/engine/indicators/{donchianState.js → state/donchianState.js} +1 -1
  117. package/dist/engine/indicators/state/donchianState.js.map +1 -0
  118. package/dist/engine/indicators/{eneState.d.ts → state/eneState.d.ts} +4 -2
  119. package/dist/engine/indicators/state/eneState.d.ts.map +1 -0
  120. package/dist/engine/indicators/{eneState.js → state/eneState.js} +5 -3
  121. package/dist/engine/indicators/state/eneState.js.map +1 -0
  122. package/dist/engine/indicators/{expmaState.d.ts → state/expmaState.d.ts} +4 -2
  123. package/dist/engine/indicators/state/expmaState.d.ts.map +1 -0
  124. package/dist/engine/indicators/{expmaState.js → state/expmaState.js} +5 -3
  125. package/dist/engine/indicators/state/expmaState.js.map +1 -0
  126. package/dist/engine/indicators/{fastkState.d.ts → state/fastkState.d.ts} +1 -1
  127. package/dist/engine/indicators/state/fastkState.d.ts.map +1 -0
  128. package/dist/engine/indicators/{fastkState.js → state/fastkState.js} +1 -1
  129. package/dist/engine/indicators/state/fastkState.js.map +1 -0
  130. package/dist/engine/indicators/{fibState.d.ts → state/fibState.d.ts} +1 -1
  131. package/dist/engine/indicators/state/fibState.d.ts.map +1 -0
  132. package/dist/engine/indicators/{fibState.js → state/fibState.js} +1 -1
  133. package/dist/engine/indicators/state/fibState.js.map +1 -0
  134. package/dist/engine/indicators/{hmaState.d.ts → state/hmaState.d.ts} +1 -1
  135. package/dist/engine/indicators/state/hmaState.d.ts.map +1 -0
  136. package/dist/engine/indicators/{hmaState.js → state/hmaState.js} +1 -1
  137. package/dist/engine/indicators/state/hmaState.js.map +1 -0
  138. package/dist/engine/indicators/{hvState.d.ts → state/hvState.d.ts} +1 -1
  139. package/dist/engine/indicators/state/hvState.d.ts.map +1 -0
  140. package/dist/engine/indicators/{hvState.js → state/hvState.js} +1 -1
  141. package/dist/engine/indicators/state/hvState.js.map +1 -0
  142. package/dist/engine/indicators/{ichimokuState.d.ts → state/ichimokuState.d.ts} +1 -1
  143. package/dist/engine/indicators/state/ichimokuState.d.ts.map +1 -0
  144. package/dist/engine/indicators/{ichimokuState.js → state/ichimokuState.js} +1 -1
  145. package/dist/engine/indicators/state/ichimokuState.js.map +1 -0
  146. package/dist/engine/indicators/{kamaState.d.ts → state/kamaState.d.ts} +1 -1
  147. package/dist/engine/indicators/state/kamaState.d.ts.map +1 -0
  148. package/dist/engine/indicators/{kamaState.js → state/kamaState.js} +1 -1
  149. package/dist/engine/indicators/state/kamaState.js.map +1 -0
  150. package/dist/engine/indicators/{keltnerState.d.ts → state/keltnerState.d.ts} +1 -1
  151. package/dist/engine/indicators/state/keltnerState.d.ts.map +1 -0
  152. package/dist/engine/indicators/{keltnerState.js → state/keltnerState.js} +1 -1
  153. package/dist/engine/indicators/state/keltnerState.js.map +1 -0
  154. package/dist/engine/indicators/{kstState.d.ts → state/kstState.d.ts} +2 -2
  155. package/dist/engine/indicators/state/kstState.d.ts.map +1 -0
  156. package/dist/engine/indicators/{kstState.js → state/kstState.js} +1 -1
  157. package/dist/engine/indicators/state/kstState.js.map +1 -0
  158. package/dist/engine/indicators/{maState.d.ts → state/maState.d.ts} +1 -1
  159. package/dist/engine/indicators/state/maState.d.ts.map +1 -0
  160. package/dist/engine/indicators/{maState.js → state/maState.js} +1 -1
  161. package/dist/engine/indicators/state/maState.js.map +1 -0
  162. package/dist/engine/indicators/{macdState.d.ts → state/macdState.d.ts} +3 -19
  163. package/dist/engine/indicators/state/macdState.d.ts.map +1 -0
  164. package/dist/engine/indicators/state/macdState.js.map +1 -0
  165. package/dist/engine/indicators/{mfiState.d.ts → state/mfiState.d.ts} +1 -1
  166. package/dist/engine/indicators/state/mfiState.d.ts.map +1 -0
  167. package/dist/engine/indicators/{mfiState.js → state/mfiState.js} +1 -1
  168. package/dist/engine/indicators/state/mfiState.js.map +1 -0
  169. package/dist/engine/indicators/{momState.d.ts → state/momState.d.ts} +1 -1
  170. package/dist/engine/indicators/state/momState.d.ts.map +1 -0
  171. package/dist/engine/indicators/{momState.js → state/momState.js} +1 -1
  172. package/dist/engine/indicators/state/momState.js.map +1 -0
  173. package/dist/engine/indicators/{obvState.d.ts → state/obvState.d.ts} +1 -1
  174. package/dist/engine/indicators/state/obvState.d.ts.map +1 -0
  175. package/dist/engine/indicators/{obvState.js → state/obvState.js} +1 -1
  176. package/dist/engine/indicators/state/obvState.js.map +1 -0
  177. package/dist/engine/indicators/{parkinsonState.d.ts → state/parkinsonState.d.ts} +1 -1
  178. package/dist/engine/indicators/state/parkinsonState.d.ts.map +1 -0
  179. package/dist/engine/indicators/{parkinsonState.js → state/parkinsonState.js} +1 -1
  180. package/dist/engine/indicators/state/parkinsonState.js.map +1 -0
  181. package/dist/engine/indicators/{pivotState.d.ts → state/pivotState.d.ts} +1 -1
  182. package/dist/engine/indicators/state/pivotState.d.ts.map +1 -0
  183. package/dist/engine/indicators/{pivotState.js → state/pivotState.js} +1 -1
  184. package/dist/engine/indicators/state/pivotState.js.map +1 -0
  185. package/dist/engine/indicators/{pvtState.d.ts → state/pvtState.d.ts} +1 -1
  186. package/dist/engine/indicators/state/pvtState.d.ts.map +1 -0
  187. package/dist/engine/indicators/{pvtState.js → state/pvtState.js} +1 -1
  188. package/dist/engine/indicators/state/pvtState.js.map +1 -0
  189. package/dist/engine/indicators/{rocState.d.ts → state/rocState.d.ts} +1 -1
  190. package/dist/engine/indicators/state/rocState.d.ts.map +1 -0
  191. package/dist/engine/indicators/{rocState.js → state/rocState.js} +1 -1
  192. package/dist/engine/indicators/state/rocState.js.map +1 -0
  193. package/dist/engine/indicators/{rsiState.d.ts → state/rsiState.d.ts} +4 -1
  194. package/dist/engine/indicators/state/rsiState.d.ts.map +1 -0
  195. package/dist/engine/indicators/{rsiState.js → state/rsiState.js} +7 -4
  196. package/dist/engine/indicators/state/rsiState.js.map +1 -0
  197. package/dist/engine/indicators/{sarState.d.ts → state/sarState.d.ts} +1 -1
  198. package/dist/engine/indicators/state/sarState.d.ts.map +1 -0
  199. package/dist/engine/indicators/{sarState.js → state/sarState.js} +1 -1
  200. package/dist/engine/indicators/state/sarState.js.map +1 -0
  201. package/dist/engine/indicators/{stochState.d.ts → state/stochState.d.ts} +2 -2
  202. package/dist/engine/indicators/state/stochState.d.ts.map +1 -0
  203. package/dist/engine/indicators/{stochState.js → state/stochState.js} +1 -1
  204. package/dist/engine/indicators/state/stochState.js.map +1 -0
  205. package/dist/engine/indicators/{structureState.d.ts → state/structureState.d.ts} +1 -1
  206. package/dist/engine/indicators/state/structureState.d.ts.map +1 -0
  207. package/dist/engine/indicators/{structureState.js → state/structureState.js} +1 -1
  208. package/dist/engine/indicators/state/structureState.js.map +1 -0
  209. package/dist/engine/indicators/{supertrendState.d.ts → state/supertrendState.d.ts} +1 -1
  210. package/dist/engine/indicators/state/supertrendState.d.ts.map +1 -0
  211. package/dist/engine/indicators/{supertrendState.js → state/supertrendState.js} +1 -1
  212. package/dist/engine/indicators/state/supertrendState.js.map +1 -0
  213. package/dist/engine/indicators/{temaState.d.ts → state/temaState.d.ts} +1 -1
  214. package/dist/engine/indicators/state/temaState.d.ts.map +1 -0
  215. package/dist/engine/indicators/{temaState.js → state/temaState.js} +1 -1
  216. package/dist/engine/indicators/state/temaState.js.map +1 -0
  217. package/dist/engine/indicators/{trixState.d.ts → state/trixState.d.ts} +1 -1
  218. package/dist/engine/indicators/state/trixState.d.ts.map +1 -0
  219. package/dist/engine/indicators/{trixState.js → state/trixState.js} +1 -1
  220. package/dist/engine/indicators/state/trixState.js.map +1 -0
  221. package/dist/engine/indicators/{vmaState.d.ts → state/vmaState.d.ts} +1 -1
  222. package/dist/engine/indicators/state/vmaState.d.ts.map +1 -0
  223. package/dist/engine/indicators/{vmaState.js → state/vmaState.js} +1 -1
  224. package/dist/engine/indicators/state/vmaState.js.map +1 -0
  225. package/dist/engine/indicators/{volumeProfileState.d.ts → state/volumeProfileState.d.ts} +1 -1
  226. package/dist/engine/indicators/state/volumeProfileState.d.ts.map +1 -0
  227. package/dist/engine/indicators/{volumeProfileState.js → state/volumeProfileState.js} +1 -1
  228. package/dist/engine/indicators/state/volumeProfileState.js.map +1 -0
  229. package/dist/engine/indicators/{vwapState.d.ts → state/vwapState.d.ts} +1 -1
  230. package/dist/engine/indicators/state/vwapState.d.ts.map +1 -0
  231. package/dist/engine/indicators/{vwapState.js → state/vwapState.js} +1 -1
  232. package/dist/engine/indicators/state/vwapState.js.map +1 -0
  233. package/dist/engine/indicators/{wmaState.d.ts → state/wmaState.d.ts} +1 -1
  234. package/dist/engine/indicators/state/wmaState.d.ts.map +1 -0
  235. package/dist/engine/indicators/{wmaState.js → state/wmaState.js} +1 -1
  236. package/dist/engine/indicators/state/wmaState.js.map +1 -0
  237. package/dist/engine/indicators/{wmsrState.d.ts → state/wmsrState.d.ts} +1 -1
  238. package/dist/engine/indicators/state/wmsrState.d.ts.map +1 -0
  239. package/dist/engine/indicators/{wmsrState.js → state/wmsrState.js} +1 -1
  240. package/dist/engine/indicators/state/wmsrState.js.map +1 -0
  241. package/dist/engine/indicators/{zonesState.d.ts → state/zonesState.d.ts} +1 -1
  242. package/dist/engine/indicators/state/zonesState.d.ts.map +1 -0
  243. package/dist/engine/indicators/{zonesState.js → state/zonesState.js} +1 -1
  244. package/dist/engine/indicators/state/zonesState.js.map +1 -0
  245. package/dist/engine/indicators/stateComposer.d.ts +39 -39
  246. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  247. package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -1
  248. package/dist/engine/indicators/visibleStateComposers.js +192 -31
  249. package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
  250. package/dist/engine/layout/pane.js +2 -2
  251. package/dist/engine/layout/pane.js.map +1 -1
  252. package/dist/engine/paneRenderer.d.ts +2 -6
  253. package/dist/engine/paneRenderer.d.ts.map +1 -1
  254. package/dist/engine/paneRenderer.js.map +1 -1
  255. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  256. package/dist/engine/render/chartRenderer.js +33 -3
  257. package/dist/engine/render/chartRenderer.js.map +1 -1
  258. package/dist/engine/renderers/Indicator/atr.js +2 -2
  259. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  260. package/dist/engine/renderers/Indicator/cci.js +1 -1
  261. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  262. package/dist/engine/renderers/Indicator/chaikinVol.js +1 -1
  263. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  264. package/dist/engine/renderers/Indicator/cmf.js +1 -1
  265. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  266. package/dist/engine/renderers/Indicator/dema.js +1 -1
  267. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  268. package/dist/engine/renderers/Indicator/donchian.js +1 -1
  269. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  270. package/dist/engine/renderers/Indicator/fastk.js +1 -1
  271. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  272. package/dist/engine/renderers/Indicator/fib.js +1 -1
  273. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  274. package/dist/engine/renderers/Indicator/hma.js +1 -1
  275. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  276. package/dist/engine/renderers/Indicator/hv.js +2 -2
  277. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  278. package/dist/engine/renderers/Indicator/ichimoku.js +95 -92
  279. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  280. package/dist/engine/renderers/Indicator/kama.js +1 -1
  281. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  282. package/dist/engine/renderers/Indicator/keltner.js +1 -1
  283. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  284. package/dist/engine/renderers/Indicator/kst.js +2 -2
  285. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  286. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  287. package/dist/engine/renderers/Indicator/macd.js +1 -1
  288. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  289. package/dist/engine/renderers/Indicator/mfi.js +1 -1
  290. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  291. package/dist/engine/renderers/Indicator/mom.js +2 -2
  292. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  293. package/dist/engine/renderers/Indicator/obv.js +1 -1
  294. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  295. package/dist/engine/renderers/Indicator/parkinson.js +2 -2
  296. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  297. package/dist/engine/renderers/Indicator/pivot.js +1 -1
  298. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  299. package/dist/engine/renderers/Indicator/pvt.js +1 -1
  300. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  301. package/dist/engine/renderers/Indicator/roc.js +1 -1
  302. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  303. package/dist/engine/renderers/Indicator/rsi.js +1 -1
  304. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  305. package/dist/engine/renderers/Indicator/sar.js +1 -1
  306. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  307. package/dist/engine/renderers/Indicator/stoch.js +1 -1
  308. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  309. package/dist/engine/renderers/Indicator/structure.js +1 -1
  310. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  311. package/dist/engine/renderers/Indicator/supertrend.js +1 -1
  312. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  313. package/dist/engine/renderers/Indicator/tema.js +1 -1
  314. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  315. package/dist/engine/renderers/Indicator/trix.js +2 -2
  316. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  317. package/dist/engine/renderers/Indicator/vma.js +2 -2
  318. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  319. package/dist/engine/renderers/Indicator/volumeProfile.js +1 -1
  320. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  321. package/dist/engine/renderers/Indicator/vwap.js +1 -1
  322. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  323. package/dist/engine/renderers/Indicator/wma.js +1 -1
  324. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  325. package/dist/engine/renderers/Indicator/wmsr.js +1 -1
  326. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  327. package/dist/engine/renderers/Indicator/zones.js +1 -1
  328. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  329. package/dist/engine/renderers/candle.d.ts.map +1 -1
  330. package/dist/engine/renderers/candle.js +94 -60
  331. package/dist/engine/renderers/candle.js.map +1 -1
  332. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  333. package/dist/engine/renderers/extremaMarkers.js +5 -6
  334. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  335. package/dist/engine/renderers/gridLines.d.ts.map +1 -1
  336. package/dist/engine/renderers/gridLines.js +8 -36
  337. package/dist/engine/renderers/gridLines.js.map +1 -1
  338. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -1
  339. package/dist/engine/renderers/leftYAxis.js +54 -21
  340. package/dist/engine/renderers/leftYAxis.js.map +1 -1
  341. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  342. package/dist/engine/renderers/timeAxis.js +2 -0
  343. package/dist/engine/renderers/timeAxis.js.map +1 -1
  344. package/dist/engine/renderers/timeShare.js +1 -1
  345. package/dist/engine/renderers/timeShare.js.map +1 -1
  346. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  347. package/dist/engine/renderers/yAxis.js +16 -22
  348. package/dist/engine/renderers/yAxis.js.map +1 -1
  349. package/dist/engine/utils/tickPosition.d.ts +12 -0
  350. package/dist/engine/utils/tickPosition.d.ts.map +1 -1
  351. package/dist/engine/utils/tickPosition.js +15 -0
  352. package/dist/engine/utils/tickPosition.js.map +1 -1
  353. package/dist/engine/viewport/chartViewportManager.d.ts +34 -5
  354. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  355. package/dist/engine/viewport/chartViewportManager.js +61 -30
  356. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  357. package/dist/mcp/chartBridge.js +1 -1
  358. package/dist/mcp/chartBridge.js.map +1 -1
  359. package/dist/plugin/types.d.ts +13 -0
  360. package/dist/plugin/types.d.ts.map +1 -1
  361. package/dist/plugin/types.js.map +1 -1
  362. package/dist/utils/dateFormat.d.ts +2 -2
  363. package/dist/utils/dateFormat.d.ts.map +1 -1
  364. package/dist/utils/dateFormat.js +6 -6
  365. package/dist/utils/dateFormat.js.map +1 -1
  366. package/dist/utils/kLineDraw/axis.d.ts +4 -0
  367. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  368. package/dist/utils/kLineDraw/axis.js +2 -2
  369. package/dist/utils/kLineDraw/axis.js.map +1 -1
  370. package/dist/utils/volumePrice.d.ts.map +1 -1
  371. package/dist/utils/volumePrice.js +20 -3
  372. package/dist/utils/volumePrice.js.map +1 -1
  373. package/dist/version.d.ts +1 -1
  374. package/dist/version.js +1 -1
  375. package/package.json +1 -1
  376. package/src/config/chartSettings.ts +1 -2
  377. package/src/controllers/createChartController.ts +9 -2
  378. package/src/controllers/index.ts +1 -1
  379. package/src/controllers/types.ts +4 -2
  380. package/src/data-fetchers/__tests__/dataBuffer.test.ts +135 -0
  381. package/src/data-fetchers/dataBuffer.ts +61 -9
  382. package/src/engine/chart.ts +11 -46
  383. package/src/engine/controller/interaction.ts +187 -77
  384. package/src/engine/data/chartDataManager.ts +43 -43
  385. package/src/engine/drawing/index.ts +2 -36
  386. package/src/engine/drawing/interaction.ts +1 -1
  387. package/src/engine/drawing/linearRegression.ts +36 -0
  388. package/src/engine/drawing/plugin.ts +160 -97
  389. package/src/engine/indicators/__tests__/calculators.test.ts +9 -1
  390. package/src/engine/indicators/__tests__/indicatorRegistry.test.ts +10 -5
  391. package/src/engine/indicators/__tests__/scheduler.test.ts +12 -12
  392. package/src/engine/indicators/__tests__/soa.test.ts +46 -12
  393. package/src/engine/indicators/calculators/_shared.ts +44 -0
  394. package/src/engine/indicators/calculators/bands.ts +365 -0
  395. package/src/engine/indicators/calculators/index.ts +37 -0
  396. package/src/engine/indicators/calculators/movingAverages.ts +189 -0
  397. package/src/engine/indicators/calculators/oscillators.ts +446 -0
  398. package/src/engine/indicators/calculators/patterns.ts +287 -0
  399. package/src/engine/indicators/calculators/volatility.ts +150 -0
  400. package/src/engine/indicators/calculators/volume.ts +248 -0
  401. package/src/engine/indicators/calculators.ts +1 -2460
  402. package/src/engine/indicators/chartIndicatorManager.ts +3 -44
  403. package/src/engine/indicators/indicatorRegistry.ts +15 -0
  404. package/src/engine/indicators/indicatorRuntime.ts +2 -2
  405. package/src/engine/indicators/scheduler.ts +39 -154
  406. package/src/engine/indicators/{atrState.ts → state/atrState.ts} +2 -2
  407. package/src/engine/indicators/{bollState.ts → state/bollState.ts} +8 -5
  408. package/src/engine/indicators/{cciState.ts → state/cciState.ts} +2 -2
  409. package/src/engine/indicators/{chaikinVolState.ts → state/chaikinVolState.ts} +2 -2
  410. package/src/engine/indicators/{cmfState.ts → state/cmfState.ts} +2 -2
  411. package/src/engine/indicators/{demaState.ts → state/demaState.ts} +2 -2
  412. package/src/engine/indicators/{donchianState.ts → state/donchianState.ts} +2 -2
  413. package/src/engine/indicators/{eneState.ts → state/eneState.ts} +8 -5
  414. package/src/engine/indicators/{expmaState.ts → state/expmaState.ts} +8 -5
  415. package/src/engine/indicators/{fastkState.ts → state/fastkState.ts} +2 -2
  416. package/src/engine/indicators/{fibState.ts → state/fibState.ts} +2 -2
  417. package/src/engine/indicators/{hmaState.ts → state/hmaState.ts} +2 -2
  418. package/src/engine/indicators/{hvState.ts → state/hvState.ts} +2 -2
  419. package/src/engine/indicators/{ichimokuState.ts → state/ichimokuState.ts} +2 -2
  420. package/src/engine/indicators/{kamaState.ts → state/kamaState.ts} +2 -2
  421. package/src/engine/indicators/{keltnerState.ts → state/keltnerState.ts} +2 -2
  422. package/src/engine/indicators/{kstState.ts → state/kstState.ts} +3 -3
  423. package/src/engine/indicators/{maState.ts → state/maState.ts} +2 -2
  424. package/src/engine/indicators/{macdState.ts → state/macdState.ts} +3 -20
  425. package/src/engine/indicators/{mfiState.ts → state/mfiState.ts} +2 -2
  426. package/src/engine/indicators/{momState.ts → state/momState.ts} +2 -2
  427. package/src/engine/indicators/{obvState.ts → state/obvState.ts} +2 -2
  428. package/src/engine/indicators/{parkinsonState.ts → state/parkinsonState.ts} +2 -2
  429. package/src/engine/indicators/{pivotState.ts → state/pivotState.ts} +2 -2
  430. package/src/engine/indicators/{pvtState.ts → state/pvtState.ts} +2 -2
  431. package/src/engine/indicators/{rocState.ts → state/rocState.ts} +2 -2
  432. package/src/engine/indicators/{rsiState.ts → state/rsiState.ts} +9 -5
  433. package/src/engine/indicators/{sarState.ts → state/sarState.ts} +2 -2
  434. package/src/engine/indicators/{stochState.ts → state/stochState.ts} +3 -3
  435. package/src/engine/indicators/{structureState.ts → state/structureState.ts} +2 -2
  436. package/src/engine/indicators/{supertrendState.ts → state/supertrendState.ts} +2 -2
  437. package/src/engine/indicators/{temaState.ts → state/temaState.ts} +2 -2
  438. package/src/engine/indicators/{trixState.ts → state/trixState.ts} +2 -2
  439. package/src/engine/indicators/{vmaState.ts → state/vmaState.ts} +2 -2
  440. package/src/engine/indicators/{volumeProfileState.ts → state/volumeProfileState.ts} +2 -2
  441. package/src/engine/indicators/{vwapState.ts → state/vwapState.ts} +2 -2
  442. package/src/engine/indicators/{wmaState.ts → state/wmaState.ts} +2 -2
  443. package/src/engine/indicators/{wmsrState.ts → state/wmsrState.ts} +2 -2
  444. package/src/engine/indicators/{zonesState.ts → state/zonesState.ts} +2 -2
  445. package/src/engine/indicators/stateComposer.ts +39 -39
  446. package/src/engine/indicators/visibleStateComposers.ts +203 -30
  447. package/src/engine/layout/pane.ts +2 -2
  448. package/src/engine/paneRenderer.ts +2 -6
  449. package/src/engine/render/chartRenderer.ts +34 -4
  450. package/src/engine/renderers/Indicator/__tests__/createSubIndicatorRenderer.test.ts +1 -1
  451. package/src/engine/renderers/Indicator/atr.ts +3 -3
  452. package/src/engine/renderers/Indicator/boll.ts +1 -1
  453. package/src/engine/renderers/Indicator/cci.ts +2 -2
  454. package/src/engine/renderers/Indicator/chaikinVol.ts +2 -2
  455. package/src/engine/renderers/Indicator/cmf.ts +2 -2
  456. package/src/engine/renderers/Indicator/dema.ts +2 -2
  457. package/src/engine/renderers/Indicator/donchian.ts +2 -2
  458. package/src/engine/renderers/Indicator/ene.ts +1 -1
  459. package/src/engine/renderers/Indicator/expma.ts +1 -1
  460. package/src/engine/renderers/Indicator/fastk.ts +2 -2
  461. package/src/engine/renderers/Indicator/fib.ts +2 -2
  462. package/src/engine/renderers/Indicator/hma.ts +2 -2
  463. package/src/engine/renderers/Indicator/hv.ts +3 -3
  464. package/src/engine/renderers/Indicator/ichimoku.ts +111 -85
  465. package/src/engine/renderers/Indicator/kama.ts +3 -3
  466. package/src/engine/renderers/Indicator/keltner.ts +4 -4
  467. package/src/engine/renderers/Indicator/kst.ts +5 -5
  468. package/src/engine/renderers/Indicator/ma.ts +2 -2
  469. package/src/engine/renderers/Indicator/macd.ts +40 -40
  470. package/src/engine/renderers/Indicator/mfi.ts +3 -3
  471. package/src/engine/renderers/Indicator/mom.ts +4 -4
  472. package/src/engine/renderers/Indicator/obv.ts +3 -3
  473. package/src/engine/renderers/Indicator/parkinson.ts +5 -5
  474. package/src/engine/renderers/Indicator/pivot.ts +4 -4
  475. package/src/engine/renderers/Indicator/pvt.ts +3 -3
  476. package/src/engine/renderers/Indicator/roc.ts +3 -3
  477. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  478. package/src/engine/renderers/Indicator/sar.ts +3 -3
  479. package/src/engine/renderers/Indicator/stoch.ts +4 -4
  480. package/src/engine/renderers/Indicator/structure.ts +24 -24
  481. package/src/engine/renderers/Indicator/supertrend.ts +4 -4
  482. package/src/engine/renderers/Indicator/tema.ts +3 -3
  483. package/src/engine/renderers/Indicator/trix.ts +34 -34
  484. package/src/engine/renderers/Indicator/vma.ts +3 -3
  485. package/src/engine/renderers/Indicator/volumeProfile.ts +28 -28
  486. package/src/engine/renderers/Indicator/vwap.ts +3 -3
  487. package/src/engine/renderers/Indicator/wma.ts +3 -3
  488. package/src/engine/renderers/Indicator/wmsr.ts +3 -3
  489. package/src/engine/renderers/Indicator/zones.ts +6 -6
  490. package/src/engine/renderers/__tests__/boll.renderer.test.ts +1 -1
  491. package/src/engine/renderers/__tests__/ene.renderer.test.ts +1 -1
  492. package/src/engine/renderers/__tests__/expma.renderer.test.ts +1 -1
  493. package/src/engine/renderers/__tests__/ma.renderer.test.ts +1 -1
  494. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +4 -4
  495. package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +30 -26
  496. package/src/engine/renderers/candle.ts +112 -70
  497. package/src/engine/renderers/extremaMarkers.ts +5 -3
  498. package/src/engine/renderers/gridLines.ts +8 -37
  499. package/src/engine/renderers/leftYAxis.ts +61 -22
  500. package/src/engine/renderers/timeAxis.ts +2 -0
  501. package/src/engine/renderers/timeShare.ts +10 -10
  502. package/src/engine/renderers/yAxis.ts +19 -23
  503. package/src/engine/utils/tickPosition.ts +34 -0
  504. package/src/engine/viewport/chartViewportManager.ts +66 -36
  505. package/src/mcp/chartBridge.ts +1 -1
  506. package/src/plugin/types.ts +14 -0
  507. package/src/utils/__tests__/dateFormat.test.ts +164 -0
  508. package/src/utils/dateFormat.ts +12 -6
  509. package/src/utils/kLineDraw/axis.ts +6 -2
  510. package/src/utils/volumePrice.ts +19 -3
  511. package/src/version.ts +1 -1
  512. package/dist/engine/indicators/atrState.d.ts.map +0 -1
  513. package/dist/engine/indicators/atrState.js.map +0 -1
  514. package/dist/engine/indicators/bollState.d.ts.map +0 -1
  515. package/dist/engine/indicators/bollState.js.map +0 -1
  516. package/dist/engine/indicators/cciState.d.ts.map +0 -1
  517. package/dist/engine/indicators/cciState.js.map +0 -1
  518. package/dist/engine/indicators/chaikinVolState.d.ts.map +0 -1
  519. package/dist/engine/indicators/chaikinVolState.js.map +0 -1
  520. package/dist/engine/indicators/cmfState.d.ts.map +0 -1
  521. package/dist/engine/indicators/cmfState.js.map +0 -1
  522. package/dist/engine/indicators/demaState.d.ts.map +0 -1
  523. package/dist/engine/indicators/demaState.js.map +0 -1
  524. package/dist/engine/indicators/donchianState.d.ts.map +0 -1
  525. package/dist/engine/indicators/donchianState.js.map +0 -1
  526. package/dist/engine/indicators/eneState.d.ts.map +0 -1
  527. package/dist/engine/indicators/eneState.js.map +0 -1
  528. package/dist/engine/indicators/expmaState.d.ts.map +0 -1
  529. package/dist/engine/indicators/expmaState.js.map +0 -1
  530. package/dist/engine/indicators/fastkState.d.ts.map +0 -1
  531. package/dist/engine/indicators/fastkState.js.map +0 -1
  532. package/dist/engine/indicators/fibState.d.ts.map +0 -1
  533. package/dist/engine/indicators/fibState.js.map +0 -1
  534. package/dist/engine/indicators/hmaState.d.ts.map +0 -1
  535. package/dist/engine/indicators/hmaState.js.map +0 -1
  536. package/dist/engine/indicators/hvState.d.ts.map +0 -1
  537. package/dist/engine/indicators/hvState.js.map +0 -1
  538. package/dist/engine/indicators/ichimokuState.d.ts.map +0 -1
  539. package/dist/engine/indicators/ichimokuState.js.map +0 -1
  540. package/dist/engine/indicators/kamaState.d.ts.map +0 -1
  541. package/dist/engine/indicators/kamaState.js.map +0 -1
  542. package/dist/engine/indicators/keltnerState.d.ts.map +0 -1
  543. package/dist/engine/indicators/keltnerState.js.map +0 -1
  544. package/dist/engine/indicators/kstState.d.ts.map +0 -1
  545. package/dist/engine/indicators/kstState.js.map +0 -1
  546. package/dist/engine/indicators/maState.d.ts.map +0 -1
  547. package/dist/engine/indicators/maState.js.map +0 -1
  548. package/dist/engine/indicators/macdState.d.ts.map +0 -1
  549. package/dist/engine/indicators/macdState.js.map +0 -1
  550. package/dist/engine/indicators/mfiState.d.ts.map +0 -1
  551. package/dist/engine/indicators/mfiState.js.map +0 -1
  552. package/dist/engine/indicators/momState.d.ts.map +0 -1
  553. package/dist/engine/indicators/momState.js.map +0 -1
  554. package/dist/engine/indicators/obvState.d.ts.map +0 -1
  555. package/dist/engine/indicators/obvState.js.map +0 -1
  556. package/dist/engine/indicators/parkinsonState.d.ts.map +0 -1
  557. package/dist/engine/indicators/parkinsonState.js.map +0 -1
  558. package/dist/engine/indicators/pivotState.d.ts.map +0 -1
  559. package/dist/engine/indicators/pivotState.js.map +0 -1
  560. package/dist/engine/indicators/pvtState.d.ts.map +0 -1
  561. package/dist/engine/indicators/pvtState.js.map +0 -1
  562. package/dist/engine/indicators/rocState.d.ts.map +0 -1
  563. package/dist/engine/indicators/rocState.js.map +0 -1
  564. package/dist/engine/indicators/rsiState.d.ts.map +0 -1
  565. package/dist/engine/indicators/rsiState.js.map +0 -1
  566. package/dist/engine/indicators/sarState.d.ts.map +0 -1
  567. package/dist/engine/indicators/sarState.js.map +0 -1
  568. package/dist/engine/indicators/stochState.d.ts.map +0 -1
  569. package/dist/engine/indicators/stochState.js.map +0 -1
  570. package/dist/engine/indicators/structureState.d.ts.map +0 -1
  571. package/dist/engine/indicators/structureState.js.map +0 -1
  572. package/dist/engine/indicators/supertrendState.d.ts.map +0 -1
  573. package/dist/engine/indicators/supertrendState.js.map +0 -1
  574. package/dist/engine/indicators/temaState.d.ts.map +0 -1
  575. package/dist/engine/indicators/temaState.js.map +0 -1
  576. package/dist/engine/indicators/trixState.d.ts.map +0 -1
  577. package/dist/engine/indicators/trixState.js.map +0 -1
  578. package/dist/engine/indicators/vmaState.d.ts.map +0 -1
  579. package/dist/engine/indicators/vmaState.js.map +0 -1
  580. package/dist/engine/indicators/volumeProfileState.d.ts.map +0 -1
  581. package/dist/engine/indicators/volumeProfileState.js.map +0 -1
  582. package/dist/engine/indicators/vwapState.d.ts.map +0 -1
  583. package/dist/engine/indicators/vwapState.js.map +0 -1
  584. package/dist/engine/indicators/wmaState.d.ts.map +0 -1
  585. package/dist/engine/indicators/wmaState.js.map +0 -1
  586. package/dist/engine/indicators/wmsrState.d.ts.map +0 -1
  587. package/dist/engine/indicators/wmsrState.js.map +0 -1
  588. package/dist/engine/indicators/zonesState.d.ts.map +0 -1
  589. package/dist/engine/indicators/zonesState.js.map +0 -1
  590. /package/dist/engine/indicators/{macdState.js → state/macdState.js} +0 -0
@@ -8,10 +8,26 @@ export interface DataWindow {
8
8
  }
9
9
 
10
10
  const MS_PER_DAY = 86_400_000
11
- const INITIAL_LOAD_DAYS = 365
12
- const INCREMENTAL_LOAD_DAYS = 90
13
11
  const FETCH_MAX_RETRIES = 2
14
12
 
13
+ const PERIOD_INITIAL_DAYS: Record<string, number> = {
14
+ '1min': 3,
15
+ '5min': 30,
16
+ '15min': 60,
17
+ '30min': 90,
18
+ '60min': 180,
19
+ daily: 365,
20
+ weekly: 365,
21
+ monthly: 365,
22
+ quarterly: 365,
23
+ yearly: 365,
24
+ timeshare: 1,
25
+ }
26
+
27
+ export function getPeriodDays(period?: string): number {
28
+ return PERIOD_INITIAL_DAYS[period ?? 'daily'] ?? 365
29
+ }
30
+
15
31
  function formatDate(ts: number): string {
16
32
  const d = new Date(ts)
17
33
  const y = d.getFullYear()
@@ -47,6 +63,8 @@ export class DataBuffer implements DataBufferLike {
47
63
  private _pendingFetch: Promise<void> | null = null
48
64
  private _disposed = false
49
65
  private _attemptedBoundaries: Set<number> = new Set()
66
+ private _monthKeys: Int32Array | null = null
67
+ private _dayKeys: Int32Array | null = null
50
68
 
51
69
  onPrepend: ((count: number) => void) | null = null
52
70
 
@@ -75,6 +93,33 @@ export class DataBuffer implements DataBufferLike {
75
93
  return this._data
76
94
  }
77
95
 
96
+ getMonthKeys(): Int32Array | null {
97
+ return this._monthKeys
98
+ }
99
+
100
+ getDayKeys(): Int32Array | null {
101
+ return this._dayKeys
102
+ }
103
+
104
+ private _precomputeKeys(): void {
105
+ const n = this._data.length
106
+ if (n === 0) {
107
+ this._monthKeys = null
108
+ this._dayKeys = null
109
+ return
110
+ }
111
+ const monthKeys = new Int32Array(n)
112
+ const dayKeys = new Int32Array(n)
113
+ for (let i = 0; i < n; i++) {
114
+ const d = new Date(this._data[i]!.timestamp)
115
+ monthKeys[i] = d.getFullYear() * 12 + d.getMonth()
116
+ const yearStart = new Date(d.getFullYear(), 0, 0)
117
+ dayKeys[i] = d.getFullYear() * 366 + Math.floor((d.getTime() - yearStart.getTime()) / 86400000)
118
+ }
119
+ this._monthKeys = monthKeys
120
+ this._dayKeys = dayKeys
121
+ }
122
+
78
123
  setFetcher(fetcher: DataFetcher | null): void {
79
124
  this._fetcher = fetcher
80
125
  }
@@ -88,6 +133,8 @@ export class DataBuffer implements DataBufferLike {
88
133
  this._data = []
89
134
  this._loadedWindow = null
90
135
  this._attemptedBoundaries.clear()
136
+ this._monthKeys = null
137
+ this._dayKeys = null
91
138
  this._dataSignal.set([])
92
139
  if (initialStartTs !== undefined) {
93
140
  this.loadInitialRange(initialStartTs, Date.now())
@@ -110,15 +157,16 @@ export class DataBuffer implements DataBufferLike {
110
157
  this.fetchRange(requestStartTs, incrementalEnd)
111
158
  }
112
159
 
113
- private loadInitial(): void {
114
- if ((!this._requestFetch && !this._fetcher) || !this._currentSpec || this._disposed) return
160
+ private loadInitial(): void {
161
+ if ((!this._requestFetch && !this._fetcher) || !this._currentSpec || this._disposed) return
115
162
 
116
- const now = Date.now()
117
- const startDate = now - INITIAL_LOAD_DAYS * MS_PER_DAY
118
- const endDate = now
163
+ const now = Date.now()
164
+ const days = getPeriodDays(this._currentSpec.period)
165
+ const startDate = now - days * MS_PER_DAY
166
+ const endDate = now
119
167
 
120
- this.fetchRange(startDate, endDate)
121
- }
168
+ this.fetchRange(startDate, endDate)
169
+ }
122
170
 
123
171
  private loadInitialRange(startTs: number, endTs: number): void {
124
172
  if ((!this._requestFetch && !this._fetcher) || !this._currentSpec || this._disposed) return
@@ -182,6 +230,7 @@ export class DataBuffer implements DataBufferLike {
182
230
 
183
231
  this._data = merged
184
232
  this._dataSignal.set([...merged])
233
+ this._precomputeKeys()
185
234
 
186
235
  if (merged.length > 0) {
187
236
  const newEarliest = merged[0]!.timestamp
@@ -245,6 +294,7 @@ export class DataBuffer implements DataBufferLike {
245
294
  this._loadedWindow = null
246
295
  }
247
296
  this._attemptedBoundaries.clear()
297
+ this._precomputeKeys()
248
298
  }
249
299
 
250
300
  /**
@@ -260,5 +310,7 @@ export class DataBuffer implements DataBufferLike {
260
310
  this._data = []
261
311
  this._loadedWindow = null
262
312
  this._attemptedBoundaries.clear()
313
+ this._monthKeys = null
314
+ this._dayKeys = null
263
315
  }
264
316
  }
@@ -194,8 +194,7 @@ export class Chart {
194
194
  getEffectiveDpr: () => this.viewportManager.getEffectiveDpr(),
195
195
  getLogicalScrollLeft: () => this.viewportManager.getLogicalScrollLeft(),
196
196
  getCachedScrollLeft: () => this.viewportManager.getCachedScrollLeft(),
197
- setCachedScrollLeft: (v) => { this.viewportManager.setCachedScrollLeft(v) },
198
- setPendingScrollLeft: (v) => { this.viewportManager.setPendingScrollLeft(v) },
197
+ setScrollLeft: (v) => { this.viewportManager.setScrollLeft(v) },
199
198
  getDom: () => this.dom,
200
199
  getObservedSize: () => this.viewportManager.getObservedSize(),
201
200
  getViewport: () => this.viewportManager.getViewport(),
@@ -352,7 +351,11 @@ export class Chart {
352
351
 
353
352
  /** 同步程序性 scrollLeft 写入后的缓存,避免等待异步 scroll 事件 */
354
353
  syncScrollLeft(scrollLeft: number): void {
355
- this.viewportManager.setCachedScrollLeft(scrollLeft)
354
+ this.viewportManager.setScrollLeft(scrollLeft)
355
+ }
356
+
357
+ setScrollLeft(v: number): void {
358
+ this.viewportManager.setScrollLeft(v)
356
359
  }
357
360
 
358
361
  /** 获取逻辑 scrollLeft(减去左侧加载缓冲宽度,可为负值) */
@@ -608,49 +611,6 @@ export class Chart {
608
611
  return this.indicatorManager.getSubPaneEntry(paneId)
609
612
  }
610
613
 
611
- private getDefaultSubPaneParams(indicatorId: SubIndicatorType): Record<string, unknown> {
612
- // 默认参数定义在 SubPaneManager 中,这里导入使用
613
- const defaults: Record<string, Record<string, unknown>> = {
614
- VOLUME: {},
615
- MACD: { fastPeriod: 12, slowPeriod: 26, signalPeriod: 9 },
616
- RSI: { period1: 6, period2: 12, period3: 24 },
617
- CCI: { period: 14, showCCI: true },
618
- STOCH: { n: 9, m: 3, showK: true, showD: true },
619
- MOM: { period: 10, showMOM: true },
620
- WMSR: { period: 14, showWMSR: true },
621
- KST: { roc1: 10, roc2: 15, roc3: 20, roc4: 30, signalPeriod: 9, showKST: true, showSignal: true },
622
- FASTK: { period: 9, showFASTK: true },
623
- ATR: { period: 14, showATR: true },
624
- WMA: { period: 10, showWMA: true },
625
- DEMA: { period: 14, showDEMA: true },
626
- TEMA: { period: 14, showTEMA: true },
627
- HMA: { period: 14, showHMA: true },
628
- KAMA: { period: 10, fastPeriod: 2, slowPeriod: 30, showKAMA: true },
629
- SAR: { step: 0.02, maxStep: 0.2, showSAR: true },
630
- SUPERTREND: { atrPeriod: 10, multiplier: 3, showSuperTrend: true },
631
- KELTNER: { emaPeriod: 20, atrPeriod: 10, multiplier: 2, showUpper: true, showMiddle: true, showLower: true },
632
- DONCHIAN: { period: 20, showUpper: true, showMiddle: true, showLower: true },
633
- ICHIMOKU: { tenkanPeriod: 9, kijunPeriod: 26, spanBPeriod: 52, displacement: 26, showTenkan: true, showKijun: true, showSpanA: true, showSpanB: true, showChikou: true, showCloud: true },
634
- ROC: { period: 12, showROC: true },
635
- TRIX: { period: 15, signalPeriod: 9, showTRIX: true, showSignal: true },
636
- HV: { period: 20, annualizationFactor: 252, showHV: true },
637
- PARKINSON: { period: 20, annualizationFactor: 252, showParkinson: true },
638
- CHAIKIN_VOL: { emaPeriod: 10, rocPeriod: 10, showChaikinVol: true },
639
- VMA: { period: 5, showVMA: true },
640
- OBV: { showOBV: true },
641
- PVT: { showPVT: true },
642
- VWAP: { sessionResetGapMs: 0, showVWAP: true },
643
- CMF: { period: 20, showCMF: true },
644
- MFI: { period: 14, showMFI: true },
645
- PIVOT: { showPP: true, showR1: true, showR2: true, showR3: false, showS1: true, showS2: true, showS3: false },
646
- FIB: { period: 50, showLevels: true },
647
- STRUCTURE: { leftWindow: 2, rightWindow: 2, breakoutSource: 'close', showSwingLabels: true, showBOS: true, showCHOCH: true, showProvisional: false },
648
- ZONES: { showFVG: true, showOB: true, showFilledZones: true, obLookback: 5 },
649
- VOLUME_PROFILE: { bins: 24, lookback: 0, valueAreaPercent: 0.7, showVolumeProfile: true },
650
- }
651
- return { ...(defaults[indicatorId] ?? {}) }
652
- }
653
-
654
614
 
655
615
 
656
616
  /**
@@ -751,6 +711,11 @@ export class Chart {
751
711
  return this.dataManager.getContentWidth()
752
712
  }
753
713
 
714
+ /** 获取左侧加载缓冲宽度(视口宽度,用于计算 overlay 像素偏移) */
715
+ getLeftLoadBufferWidth(): number {
716
+ return this.dataManager.getLeftLoadBufferWidth()
717
+ }
718
+
754
719
  /** 滚动到最右侧(最新数据位置) */
755
720
  scrollToRight(): void {
756
721
  this.dataManager.scrollToRight()
@@ -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
@@ -47,7 +68,7 @@ export class InteractionController {
47
68
  const dpr = this.chart.getCurrentDpr()
48
69
  const rounded = Math.round(clampedScrollLeft * dpr) / dpr
49
70
  container.scrollLeft = rounded
50
- this.chart.syncScrollLeft(container.scrollLeft)
71
+ this.chart.setScrollLeft(container.scrollLeft)
51
72
  }
52
73
 
53
74
  /** 垂直拖动相关 */
@@ -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,