@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
@@ -4,7 +4,7 @@ import type { KLineData } from '../../types/price'
4
4
  import { createHorizontalLineRect, createVerticalLineRect } from '../draw/pixelAlign'
5
5
  import { findMonthBoundaries } from '../../utils/dateFormat'
6
6
  import { resolveThemeColors } from '../../tokens'
7
- import { calculateTickPositions, calculateValueTickPositions, type ScaleType } from '../utils/tickPosition'
7
+
8
8
 
9
9
  /**
10
10
  * 创建网格线渲染器插件
@@ -34,44 +34,15 @@ export function createGridLinesRendererPlugin(): RendererPlugin {
34
34
  const plotWidth = ctx.canvas.width / dpr
35
35
  const startX = scrollLeft
36
36
  const endX = scrollLeft + plotWidth
37
- const pt = pane.yAxis.getPaddingTop()
38
- const pb = pane.yAxis.getPaddingBottom()
39
-
40
- // 水平网格线:与 Y 轴刻度对齐
41
- const scaleType = pane.yAxis.getScaleType()
42
- let yPositions: number[]
43
-
44
- if ((scaleType === 'log' || scaleType === 'percent') && pane.role === 'price') {
45
- const displayRange = pane.yAxis.getDisplayRange(pane.priceRange)
46
- const valueMin = scaleType === 'percent' ? pane.yAxis.getDisplayPercentRange().minPct : displayRange.minPrice
47
- const valueMax = scaleType === 'percent' ? pane.yAxis.getDisplayPercentRange().maxPct : displayRange.maxPrice
48
- const tickValues = calculateValueTickPositions({
49
- height: pane.height,
50
- paddingTop: pt,
51
- paddingBottom: pb,
52
- isMain: true,
53
- valueMin,
54
- valueMax,
55
- scaleType,
56
- })
57
- yPositions = tickValues.map(t => t.y)
58
- } else {
59
- // 线性模式:均匀分布
60
- const tickPositions = calculateTickPositions({
61
- height: pane.height,
62
- paddingTop: pt,
63
- paddingBottom: pb,
64
- isMain: pane.role === 'price',
65
- })
66
- yPositions = tickPositions.map(t => t.y)
67
- }
68
-
69
- for (const y of yPositions) {
70
- const h = createHorizontalLineRect(startX, endX, y, dpr)
71
- if (h) ctx.fillRect(h.x, h.y, h.width, h.height)
37
+ // 水平网格线:从预计算的 yAxisTicks 取 Y 位置,确保与轴刻度对齐
38
+ if (context.yAxisTicks) {
39
+ for (const tick of context.yAxisTicks) {
40
+ const h = createHorizontalLineRect(startX, endX, tick.y, dpr)
41
+ if (h) ctx.fillRect(h.x, h.y, h.width, h.height)
42
+ }
72
43
  }
73
44
 
74
- const boundaries = findMonthBoundaries(klineData)
45
+ const boundaries = findMonthBoundaries(klineData, context.monthKeys)
75
46
 
76
47
  for (const idx of boundaries) {
77
48
  if (idx < range.start || idx >= range.end || idx >= klineData.length) continue
@@ -1,9 +1,10 @@
1
1
  import type { RendererPlugin, RenderContext } from '../../plugin'
2
2
  import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
- import { drawScaleTicks } from '../renderers/Indicator/scale/indicator_scale'
4
3
  import { drawCrosshairPriceLabel } from '../../utils/kLineDraw/axis'
5
4
  import { resolveThemeColors } from '../../tokens'
6
- import type { ScaleType } from '../utils/tickPosition'
5
+ import { getFont, setCanvasFont } from '../theme/fonts'
6
+ import { roundToPhysicalPixel } from '../draw/pixelAlign'
7
+ import { priceAtYForScaleType, type ScaleType } from '../utils/tickPosition'
7
8
 
8
9
  export function createLeftYAxisRendererPlugin(options: {
9
10
  axisWidth: number
@@ -32,45 +33,83 @@ export function createLeftYAxisRendererPlugin(options: {
32
33
  }
33
34
 
34
35
  const tokenColors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
35
- const displayRange = pane.yAxis.getDisplayRange()
36
- const { minPrice, maxPrice } = displayRange
37
36
 
38
37
  if (!pane.capabilities.showPriceAxisTicks) return
39
38
 
40
39
  const scaleType: ScaleType = period === 'timeshare' ? 'linear' : ((context.settings?.leftAxisType as ScaleType) ?? 'linear')
40
+ const paneScaleType = pane.yAxis.getScaleType()
41
41
 
42
- drawScaleTicks({
43
- tickColor: tokenColors.text.secondary,
44
- ctx: leftAxisCtx,
45
- dpr,
46
- axisWidth,
47
- height: pane.height,
48
- paddingTop: pane.yAxis.getPaddingTop(),
49
- paddingBottom: pane.yAxis.getPaddingBottom(),
50
- valueMin: minPrice,
51
- valueMax: maxPrice,
52
- isMain: true,
53
- decimals: 2,
54
- hideEdgeTicks: false,
55
- scaleType,
56
- textAlign: 'center',
57
- })
42
+ if (!context.yAxisTicks) return
43
+
44
+ leftAxisCtx.clearRect(0, 0, axisWidth, pane.height)
45
+
46
+ const font = getFont(12)
47
+ setCanvasFont(leftAxisCtx, font)
48
+ leftAxisCtx.textBaseline = 'middle'
49
+ leftAxisCtx.textAlign = 'center'
50
+ leftAxisCtx.fillStyle = tokenColors.text.secondary
51
+
52
+ const textX = roundToPhysicalPixel(axisWidth / 2, dpr)
53
+
54
+ const needsOwnValues = scaleType !== paneScaleType
55
+ const crosshairPriceRange = pane.yAxis.getDisplayRange()
56
+
57
+ const formatTick = scaleType === 'percent'
58
+ ? (v: number) => {
59
+ const sign = v >= 0 ? '+' : ''
60
+ return sign + v.toFixed(2) + '%'
61
+ }
62
+ : (v: number) => v.toFixed(2)
63
+
64
+ for (const tick of context.yAxisTicks) {
65
+ let displayValue: number
66
+ if (needsOwnValues) {
67
+ if (scaleType === 'percent') {
68
+ displayValue = pane.yAxis.toPercent(tick.value)
69
+ } else {
70
+ const { minPrice, maxPrice } = crosshairPriceRange
71
+ displayValue = priceAtYForScaleType(
72
+ tick.y, minPrice, maxPrice, scaleType,
73
+ pane.height, pane.yAxis.getPaddingTop(), pane.yAxis.getPaddingBottom(),
74
+ )
75
+ }
76
+ } else {
77
+ displayValue = tick.value
78
+ }
79
+ leftAxisCtx.fillText(formatTick(displayValue), textX, tick.y)
80
+ }
58
81
 
59
82
  const crosshair = options.getCrosshair?.()
60
83
  if (!crosshair || crosshair.activePaneId !== pane.id || crosshair.price === null) return
61
84
 
85
+ const isCrosshairPercent = scaleType === 'percent'
86
+ const crosshairPrice = isCrosshairPercent ? pane.yAxis.toPercent(crosshair.price) : crosshair.price
87
+ const crosshairLabelRange: { minPrice: number; maxPrice: number } = isCrosshairPercent
88
+ ? (() => {
89
+ const p = pane.yAxis.getDisplayPercentRange()
90
+ return { minPrice: p.minPct, maxPrice: p.maxPct }
91
+ })()
92
+ : crosshairPriceRange
93
+ const formatCrosshairPrice = isCrosshairPercent
94
+ ? (v: number) => {
95
+ const sign = v >= 0 ? '+' : ''
96
+ return sign + v.toFixed(2) + '%'
97
+ }
98
+ : undefined
99
+
62
100
  drawCrosshairPriceLabel(leftAxisCtx, {
63
101
  x: 0,
64
102
  y: pane.top,
65
103
  width: axisWidth,
66
104
  height: pane.height,
67
105
  crosshairY: crosshair.y,
68
- priceRange: displayRange,
106
+ priceRange: crosshairLabelRange,
69
107
  yPaddingPx: options.yPaddingPx,
70
108
  dpr,
71
109
  fontSize: 12,
72
110
  priceOffset: 0,
73
- price: crosshair.price,
111
+ price: crosshairPrice,
112
+ formatPrice: formatCrosshairPrice,
74
113
  }, context.theme, context.isAsiaMarket, context.colorPresetSettings)
75
114
  },
76
115
  }
@@ -59,6 +59,8 @@ export function createTimeAxisRendererPlugin(options: {
59
59
  drawTopBorder: false,
60
60
  drawBottomBorder: false,
61
61
  period: context.period,
62
+ monthKeys: context.monthKeys,
63
+ dayKeys: context.dayKeys,
62
64
  }, context.theme, context.isAsiaMarket, context.colorPresetSettings)
63
65
 
64
66
  // 绘制来自 xAxisRanges 的时间范围带(先于标签绘制)
@@ -51,7 +51,7 @@ export function createTimeShareRendererPlugin(): RendererPluginWithHost {
51
51
  xPositions.push(x)
52
52
  yPrices.push(pane.yAxis.priceToY(item.price))
53
53
  yAvgs.push(pane.yAxis.priceToY(item.average))
54
- volumes.push(item.volume)
54
+ volumes.push(item.volume ?? 0)
55
55
  maxVolume = Math.max(maxVolume, item.volume)
56
56
  }
57
57
 
@@ -86,8 +86,8 @@ function drawPreCloseLine(
86
86
  color: string,
87
87
  ): void {
88
88
  if (xPositions.length < 2) return
89
- const firstX = xPositions[0]
90
- const lastX = xPositions[xPositions.length - 1]
89
+ const firstX = xPositions[0]!
90
+ const lastX = xPositions[xPositions.length - 1]!
91
91
 
92
92
  ctx.save()
93
93
  ctx.strokeStyle = color
@@ -198,10 +198,10 @@ function drawSegmentLine(
198
198
  ctx.lineCap = 'round'
199
199
 
200
200
  ctx.beginPath()
201
- ctx.moveTo(xPositions[0], yPositions[0])
201
+ ctx.moveTo(xPositions[0]!, yPositions[0]!)
202
202
 
203
203
  for (let i = 1; i < xPositions.length; i++) {
204
- ctx.lineTo(xPositions[i], yPositions[i])
204
+ ctx.lineTo(xPositions[i]!, yPositions[i]!)
205
205
  }
206
206
 
207
207
  ctx.stroke()
@@ -228,7 +228,7 @@ function drawVolumeBars(
228
228
  const snappedBottom = Math.round(paneHeight * dpr) / dpr
229
229
 
230
230
  for (let i = 0; i < barRects.length; i++) {
231
- const volume = volumes[i]
231
+ const volume = volumes[i]!
232
232
  if (volume <= 0) continue
233
233
 
234
234
  const barHeight = (volume / maxVolume) * volumeAreaHeight
@@ -239,14 +239,14 @@ function drawVolumeBars(
239
239
 
240
240
  let barColor: string
241
241
  if (i > 0) {
242
- const price = data[idx].price
243
- const prevPrice = data[idx - 1].price
242
+ const price = data[idx]!.price
243
+ const prevPrice = data[idx - 1]!.price
244
244
  if (price > prevPrice) barColor = upColor
245
245
  else if (price < prevPrice) barColor = downColor
246
246
  else barColor = neutralColor
247
247
  } else {
248
- if (data[idx].price > preClose) barColor = upColor
249
- else if (data[idx].price < preClose) barColor = downColor
248
+ if (data[idx]!.price > preClose) barColor = upColor
249
+ else if (data[idx]!.price < preClose) barColor = downColor
250
250
  else barColor = neutralColor
251
251
  }
252
252
 
@@ -1,11 +1,11 @@
1
1
  import type { RendererPlugin, RenderContext } from '../../plugin'
2
2
  import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
3
  import { drawCrosshairPriceLabel, drawAxisPriceLabel } from '../../utils/kLineDraw/axis'
4
- import { drawScaleTicks } from '../renderers/Indicator/scale/indicator_scale'
5
4
  import { resolveThemeColors } from '../../tokens'
5
+ import { getFont, setCanvasFont } from '../theme/fonts'
6
+ import { roundToPhysicalPixel } from '../draw/pixelAlign'
6
7
 
7
8
  import type { KLineData } from '../../types/price'
8
- import type { ScaleType } from '../utils/tickPosition'
9
9
 
10
10
  /**
11
11
  * 创建 Y 轴渲染器插件
@@ -42,32 +42,28 @@ export function createYAxisRendererPlugin(options: {
42
42
 
43
43
  const isPercent = scaleType === 'percent' && pane.role === 'price'
44
44
 
45
- if (pane.capabilities.showPriceAxisTicks) {
46
- const tickValueMin = isPercent ? pane.yAxis.getDisplayPercentRange().minPct : displayRange.minPrice
47
- const tickValueMax = isPercent ? pane.yAxis.getDisplayPercentRange().maxPct : displayRange.maxPrice
48
- const formatLabel = isPercent
45
+ if (pane.capabilities.showPriceAxisTicks && context.yAxisTicks) {
46
+ targetCtx.clearRect(0, 0, axisWidth, pane.height)
47
+
48
+ const font = getFont(12)
49
+ setCanvasFont(targetCtx, font)
50
+ targetCtx.textBaseline = 'middle'
51
+ targetCtx.textAlign = 'center'
52
+ targetCtx.fillStyle = tokenColors.text.secondary
53
+
54
+ const format = isPercent
49
55
  ? (v: number) => {
50
56
  const sign = v >= 0 ? '+' : ''
51
57
  return sign + v.toFixed(2) + '%'
52
58
  }
53
- : undefined
59
+ : (v: number) => v.toFixed(2)
54
60
 
55
- drawScaleTicks({
56
- tickColor: tokenColors.text.secondary,
57
- ctx: targetCtx,
58
- dpr,
59
- axisWidth,
60
- height: pane.height,
61
- paddingTop: pane.yAxis.getPaddingTop(),
62
- paddingBottom: pane.yAxis.getPaddingBottom(),
63
- valueMin: tickValueMin,
64
- valueMax: tickValueMax,
65
- isMain: true,
66
- decimals: 2,
67
- hideEdgeTicks: false,
68
- scaleType: isPercent ? 'percent' : scaleType,
69
- formatLabel,
70
- })
61
+ const textX = roundToPhysicalPixel(axisWidth / 2, dpr)
62
+
63
+ for (const tick of context.yAxisTicks) {
64
+ const displayValue = isPercent ? pane.yAxis.toPercent(tick.value) : tick.value
65
+ targetCtx.fillText(format(displayValue), textX, tick.y)
66
+ }
71
67
  }
72
68
 
73
69
  // 绘制价格范围带(先于标签,使标签覆盖在范围带之上)
@@ -206,6 +206,40 @@ function generatePixelUniformPercentTicks(options: {
206
206
  return positions
207
207
  }
208
208
 
209
+ /**
210
+ * 计算均匀像素 Y 位置的值(统一像素反算)
211
+ * 所有刻度类型都先确定像素均匀 Y 位置,再通过 yToPrice 反算该位置的值
212
+ */
213
+ export interface UniformPixelTick {
214
+ y: number
215
+ value: number
216
+ }
217
+
218
+ /**
219
+ * 在给定 Y 像素位置,按指定刻度类型反算价格/值
220
+ */
221
+ export function priceAtYForScaleType(
222
+ y: number,
223
+ valueMin: number,
224
+ valueMax: number,
225
+ scaleType: ScaleType,
226
+ height: number,
227
+ paddingTop: number,
228
+ paddingBottom: number,
229
+ ): number {
230
+ const viewH = Math.max(1, height - paddingTop - paddingBottom)
231
+ const ratio = 1 - (y - paddingTop) / viewH
232
+
233
+ if (scaleType === 'log') {
234
+ if (valueMin <= 0 || valueMax <= 0) return valueMin + ratio * (valueMax - valueMin)
235
+ const logMin = Math.log(valueMin)
236
+ const logMax = Math.log(valueMax)
237
+ return Math.exp(logMin + ratio * (logMax - logMin))
238
+ }
239
+
240
+ return valueMin + ratio * (valueMax - valueMin)
241
+ }
242
+
209
243
  // calculateValueTickPositions 缓存
