@363045841yyt/klinechart-core 0.8.6 → 0.8.7

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 (490) hide show
  1. package/dist/config/chartSettings.d.ts +21 -2
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +9 -1
  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 +49 -2
  7. package/dist/controllers/createChartController.js.map +1 -1
  8. package/dist/controllers/types.d.ts +34 -23
  9. package/dist/controllers/types.d.ts.map +1 -1
  10. package/dist/data-fetchers/baostock.d.ts +0 -3
  11. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  12. package/dist/data-fetchers/baostock.js +0 -1
  13. package/dist/data-fetchers/baostock.js.map +1 -1
  14. package/dist/data-fetchers/dataBuffer.d.ts +13 -2
  15. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  16. package/dist/data-fetchers/dataBuffer.js +41 -7
  17. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  18. package/dist/data-fetchers/dataBufferTypes.d.ts +11 -0
  19. package/dist/data-fetchers/dataBufferTypes.d.ts.map +1 -0
  20. package/dist/data-fetchers/dataBufferTypes.js +2 -0
  21. package/dist/data-fetchers/dataBufferTypes.js.map +1 -0
  22. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts +4 -3
  23. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  24. package/dist/data-fetchers/fetcherDefinitionRegistry.js +9 -2
  25. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  26. package/dist/data-fetchers/gotdx/gotdx.d.ts +7 -0
  27. package/dist/data-fetchers/gotdx/gotdx.d.ts.map +1 -0
  28. package/dist/data-fetchers/gotdx/gotdx.js +7 -0
  29. package/dist/data-fetchers/gotdx/gotdx.js.map +1 -0
  30. package/dist/data-fetchers/gotdx.d.ts +0 -8
  31. package/dist/data-fetchers/gotdx.d.ts.map +1 -1
  32. package/dist/data-fetchers/gotdx.js +40 -3
  33. package/dist/data-fetchers/gotdx.js.map +1 -1
  34. package/dist/data-fetchers/hundred-mock.d.ts +0 -3
  35. package/dist/data-fetchers/hundred-mock.d.ts.map +1 -1
  36. package/dist/data-fetchers/hundred-mock.js +0 -1
  37. package/dist/data-fetchers/hundred-mock.js.map +1 -1
  38. package/dist/data-fetchers/index.d.ts +10 -8
  39. package/dist/data-fetchers/index.d.ts.map +1 -1
  40. package/dist/data-fetchers/index.js +8 -7
  41. package/dist/data-fetchers/index.js.map +1 -1
  42. package/dist/data-fetchers/router.d.ts +2 -0
  43. package/dist/data-fetchers/router.d.ts.map +1 -1
  44. package/dist/data-fetchers/router.js +8 -1
  45. package/dist/data-fetchers/router.js.map +1 -1
  46. package/dist/data-fetchers/thousand-mock.d.ts +0 -3
  47. package/dist/data-fetchers/thousand-mock.d.ts.map +1 -1
  48. package/dist/data-fetchers/thousand-mock.js +0 -1
  49. package/dist/data-fetchers/thousand-mock.js.map +1 -1
  50. package/dist/data-fetchers/timeShareBuffer.d.ts +27 -0
  51. package/dist/data-fetchers/timeShareBuffer.d.ts.map +1 -0
  52. package/dist/data-fetchers/timeShareBuffer.js +79 -0
  53. package/dist/data-fetchers/timeShareBuffer.js.map +1 -0
  54. package/dist/data-fetchers/tradingview.d.ts +0 -8
  55. package/dist/data-fetchers/tradingview.d.ts.map +1 -1
  56. package/dist/data-fetchers/tradingview.js +1 -2
  57. package/dist/data-fetchers/tradingview.js.map +1 -1
  58. package/dist/data-fetchers/types.d.ts +9 -1
  59. package/dist/data-fetchers/types.d.ts.map +1 -1
  60. package/dist/engine/chart.d.ts +29 -1
  61. package/dist/engine/chart.d.ts.map +1 -1
  62. package/dist/engine/chart.js +140 -5
  63. package/dist/engine/chart.js.map +1 -1
  64. package/dist/engine/chartTypes.d.ts +3 -0
  65. package/dist/engine/chartTypes.d.ts.map +1 -1
  66. package/dist/engine/controller/interaction.d.ts +6 -1
  67. package/dist/engine/controller/interaction.d.ts.map +1 -1
  68. package/dist/engine/controller/interaction.js +76 -28
  69. package/dist/engine/controller/interaction.js.map +1 -1
  70. package/dist/engine/data/chartDataManager.d.ts +38 -11
  71. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  72. package/dist/engine/data/chartDataManager.js +491 -188
  73. package/dist/engine/data/chartDataManager.js.map +1 -1
  74. package/dist/engine/draw/pixelAlign.d.ts +0 -27
  75. package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
  76. package/dist/engine/draw/pixelAlign.js +1 -1
  77. package/dist/engine/draw/pixelAlign.js.map +1 -1
  78. package/dist/engine/indicators/calculators.d.ts +0 -104
  79. package/dist/engine/indicators/calculators.d.ts.map +1 -1
  80. package/dist/engine/indicators/calculators.js +57 -168
  81. package/dist/engine/indicators/calculators.js.map +1 -1
  82. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  83. package/dist/engine/indicators/chartIndicatorManager.js +3 -2
  84. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  85. package/dist/engine/indicators/macdState.d.ts +0 -5
  86. package/dist/engine/indicators/macdState.d.ts.map +1 -1
  87. package/dist/engine/indicators/macdState.js +1 -1
  88. package/dist/engine/indicators/macdState.js.map +1 -1
  89. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  90. package/dist/engine/indicators/registerBuiltins.js +1 -0
  91. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  92. package/dist/engine/indicators/rsiState.d.ts +0 -4
  93. package/dist/engine/indicators/rsiState.d.ts.map +1 -1
  94. package/dist/engine/indicators/rsiState.js +1 -1
  95. package/dist/engine/indicators/rsiState.js.map +1 -1
  96. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  97. package/dist/engine/indicators/scheduler.js +1 -7
  98. package/dist/engine/indicators/scheduler.js.map +1 -1
  99. package/dist/engine/layout/chartPaneLayout.d.ts +2 -0
  100. package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
  101. package/dist/engine/layout/chartPaneLayout.js +24 -6
  102. package/dist/engine/layout/chartPaneLayout.js.map +1 -1
  103. package/dist/engine/modes/kLineMode.d.ts +37 -0
  104. package/dist/engine/modes/kLineMode.d.ts.map +1 -0
  105. package/dist/engine/modes/kLineMode.js +22 -0
  106. package/dist/engine/modes/kLineMode.js.map +1 -0
  107. package/dist/engine/modes/timeShareMode.d.ts +37 -0
  108. package/dist/engine/modes/timeShareMode.d.ts.map +1 -0
  109. package/dist/engine/modes/timeShareMode.js +59 -0
  110. package/dist/engine/modes/timeShareMode.js.map +1 -0
  111. package/dist/engine/modes/types.d.ts +47 -0
  112. package/dist/engine/modes/types.d.ts.map +1 -0
  113. package/dist/engine/modes/types.js +2 -0
  114. package/dist/engine/modes/types.js.map +1 -0
  115. package/dist/engine/paneRenderer.d.ts +4 -0
  116. package/dist/engine/paneRenderer.d.ts.map +1 -1
  117. package/dist/engine/paneRenderer.js +27 -40
  118. package/dist/engine/paneRenderer.js.map +1 -1
  119. package/dist/engine/render/chartRenderer.d.ts +4 -23
  120. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  121. package/dist/engine/render/chartRenderer.js +87 -17
  122. package/dist/engine/render/chartRenderer.js.map +1 -1
  123. package/dist/engine/renderers/Indicator/atr.d.ts +1 -18
  124. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  125. package/dist/engine/renderers/Indicator/atr.js +3 -22
  126. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  127. package/dist/engine/renderers/Indicator/boll.d.ts +1 -4
  128. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  129. package/dist/engine/renderers/Indicator/boll.js +3 -18
  130. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  131. package/dist/engine/renderers/Indicator/cci.d.ts +1 -22
  132. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  133. package/dist/engine/renderers/Indicator/cci.js +8 -20
  134. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  135. package/dist/engine/renderers/Indicator/chaikinVol.d.ts +1 -7
  136. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  137. package/dist/engine/renderers/Indicator/chaikinVol.js +3 -16
  138. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  139. package/dist/engine/renderers/Indicator/cmf.d.ts +1 -7
  140. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  141. package/dist/engine/renderers/Indicator/cmf.js +3 -15
  142. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  143. package/dist/engine/renderers/Indicator/dema.d.ts +1 -7
  144. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  145. package/dist/engine/renderers/Indicator/dema.js +3 -17
  146. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  147. package/dist/engine/renderers/Indicator/donchian.d.ts +1 -8
  148. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  149. package/dist/engine/renderers/Indicator/donchian.js +2 -2
  150. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  151. package/dist/engine/renderers/Indicator/ene.d.ts +1 -12
  152. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  153. package/dist/engine/renderers/Indicator/ene.js +3 -18
  154. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  155. package/dist/engine/renderers/Indicator/expma.d.ts +1 -4
  156. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  157. package/dist/engine/renderers/Indicator/expma.js +2 -2
  158. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  159. package/dist/engine/renderers/Indicator/fastk.d.ts +1 -22
  160. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  161. package/dist/engine/renderers/Indicator/fastk.js +11 -64
  162. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  163. package/dist/engine/renderers/Indicator/fib.d.ts +1 -6
  164. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  165. package/dist/engine/renderers/Indicator/fib.js +2 -2
  166. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  167. package/dist/engine/renderers/Indicator/hma.d.ts +1 -7
  168. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  169. package/dist/engine/renderers/Indicator/hma.js +3 -17
  170. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  171. package/dist/engine/renderers/Indicator/hv.d.ts +1 -7
  172. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  173. package/dist/engine/renderers/Indicator/hv.js +3 -16
  174. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  175. package/dist/engine/renderers/Indicator/ichimoku.d.ts +1 -8
  176. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  177. package/dist/engine/renderers/Indicator/ichimoku.js +2 -2
  178. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  179. package/dist/engine/renderers/Indicator/kama.d.ts +1 -7
  180. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  181. package/dist/engine/renderers/Indicator/kama.js +3 -17
  182. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  183. package/dist/engine/renderers/Indicator/keltner.d.ts +1 -8
  184. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  185. package/dist/engine/renderers/Indicator/keltner.js +2 -2
  186. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  187. package/dist/engine/renderers/Indicator/kst.d.ts +1 -22
  188. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  189. package/dist/engine/renderers/Indicator/kst.js +2 -2
  190. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  191. package/dist/engine/renderers/Indicator/ma.d.ts +1 -4
  192. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  193. package/dist/engine/renderers/Indicator/ma.js +1 -1
  194. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  195. package/dist/engine/renderers/Indicator/macd.d.ts +1 -49
  196. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  197. package/dist/engine/renderers/Indicator/macd.js +2 -12
  198. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  199. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  200. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +114 -1
  201. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  202. package/dist/engine/renderers/Indicator/mfi.d.ts +1 -7
  203. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  204. package/dist/engine/renderers/Indicator/mfi.js +3 -15
  205. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  206. package/dist/engine/renderers/Indicator/mom.d.ts +1 -22
  207. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  208. package/dist/engine/renderers/Indicator/mom.js +8 -23
  209. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  210. package/dist/engine/renderers/Indicator/obv.d.ts +1 -7
  211. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  212. package/dist/engine/renderers/Indicator/obv.js +3 -14
  213. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  214. package/dist/engine/renderers/Indicator/parkinson.d.ts +1 -7
  215. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  216. package/dist/engine/renderers/Indicator/parkinson.js +3 -16
  217. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  218. package/dist/engine/renderers/Indicator/pivot.d.ts +1 -6
  219. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  220. package/dist/engine/renderers/Indicator/pivot.js +2 -2
  221. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  222. package/dist/engine/renderers/Indicator/pvt.d.ts +1 -7
  223. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  224. package/dist/engine/renderers/Indicator/pvt.js +3 -14
  225. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  226. package/dist/engine/renderers/Indicator/roc.d.ts +1 -8
  227. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  228. package/dist/engine/renderers/Indicator/roc.js +3 -15
  229. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  230. package/dist/engine/renderers/Indicator/rsi.d.ts +0 -32
  231. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  232. package/dist/engine/renderers/Indicator/rsi.js +3 -3
  233. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  234. package/dist/engine/renderers/Indicator/sar.d.ts +1 -8
  235. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  236. package/dist/engine/renderers/Indicator/sar.js +2 -2
  237. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  238. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +2 -0
  239. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  240. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +10 -6
  241. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  242. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts +4 -0
  243. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts.map +1 -0
  244. package/dist/engine/renderers/Indicator/shared/dashedLines.js +50 -0
  245. package/dist/engine/renderers/Indicator/shared/dashedLines.js.map +1 -0
  246. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts +14 -0
  247. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -0
  248. package/dist/engine/renderers/Indicator/shared/titleInfo.js +25 -0
  249. package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -0
  250. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts +5 -0
  251. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts.map +1 -0
  252. package/dist/engine/renderers/Indicator/shared/webglBand.js +17 -0
  253. package/dist/engine/renderers/Indicator/shared/webglBand.js.map +1 -0
  254. package/dist/engine/renderers/Indicator/stoch.d.ts +1 -22
  255. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  256. package/dist/engine/renderers/Indicator/stoch.js +5 -46
  257. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  258. package/dist/engine/renderers/Indicator/structure.d.ts +1 -7
  259. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  260. package/dist/engine/renderers/Indicator/structure.js +2 -2
  261. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  262. package/dist/engine/renderers/Indicator/supertrend.d.ts +1 -8
  263. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  264. package/dist/engine/renderers/Indicator/supertrend.js +2 -2
  265. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  266. package/dist/engine/renderers/Indicator/tema.d.ts +1 -7
  267. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  268. package/dist/engine/renderers/Indicator/tema.js +3 -17
  269. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  270. package/dist/engine/renderers/Indicator/trix.d.ts +1 -8
  271. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  272. package/dist/engine/renderers/Indicator/trix.js +2 -2
  273. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  274. package/dist/engine/renderers/Indicator/vma.d.ts +1 -7
  275. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  276. package/dist/engine/renderers/Indicator/vma.js +3 -15
  277. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  278. package/dist/engine/renderers/Indicator/volumeProfile.d.ts +1 -7
  279. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  280. package/dist/engine/renderers/Indicator/volumeProfile.js +2 -2
  281. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  282. package/dist/engine/renderers/Indicator/vwap.d.ts +1 -7
  283. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  284. package/dist/engine/renderers/Indicator/vwap.js +3 -14
  285. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  286. package/dist/engine/renderers/Indicator/wma.d.ts +1 -7
  287. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  288. package/dist/engine/renderers/Indicator/wma.js +3 -17
  289. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  290. package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -22
  291. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  292. package/dist/engine/renderers/Indicator/wmsr.js +8 -23
  293. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  294. package/dist/engine/renderers/Indicator/zones.d.ts +1 -6
  295. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  296. package/dist/engine/renderers/Indicator/zones.js +2 -2
  297. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  298. package/dist/engine/renderers/candle.d.ts +0 -16
  299. package/dist/engine/renderers/candle.d.ts.map +1 -1
  300. package/dist/engine/renderers/candle.js +1 -1
  301. package/dist/engine/renderers/candle.js.map +1 -1
  302. package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
  303. package/dist/engine/renderers/comparisonLine.js +2 -0
  304. package/dist/engine/renderers/comparisonLine.js.map +1 -1
  305. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  306. package/dist/engine/renderers/extremaMarkers.js +2 -0
  307. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  308. package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
  309. package/dist/engine/renderers/lastPrice.js +7 -2
  310. package/dist/engine/renderers/lastPrice.js.map +1 -1
  311. package/dist/engine/renderers/leftYAxis.d.ts +11 -0
  312. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -0
  313. package/dist/engine/renderers/leftYAxis.js +67 -0
  314. package/dist/engine/renderers/leftYAxis.js.map +1 -0
  315. package/dist/engine/renderers/subVolume.d.ts +1 -13
  316. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  317. package/dist/engine/renderers/subVolume.js +1 -1
  318. package/dist/engine/renderers/subVolume.js.map +1 -1
  319. package/dist/engine/renderers/timeAxis.d.ts +0 -2
  320. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  321. package/dist/engine/renderers/timeAxis.js +4 -1
  322. package/dist/engine/renderers/timeAxis.js.map +1 -1
  323. package/dist/engine/renderers/timeShare.d.ts +3 -0
  324. package/dist/engine/renderers/timeShare.d.ts.map +1 -0
  325. package/dist/engine/renderers/timeShare.js +260 -0
  326. package/dist/engine/renderers/timeShare.js.map +1 -0
  327. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  328. package/dist/engine/renderers/yAxis.js +9 -1
  329. package/dist/engine/renderers/yAxis.js.map +1 -1
  330. package/dist/engine/scale/price.d.ts +0 -7
  331. package/dist/engine/scale/price.d.ts.map +1 -1
  332. package/dist/engine/scale/price.js +3 -2
  333. package/dist/engine/scale/price.js.map +1 -1
  334. package/dist/engine/theme/fonts.d.ts +0 -2
  335. package/dist/engine/theme/fonts.d.ts.map +1 -1
  336. package/dist/engine/theme/fonts.js +1 -1
  337. package/dist/engine/theme/fonts.js.map +1 -1
  338. package/dist/engine/utils/klineConfig.d.ts.map +1 -1
  339. package/dist/engine/utils/klineConfig.js +1 -5
  340. package/dist/engine/utils/klineConfig.js.map +1 -1
  341. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  342. package/dist/engine/viewport/chartViewportManager.js +6 -5
  343. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  344. package/dist/plugin/types.d.ts +1 -0
  345. package/dist/plugin/types.d.ts.map +1 -1
  346. package/dist/plugin/types.js.map +1 -1
  347. package/dist/semantic/types.d.ts +1 -1
  348. package/dist/semantic/types.d.ts.map +1 -1
  349. package/dist/tokens/theme-base.d.ts +5 -0
  350. package/dist/tokens/theme-base.d.ts.map +1 -0
  351. package/dist/tokens/theme-base.js +31 -0
  352. package/dist/tokens/theme-base.js.map +1 -0
  353. package/dist/tokens/theme-china.d.ts.map +1 -1
  354. package/dist/tokens/theme-china.js +3 -0
  355. package/dist/tokens/theme-china.js.map +1 -1
  356. package/dist/tokens/theme-dark.d.ts.map +1 -1
  357. package/dist/tokens/theme-dark.js +11 -30
  358. package/dist/tokens/theme-dark.js.map +1 -1
  359. package/dist/tokens/theme-light.d.ts.map +1 -1
  360. package/dist/tokens/theme-light.js +11 -30
  361. package/dist/tokens/theme-light.js.map +1 -1
  362. package/dist/tokens/types.d.ts +7 -0
  363. package/dist/tokens/types.d.ts.map +1 -1
  364. package/dist/types/price.d.ts +8 -0
  365. package/dist/types/price.d.ts.map +1 -1
  366. package/dist/types/price.js +4 -0
  367. package/dist/types/price.js.map +1 -1
  368. package/dist/utils/dateFormat.d.ts +5 -42
  369. package/dist/utils/dateFormat.d.ts.map +1 -1
  370. package/dist/utils/dateFormat.js +24 -4
  371. package/dist/utils/dateFormat.js.map +1 -1
  372. package/dist/utils/kLineDraw/axis.d.ts +9 -28
  373. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  374. package/dist/utils/kLineDraw/axis.js +33 -58
  375. package/dist/utils/kLineDraw/axis.js.map +1 -1
  376. package/dist/utils/volumePrice.d.ts +0 -40
  377. package/dist/utils/volumePrice.d.ts.map +1 -1
  378. package/dist/utils/volumePrice.js +2 -2
  379. package/dist/utils/volumePrice.js.map +1 -1
  380. package/dist/version.d.ts +1 -1
  381. package/dist/version.js +1 -1
  382. package/package.json +1 -1
  383. package/src/config/chartSettings.ts +9 -1
  384. package/src/controllers/createChartController.ts +52 -2
  385. package/src/controllers/types.ts +36 -17
  386. package/src/data-fetchers/__tests__/dataBuffer.test.ts +39 -5
  387. package/src/data-fetchers/baostock.ts +1 -1
  388. package/src/data-fetchers/dataBuffer.ts +48 -11
  389. package/src/data-fetchers/dataBufferTypes.ts +11 -0
  390. package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -4
  391. package/src/data-fetchers/gotdx/gotdx.ts +6 -0
  392. package/src/data-fetchers/gotdx.ts +45 -7
  393. package/src/data-fetchers/hundred-mock.ts +1 -1
  394. package/src/data-fetchers/index.ts +10 -20
  395. package/src/data-fetchers/router.ts +12 -1
  396. package/src/data-fetchers/thousand-mock.ts +1 -1
  397. package/src/data-fetchers/timeShareBuffer.ts +92 -0
  398. package/src/data-fetchers/tradingview.ts +2 -2
  399. package/src/data-fetchers/types.ts +15 -2
  400. package/src/engine/__tests__/chart.dpr.test.ts +1 -0
  401. package/src/engine/chart.ts +157 -7
  402. package/src/engine/chartTypes.ts +3 -0
  403. package/src/engine/controller/__tests__/interaction.dpr.test.ts +2 -0
  404. package/src/engine/controller/interaction.ts +80 -28
  405. package/src/engine/data/chartDataManager.ts +557 -214
  406. package/src/engine/draw/pixelAlign.ts +1 -1
  407. package/src/engine/indicators/__tests__/_propertyAssertions.ts +2 -2
  408. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -1
  409. package/src/engine/indicators/calculators.ts +83 -233
  410. package/src/engine/indicators/chartIndicatorManager.ts +3 -2
  411. package/src/engine/indicators/macdState.ts +1 -1
  412. package/src/engine/indicators/registerBuiltins.ts +1 -0
  413. package/src/engine/indicators/rsiState.ts +1 -1
  414. package/src/engine/indicators/scheduler.ts +1 -7
  415. package/src/engine/layout/chartPaneLayout.ts +26 -6
  416. package/src/engine/modes/kLineMode.ts +57 -0
  417. package/src/engine/modes/timeShareMode.ts +95 -0
  418. package/src/engine/modes/types.ts +63 -0
  419. package/src/engine/paneRenderer.ts +37 -46
  420. package/src/engine/render/chartRenderer.ts +93 -20
  421. package/src/engine/renderers/Indicator/atr.ts +4 -29
  422. package/src/engine/renderers/Indicator/boll.ts +3 -24
  423. package/src/engine/renderers/Indicator/cci.ts +9 -27
  424. package/src/engine/renderers/Indicator/chaikinVol.ts +3 -23
  425. package/src/engine/renderers/Indicator/cmf.ts +3 -22
  426. package/src/engine/renderers/Indicator/dema.ts +5 -26
  427. package/src/engine/renderers/Indicator/donchian.ts +3 -3
  428. package/src/engine/renderers/Indicator/ene.ts +3 -24
  429. package/src/engine/renderers/Indicator/expma.ts +2 -2
  430. package/src/engine/renderers/Indicator/fastk.ts +12 -95
  431. package/src/engine/renderers/Indicator/fib.ts +2 -2
  432. package/src/engine/renderers/Indicator/hma.ts +5 -26
  433. package/src/engine/renderers/Indicator/hv.ts +3 -23
  434. package/src/engine/renderers/Indicator/ichimoku.ts +3 -3
  435. package/src/engine/renderers/Indicator/kama.ts +5 -26
  436. package/src/engine/renderers/Indicator/keltner.ts +3 -3
  437. package/src/engine/renderers/Indicator/kst.ts +3 -3
  438. package/src/engine/renderers/Indicator/ma.ts +1 -1
  439. package/src/engine/renderers/Indicator/macd.ts +4 -21
  440. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +127 -2
  441. package/src/engine/renderers/Indicator/mfi.ts +3 -22
  442. package/src/engine/renderers/Indicator/mom.ts +9 -30
  443. package/src/engine/renderers/Indicator/obv.ts +3 -21
  444. package/src/engine/renderers/Indicator/parkinson.ts +3 -23
  445. package/src/engine/renderers/Indicator/pivot.ts +2 -2
  446. package/src/engine/renderers/Indicator/pvt.ts +3 -21
  447. package/src/engine/renderers/Indicator/roc.ts +4 -23
  448. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  449. package/src/engine/renderers/Indicator/sar.ts +3 -3
  450. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +11 -4
  451. package/src/engine/renderers/Indicator/shared/dashedLines.ts +81 -0
  452. package/src/engine/renderers/Indicator/shared/titleInfo.ts +52 -0
  453. package/src/engine/renderers/Indicator/shared/webglBand.ts +23 -0
  454. package/src/engine/renderers/Indicator/stoch.ts +6 -71
  455. package/src/engine/renderers/Indicator/structure.ts +2 -2
  456. package/src/engine/renderers/Indicator/supertrend.ts +3 -3
  457. package/src/engine/renderers/Indicator/tema.ts +5 -26
  458. package/src/engine/renderers/Indicator/trix.ts +3 -3
  459. package/src/engine/renderers/Indicator/vma.ts +3 -22
  460. package/src/engine/renderers/Indicator/volumeProfile.ts +2 -2
  461. package/src/engine/renderers/Indicator/vwap.ts +3 -21
  462. package/src/engine/renderers/Indicator/wma.ts +5 -26
  463. package/src/engine/renderers/Indicator/wmsr.ts +9 -30
  464. package/src/engine/renderers/Indicator/zones.ts +2 -2
  465. package/src/engine/renderers/candle.ts +1 -1
  466. package/src/engine/renderers/comparisonLine.ts +1 -0
  467. package/src/engine/renderers/extremaMarkers.ts +1 -0
  468. package/src/engine/renderers/lastPrice.ts +5 -2
  469. package/src/engine/renderers/leftYAxis.ts +77 -0
  470. package/src/engine/renderers/subVolume.ts +3 -3
  471. package/src/engine/renderers/timeAxis.ts +16 -13
  472. package/src/engine/renderers/timeShare.ts +271 -0
  473. package/src/engine/renderers/yAxis.ts +9 -1
  474. package/src/engine/scale/price.ts +2 -2
  475. package/src/engine/theme/fonts.ts +1 -1
  476. package/src/engine/utils/klineConfig.ts +1 -5
  477. package/src/engine/viewport/chartViewportManager.ts +6 -5
  478. package/src/plugin/types.ts +1 -0
  479. package/src/semantic/types.ts +1 -1
  480. package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +14 -0
  481. package/src/tokens/theme-base.ts +36 -0
  482. package/src/tokens/theme-china.ts +4 -0
  483. package/src/tokens/theme-dark.ts +12 -32
  484. package/src/tokens/theme-light.ts +13 -33
  485. package/src/tokens/types.ts +9 -0
  486. package/src/types/price.ts +13 -0
  487. package/src/utils/dateFormat.ts +27 -4
  488. package/src/utils/kLineDraw/axis.ts +40 -107
  489. package/src/utils/volumePrice.ts +2 -2
  490. package/src/version.ts +1 -1
