@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 { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
- import type { VolumeProfileRenderState } from '../../indicators/volumeProfileState'
4
- import { createVolumeProfileStateKey, EMPTY_VOLUME_PROFILE_STATE } from '../../indicators/volumeProfileState'
3
+ import type { VolumeProfileRenderState } from '../../indicators/state/volumeProfileState'
4
+ import { createVolumeProfileStateKey, EMPTY_VOLUME_PROFILE_STATE } from '../../indicators/state/volumeProfileState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
6
  import { createVolumeProfileVisibleStateComposer } from '../../indicators/visibleStateComposers'
7
7
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
@@ -110,7 +110,7 @@ function createVolumeProfileRendererPlugin(options: { paneId?: string } = {}): R
110
110
  const state = pluginHost?.getSharedState<VolumeProfileRenderState>(stateKey)
111
111
  return state?.params ?? {}
112
112
  },
113
- setConfig() {},
113
+ setConfig() { },
114
114
  }
115
115
  }
116
116
 
@@ -119,33 +119,33 @@ const VP_VAH_COLOR = '#6366f1'
119
119
  const VP_VAL_COLOR = '#818cf8'
120
120
 
121
121
  function getVolumeProfileTitleInfo(
122
- _data: KLineData[],
123
- index: number | null,
124
- params: Record<string, number | boolean | string>,
125
- host: PluginHost,
126
- paneId: string,
122
+ _data: KLineData[],
123
+ index: number | null,
124
+ params: Record<string, number | boolean | string>,
125
+ host: PluginHost,
126
+ paneId: string,
127
127
  ): TitleInfo | null {
128
- if (index === null) return null
129
- const bins = (params.bins as number) ?? 24
130
- const state = host.getSharedState<VolumeProfileRenderState>(createVolumeProfileStateKey(paneId))
131
- const vp = state?.series
132
-
133
- const values: Array<{ label: string; value: number; color: string }> = []
134
- if (vp && vp.bins.length > 0) {
135
- if (state.params.showPOC) {
136
- values.push({ label: 'POC', value: vp.poc, color: VP_POC_COLOR })
128
+ if (index === null) return null
129
+ const bins = (params.bins as number) ?? 24
130
+ const state = host.getSharedState<VolumeProfileRenderState>(createVolumeProfileStateKey(paneId))
131
+ const vp = state?.series
132
+
133
+ const values: Array<{ label: string; value: number; color: string }> = []
134
+ if (vp && vp.bins.length > 0) {
135
+ if (state.params.showPOC) {
136
+ values.push({ label: 'POC', value: vp.poc, color: VP_POC_COLOR })
137
+ }
138
+ if (state.params.showValueArea) {
139
+ values.push({ label: 'VAH', value: vp.vah, color: VP_VAH_COLOR })
140
+ values.push({ label: 'VAL', value: vp.val, color: VP_VAL_COLOR })
141
+ }
137
142
  }
138
- if (state.params.showValueArea) {
139
- values.push({ label: 'VAH', value: vp.vah, color: VP_VAH_COLOR })
140
- values.push({ label: 'VAL', value: vp.val, color: VP_VAL_COLOR })
141
- }
142
- }
143
143
 
144
- return {
145
- name: 'VP',
146
- params: [bins],
147
- values,
148
- }
144
+ return {
145
+ name: 'VP',
146
+ params: [bins],
147
+ values,
148
+ }
149
149
  }
150
150
 
151
151
  @Indicator({
@@ -156,7 +156,7 @@ function getVolumeProfileTitleInfo(
156
156
  scale: { indicatorKey: 'volumeProfile', label: 'VP', decimals: 0 },
157
157
  getTitleInfo: getVolumeProfileTitleInfo,
158
158
  visibleState: { compose: createVolumeProfileVisibleStateComposer('volumeProfile', EMPTY_VOLUME_PROFILE_STATE) },
159
- runtime: { defaultConfig:{bins:24,lookback:100,valueAreaPercent:70,showPOC:true,showValueArea:true}, computeKey:'calcVolumeProfileData', compute:(data,c)=>calcVolumeProfileData(data,c.bins,c.lookback,c.valueAreaPercent) },
159
+ runtime: { defaultConfig: { bins: 24, lookback: 100, valueAreaPercent: 70, showPOC: true, showValueArea: true }, computeKey: 'calcVolumeProfileData', compute: (data, c) => calcVolumeProfileData(data, c.bins, c.lookback, c.valueAreaPercent) },
160
160
  })
161
161
  class VolumeProfileIndicatorDefinition {
162
162
  static rendererFactory = createVolumeProfileRendererPlugin
@@ -1,7 +1,7 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
- import type { VWAPRenderState } from '../../indicators/vwapState'
4
- import { createVWAPStateKey, EMPTY_VWAP_STATE } from '../../indicators/vwapState'
3
+ import type { VWAPRenderState } from '../../indicators/state/vwapState'
4
+ import { createVWAPStateKey, EMPTY_VWAP_STATE } from '../../indicators/state/vwapState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
6
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
7
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
@@ -106,7 +106,7 @@ function createVWAPRendererPlugin(options: { paneId?: string } = {}): RendererPl
106
106
  const state = pluginHost?.getSharedState<VWAPRenderState>(stateKey)
107
107
  return state?.params ?? {}
108
108
  },
109
- setConfig() {},
109
+ setConfig() { },
110
110
  }
111
111
  }
