@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
@@ -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'
@@ -18,8 +18,7 @@ export interface DataDependencies {
18
18
  getEffectiveDpr: () => number
19
19
  getLogicalScrollLeft: () => number
20
20
  getCachedScrollLeft: () => number
21
- setCachedScrollLeft: (v: number) => void
22
- setPendingScrollLeft: (v: number) => void
21
+ setScrollLeft: (v: number) => void
23
22
  getDom: () => ChartDom
24
23
  getObservedSize: () => { width: number; height: number }
25
24
  getViewport: () => Viewport | null
@@ -43,6 +42,8 @@ function bufKey(type: string, symbol: string, period?: string): string {
43
42
  }
44
43
 
45
44
  export class ChartDataManager {
45
+ static readonly TRAILING_SLOTS = 30
46
+
46
47
  private _dataFetcher: DataFetcher | null = null
47
48
  private _timeShareFetcher: TimeShareFetcherFn | null = null
48
49
 
@@ -101,8 +102,9 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
101
102
  this._dataSignal.set([...buf.data.peek() as unknown[]])
102
103
  this._loadingSignal.set(buf.loading.peek())
103
104
  const unsubData = buf.data.subscribe(() => {
105
+ const prevDataLength = this._dataSignal.peek().length
104
106
  this._dataSignal.set([...buf.data.peek() as unknown[]])
105
- this.onBufferDataChanged(key)
107
+ this.onBufferDataChanged(key, prevDataLength)
106
108
  })
107
109
  const unsubLoading = buf.loading.subscribe(() => {
108
110
  this._loadingSignal.set(buf.loading.peek())
@@ -162,45 +164,30 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
162
164
 
163
165
  // ── Buffer data change handler ──
164
166
 
165
- private onBufferDataChanged(key: string): void {
167
+ private onBufferDataChanged(key: string, prevDataLength?: number): void {
166
168
  const buf = this._buffers.get(key)
167
169
  if (!buf) return
168
170
 
169
171
  if (buf instanceof DataBuffer) {
170
- this.onKLineBufferChanged(key, buf)
172
+ this.onKLineBufferChanged(key, buf, prevDataLength)
171
173
  } else if (buf instanceof TimeShareBuffer) {
172
174
  this.onTimeShareBufferChanged(key, buf)
173
175
  }
174
176
  }
175
177
 
176
- private onKLineBufferChanged(key: string, buf: DataBuffer): void {
178
+ private onKLineBufferChanged(key: string, buf: DataBuffer, prevDataLength?: number): void {
177
179
  if (!key.startsWith('main:')) return
178
180
 
179
- const prevLength = this.getActiveKLineLength()
180
181
  const bufferData = buf.getRawData() as KLineData[]
181
182
  const prependedCount = this.pendingPrependedCount
182
183
  this.pendingPrependedCount = 0
183
184
 
184
- if (this.deps.getCachedScrollLeft() < this.getLeftLoadBufferWidth()) {
185
- const desiredScrollLeft = this.getLeftLoadBufferWidth()
186
- this.deps.setCachedScrollLeft(desiredScrollLeft)
187
- this.deps.setPendingScrollLeft(desiredScrollLeft)
185
+ if (prependedCount === 0 && this.deps.getCachedScrollLeft() < this.getLeftLoadBufferWidth()) {
186
+ this.deps.setScrollLeft(this.getLeftLoadBufferWidth())
188
187
  }
189
188
 
190
- if (prevLength === 0 && bufferData.length > 0) {
191
- const dpr = this.deps.getEffectiveDpr()
192
- const opt = this.deps.getOption()
193
- const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
194
- const lastKLineEndPx = (startXPx + bufferData.length * unitPx) / dpr
195
- const container = this.deps.getDom().container
196
- if (container) {
197
- const target = this.getLeftLoadBufferWidth() + Math.max(0, lastKLineEndPx - container.clientWidth)
198
- const contentWidth = this.getContentWidth()
199
- const maxScroll = Math.max(0, contentWidth - container.clientWidth)
200
- const scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr
201
- this.deps.setCachedScrollLeft(scrollLeft)
202
- this.deps.setPendingScrollLeft(scrollLeft)
203
- }
189
+ if ((prevDataLength ?? this._dataSignal.peek().length) === 0 && bufferData.length > 0) {
190
+ this.scrollToRight()
204
191
  }
205
192
 
206
193
  this.deps.resetInteraction()
@@ -285,7 +272,7 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
285
272
  return 24
286
273
  }
287
274
 
288
- private static readonly TRAILING_DRAWING_SLOTS = 24
275
+
289
276
 
290
277
  private clearIncrementalLoadHintTimer(): void {
291
278
  if (this.incrementalLoadHintTimer !== null) {
@@ -312,7 +299,6 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
312
299
  const hint = ownerDoc.createElement('div')
313
300
  hint.className = 'klc-incremental-load-hint'
314
301
  hint.style.position = 'absolute'
315
- hint.style.left = '0'
316
302
  hint.style.top = '0'
317
303
  hint.style.height = '0px'
318
304
  hint.style.width = '0px'
@@ -336,7 +322,8 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
336
322
  const dpr = this.deps.getEffectiveDpr()
337
323
  const opt = this.deps.getOption()
338
324
  const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
339
- const width = this.getLeftLoadBufferWidth() + (startXPx + count * unitPx) / dpr
325
+ hint.style.left = `${this.getLeftLoadBufferWidth()}px`
326
+ const width = (startXPx + count * unitPx) / dpr
340
327
  hint.style.width = `${Math.max(0, width)}px`
341
328
  hint.style.height = `${Math.max(
342
329
  0,
@@ -381,6 +368,14 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
381
368
  return [...this._dataSignal.peek()]
382
369
  }
383
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
+
384
379
  getTimeShareData(): TimeShareData[] {
385
380
  const buf = this.getActiveTimeShareBuffer()
386
381
  return buf ? buf.getRawData() : []
@@ -552,10 +547,12 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
552
547
  const range = this.computeRawVisibleRange() ?? this.lastRawVisibleRange
553
548
 
554
549
  const MS_PER_DAY = 86_400_000
550
+ const spec = buf.currentSpec
551
+ const gapDays = getPeriodDays(spec?.period)
555
552
  let firstVisibleTs: number | undefined
556
553
 
557
554
  if (range.start < 0 && this._dataFetcher) {
558
- const earlierThanEarliest = window.earliestTs - 365 * MS_PER_DAY
555
+ const earlierThanEarliest = window.earliestTs - gapDays * MS_PER_DAY
559
556
  buf.ensureRange(earlierThanEarliest, window.earliestTs)
560
557
  firstVisibleTs = data[0]?.timestamp
561
558
  } else if (range.start < data.length) {
@@ -867,11 +864,8 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
867
864
  const opt = this.deps.getOption()
868
865
  const { unitPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
869
866
  const compensation = (count * unitPx) / dpr
870
- const container = this.deps.getDom().container
871
- if (container) {
872
- container.scrollLeft += compensation
873
- this.deps.setCachedScrollLeft(container.scrollLeft)
874
- }
867
+ const nextScrollLeft = this.deps.getCachedScrollLeft() + compensation
868
+ this.deps.setScrollLeft(nextScrollLeft)
875
869
  }
876
870
 
877
871
  buf.setSymbol(spec)
@@ -893,23 +887,29 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
893
887
  const viewWidth = this.deps.getViewport()?.plotWidth ?? 0
894
888
  const dpr = this.deps.getEffectiveDpr()
895
889
  const { startXPx, unitPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
896
- const dataPlotWidth = (startXPx + (dataLength + ChartDataManager.TRAILING_DRAWING_SLOTS) * unitPx) / dpr
890
+ const dataPlotWidth = (startXPx + (dataLength + ChartDataManager.TRAILING_SLOTS) * unitPx) / dpr
897
891
  return this.getLeftLoadBufferWidth() + Math.max(dataPlotWidth, viewWidth)
898
892
  }
899
893
 
900
894
  scrollToRight(): void {
901
895
  const buf = this.getActiveDataBuffer()
902
896
  const dataLength = buf ? buf.getRawData().length : 0
903
- const container = this.deps.getDom().container
904
- if (!container || dataLength === 0) return
897
+ if (dataLength === 0) return
905
898
  const dpr = this.deps.getEffectiveDpr()
906
899
  const opt = this.deps.getOption()
907
900
  const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
908
- const lastKLineEndPx = (startXPx + dataLength * unitPx) / dpr
909
- const target = this.getLeftLoadBufferWidth() + Math.max(0, lastKLineEndPx - container.clientWidth)
910
- const maxScroll = Math.max(0, container.scrollWidth - container.clientWidth)
911
- container.scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr
912
- this.deps.setCachedScrollLeft(container.scrollLeft)
901
+ const lastKLineEndPx = (startXPx + (dataLength + ChartDataManager.TRAILING_SLOTS) * unitPx) / dpr
902
+ const viewport = this.deps.getViewport()
903
+ const clientWidth = viewport?.viewWidth
904
+ ?? (this.deps.getObservedSize().width > 0 ? this.deps.getObservedSize().width : undefined)
905
+ ?? Math.round(this.deps.getDom().container?.clientWidth ?? 0)
906
+ if (clientWidth <= 0) return
907
+ const target = this.getLeftLoadBufferWidth() + Math.max(0, lastKLineEndPx - clientWidth)
908
+ const contentWidth = this.getContentWidth()
909
+ const maxScroll = Math.max(0, contentWidth - clientWidth)
910
+ const scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr
911
+ this.deps.setScrollLeft(scrollLeft)
912
+ this.deps.scheduleDraw()
913
913
  }
914
914
 
915
915
  // ── Comparison price range ──
@@ -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
+ }
@@ -10,29 +10,76 @@ import type { PrimitiveRendererSet } from './index'
10
10
  import type { KLineData } from '../../types/price'
11
11
  import { getPhysicalKLineConfig } from '../utils/klineConfig'
12
12
 
13
+ type SafeViewport = { scrollLeft: number; plotWidth: number; plotHeight: number }
14
+ type ToScreenFn = (anchor: { index: number; price: number }) => { x: number; y: number }
15
+
16
+ function resolveViewport(context: RenderContext, paneHeight: number): SafeViewport {
17
+ return context.viewport ?? {
18
+ scrollLeft: context.scrollLeft,
19
+ plotWidth: context.paneWidth,
20
+ plotHeight: paneHeight,
21
+ }
22
+ }
23
+
24
+ function createToScreen(
25
+ kWidth: number, kGap: number, dpr: number,
26
+ pane: RenderContext['pane'], viewport: SafeViewport
27
+ ): ToScreenFn {
28
+ const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, dpr)
29
+ return (anchor) => {
30
+ if (!Number.isFinite(anchor.index) || anchor.index < 0) {
31
+ return { x: -kWidth, y: pane.yAxis.priceToY(anchor.price) }
32
+ }
33
+ const x = (startXPx + anchor.index * unitPx + (unitPx - 1) / 2) / dpr - viewport.scrollLeft
34
+ return { x, y: pane.yAxis.priceToY(anchor.price) }
35
+ }
36
+ }
37
+
38
+ function renderPrimitives(
39
+ ctx: CanvasRenderingContext2D,
40
+ primitives: DrawingPrimitive[],
41
+ renderers: PrimitiveRendererSet,
42
+ viewportClip: { left: number; top: number; right: number; bottom: number },
43
+ dpr: number
44
+ ): void {
45
+ for (const primitive of primitives) {
46
+ if (primitive.kind === 'point') {
47
+ renderers.point(ctx, primitive, dpr)
48
+ continue
49
+ }
50
+ if (primitive.kind === 'line') {
51
+ renderers.line(ctx, primitive, viewportClip, dpr)
52
+ continue
53
+ }
54
+ if (primitive.kind === 'area') {
55
+ renderers.area(ctx, primitive, dpr)
56
+ continue
57
+ }
58
+ renderers.text(ctx, primitive, dpr)
59
+ }
60
+ }
61
+
13
62
  /**
14
- * 为选中的绘图推送锚点轴标签
15
- * 提取为独立函数供主插件和 overlay 插件共用
63
+ * 查找当前选中且在指定 pane 内的绘图
16
64
  */
17
- function pushSelectedDrawingLabels(
65
+ function findSelectedAnchorDrawing(
18
66
  store: DrawingStore,
19
67
  definitions: DrawingDefinitionRegistry,
20
- context: RenderContext,
21
68
  pane: RenderContext['pane'],
22
69
  seriesData: KLineData[],
23
70
  range: RenderContext['range'],
71
+ context: RenderContext,
24
72
  kWidth: number,
25
73
  kGap: number,
26
74
  dpr: number,
27
- viewport: NonNullable<RenderContext['viewport']>,
28
- startXPx: number,
29
- unitPx: number
30
- ): void {
75
+ viewport: SafeViewport,
76
+ toScreen: ToScreenFn
77
+ ) {
31
78
  const selectedId = store.getSelectedId()
32
- if (!selectedId) return
79
+ if (!selectedId) return null
33
80
 
34
81
  const selectedDrawing = store.getAll().find(d => d.id === selectedId)
35
- if (!selectedDrawing || !selectedDrawing.visible || selectedDrawing.paneId !== pane.id) return
82
+ if (!selectedDrawing || !selectedDrawing.visible || selectedDrawing.paneId !== pane.id) return null
36
83
 
37
84
  const geometry = definitions.compute(selectedDrawing, {
38
85
  pane,
@@ -47,65 +94,88 @@ function pushSelectedDrawingLabels(
47
94
  dpr,
48
95
  paneWidth: context.paneWidth,
49
96
  viewport,
50
- toScreen(anchor) {
51
- if (!Number.isFinite(anchor.index) || anchor.index < 0) {
52
- return { x: -kWidth, y: pane.yAxis.priceToY(anchor.price) }
53
- }
54
- const x = (startXPx + anchor.index * unitPx + (unitPx - 1) / 2) / dpr - viewport.scrollLeft
55
- return { x, y: pane.yAxis.priceToY(anchor.price) }
56
- },
97
+ toScreen,
57
98
  })
99
+ if (!geometry) return null
58
100
 
59
- if (!geometry) return
101
+ const allAnchors = [...selectedDrawing.anchors, ...(geometry.computedAnchors ?? [])]
102
+ if (allAnchors.length === 0) return null
60
103
 
61
- // 只在价格 pane 时添加标签
62
- if (pane.role !== 'price') return
104
+ return { drawing: selectedDrawing, allAnchors }
105
+ }
63
106
 
64
- // 合并用户锚点和计算锚点
65
- const allAnchors = [...selectedDrawing.anchors, ...(geometry.computedAnchors ?? [])]
66
- if (allAnchors.length === 0) return
107
+ /**
108
+ * 单次遍历锚点,同时计算价格范围和索引范围,推送到 context
109
+ */
110
+ function pushAnchorBands(
111
+ allAnchors: ReadonlyArray<{ price: number; index: number }>,
112
+ context: RenderContext,
113
+ pane: RenderContext['pane'],
114
+ style: DrawingStyle | undefined,
115
+ startXPx: number,
116
+ unitPx: number,
117
+ dpr: number
118
+ ): void {
119
+ if (allAnchors.length < 2) return
67
120
 
68
- // 计算锚点价格范围,用于Y轴价格范围带
69
- if (allAnchors.length >= 2) {
70
- let minP = Infinity, maxP = -Infinity
71
- for (const a of allAnchors) {
72
- if (!Number.isFinite(a.price)) continue
121
+ let minP = Infinity, maxP = -Infinity
122
+ let minIdx = Infinity, maxIdx = -Infinity
123
+
124
+ for (const a of allAnchors) {
125
+ if (Number.isFinite(a.price)) {
73
126
  if (a.price < minP) minP = a.price
74
127
  if (a.price > maxP) maxP = a.price
75
128
  }
76
- if (Number.isFinite(minP) && Number.isFinite(maxP) && minP !== maxP) {
77
- if (!context.yAxisRanges) context.yAxisRanges = []
78
- context.yAxisRanges.push({
79
- topY: pane.yAxis.priceToY(maxP),
80
- bottomY: pane.yAxis.priceToY(minP),
81
- color: selectedDrawing.style?.stroke ?? '#2962ff',
82
- opacity: 0.15,
83
- })
84
- }
85
- }
86
-
87
- // 计算锚点X坐标范围,用于X轴时间范围带
88
- if (allAnchors.length >= 2) {
89
- let minIdx = Infinity, maxIdx = -Infinity
90
- for (const a of allAnchors) {
91
- if (!Number.isFinite(a.index) || a.index < 0) continue
129
+ if (Number.isFinite(a.index) && a.index >= 0) {
92
130
  if (a.index < minIdx) minIdx = a.index
93
131
  if (a.index > maxIdx) maxIdx = a.index
94
132
  }
95
- if (Number.isFinite(minIdx) && Number.isFinite(maxIdx) && minIdx !== maxIdx) {
96
- if (!context.xAxisRanges) context.xAxisRanges = []
97
- const leftX = (startXPx + minIdx * unitPx + (unitPx - 1) / 2) / dpr
98
- const rightX = (startXPx + maxIdx * unitPx + (unitPx - 1) / 2) / dpr
99
- context.xAxisRanges.push({
100
- leftX,
101
- rightX,
102
- color: selectedDrawing.style?.stroke ?? '#2962ff',
103
- opacity: 0.15,
104
- })
105
- }
106
133
  }
107
134
 
108
- // 辅助函数:根据index获取时间戳
135
+ const strokeColor = style?.stroke ?? '#2962ff'
136
+
137
+ if (Number.isFinite(minP) && Number.isFinite(maxP) && minP !== maxP) {
138
+ if (!context.yAxisRanges) context.yAxisRanges = []
139
+ context.yAxisRanges.push({
140
+ topY: pane.yAxis.priceToY(maxP),
141
+ bottomY: pane.yAxis.priceToY(minP),
142
+ color: strokeColor,
143
+ opacity: 0.15,
144
+ })
145
+ }
146
+
147
+ if (Number.isFinite(minIdx) && Number.isFinite(maxIdx) && minIdx !== maxIdx) {
148
+ if (!context.xAxisRanges) context.xAxisRanges = []
149
+ const leftX = (startXPx + minIdx * unitPx + (unitPx - 1) / 2) / dpr
150
+ const rightX = (startXPx + maxIdx * unitPx + (unitPx - 1) / 2) / dpr
151
+ context.xAxisRanges.push({
152
+ leftX,
153
+ rightX,
154
+ color: strokeColor,
155
+ opacity: 0.15,
156
+ })
157
+ }
158
+ }
159
+
160
+ /**
161
+ * 遍历锚点,推送 Y 轴和 X 轴标签
162
+ */
163
+ function pushAnchorLabels(
164
+ allAnchors: ReadonlyArray<{ index: number; price: number; time?: number | string }>,
165
+ context: RenderContext,
166
+ pane: RenderContext['pane'],
167
+ viewport: SafeViewport,
168
+ kWidth: number,
169
+ style: DrawingStyle | undefined,
170
+ seriesData: KLineData[],
171
+ startXPx: number,
172
+ unitPx: number,
173
+ dpr: number
174
+ ): void {
175
+ if (pane.role !== 'price') return
176
+
177
+ const strokeColor = style?.stroke ?? '#2962ff'
178
+
109
179
  const getTimestampForIndex = (idx: number): number | null => {
110
180
  if (idx >= 0 && idx < seriesData.length) {
111
181
  return seriesData[idx]?.timestamp ?? null
@@ -121,7 +191,6 @@ function pushSelectedDrawingLabels(
121
191
  return null
122
192
  }
123
193
 
124
- // 推送每个锚点的标签
125
194
  for (const anchor of allAnchors) {
126
195
  if (!Number.isFinite(anchor.index) || !Number.isFinite(anchor.price)) continue
127
196
 
@@ -133,7 +202,6 @@ function pushSelectedDrawingLabels(
133
202
  return { x, y: pane.yAxis.priceToY(anchor.price) }
134
203
  })()
135
204
 
136
- // Y轴标签
137
205
  if (screenPoint.y >= 0 && screenPoint.y <= pane.height) {
138
206
  if (!context.yAxisLabels) context.yAxisLabels = []
139
207
  context.yAxisLabels.push({
@@ -141,14 +209,13 @@ function pushSelectedDrawingLabels(
141
209
  price: anchor.price,
142
210
  y: screenPoint.y,
143
211
  style: {
144
- bgColor: selectedDrawing.style?.stroke ?? '#2962ff',
145
- borderColor: selectedDrawing.style?.stroke ?? '#2962ff',
212
+ bgColor: strokeColor,
213
+ borderColor: strokeColor,
146
214
  textColor: '#ffffff',
147
215
  }
148
216
  })
149
217
  }
150
218
 
151
- // X轴标签
152
219
  if (screenPoint.x >= -kWidth && screenPoint.x <= viewport.plotWidth + kWidth) {
153
220
  const timestamp = anchor.time
154
221
  ? (typeof anchor.time === 'string' ? new Date(anchor.time).getTime() : anchor.time)
@@ -161,7 +228,7 @@ function pushSelectedDrawingLabels(
161
228
  timestamp,
162
229
  x: screenPoint.x + viewport.scrollLeft,
163
230
  style: {
164
- bgColor: selectedDrawing.style?.stroke ?? '#2962ff',
231
+ bgColor: strokeColor,
165
232
  textColor: '#ffffff',
166
233
  }
167
234
  })
@@ -169,6 +236,32 @@ function pushSelectedDrawingLabels(
169
236
  }
170
237
  }
171
238
 
239
+ /**
240
+ * 为选中的绘图推送锚点轴标签
241
+ * 提取为独立函数供主插件和 overlay 插件共用
242
+ */
243
+ function pushSelectedDrawingLabels(
244
+ store: DrawingStore,
245
+ definitions: DrawingDefinitionRegistry,
246
+ context: RenderContext,
247
+ pane: RenderContext['pane'],
248
+ seriesData: KLineData[],
249
+ range: RenderContext['range'],
250
+ kWidth: number,
251
+ kGap: number,
252
+ dpr: number,
253
+ viewport: SafeViewport,
254
+ startXPx: number,
255
+ unitPx: number
256
+ ): void {
257
+ const toScreen = createToScreen(kWidth, kGap, dpr, pane, viewport)
258
+ const found = findSelectedAnchorDrawing(store, definitions, pane, seriesData, range, context, kWidth, kGap, dpr, viewport, toScreen)
259
+ if (!found) return
260
+
261
+ pushAnchorBands(found.allAnchors, context, pane, found.drawing.style, startXPx, unitPx, dpr)
262
+ pushAnchorLabels(found.allAnchors, context, pane, viewport, kWidth, found.drawing.style, seriesData, startXPx, unitPx, dpr)
263
+ }
264
+
172
265
  /**
173
266
  * 创建绘图渲染器插件(主层,负责绘制 shape)
174
267
  * 注意:此插件不再推送轴标签,标签由 createDrawingLabelOverlayPlugin 负责
@@ -193,11 +286,7 @@ export function createDrawingRendererPlugin(options: {
193
286
  priority: 55,
194
287
  draw(context: RenderContext) {
195
288
  const { ctx, pane, data, range, dpr, paneWidth, kLinePositions, kLineCenters, kBarRects, kWidth, kGap } = context
196
- const viewport = context.viewport ?? {
197
- scrollLeft: context.scrollLeft,
198
- plotWidth: paneWidth,
199
- plotHeight: pane.height,
200
- }
289
+ const viewport = resolveViewport(context, pane.height)
201
290
  const seriesData = data as KLineData[]
202
291
  const visibleData = seriesData.slice(range.start, range.end)
203
292
  const drawings = store.getVisibleByPane(pane.id)
@@ -209,6 +298,7 @@ export function createDrawingRendererPlugin(options: {
209
298
  right: viewport.plotWidth,
210
299
  bottom: pane.height,
211
300
  }
301
+ const toScreen = createToScreen(kWidth, kGap, dpr, pane, viewport)
212
302
 
213
303
  ctx.save()
214
304
  ctx.beginPath()
@@ -229,14 +319,7 @@ export function createDrawingRendererPlugin(options: {
229
319
  dpr,
230
320
  paneWidth,
231
321
  viewport,
232
- toScreen(anchor) {
233
- const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, dpr)
234
- if (!Number.isFinite(anchor.index) || anchor.index < 0) {
235
- return { x: -kWidth, y: pane.yAxis.priceToY(anchor.price) }
236
- }
237
- const x = (startXPx + anchor.index * unitPx + (unitPx - 1) / 2) / dpr - viewport.scrollLeft
238
- return { x, y: pane.yAxis.priceToY(anchor.price) }
239
- },
322
+ toScreen,
240
323
  })
241
324
  if (!geometry) continue
242
325
 
@@ -245,22 +328,7 @@ export function createDrawingRendererPlugin(options: {
245
328
  ? geometry.primitives.map((p) => applySelectedStyle(p, drawing.style))
246
329
  : geometry.primitives
247
330
 
248
- // 绘制形状(不再推送轴标签,标签由 overlay 插件负责)
249
- for (const primitive of primitives) {
250
- if (primitive.kind === 'point') {
251
- renderers.point(ctx, primitive, dpr)
252
- continue
253
- }
254
- if (primitive.kind === 'line') {
255
- renderers.line(ctx, primitive, viewportClip, dpr)
256
- continue
257
- }
258
- if (primitive.kind === 'area') {
259
- renderers.area(ctx, primitive, dpr)
260
- continue
261
- }
262
- renderers.text(ctx, primitive, dpr)
263
- }
331
+ renderPrimitives(ctx, primitives, renderers, viewportClip, dpr)
264
332
  }
265
333
 
266
334
  ctx.restore()
@@ -297,15 +365,10 @@ export function createDrawingLabelOverlayPlugin(options: {
297
365
  priority: -24, // 比主绘图层稍晚,确保在其他 overlay 插件之后
298
366
  draw(context: RenderContext) {
299
367
  const { pane, data, range, dpr, paneWidth, kWidth, kGap } = context
300
- const viewport = context.viewport ?? {
301
- scrollLeft: context.scrollLeft,
302
- plotWidth: paneWidth,
303
- plotHeight: pane.height,
304
- }
368
+ const viewport = resolveViewport(context, pane.height)
305
369
  const seriesData = data as KLineData[]
306
370
  const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, dpr)
307
371
 
308
- // 推送选中绘图的锚点标签
309
372
  pushSelectedDrawingLabels(
310
373
  store,
311
374
  definitions,
@@ -6,16 +6,24 @@ import {
6
6
  calcENEData,
7
7
  calcRSIData,
8
8
  DEFAULT_MA_PERIODS,
9
+ } from '../calculators'
10
+ import {
9
11
  DEFAULT_BOLL_PERIOD,
10
12
  DEFAULT_BOLL_MULTIPLIER,
13
+ } from '../state/bollState'
14
+ import {
11
15
  DEFAULT_EXPMA_FAST_PERIOD,
12
16
  DEFAULT_EXPMA_SLOW_PERIOD,
17
+ } from '../state/expmaState'
18
+ import {
13
19
  DEFAULT_ENE_PERIOD,
14
20
  DEFAULT_ENE_DEVIATION,
21
+ } from '../state/eneState'
22
+ import {
15
23
  DEFAULT_RSI_PERIOD1,
16
24
  DEFAULT_RSI_PERIOD2,
17
25
  DEFAULT_RSI_PERIOD3,
18
- } from '../calculators'
26
+ } from '../state/rsiState'
19
27
  import type { KLineData } from '@/types/price'
20
28
 
21
29
  /**