@@ -16,6 +16,7 @@ import { InteractionController } from '../controller/interaction'
16
16
  import { UpdateLevel } from '../layout/pane'
17
17
  import type { VisibleRange } from '../layout/pane'
18
18
  import { DrawingStore } from '../drawing'
19
+ import type { ChartModeHandler } from '../modes/types'
19
20
  import { createMainIndicatorLegendRendererPlugin } from '../renderers/Indicator/mainIndicatorLegend'
20
21
  import { createDrawingRendererPlugin, createDrawingLabelOverlayPlugin } from '../drawing/plugin'
21
22
  import { createGridLinesRendererPlugin } from '../renderers/gridLines'
@@ -25,6 +26,7 @@ import { createLastPriceLineRendererPlugin, createLastPriceLabelRegistrarPlugin
25
26
  import { createCustomMarkersRenderer } from '../renderers/customMarkers'
26
27
  import { createExtremaMarkersRendererPlugin } from '../renderers/extremaMarkers'
27
28
  import { createYAxisRendererPlugin } from '../renderers/yAxis'
29
+ import { createLeftYAxisRendererPlugin } from '../renderers/leftYAxis'
28
30
  import { createCrosshairRendererPlugin } from '../renderers/crosshair'
29
31
  import { createTimeAxisRendererPlugin } from '../renderers/timeAxis'
30
32
 
@@ -33,7 +35,7 @@ type ResolvedChartOptions = Omit<ChartOptions, 'kWidth' | 'kGap'> & {
33
35
  kGap: number
34
36
  }
35
37
 
36
- export type FrameContext = {
38
+ type FrameContext = {
37
39
  vp: Viewport
38
40
  range: VisibleRange
39
41
  kLinePositions: KLinePositions
@@ -62,6 +64,7 @@ export interface RendererDependencies {
62
64
  getViewportManager: () => ChartViewportManager
63
65
  getDataManager: () => ChartDataManager
64
66
  getIndicatorManager: () => ChartIndicatorManager
67
+ getActiveMode: () => ChartModeHandler
65
68
  }
66
69
 
67
70
  export class ChartRenderer {
@@ -127,6 +130,19 @@ export class ChartRenderer {
127
130
  price: interaction.crosshairPrice,
128
131
  }),
129
132
  }))