112
112
 
@@ -1,8 +1,8 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { createSingleLineTitleInfo } from './shared/titleInfo'
3
3
  import { RENDERER_PRIORITY } from '../../../plugin'
4
- import type { WMARenderState } from '../../indicators/wmaState'
5
- import { createWMAStateKey, EMPTY_WMA_STATE } from '../../indicators/wmaState'
4
+ import type { WMARenderState } from '../../indicators/state/wmaState'
5
+ import { createWMAStateKey, EMPTY_WMA_STATE } from '../../indicators/state/wmaState'
6
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
7
7
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
8
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
@@ -134,7 +134,7 @@ const getWMATitleInfo = createSingleLineTitleInfo({ createStateKey: createWMASta
134
134
  mainPane: { rendererName: 'wma_main', toActiveConfig: (params, active) => ({ ...params, showWMA: active }) },
135
135
  visibleState: { compose: createSparseVisibleStateComposer('wma', EMPTY_WMA_STATE) },
136
136
  scale: { indicatorKey: 'wma', label: 'WMA', decimals: 2 },
137
- runtime: { defaultConfig:{period:10,showWMA:true}, computeKey:'calcWMAData', compute:(data,c)=>calcWMAData(data,c.period) },
137
+ runtime: { defaultConfig: { period: 10, showWMA: true }, computeKey: 'calcWMAData', compute: (data, c) => calcWMAData(data, c.period) },
138
138
  })
139
139
  class WMADefinition {
140
140
  static rendererFactory = createWMARendererPlugin
@@ -2,8 +2,8 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import { resolveThemeColors } from '../../../tokens'
4
4
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
5
- import type { WMSRRenderState } from '../../indicators/wmsrState'
6
- import { createWMSRStateKey, EMPTY_WMSR_STATE } from '../../indicators/wmsrState'
5
+ import type { WMSRRenderState } from '../../indicators/state/wmsrState'
6
+ import { createWMSRStateKey, EMPTY_WMSR_STATE } from '../../indicators/state/wmsrState'
7
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
8
  import { createFixedRangeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
9
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
@@ -163,7 +163,7 @@ function createWMSRRendererPlugin(options: WMSRRendererOptions = {}): RendererPl
163
163
  },
164
164
 
165
165
  draw(context: RenderContext) {
166
- const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
166
+ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
167
167
  const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
168
168
 
169
169
  const stateKey = resolveKey()
@@ -1,8 +1,8 @@
1
1
  import { resolveThemeColors } from '../../../tokens'
2
2
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
3
3
  import { RENDERER_PRIORITY } from '../../../plugin'
4
- import type { ZonesRenderState } from '../../indicators/zonesState'
5
- import { createZonesStateKey, EMPTY_ZONES_STATE } from '../../indicators/zonesState'
4
+ import type { ZonesRenderState } from '../../indicators/state/zonesState'
5
+ import { createZonesStateKey, EMPTY_ZONES_STATE } from '../../indicators/state/zonesState'
6
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
7
7
  import { createFixedUnitVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
8
  import { resolveStateKey, type TitleInfo, type TitleValueItem, type GetTitleInfoFn } from '../../indicators/indicatorMetadata'
@@ -73,8 +73,8 @@ function createZonesRendererPlugin(options: { paneId?: string } = {}): RendererP
73
73
  const yLow = toY(zone.low)
74
74
  const fill = zone.kind === 'FVG_BULL' ? colors.zones.fvgBullFill
75
75
  : zone.kind === 'FVG_BEAR' ? colors.zones.fvgBearFill
76
- : zone.kind === 'OB_BULL' ? colors.zones.obBullFill
77
- : colors.zones.obBearFill
76
+ : zone.kind === 'OB_BULL' ? colors.zones.obBullFill
77
+ : colors.zones.obBearFill
78
78
  ctx.fillStyle = fill
79
79
  ctx.fillRect(startX, yHigh, endX - startX, yLow - yHigh)
80
80
  }
@@ -86,7 +86,7 @@ function createZonesRendererPlugin(options: { paneId?: string } = {}): RendererP
86
86
  if (!stateKey) return {}
87
87
  return pluginHost?.getSharedState<ZonesRenderState>(stateKey)?.params ?? {}
88
88
  },
89
- setConfig() {},
89
+ setConfig() { },
90
90
  }