210
244
  let _cvtpCacheKey = ''
211
245
  let _cvtpCacheResult: TickPositionWithValue[] = []
@@ -95,16 +95,6 @@ export class ChartViewportManager {
95
95
  this._pendingScrollLeft = v
96
96
  }
97
97
 
98
- /** 仅设置缓存 scrollLeft(由 DataManager 内部使用) */
99
- setCachedScrollLeft(v: number): void {
100
- this.cachedScrollLeft = v
101
- }
102
-
103
- /** 仅设置待写入 scrollLeft(由 DataManager 内部使用) */
104
- setPendingScrollLeft(v: number): void {
105
- this._pendingScrollLeft = v
106
- }
107
-
108
98
  /** 在 RAF 回调中应用待写入的 scrollLeft */
109
99
  applyPendingScrollLeft(container: HTMLElement): void {
110
100
  if (this._pendingScrollLeft !== null) {
@@ -175,38 +165,76 @@ export class ChartViewportManager {
175
165
  }
176
166
 
177
167
  /**
178
- * 计算视口
168
+ * 计算视口(coordinator)
169
+ *
170
+ * 协调 4 个步骤:尺寸解析 → DPR 计算 → DOM 同步 → 状态推送。
171
+ * 每一子步骤均可独立测试。
179
172
  */
180
173
  computeViewport(): Viewport | null {
174
+ const dims = this.resolveViewportDimensions()
175
+ if (!dims) return null
176
+ const { viewWidth, viewHeight, plotWidth, plotHeight } = dims
177
+
178
+ const dpr = this.clampDpr(viewWidth, viewHeight)
179
+ const scrollLeft = Math.round(this.getLogicalScrollLeft() * dpr) / dpr
180
+
181
+ this.syncCanvasDom(dpr, viewWidth, viewHeight)
182
+ this.deps.resizeSharedWebGLSurface(plotWidth, plotHeight, dpr)
183
+
184
+ const vp: Viewport = { viewWidth, viewHeight, plotWidth, plotHeight, scrollLeft, dpr }
185
+ this.applyViewportState(vp)
186
+ return vp
187
+ }
188
+
189
+ /**
190
+ * 解析容器尺寸
191
+ *
192
+ * 优先使用 ResizeObserver 上报的 observedSize,
193
+ * fallback 到 DOM clientWidth/clientHeight。
194
+ * plotHeight 为 viewHeight 扣除底部轴高度。
195
+ */
196
+ private resolveViewportDimensions(): { viewWidth: number; viewHeight: number; plotWidth: number; plotHeight: number } | null {
181
197
  const container = this.deps.getDom().container
182
198
  if (!container) return null
183
199
 
184
- const observedWidth = this.observedSize.width
185
- const observedHeight = this.observedSize.height
186
- const viewWidth = observedWidth > 0
187
- ? observedWidth
200
+ const viewWidth = this.observedSize.width > 0
201
+ ? this.observedSize.width
188
202
  : Math.max(1, Math.round(container.clientWidth))
189
- const viewHeight = observedHeight > 0
190
- ? observedHeight
203
+ const viewHeight = this.observedSize.height > 0
204
+ ? this.observedSize.height
191
205
  : Math.max(1, Math.round(container.clientHeight))
192
-
193
206
  const plotWidth = Math.round(viewWidth)
194
207
  const plotHeight = Math.round(viewHeight - this.deps.getBottomAxisHeight())
195
208
 
196
- let dpr = this.getEffectiveDpr()
209
+ return { viewWidth, viewHeight, plotWidth, plotHeight }
210
+ }
197
211
 
212
+ /**
213
+ * DPR 计算与封顶
214
+ *
215
+ * 取 effectiveDpr,若总像素超 MAX_CANVAS_PIXELS(16M)则降级 dpr
216
+ * 以避免浏览器 canvas 创建失败。
217
+ */
218
+ private clampDpr(viewWidth: number, viewHeight: number): number {
198
219
  const MAX_CANVAS_PIXELS = 16 * 1024 * 1024
199
- const requestedPixels = viewWidth * dpr * (viewHeight * dpr)
200
- if (requestedPixels > MAX_CANVAS_PIXELS) {
220
+ let dpr = this.getEffectiveDpr()
221
+ if (viewWidth * dpr * (viewHeight * dpr) > MAX_CANVAS_PIXELS) {
201
222
  dpr = Math.sqrt(MAX_CANVAS_PIXELS / (viewWidth * viewHeight))
202
223
  }
224
+ return dpr
225
+ }
203
226
 
204
- // 对齐 scrollLeft,消除 translate 亚像素偏移
205
- const scrollLeft = Math.round(this.getLogicalScrollLeft() * dpr) / dpr
206
-
227
+ /**
228
+ * 同步 DOM canvas 尺寸
229
+ *
230
+ * 更新 canvasLayer 和 xAxisCanvas 的 width/height 属性与 CSS 尺寸,
231
+ * 确保物理像素与逻辑像素一致,消除亚像素偏移。
232
+ * 仅在实际值变化时写入,避免无意义回流。
233
+ */
234
+ private syncCanvasDom(dpr: number, viewWidth: number, viewHeight: number): void {
207
235
  const dom = this.deps.getDom()
208
-
209
236
  const dprRoundedViewWidth = Math.round(viewWidth * dpr) / dpr
237
+
210
238
  const canvasLayerWidth = `${dprRoundedViewWidth}px`
211
239
  if (dom.canvasLayer.style.width !== canvasLayerWidth) {
212
240
  dom.canvasLayer.style.width = canvasLayerWidth
@@ -236,17 +264,15 @@ export class ChartViewportManager {
236
264
  if (dom.xAxisCanvas.style.height !== xAxisCssHeight) {
237
265
  dom.xAxisCanvas.style.height = xAxisCssHeight
238
266
  }
267
+ }
239
268
 
240
- this.deps.resizeSharedWebGLSurface(plotWidth, plotHeight, dpr)
241
-
242
- const vp: Viewport = {
243
- viewWidth,
244
- viewHeight,
245
- plotWidth,
246
- plotHeight,
247
- scrollLeft,
248
- dpr,
249
- }
269
+ /**
270
+ * 应用视口状态
271
+ *
272
+ * 缓存 Viewport 对象并检测字段是否变化,
273
+ * 有变化时才写入 _viewportSignal 避免触发无关重绘。
274
+ */
275
+ private applyViewportState(vp: Viewport): void {
250
276
  const prevViewport = this._internalViewport
251
277
  const viewportChanged = !prevViewport
252
278
  || prevViewport.viewWidth !== vp.viewWidth
@@ -270,7 +296,6 @@ export class ChartViewportManager {
270
296
  kGap: current.kGap,
271
297
  })
272
298
  }
273
- return vp
274
299
  }
275
300
 
276
301
  /**
@@ -298,6 +323,11 @@ export class ChartViewportManager {
298
323
  this.observedSize.width = cssWidth
299
324
  this.observedSize.height = cssHeight
300
325
 
326
+ if (this.cachedScrollLeft === 0 && cssWidth > 0) {
327
+ this.cachedScrollLeft = cssWidth
328
+ this._pendingScrollLeft = cssWidth
329
+ }
330
+
301
331
  const pixelSize = entry.devicePixelContentBoxSize?.[0]
302
332
  const cssSize = entry.contentBoxSize?.[0]
303
333
  if (!pixelSize || !cssSize || cssSize.inlineSize <= 0) {
@@ -208,7 +208,7 @@ export class ChartBridge {
208
208
 
209
209
  this.reconnectTimer = setTimeout(() => {
210
210
  if (!this.destroyed) {
211
- this.connect()
211
+ this.connect().catch(() => {})
212
212
  }
213
213
  }, delay)
214
214
  }
@@ -262,6 +262,14 @@ export interface XAxisRange {
262
262
  opacity: number
263
263
  }
264
264
 
265
+ /** Y轴刻度(位置+值),由 RenderContext 构建时预计算,所有 Y 轴渲染器共用 */
266
+ export interface YAxisTick {
267
+ /** Y像素位置(相对 pane 顶部,逻辑像素) */
268
+ y: number
269
+ /** 该Y位置通过 pane.yAxis.yToPrice 反算的价格值 */
270
+ value: number
271
+ }
272
+
265
273
  /** 渲染上下文 */
266
274
  /** MarkerManager 接口(用于 RenderContext) */
267
275
  export interface MarkerManagerLike {
@@ -328,6 +336,12 @@ export interface RenderContext {
328
336
  isAsiaMarket?: boolean
329
337
  /** 用户颜色预设覆盖项 */
330
338
  colorPresetSettings?: import('../tokens').ColorPresetSettings
339
+ /** 预计算的 Y 轴刻度列表(统一像素均匀分布 → yToPrice 反算),所有 Y 轴渲染器共用 */
340
+ yAxisTicks?: YAxisTick[]
341
+ /** 预计算的月份键值数组(year*12+month),与 data 长度一致,由 DataBuffer 在数据加载时计算 */
342
+ monthKeys?: Int32Array
343
+ /** 预计算的日期键值数组(year*366+dayOfYear),与 data 长度一致,由 DataBuffer 在数据加载时计算 */
344
+ dayKeys?: Int32Array
331
345
  }
332
346
 
333
347
  export type DrawingAnchor = {