133
+ this.useDrawingPlugin(createLeftYAxisRendererPlugin({
134
+ axisWidth: opt.leftAxisWidth,
135
+ yPaddingPx: opt.yPaddingPx,
136
+ getCrosshair: () => {
137
+ const pos = interaction.crosshairPos
138
+ const price = interaction.crosshairPrice
139
+ const activePaneId = interaction.activePaneId
140
+ if (pos && price !== null) {
141
+ return { y: pos.y, price, activePaneId }
142
+ }
143
+ return null
144
+ },
145
+ }))
130
146
  this.useDrawingPlugin(createTimeAxisRendererPlugin({
131
147
  height: opt.bottomAxisHeight,
132
148
  getCrosshair: () => {
@@ -203,19 +219,24 @@ export class ChartRenderer {
203
219
 
204
220
  const frame = this.prepareFrameData(level)
205
221
  if (!frame) {
206
- if (this.deps.getDataManager().getInternalData().length === 0) this.clearAllCanvases()
222
+ const dataManager = this.deps.getDataManager()
223
+ if (dataManager.getInternalData().length === 0 && dataManager.getTimeShareData().length === 0) this.clearAllCanvases()
207
224
  return
208
225
  }
209
226
 
210
227
  const { vp, range, kLinePositions, kLineCenters, kBarRects, kWidthPx, useCachedFrame } = frame
211
228
 
212
- this.deps.getInteraction().setKLinePositions(kLinePositions, range, kWidthPx)
229
+ this.deps.getInteraction().setKLinePositions(kLinePositions, range, kWidthPx, kLineCenters)
213
230
 
214
- const indicatorManager = this.deps.getIndicatorManager()
215
- indicatorManager.indicatorSchedulerAccessor.setActiveMainIndicators(
216
- [...indicatorManager.mainIndicatorsSignalPeek.entries()].map(([id, entry]) => ({ id, params: entry.params })),
217
- )
218
- const mainIndicatorRange = useCachedFrame ? null : indicatorManager.indicatorSchedulerAccessor.getMainIndicatorPriceRange()
231
+ const dataManager = this.deps.getDataManager()
232
+ const mode = this.deps.getActiveMode()
233
+ if (mode.useIndicatorScheduler) {
234
+ const indicatorManager = this.deps.getIndicatorManager()
235
+ indicatorManager.indicatorSchedulerAccessor.setActiveMainIndicators(
236
+ [...indicatorManager.mainIndicatorsSignalPeek.entries()].map(([id, entry]) => ({ id, params: entry.params })),
237
+ )
238
+ }
239
+ const mainIndicatorRange = useCachedFrame ? null : this.deps.getIndicatorManager().indicatorSchedulerAccessor.getMainIndicatorPriceRange()
219
240
  const hasCrosshair = this.deps.getInteraction().getCrosshairIndex() !== null
220
241
 
221
242
  const { sharedXAxisLabels, sharedXAxisRanges } = this.renderPanes(
@@ -233,7 +254,7 @@ export class ChartRenderer {
233
254
  const vp = useCachedFrame ? this.cachedDrawFrame!.viewport : this.deps.getViewportManager().computeViewport()
234
255
  if (!vp) return null
235
256
 
236
- const internalData = this.deps.getDataManager().getInternalData()
257
+ const internalData = this.deps.getDataManager().getRenderData() as KLineData[]
237
258
  if (internalData.length === 0) return null
238
259
 
239
260
  const opt = this.deps.getOption()
@@ -253,13 +274,16 @@ export class ChartRenderer {
253
274
  const range = { start: Math.max(0, rawRange.start), end: rawRange.end }
254
275
 
255
276
  const dataManager = this.deps.getDataManager()
277
+ const mode = this.deps.getActiveMode()
256
278
  if (!useCachedFrame && (
257
279
  range.start !== dataManager.lastVisibleRange.start
258
280
  || range.end !== dataManager.lastVisibleRange.end
259
281
  || rawRange.start !== dataManager.lastRawVisibleRange.start
260
282
  || rawRange.end !== dataManager.lastRawVisibleRange.end
261
283
  )) {
262
- this.deps.getIndicatorManager().indicatorSchedulerAccessor.updateVisibleRange(range)
284
+ if (mode.useIndicatorScheduler) {
285
+ this.deps.getIndicatorManager().indicatorSchedulerAccessor.updateVisibleRange(range)
286
+ }
263
287
  dataManager.lastVisibleRange = range
264
288
  dataManager.lastRawVisibleRange = rawRange
265
289
  this.checkVisibleRangeGapWhenIdle()
@@ -295,7 +319,34 @@ export class ChartRenderer {
295
319
  kBarRects[i] = { x: barLeftPx / vp.dpr, width: barWidthPx / vp.dpr }
296
320
  }
297
321
 
298
- kWidthPx = getPhysicalKLineConfig(opt.kWidth, opt.kGap, vp.dpr).kWidthPx
322
+ if (mode.debugName === 'TimeShare') {
323
+ const totalWidth = vp.plotWidth
324
+ const count = kLineCenters.length
325
+ if (count > 0) {
326
+ const dpr = vp.dpr
327
+ const step = totalWidth / count
328
+ for (let i = 0; i < count; i++) {
329
+ kLineCenters[i] = Math.round((i + 0.5) * step * dpr) / dpr
330
+ kLinePositions[i] = Math.round(i * step * dpr) / dpr
331
+ }
332
+ kWidthPx = Math.round(totalWidth * dpr / count)
333
+
334
+ const logicalBarWidth = Math.max(1, step * 0.6)
335
+ const barWidthPx = Math.round(logicalBarWidth * dpr)
336
+ const halfBarPx = Math.floor(barWidthPx / 2)
337
+ for (let i = 0; i < count; i++) {
338
+ const centerPx = Math.round(kLineCenters[i] * dpr)
339
+ kBarRects[i] = {
340
+ x: (centerPx - halfBarPx) / dpr,
341
+ width: barWidthPx / dpr,
342
+ }
343
+ }
344
+ } else {
345
+ kWidthPx = getPhysicalKLineConfig(opt.kWidth, opt.kGap, vp.dpr).kWidthPx
346
+ }
347
+ } else {
348
+ kWidthPx = getPhysicalKLineConfig(opt.kWidth, opt.kGap, vp.dpr).kWidthPx
349
+ }
299
350
  this.cachedDrawFrame = {
300
351
  viewport: { ...vp },
301
352
  range: { ...range },
@@ -316,15 +367,28 @@ export class ChartRenderer {
316
367
  }
317
368
  }
318
369
 
370
+ private clearAxisCtx(ctx: CanvasRenderingContext2D, dpr: number, width: number, height: number): void {
371
+ ctx.setTransform(1, 0, 0, 1, 0, 0)
372
+ ctx.scale(dpr, dpr)
373
+ ctx.clearRect(0, 0, width, height + 2 / dpr)
374
+ }
375
+
319
376
  clearAllCanvases(): void {
320
377
  const vp = this.deps.getViewportManager().computeViewport()
321
378
  if (!vp) return
322
379
  for (const r of this.deps.getPaneRenderers()) {
323
- const { mainCtx, overlayCtx, yAxisCtx } = r.getContexts()
380
+ const { mainCtx, overlayCtx, yAxisCtx, leftAxisCtx } = r.getContexts()
324
381
  const pane = r.getPane()
325
382
  mainCtx?.clearRect(0, 0, vp.plotWidth + 1, pane.height + 2 / vp.dpr)
326
383
  overlayCtx?.clearRect(0, 0, vp.plotWidth + 1, pane.height + 2 / vp.dpr)
327
384
  yAxisCtx?.clearRect(0, 0, vp.plotWidth + 1, pane.height + 2 / vp.dpr)
385
+ if (leftAxisCtx) {
386
+ const leftCanvas = leftAxisCtx.canvas
387
+ if (leftCanvas) {
388
+ const laW = leftCanvas.width / vp.dpr
389
+ leftAxisCtx.clearRect(0, 0, laW, pane.height + 2 / vp.dpr)
390
+ }
391
+ }
328
392
  }
329
393
  const xCtx = this.xAxisCtx
330
394
  if (xCtx) {
@@ -354,17 +418,18 @@ export class ChartRenderer {
354
418
  const dataManager = this.deps.getDataManager()
355
419
  const rendererPluginManager = this.deps.getRendererPluginManager()
356
420
  const pluginHost = this.deps.getPluginHost()
421
+ const mode = this.deps.getActiveMode()
357
422
 
358
423
  for (const renderer of this.deps.getPaneRenderers()) {
359
424
  const pane = renderer.getPane()
360
- const { mainCtx, overlayCtx, yAxisCtx } = renderer.getContexts()
425
+ const { mainCtx, overlayCtx, yAxisCtx, leftAxisCtx } = renderer.getContexts()
361
426
  const { candleSurface, lineSurface } = renderer.getWebGL()
362
427
 
363
428
  if (!useCachedFrame) {
364
- const indicatorRange = pane.role === 'price' ? mainIndicatorRange : null
429
+ const indicatorRange = pane.role === 'price' && mode.useIndicatorScheduler ? mainIndicatorRange : null
365
430
  const comparisonRange = pane.id === 'main' ? dataManager.getComparisonEquivalentPriceRange(range) : null
366
431
  const mergedRange = this.mergeNumericRanges(indicatorRange, comparisonRange)
367
- pane.updateRange(dataManager.getInternalData(), range, mergedRange)
432
+ mode.updatePaneRange(pane as any, range, dataManager, mergedRange)
368
433
  if (pane.id === 'main' && this.settings.disableMainPaneVerticalScroll) {
369
434
  pane.yAxis.resetTransform()
370
435
  }
@@ -390,9 +455,11 @@ export class ChartRenderer {
390
455
 
391
456
  if (yAxisCtx && !useCachedFrame) {
392
457
  const yAxisWidth = yAxisCtx.canvas.width / vp.dpr
393
- yAxisCtx.setTransform(1, 0, 0, 1, 0, 0)
394
- yAxisCtx.scale(vp.dpr, vp.dpr)
395
- yAxisCtx.clearRect(0, 0, yAxisWidth, pane.height + 2 / vp.dpr)
458
+ this.clearAxisCtx(yAxisCtx, vp.dpr, yAxisWidth, pane.height)
459
+ }
460
+ if (leftAxisCtx && !useCachedFrame) {
461
+ const leftAxisWidth = leftAxisCtx.canvas.width / vp.dpr
462
+ this.clearAxisCtx(leftAxisCtx, vp.dpr, leftAxisWidth, pane.height)
396
463
  }
397
464
 
398
465
  const opt = this.deps.getOption()
@@ -400,7 +467,7 @@ export class ChartRenderer {
400
467
  ctx: mainCtx!,
401
468
  overlayCtx: overlayCtx ?? undefined,
402
469
  pane: wrapPaneInfo(pane),
403
- data: dataManager.getInternalData(),
470
+ data: dataManager.getRenderData(),
404
471
  period: dataManager.currentPeriod,
405
472
  comparisonData: dataManager.getComparisonData(),
406
473
  comparisonSymbols: dataManager.getComparisonSpecs(),
@@ -417,6 +484,7 @@ export class ChartRenderer {
417
484
  markerManager: this.markerManager,
418
485
  crosshairIndex: this.deps.getInteraction().getCrosshairIndex(),
419
486
  yAxisCtx: yAxisCtx ?? undefined,
487
+ leftAxisCtx: leftAxisCtx ?? undefined,
420
488
  candleWebGLSurface: candleSurface ?? undefined,
421
489
  lineWebGLSurface: lineSurface ?? undefined,
422
490
  zoomLevel: this.deps.getCurrentZoomLevel(),
@@ -446,6 +514,11 @@ export class ChartRenderer {
446
514
  if (yAxisErrors.length > 0) {
447
515
  pluginHost.events.emit('renderer:error', { paneId: pane.id, errors: yAxisErrors })
448
516
  }
517
+
518
+ const leftAxisErrors = rendererPluginManager.renderPlugin('leftYAxis', context)
519
+ if (leftAxisErrors.length > 0) {
520
+ pluginHost.events.emit('renderer:error', { paneId: pane.id, errors: leftAxisErrors })
521
+ }
449
522
  }
450
523
  }
451
524
 
@@ -498,7 +571,7 @@ export class ChartRenderer {
498
571
  priceRange: { maxPrice: 0, minPrice: 0 },
499
572
  },
500
573
  period: this.deps.getDataManager().currentPeriod,
501
- data: this.deps.getDataManager().getInternalData(),
574
+ data: this.deps.getDataManager().getRenderData(),
502
575
  range,
503
576
  scrollLeft: vp.scrollLeft,
504
577
  kWidth: opt.kWidth,
@@ -10,13 +10,13 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
10
10
  import type { IndicatorScheduler, ATRSchedulerConfig } from '../../indicators/scheduler'
11
11
  import { createAtrScaleRendererPlugin } from './scale/atr_scale'
12
12
  import { calcATRData } from '../../indicators/calculators'
13
- import type { KLineData } from '../../../types/price'
13
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
14
14
 
15
15
  type LinePoint = { x: number; y: number }
16
16
 
17
17
  const ATR_COLOR = '#d97706'
18
18
 
19
- export interface ATRRendererOptions {
19
+ interface ATRRendererOptions {
20
20
  paneId?: string
21
21
  }
22
22
 
@@ -34,7 +34,7 @@ function getATRStateKey(host: PluginHost | null, paneId: string): string | null
34
34
  return resolveStateKey(meta.stateKey, paneId)
35
35
  }
36
36
 
37
- export function createATRRendererPlugin(options: ATRRendererOptions = {}): RendererPluginWithHost {
37
+ function createATRRendererPlugin(options: ATRRendererOptions = {}): RendererPluginWithHost {
38
38
  const { paneId = 'sub_ATR' } = options
39
39
  let pluginHost: PluginHost | null = null
40
40
 
@@ -206,32 +206,7 @@ function drawWithCanvas2D(
206
206
  ctx.restore()
207
207
  }
208
208
 
209
- /**
210
- * 获取 ATR 标题信息(供 paneTitle 使用)
211
- */
212
- export function getATRTitleInfo(
213
- _data: KLineData[],
214
- index: number | null,
215
- params: Record<string, number | boolean | string>,
216
- pluginHost: PluginHost,
217
- paneId: string,
218
- ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
219
- if (index === null) return null
220
- const period = (params.period as number) ?? 14
221
- const state = pluginHost.getSharedState<ATRRenderState>(createATRStateKey(paneId))
222
- if (!state) return null
223
-
224
- const atr = state.series[index]
225
- if (atr === undefined) return null
226
-
227
- return {
228
- name: 'ATR',
229
- params: [period],
230
- values: [
231
- { label: 'ATR', value: atr, color: ATR_COLOR },
232
- ],
233
- }
234
- }
209
+ const getATRTitleInfo = createSingleLineTitleInfo({ createStateKey: createATRStateKey, name: 'ATR', defaultPeriod: 14, color: ATR_COLOR })
235
210
 
236
211
  @Indicator({
237
212
  name: 'atr',
@@ -9,6 +9,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
9
  import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer, GetTitleInfoFn, TitleInfo, TitleValueItem } from '../../indicators/indicatorMetadata'
10
10
  import type { BOLLSchedulerConfig, IndicatorScheduler } from '../../indicators/scheduler'
11
11
  import { calcBOLLData } from '../../indicators/calculators'
12
+ import { getRgbaAlpha, toOpaqueRgba, compositeLineSurface } from './shared/webglBand'
12
13
 
13
14
  type LinePoint = { x: number; y: number }
14
15
 
@@ -20,28 +21,6 @@ interface PriceData {
20
21
  lower: number
21
22
  }
22
23
 
23
- function getRgbaAlpha(color: string): number {
24
- const match = color.match(/^rgba\([^,]+,[^,]+,[^,]+,\s*([\d.]+)\)$/i)
25
- if (!match) return 1
26
- const alpha = Number(match[1])
27
- return Number.isFinite(alpha) ? alpha : 1
28
- }
29
-
30
- function toOpaqueRgba(color: string): string {
31
- return color.replace(/,\s*[\d.]+\s*\)$/i, ', 1)')
32
- }
33
-
34
- function compositeLineSurface(
35
- context: RenderContext,
36
- surface: NonNullable<RenderContext['lineWebGLSurface']>,
37
- alpha = 1
38
- ): void {
39
- surface.compositeTo(context.ctx, {
40
- alpha,
41
- imageSmoothingEnabled: false,
42
- })
43
- }
44
-
45
24
  function drawBOLLWithWebGL(
46
25
  context: RenderContext,
47
26
  data: {
@@ -110,7 +89,7 @@ function buildPriceCacheKey(
110
89
  return `${range.start}|${range.end}|${dataLength}|${lastTimestamp}|${period}`
111
90
  }
112
91
 
113
- export function getBOLLStateKey(host: PluginHost | null): string | null {
92
+ function getBOLLStateKey(host: PluginHost | null): string | null {
114
93
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
115
94
  if (!scheduler) {
116
95
  console.warn('[BOLLRenderer] Scheduler not available via service locator')
@@ -155,7 +134,7 @@ const composeBOLLRenderState: IndicatorRenderStateComposer = (bundle, range, tim
155
134
  }
156
135
  }
157
136
 
158
- export const getBOLLTitleInfo: GetTitleInfoFn = (
137
+ const getBOLLTitleInfo: GetTitleInfoFn = (
159
138
  _data: KLineData[],
160
139
  index: number | null,
161
140
  _params: Record<string, number | boolean | string>,
@@ -9,11 +9,11 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
9
  import type { IndicatorScheduler, CCISchedulerConfig } from '../../indicators/scheduler'
10
10
  import { createCciScaleRendererPlugin } from './scale/cci_scale'
11
11
  import { calcCCIData } from '../../indicators/calculators'
12
- import type { KLineData } from '../../../types/price'
12
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
13
13
 
14
14
  type LinePoint = { x: number; y: number }
15
15
 
16
- export interface CCIRendererOptions {
16
+ interface CCIRendererOptions {
17
17
  /** 目标 pane ID(默认 'sub') */
18
18
  paneId?: string
19
19
  }
@@ -35,7 +35,7 @@ function getCCIStateKey(host: PluginHost | null, paneId: string): string | null
35
35
  /**
36
36
  * 创建 CCI 渲染器插件
37
37
  */
38
- export function createCCIRendererPlugin(options: CCIRendererOptions = {}): RendererPluginWithHost {
38
+ function createCCIRendererPlugin(options: CCIRendererOptions = {}): RendererPluginWithHost {
39
39
  const { paneId = 'sub' } = options
40
40
  let pluginHost: PluginHost | null = null
41
41
 
@@ -240,30 +240,12 @@ function drawCCILineWithCanvas2D(
240
240
  /**
241
241
  * 获取 CCI 标题信息(供 paneTitle 使用)
242
242
  */
243
- export function getCCITitleInfo(
244
- _data: KLineData[],
245
- index: number | null,
246
- params: Record<string, number | boolean | string>,
247
- pluginHost: PluginHost,
248
- paneId: string,
249
- ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
250
- if (index === null) return null
251
- const period = (params.period as number) ?? 14
252
- const colors = resolveThemeColors('light')
253
- const state = pluginHost.getSharedState<CCIRenderState>(createCCIStateKey(paneId))
254
- if (!state) return null
255
-
256
- const cci = state.series[index]
257
- if (cci === undefined) return null
258
-
259
- return {
260
- name: 'CCI',
261
- params: [period],
262
- values: [
263
- { label: 'CCI', value: cci, color: colors.cci.cci },
264
- ],
265
- }
266
- }
243
+ const getCCITitleInfo = createSingleLineTitleInfo({
244
+ createStateKey: createCCIStateKey,
245
+ name: 'CCI',
246
+ defaultPeriod: 14,
247
+ getColor: (colors) => colors.cci.cci,
248
+ })
267
249
 
268
250
  @Indicator({
269
251
  name: 'cci',
@@ -2,8 +2,7 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { ChaikinVolRenderState } from '../../indicators/chaikinVolState'
4
4
  import { createChaikinVolStateKey, EMPTY_CHAIKIN_VOL_STATE } from '../../indicators/chaikinVolState'
5
- import type { TitleInfo } from '../../indicators/indicatorMetadata'
6
- import type { KLineData } from '../../../types/price'
5
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
7
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
7
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
8
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
@@ -28,7 +27,7 @@ function getChaikinVolStateKey(host: PluginHost | null, paneId: string): string
28
27
  return resolveStateKey(meta.stateKey, paneId)
29
28
  }
30
29
 
31
- export function createChaikinVolRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
30
+ function createChaikinVolRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
32
31
  const { paneId = 'sub_ChaikinVol' } = options
33
32
  let pluginHost: PluginHost | null = null
34
33
 
@@ -126,26 +125,7 @@ export function createChaikinVolRendererPlugin(options: { paneId?: string } = {}
126
125
  }
127
126
  }
128
127
 
129
- export function getChaikinVolTitleInfo(
130
- _data: KLineData[],
131
- index: number | null,
132
- params: Record<string, number | boolean | string>,
133
- host: PluginHost,
134
- paneId: string,
135
- ): TitleInfo | null {
136
- if (index === null) return null
137
- const emaPeriod = (params.emaPeriod as number) ?? 10
138
- const rocPeriod = (params.rocPeriod as number) ?? 10
139
- const state = host.getSharedState<ChaikinVolRenderState>(createChaikinVolStateKey(paneId))
140
- const value = state?.series[index]
141
- if (value === undefined) return null
142
-
143
- return {
144
- name: 'ChaikinVol',
145
- params: [emaPeriod, rocPeriod],
146
- values: [{ label: 'ChaikinVol', value, color: CHAIKIN_VOL_COLOR }],
147
- }
148
- }
128
+ const getChaikinVolTitleInfo = createSingleLineTitleInfo({ createStateKey: createChaikinVolStateKey, name: 'ChaikinVol', getParams: (p) => [(p.emaPeriod as number) ?? 10, (p.rocPeriod as number) ?? 10], color: CHAIKIN_VOL_COLOR })
149
129
 
150
130
  @Indicator({
151
131
  name: 'chaikinVol',
@@ -2,8 +2,7 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { CMFRenderState } from '../../indicators/cmfState'
4
4
  import { createCMFStateKey, EMPTY_CMF_STATE } from '../../indicators/cmfState'
5
- import type { TitleInfo } from '../../indicators/indicatorMetadata'
6
- import type { KLineData } from '../../../types/price'
5
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
7
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
7
  import { createFixedRangeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
9
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
@@ -28,7 +27,7 @@ function getCMFStateKey(host: PluginHost | null, paneId: string): string | null
28
27
  return resolveStateKey(meta.stateKey, paneId)
29
28
  }
30
29
 
31
- export function createCMFRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
30
+ function createCMFRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
32
31
  const { paneId = 'sub_CMF' } = options
33
32
  let pluginHost: PluginHost | null = null
34
33
 
@@ -125,25 +124,7 @@ export function createCMFRendererPlugin(options: { paneId?: string } = {}): Rend
125
124
  }
126
125
  }
127
126
 
128
- export function getCMFTitleInfo(
129
- _data: KLineData[],
130
- index: number | null,
131
- params: Record<string, number | boolean | string>,
132
- host: PluginHost,
133
- paneId: string,
134
- ): TitleInfo | null {
135
- if (index === null) return null
136
- const period = (params.period as number) ?? 20
137
- const state = host.getSharedState<CMFRenderState>(createCMFStateKey(paneId))
138
- const value = state?.series[index]
139
- if (value === undefined) return null
140
-
141
- return {
142
- name: 'CMF',
143
- params: [period],
144
- values: [{ label: 'CMF', value, color: CMF_COLOR }],
145
- }
146
- }
127
+ const getCMFTitleInfo = createSingleLineTitleInfo({ createStateKey: createCMFStateKey, name: 'CMF', defaultPeriod: 20, color: CMF_COLOR })
147
128
 
148
129
  @Indicator({
149
130
  name: 'cmf',
@@ -1,10 +1,10 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
- import type { KLineData } from '../../../types/price'
2
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
3
3
  import { RENDERER_PRIORITY } from '../../../plugin'
4
4
  import type { DEMARenderState } from '../../indicators/demaState'
5
5
  import { createDEMAStateKey, EMPTY_DEMA_STATE } from '../../indicators/demaState'
6
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
7
- import { resolveStateKey, type TitleInfo, type TitleValueItem, type GetTitleInfoFn } from '../../indicators/indicatorMetadata'
7
+ import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
8
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
9
9
  import type { IndicatorScheduler, DEMASchedulerConfig } from '../../indicators/scheduler'
10
10
  import { calcDEMAData } from '../../indicators/calculators'
@@ -13,7 +13,7 @@ const DEMA_COLOR = '#6366f1'
13
13
 
14
14
  type Point = { x: number; y: number }
15
15
 
16
- export interface DEMARendererOptions {
16
+ interface DEMARendererOptions {
17
17
  paneId?: string
18
18
  }
19
19
 
@@ -31,7 +31,7 @@ function getDEMAStateKey(host: PluginHost | null, paneId: string): string | null
31
31
  return resolveStateKey(meta.stateKey, paneId)
32
32
  }
33
33
 
34
- export function createDEMARendererPlugin(options: DEMARendererOptions = {}): RendererPluginWithHost {
34
+ function createDEMARendererPlugin(options: DEMARendererOptions = {}): RendererPluginWithHost {
35
35
  const { paneId = 'main' } = options
36
36
  let pluginHost: PluginHost | null = null
37
37
 
@@ -122,28 +122,7 @@ export function createDEMARendererPlugin(options: DEMARendererOptions = {}): Ren
122
122
  }
123
123
  }
124
124
 
125
- export const getDEMATitleInfo: GetTitleInfoFn = (
126
- _data: KLineData[],
127
- index: number | null,
128
- _params: Record<string, number | boolean | string>,
129
- pluginHost: PluginHost,
130
- paneId: string,
131
- ): TitleInfo | null => {
132
- if (index === null) return null
133
-
134
- const stateKey = createDEMAStateKey(paneId)
135
- const state = pluginHost?.getSharedState<DEMARenderState>(stateKey)
136
- if (!state || state.visibleMin > state.visibleMax) return null
137
-
138
- const value = state.series[index]
139
- if (value === undefined) return null
140
-
141
- return {
142
- name: 'DEMA',
143
- params: [state.params.period],
144
- values: [{ label: 'DEMA', value, color: '#6366f1' }],
145
- }
146
- }
125
+ const getDEMATitleInfo = createSingleLineTitleInfo({ createStateKey: createDEMAStateKey, name: 'DEMA', getParams: (p) => [p.period as number], color: DEMA_COLOR })
147
126
 
148
127
  @Indicator({
149
128
  name: 'dema',
@@ -15,7 +15,7 @@ const DONCHIAN_LOWER_COLOR = '#0891b2'
15
15
 
16
16
  type Point = { x: number; y: number }
17
17
 
18
- export interface DonchianRendererOptions { paneId?: string }
18
+ interface DonchianRendererOptions { paneId?: string }
19
19
 
20
20
  function getDonchianStateKey(host: PluginHost | null, paneId: string): string | null {
21
21
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
@@ -31,7 +31,7 @@ function getDonchianStateKey(host: PluginHost | null, paneId: string): string |
31
31
  return resolveStateKey(meta.stateKey, paneId)
32
32
  }
33
33
 
34
- export function createDonchianRendererPlugin(options: DonchianRendererOptions = {}): RendererPluginWithHost {
34
+ function createDonchianRendererPlugin(options: DonchianRendererOptions = {}): RendererPluginWithHost {
35
35
  const { paneId = 'main' } = options
36
36
  let pluginHost: PluginHost | null = null
37
37
 
@@ -124,7 +124,7 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
124
124
  ctx.stroke()
125
125
  }
126
126
 
127
- export function getDonchianTitleInfo(
127
+ function getDonchianTitleInfo(
128
128
  _data: KLineData[],
129
129
  index: number | null,
130
130
  params: Record<string, number | boolean | string>,
@@ -9,31 +9,10 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
9
  import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer, GetTitleInfoFn, TitleInfo, TitleValueItem } from '../../indicators/indicatorMetadata'
10
10
  import type { ENESchedulerConfig, IndicatorScheduler } from '../../indicators/scheduler'
11
11
  import { calcENEData } from '../../indicators/calculators'
12
+ import { getRgbaAlpha, toOpaqueRgba, compositeLineSurface } from './shared/webglBand'
12
13
 
13
14
  type LinePoint = { x: number; y: number }
14
15
 
15
- function getRgbaAlpha(color: string): number {
16
- const match = color.match(/^rgba\([^,]+,[^,]+,[^,]+,\s*([\d.]+)\)$/i)
17
- if (!match) return 1
18
- const alpha = Number(match[1])
19
- return Number.isFinite(alpha) ? alpha : 1
20
- }
21
-
22
- function toOpaqueRgba(color: string): string {
23
- return color.replace(/,\s*[\d.]+\s*\)$/i, ', 1)')
24
- }
25
-
26
- function compositeLineSurface(
27
- context: RenderContext,
28
- surface: NonNullable<RenderContext['lineWebGLSurface']>,
29
- alpha = 1
30
- ): void {
31
- surface.compositeTo(context.ctx, {
32
- alpha,
33
- imageSmoothingEnabled: false,
34
- })
35
- }
36
-
37
16
  function drawENEWithWebGL(
38
17
  context: RenderContext,
39
18
  data: {
@@ -94,7 +73,7 @@ function drawENEWithWebGL(
94
73
  * 3. 配置变更通过外部 IndicatorScheduler 处理
95
74
  * 4. 纯绘制函数,无副作用
96
75
  */
97
- export function getENEStateKey(host: PluginHost | null): string | null {
76
+ function getENEStateKey(host: PluginHost | null): string | null {
98
77
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
99
78
  if (!scheduler) {
100
79
  console.warn('[ENERenderer] Scheduler not available via service locator')
@@ -289,7 +268,7 @@ export function createENERendererPlugin(): RendererPluginWithHost {
289
268
  }
290
269
  }
291
270
 
292
- export const getENETitleInfo: GetTitleInfoFn = (
271
+ const getENETitleInfo: GetTitleInfoFn = (
293
272
  _data: KLineData[],
294
273
  index: number | null,
295
274
  _params: Record<string, number | boolean | string>,
@@ -34,7 +34,7 @@ function buildEXPMACacheKey(
34
34
  ].join('|')
35
35
  }
36
36
 
37
- export function getEXPMAStateKey(host: PluginHost | null): string | null {
37
+ function getEXPMAStateKey(host: PluginHost | null): string | null {
38
38
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
39
39
  if (!scheduler) {
40
40
  console.warn('[EXPMARenderer] Scheduler not available via service locator')
@@ -215,7 +215,7 @@ export function createEXPMARendererPlugin(): RendererPluginWithHost {
215
215
  }
216
216
  }
217
217
 
218
- export const getEXPMATitleInfo: GetTitleInfoFn = (
218
+ const getEXPMATitleInfo: GetTitleInfoFn = (
219
219
  _data: KLineData[],
220
220
  index: number | null,
221
221
  _params: Record<string, number | boolean | string>,