91
91
  }
92
92
 
@@ -125,7 +125,7 @@ const getZonesTitleInfo: GetTitleInfoFn = (_data, index, _params, host, paneId)
125
125
  mainPane: { rendererName: 'zones_main', toActiveConfig: (params, active) => ({ ...params, showFVG: active, showOB: active, showFilledZones: active }) },
126
126
  scale: { indicatorKey: 'zones', label: 'Zones', decimals: 2 },
127
127
  visibleState: { compose: createFixedUnitVisibleStateComposer('zones', EMPTY_ZONES_STATE) },
128
- runtime: { defaultConfig:{showFVG:true,showOB:true,showFilledZones:true,obLookback:20}, computeKey:'calcZonesData', compute:(data,c)=>calcZonesData(data,c.obLookback,5,2,'close') },
128
+ runtime: { defaultConfig: { showFVG: true, showOB: true, showFilledZones: true, obLookback: 20 }, computeKey: 'calcZonesData', compute: (data, c) => calcZonesData(data, c.obLookback, 5, 2, 'close') },
129
129
  })
130
130
  class ZonesDefinition {
131
131
  static rendererFactory = createZonesRendererPlugin
@@ -1,7 +1,7 @@
1
1
  // @ts-nocheck - Test file with intentional type relaxations for mocking
2
2
  import { describe, it, expect, vi, beforeEach } from 'vitest'
3
3
  import { createBOLLRendererPlugin } from '../Indicator/boll'
4
- import { BOLL_STATE_KEY, type BOLLRenderState } from '@/core/indicators/bollState'
4
+ import { BOLL_STATE_KEY, type BOLLRenderState } from '@/core/indicators/state/bollState'
5
5
  import type { PluginHost, RenderContext, RendererPluginWithHost } from '@/plugin'
6
6
  import type { KLineData } from '@/types/price'
7
7
  import type { Pane } from '@/core/layout/pane'
@@ -1,7 +1,7 @@
1
1
  // @ts-nocheck - Test file with intentional type relaxations for mocking
2
2
  import { describe, it, expect, vi, beforeEach } from 'vitest'
3
3
  import { createENERendererPlugin } from '../Indicator/ene'
4
- import { ENE_STATE_KEY, type ENERenderState } from '@/core/indicators/eneState'
4
+ import { ENE_STATE_KEY, type ENERenderState } from '@/core/indicators/state/eneState'
5
5
  import type { PluginHost, RenderContext, RendererPluginWithHost } from '@/plugin'
6
6
 
7
7
  const ENE_COLORS = { BAND_FILL: 'rgba(69, 112, 249, 0.08)' } as const
@@ -1,7 +1,7 @@
1
1
  // @ts-nocheck - Test file with intentional type relaxations for mocking
2
2
  import { describe, it, expect, vi, beforeEach } from 'vitest'
3
3
  import { createEXPMARendererPlugin } from '../Indicator/expma'
4
- import { EXPMA_STATE_KEY, type EXPMARenderState } from '@/core/indicators/expmaState'
4
+ import { EXPMA_STATE_KEY, type EXPMARenderState } from '@/core/indicators/state/expmaState'
5
5
  import type { PluginHost, RenderContext, RendererPluginWithHost } from '@/plugin'
6
6
  import type { KLineData } from '@/types/price'
7
7
  import type { Pane } from '@/core/layout/pane'
@@ -1,7 +1,7 @@
1
1
  // @ts-nocheck - Test file with intentional type relaxations for mocking
2
2
  import { describe, it, expect, vi, beforeEach } from 'vitest'
3
3
  import { createMARendererPlugin } from '../Indicator/ma'
4
- import { MA_STATE_KEY, type MARenderState } from '@/core/indicators/maState'
4
+ import { MA_STATE_KEY, type MARenderState } from '@/core/indicators/state/maState'
5
5
  import type { PluginHost, RenderContext, RendererPluginWithHost } from '@/plugin'
6
6
  import type { KLineData } from '@/types/price'
7
7
  import type { Pane } from '@/core/layout/pane'
@@ -1,10 +1,10 @@
1
1
  // @ts-nocheck - Test file with intentional type relaxations for mocking
2
2
  import { describe, it, expect, vi, beforeEach } from 'vitest'
3
3
  import { createMainIndicatorLegendRendererPlugin } from '../Indicator/mainIndicatorLegend'
4
- import { MA_STATE_KEY, type MARenderState } from '@/core/indicators/maState'
5
- import { BOLL_STATE_KEY } from '@/core/indicators/bollState'
6
- import { EXPMA_STATE_KEY } from '@/core/indicators/expmaState'
7
- import { ENE_STATE_KEY } from '@/core/indicators/eneState'
4
+ import { MA_STATE_KEY, type MARenderState } from '@/core/indicators/state/maState'
5
+ import { BOLL_STATE_KEY } from '@/core/indicators/state/bollState'
6
+ import { EXPMA_STATE_KEY } from '@/core/indicators/state/expmaState'
7
+ import { ENE_STATE_KEY } from '@/core/indicators/state/eneState'
8
8
  import type { PluginHost, RenderContext, RendererPluginWithHost } from '@/plugin'
9
9
  import type { KLineData } from '@/types/price'
10
10
  import type { Pane } from '@/core/layout/pane'
@@ -1,23 +1,12 @@
1
1
  import { describe, it, expect, vi, beforeEach } from 'vitest'
2
2
  import { createYAxisRendererPlugin } from '@/core/renderers/yAxis'
3
- import type { RenderContext, PaneInfo } from '@/plugin'
4
-
5
- vi.mock('@/core/renderers/Indicator/scale/indicator_scale', async () => {
6
- const actual = await vi.importActual<typeof import('@/core/renderers/Indicator/scale/indicator_scale')>(
7
- '@/core/renderers/Indicator/scale/indicator_scale',
8
- )
9
- return {
10
- ...actual,
11
- drawScaleTicks: vi.fn(),
12
- }
13
- })
3
+ import type { RenderContext, PaneInfo, YAxisTick } from '@/plugin'
14
4
 
15
5
  vi.mock('@/utils/kLineDraw/axis', () => ({
16
6
  drawCrosshairPriceLabel: vi.fn(),
17
7
  drawAxisPriceLabel: vi.fn(),
18
8
  }))
19
9
 
20
- import { drawScaleTicks } from '@/core/renderers/Indicator/scale/indicator_scale'
21
10
  import { drawCrosshairPriceLabel, drawAxisPriceLabel } from '@/utils/kLineDraw/axis'
22
11
 
23
12
  function createPane(overrides: Partial<PaneInfo> = {}): PaneInfo {
@@ -53,12 +42,27 @@ function createPane(overrides: Partial<PaneInfo> = {}): PaneInfo {
53
42
  }
54
43
  }
55
44
 
45
+ const mockYAxisTicks: YAxisTick[] = [
46
+ { y: 10, value: 120 },
47
+ { y: 55, value: 110 },
48
+ { y: 100, value: 100 },
49
+ { y: 145, value: 90 },
50
+ { y: 190, value: 80 },
51
+ ]
52
+
53
+ function createCtx() {
54
+ return {
55
+ canvas: { width: 80, height: 200 },
56
+ clearRect: vi.fn(),
57
+ fillText: vi.fn(),
58
+ measureText: vi.fn(() => ({ width: 10 })),
59
+ save: vi.fn(),
60
+ restore: vi.fn(),
61
+ } as unknown as CanvasRenderingContext2D
62
+ }
63
+
56
64
  function createContext(overrides: Partial<RenderContext> = {}): RenderContext {
57
- const ctx = {} as CanvasRenderingContext2D
58
- Object.defineProperty(ctx, 'canvas', {
59
- value: { width: 80, height: 200 },
60
- configurable: true,
61
- })
65
+ const ctx = createCtx()
62
66
 
63
67
  return {
64
68
  ctx,
@@ -78,6 +82,7 @@ function createContext(overrides: Partial<RenderContext> = {}): RenderContext {
78
82
  xAxisLabels: [],
79
83
  period: 'daily',
80
84
  theme: 'light',
85
+ yAxisTicks: mockYAxisTicks,
81
86
  ...overrides,
82
87
  }
83
88
  }
@@ -93,7 +98,9 @@ describe('yAxis renderer', () => {
93
98
 
94
99
  plugin.draw(context)
95
100
 
96
- expect(drawScaleTicks).toHaveBeenCalledTimes(1)
101
+ const targetCtx = context.yAxisCtx!
102
+ expect(targetCtx.clearRect).toHaveBeenCalled()
103
+ expect(targetCtx.fillText).toHaveBeenCalled()
97
104
  })
98
105
 
99
106
  it('does not draw ticks when pane capability showPriceAxisTicks is false', () => {
@@ -111,21 +118,19 @@ describe('yAxis renderer', () => {
111
118
 
112
119
  plugin.draw(context)
113
120
 
114
- expect(drawScaleTicks).toHaveBeenCalledTimes(0)
121
+ const targetCtx = context.yAxisCtx!
122
+ expect(targetCtx.fillText).toHaveBeenCalledTimes(0)
115
123
  })
116
124
 
117
125
  it('uses ctx when yAxisCtx is not provided', () => {
118
126
  const plugin = createYAxisRendererPlugin({ axisWidth: 80, yPaddingPx: 0 })
119
- const fallbackCtx = {} as CanvasRenderingContext2D
127
+ const fallbackCtx = createCtx()
120
128
  const context = createContext({ ctx: fallbackCtx, yAxisCtx: undefined })
121
129
 
122
130
  plugin.draw(context)
123
131
 
124
- expect(drawScaleTicks).toHaveBeenCalledWith(
125
- expect.objectContaining({
126
- ctx: fallbackCtx,
127
- }),
128
- )
132
+ expect(fallbackCtx.clearRect).toHaveBeenCalled()
133
+ expect(fallbackCtx.fillText).toHaveBeenCalled()
129
134
  })
130
135
 
131
136
  it('draws last price label via drawAxisPriceLabel for main pane when yAxisLabels contains lastPrice', () => {
@@ -162,7 +167,6 @@ describe('yAxis renderer', () => {
162
167
 
163
168
  plugin.draw(context)
164
169
 
165
- // Last price now flows through drawAxisPriceLabel; only the crosshair label uses drawCrosshairPriceLabel
166
170
  expect(drawCrosshairPriceLabel).toHaveBeenCalledTimes(1)
167
171
  })
168
172
 
@@ -1,17 +1,39 @@
1
1
  import type { RendererPlugin, RenderContext } from '../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../plugin'
3
3
  import type { KLineData } from '../../types/price'
4
- import { getKLineTrend, type kLineTrend } from '../../types/kLine'
5
- import { createAlignedKLineFromPx, createVerticalLineRect } from '../draw/pixelAlign'
4
+ import type { kLineTrend } from '../../types/kLine'
6
5
  import { resolveThemeColors, type VolumePriceColors } from '../../tokens'
7
- import { getPhysicalKLineConfig } from '../chart'
6
+ import { getPhysicalKLineConfig } from '../utils/klineConfig'
8
7
  import { VolumePriceRelation } from '../../types/volumePrice'
9
8
  import { analyzeVolumePriceRelationBatch, DEFAULT_VOLUME_PRICE_CONFIG } from '../../utils/volumePrice'
10
9
  import type { MarkerManager } from '../marker/registry'
11
10
 
11
+ // --- Float32Array buffer pool (reduces per-frame GC pressure) ---
12
+ let poolUpBody: Float32Array | null = null
13
+ let poolDownBody: Float32Array | null = null
14
+ let poolUpWick: Float32Array | null = null
15
+ let poolDownWick: Float32Array | null = null
16
+
17
+ function ensureBufferCapacity(pool: Float32Array | null, requiredFloats: number): Float32Array {
18
+ if (pool && pool.length >= requiredFloats) return pool
19
+ const newLen = Math.max(requiredFloats, Math.ceil((pool?.length ?? 0) * 1.5))
20
+ return new Float32Array(newLen)
21
+ }
22
+
23
+ type AlignedKLineResult = {
24
+ bodyRect: { x: number; y: number; width: number; height: number }
25
+ physBodyLeft: number
26
+ physBodyRight: number
27
+ physBodyWidth: number
28
+ physBodyCenter: number
29
+ physWickX: number
30
+ wickRect: { x: number; width: number }
31
+ isPerfectlyAligned: boolean
32
+ }
33
+
12
34
  type CandleRenderData = {
13
35
  i: number
14
- aligned: ReturnType<typeof createAlignedKLineFromPx>
36
+ aligned: AlignedKLineResult
15
37
  trend: kLineTrend
16
38
  openY: number
17
39
  closeY: number
@@ -99,10 +121,14 @@ function prepareCandles(args: {
99
121
  const upKLines: CandleRenderData[] = []
100
122
  const downKLines: CandleRenderData[] = []
101
123
  const maxRects = Math.max(1, range.end - range.start)
102
- const upBodyBuf = new Float32Array(maxRects * 4)
103
- const downBodyBuf = new Float32Array(maxRects * 4)
104
- const upWickBuf = new Float32Array(maxRects * 2 * 4)
105
- const downWickBuf = new Float32Array(maxRects * 2 * 4)
124
+ const upBodyBuf = ensureBufferCapacity(poolUpBody, maxRects * 4)
125
+ poolUpBody = upBodyBuf
126
+ const downBodyBuf = ensureBufferCapacity(poolDownBody, maxRects * 4)
127
+ poolDownBody = downBodyBuf
128
+ const upWickBuf = ensureBufferCapacity(poolUpWick, maxRects * 2 * 4)
129
+ poolUpWick = upWickBuf
130
+ const downWickBuf = ensureBufferCapacity(poolDownWick, maxRects * 2 * 4)
131
+ poolDownWick = downWickBuf
106
132
  let upBodyCount = 0
107
133
  let downBodyCount = 0
108
134
  let upWickCount = 0
@@ -121,10 +147,13 @@ function prepareCandles(args: {
121
147
  const scaleB = paddingTop + viewHeight
122
148
  fastPriceToY = (price: number) => scaleB - (price - minPrice) * scaleK
123
149
  } else {
124
- // 对数模式回退到标准方法
125
150
  fastPriceToY = (price: number) => pane.yAxis.priceToY(price)
126
151
  }
127
152
 
153
+ const invDpr = 1 / dpr
154
+ const wickWidth = 1 / dpr
155
+ const alignY = (logical: number) => Math.round(logical * dpr) * invDpr
156
+
128
157
  for (let i = range.start; i < range.end && i < data.length; i++) {
129
158
  const e = data[i]
130
159
  if (!e) continue
@@ -137,7 +166,6 @@ function prepareCandles(args: {
137
166
  const leftLogical = kLinePositions[i - range.start]
138
167
  if (leftLogical === undefined) continue
139
168
 
140
- const alignY = (logical: number) => Math.round(logical * dpr) / dpr
141
169
  const alignedOpenY = alignY(openY)
142
170
  const alignedCloseY = alignY(closeY)
143
171
  const alignedHighY = alignY(highY)
@@ -146,81 +174,95 @@ function prepareCandles(args: {
146
174
  const alignedRawRectH = Math.max(Math.abs(alignedOpenY - alignedCloseY), 1)
147
175
 
148
176
  const roundedLeftPx = Math.round(leftLogical * dpr)
149
- const aligned = createAlignedKLineFromPx(
150
- roundedLeftPx,
151
- alignedRawRectY,
152
- kWidthPx,
153
- alignedRawRectH,
154
- dpr
155
- )
156
-
157
- const trend: kLineTrend = getKLineTrend(e)
158
- const renderData: CandleRenderData = {
159
- i,
160
- aligned,
161
- trend,
162
- openY,
163
- closeY,
164
- highY,
165
- lowY,
166
- alignedHighY,
167
- alignedLowY,
168
- e,
169
- }
170
177
 
171
- const bodyRect = aligned.bodyRect
172
- const targetKLines = trend === 'up' ? upKLines : downKLines
173
- const isUp = trend === 'up'
174
-
175
- targetKLines.push(renderData)
178
+ // Inlined createAlignedKLineFromPx — no object allocation
179
+ const topPx = Math.round(alignedRawRectY * dpr)
180
+ const bottomPx = Math.round((alignedRawRectY + alignedRawRectH) * dpr)
181
+ const bodyHPx = Math.max(1, bottomPx - topPx)
182
+
183
+ const bodyX = roundedLeftPx * invDpr
184
+ const bodyY = topPx * invDpr
185
+ const bodyW = kWidthPx * invDpr
186
+ const bodyH = bodyHPx * invDpr
187
+ const wickCenterX = (roundedLeftPx + (kWidthPx - 1) / 2) * invDpr
188
+
189
+ const isUp = e.close >= e.open
190
+
191
+ if (showVolumePriceMarkers) {
192
+ const targetKLines = isUp ? upKLines : downKLines
193
+ targetKLines.push({
194
+ i,
195
+ aligned: {
196
+ bodyRect: { x: bodyX, y: bodyY, width: bodyW, height: bodyH },
197
+ physBodyLeft: roundedLeftPx,
198
+ physBodyRight: roundedLeftPx + kWidthPx,
199
+ physBodyWidth: kWidthPx,
200
+ physBodyCenter: wickCenterX,
201
+ physWickX: wickCenterX,
202
+ wickRect: { x: wickCenterX, width: 1 / dpr },
203
+ isPerfectlyAligned: kWidthPx % 2 === 1,
204
+ },
205
+ trend: isUp ? 'up' : 'down',
206
+ openY,
207
+ closeY,
208
+ highY,
209
+ lowY,
210
+ alignedHighY,
211
+ alignedLowY,
212
+ e,
213
+ })
214
+ }
176
215
 
177
216
  if (isUp) {
178
217
  const off = upBodyCount++ * 4
179
- upBodyBuf[off] = bodyRect.x
180
- upBodyBuf[off + 1] = bodyRect.y
181
- upBodyBuf[off + 2] = bodyRect.width
182
- upBodyBuf[off + 3] = bodyRect.height
218
+ upBodyBuf[off] = bodyX
219
+ upBodyBuf[off + 1] = bodyY
220
+ upBodyBuf[off + 2] = bodyW
221
+ upBodyBuf[off + 3] = bodyH
183
222
  } else {
184
223
  const off = downBodyCount++ * 4
185
- downBodyBuf[off] = bodyRect.x
186
- downBodyBuf[off + 1] = bodyRect.y
187
- downBodyBuf[off + 2] = bodyRect.width
188
- downBodyBuf[off + 3] = bodyRect.height
224
+ downBodyBuf[off] = bodyX
225
+ downBodyBuf[off + 1] = bodyY
226
+ downBodyBuf[off + 2] = bodyW
227
+ downBodyBuf[off + 3] = bodyH
189
228
  }
190
229
 
191
- const bodyTop = bodyRect.y
192
- const bodyBottom = bodyRect.y + bodyRect.height
193
- const bodyHigh = Math.max(e.open, e.close)
194
- const bodyLow = Math.min(e.open, e.close)
230
+ const bodyHigh = isUp ? e.close : e.open
231
+ const bodyLow = isUp ? e.open : e.close
195
232
 
233
+ // Inlined createVerticalLineRect for upper wick
196
234
  if (e.high > bodyHigh) {
197
- const wick = createVerticalLineRect(aligned.wickRect.x, alignedHighY, bodyTop, dpr)
198
- if (wick) {
199
- const buf = isUp ? upWickBuf : downWickBuf
200
- const idx = isUp ? upWickCount++ : downWickCount++
201
- const off = idx * 4
202
- buf[off] = wick.x
203
- buf[off + 1] = wick.y
204
- buf[off + 2] = wick.width
205
- buf[off + 3] = wick.height
206
- }
235
+ const top = Math.min(alignedHighY, bodyY)
236
+ const bottom = Math.max(alignedHighY, bodyY)
237
+ const physTop = Math.round(top * dpr)
238
+ const physBottom = Math.round(bottom * dpr)
239
+ const wickH = Math.max(1, physBottom - physTop) * invDpr
240
+ const buf = isUp ? upWickBuf : downWickBuf
241
+ const idx = isUp ? upWickCount++ : downWickCount++
242
+ const off = idx * 4
243
+ buf[off] = wickCenterX
244
+ buf[off + 1] = physTop * invDpr
245
+ buf[off + 2] = wickWidth
246
+ buf[off + 3] = wickH
207
247
  }
248
+ // Inlined createVerticalLineRect for lower wick
208
249
  if (e.low < bodyLow) {
209
- const wick = createVerticalLineRect(aligned.wickRect.x, bodyBottom, alignedLowY, dpr)
210
- if (wick) {
211
- const buf = isUp ? upWickBuf : downWickBuf
212
- const idx = isUp ? upWickCount++ : downWickCount++
213
- const off = idx * 4
214
- buf[off] = wick.x
215
- buf[off + 1] = wick.y
216
- buf[off + 2] = wick.width
217
- buf[off + 3] = wick.height
218
- }
250
+ const bodyBottom = bodyY + bodyH
251
+ const top = Math.min(bodyBottom, alignedLowY)
252
+ const bottom = Math.max(bodyBottom, alignedLowY)
253
+ const physTop = Math.round(top * dpr)
254
+ const physBottom = Math.round(bottom * dpr)
255
+ const wickH = Math.max(1, physBottom - physTop) * invDpr
256
+ const buf = isUp ? upWickBuf : downWickBuf
257
+ const idx = isUp ? upWickCount++ : downWickCount++
258
+ const off = idx * 4
259
+ buf[off] = wickCenterX
260
+ buf[off + 1] = physTop * invDpr
261
+ buf[off + 2] = wickWidth
262
+ buf[off + 3] = wickH
219
263
  }
220
264
  }
221
265
 
222
- const wickWidth = upKLines[0]?.aligned.wickRect.width ?? downKLines[0]?.aligned.wickRect.width ?? 1
223
-
224
266
  return {
225
267
  upKLines,
226
268
  downKLines,
@@ -154,6 +154,7 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
154
154
  max,
155
155
  dpr,
156
156
  paneWidth,
157
+ scrollLeft,
157
158
  ctx
158
159
  )
159
160
  if (maxMarker) markers.push(maxMarker)
@@ -164,6 +165,7 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
164
165
  min,
165
166
  dpr,
166
167
  paneWidth,
168
+ scrollLeft,
167
169
  ctx
168
170
  )
169
171
  if (minMarker) markers.push(minMarker)
@@ -186,14 +188,14 @@ function createMarkerData(
186
188
  price: number,
187
189
  dpr: number,
188
190
  paneWidth: number,
191
+ scrollLeft: number,
189
192
  ctx: CanvasRenderingContext2D
190
193
  ): MarkerData | null {
191
194
  const text = price.toFixed(2)
192
195
  const textWidth = measureTextWidth(ctx, text)
193
196
 
194
- const visibleX = x
195
- const rightEdge = visibleX + LINE_LENGTH + PADDING + textWidth
196
- const drawLeft = rightEdge > paneWidth
197
+ const screenX = x - scrollLeft
198
+ const drawLeft = screenX >= paneWidth / 2
197
199
 
198
200
  let lineStartX = x
199
201
  let lineEndX = drawLeft ? x - LINE_LENGTH : x + LINE_LENGTH