@363045841yyt/klinechart-core 0.8.6 → 0.8.8

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 (501) hide show
  1. package/dist/config/chartSettings.d.ts +18 -2
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +8 -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 +56 -2
  7. package/dist/controllers/createChartController.js.map +1 -1
  8. package/dist/controllers/types.d.ts +36 -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 +32 -1
  61. package/dist/engine/chart.d.ts.map +1 -1
  62. package/dist/engine/chart.js +148 -7
  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 +39 -14
  71. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  72. package/dist/engine/data/chartDataManager.js +494 -202
  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 +113 -18
  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/gridLines.d.ts.map +1 -1
  309. package/dist/engine/renderers/gridLines.js +7 -35
  310. package/dist/engine/renderers/gridLines.js.map +1 -1
  311. package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
  312. package/dist/engine/renderers/lastPrice.js +7 -2
  313. package/dist/engine/renderers/lastPrice.js.map +1 -1
  314. package/dist/engine/renderers/leftYAxis.d.ts +11 -0
  315. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -0
  316. package/dist/engine/renderers/leftYAxis.js +79 -0
  317. package/dist/engine/renderers/leftYAxis.js.map +1 -0
  318. package/dist/engine/renderers/subVolume.d.ts +1 -13
  319. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  320. package/dist/engine/renderers/subVolume.js +1 -1
  321. package/dist/engine/renderers/subVolume.js.map +1 -1
  322. package/dist/engine/renderers/timeAxis.d.ts +0 -2
  323. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  324. package/dist/engine/renderers/timeAxis.js +4 -1
  325. package/dist/engine/renderers/timeAxis.js.map +1 -1
  326. package/dist/engine/renderers/timeShare.d.ts +3 -0
  327. package/dist/engine/renderers/timeShare.d.ts.map +1 -0
  328. package/dist/engine/renderers/timeShare.js +260 -0
  329. package/dist/engine/renderers/timeShare.js.map +1 -0
  330. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  331. package/dist/engine/renderers/yAxis.js +25 -23
  332. package/dist/engine/renderers/yAxis.js.map +1 -1
  333. package/dist/engine/scale/price.d.ts +0 -7
  334. package/dist/engine/scale/price.d.ts.map +1 -1
  335. package/dist/engine/scale/price.js +3 -2
  336. package/dist/engine/scale/price.js.map +1 -1
  337. package/dist/engine/theme/fonts.d.ts +0 -2
  338. package/dist/engine/theme/fonts.d.ts.map +1 -1
  339. package/dist/engine/theme/fonts.js +1 -1
  340. package/dist/engine/theme/fonts.js.map +1 -1
  341. package/dist/engine/utils/klineConfig.d.ts.map +1 -1
  342. package/dist/engine/utils/klineConfig.js +1 -5
  343. package/dist/engine/utils/klineConfig.js.map +1 -1
  344. package/dist/engine/utils/tickPosition.d.ts +12 -0
  345. package/dist/engine/utils/tickPosition.d.ts.map +1 -1
  346. package/dist/engine/utils/tickPosition.js +15 -0
  347. package/dist/engine/utils/tickPosition.js.map +1 -1
  348. package/dist/engine/viewport/chartViewportManager.d.ts +0 -4
  349. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  350. package/dist/engine/viewport/chartViewportManager.js +10 -13
  351. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  352. package/dist/plugin/types.d.ts +10 -0
  353. package/dist/plugin/types.d.ts.map +1 -1
  354. package/dist/plugin/types.js.map +1 -1
  355. package/dist/semantic/types.d.ts +1 -1
  356. package/dist/semantic/types.d.ts.map +1 -1
  357. package/dist/tokens/theme-base.d.ts +5 -0
  358. package/dist/tokens/theme-base.d.ts.map +1 -0
  359. package/dist/tokens/theme-base.js +31 -0
  360. package/dist/tokens/theme-base.js.map +1 -0
  361. package/dist/tokens/theme-china.d.ts.map +1 -1
  362. package/dist/tokens/theme-china.js +3 -0
  363. package/dist/tokens/theme-china.js.map +1 -1
  364. package/dist/tokens/theme-dark.d.ts.map +1 -1
  365. package/dist/tokens/theme-dark.js +11 -30
  366. package/dist/tokens/theme-dark.js.map +1 -1
  367. package/dist/tokens/theme-light.d.ts.map +1 -1
  368. package/dist/tokens/theme-light.js +11 -30
  369. package/dist/tokens/theme-light.js.map +1 -1
  370. package/dist/tokens/types.d.ts +7 -0
  371. package/dist/tokens/types.d.ts.map +1 -1
  372. package/dist/types/price.d.ts +8 -0
  373. package/dist/types/price.d.ts.map +1 -1
  374. package/dist/types/price.js +4 -0
  375. package/dist/types/price.js.map +1 -1
  376. package/dist/utils/dateFormat.d.ts +5 -42
  377. package/dist/utils/dateFormat.d.ts.map +1 -1
  378. package/dist/utils/dateFormat.js +24 -4
  379. package/dist/utils/dateFormat.js.map +1 -1
  380. package/dist/utils/kLineDraw/axis.d.ts +9 -28
  381. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  382. package/dist/utils/kLineDraw/axis.js +33 -58
  383. package/dist/utils/kLineDraw/axis.js.map +1 -1
  384. package/dist/utils/volumePrice.d.ts +0 -40
  385. package/dist/utils/volumePrice.d.ts.map +1 -1
  386. package/dist/utils/volumePrice.js +2 -2
  387. package/dist/utils/volumePrice.js.map +1 -1
  388. package/dist/version.d.ts +1 -1
  389. package/dist/version.js +1 -1
  390. package/package.json +1 -1
  391. package/src/config/chartSettings.ts +8 -1
  392. package/src/controllers/createChartController.ts +59 -2
  393. package/src/controllers/types.ts +38 -17
  394. package/src/data-fetchers/__tests__/dataBuffer.test.ts +39 -5
  395. package/src/data-fetchers/baostock.ts +1 -1
  396. package/src/data-fetchers/dataBuffer.ts +48 -11
  397. package/src/data-fetchers/dataBufferTypes.ts +11 -0
  398. package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -4
  399. package/src/data-fetchers/gotdx/gotdx.ts +6 -0
  400. package/src/data-fetchers/gotdx.ts +45 -7
  401. package/src/data-fetchers/hundred-mock.ts +1 -1
  402. package/src/data-fetchers/index.ts +10 -20
  403. package/src/data-fetchers/router.ts +12 -1
  404. package/src/data-fetchers/thousand-mock.ts +1 -1
  405. package/src/data-fetchers/timeShareBuffer.ts +92 -0
  406. package/src/data-fetchers/tradingview.ts +2 -2
  407. package/src/data-fetchers/types.ts +15 -2
  408. package/src/engine/__tests__/chart.dpr.test.ts +1 -0
  409. package/src/engine/chart.ts +167 -9
  410. package/src/engine/chartTypes.ts +3 -0
  411. package/src/engine/controller/__tests__/interaction.dpr.test.ts +2 -0
  412. package/src/engine/controller/interaction.ts +80 -28
  413. package/src/engine/data/chartDataManager.ts +560 -229
  414. package/src/engine/draw/pixelAlign.ts +1 -1
  415. package/src/engine/indicators/__tests__/_propertyAssertions.ts +2 -2
  416. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -1
  417. package/src/engine/indicators/calculators.ts +83 -233
  418. package/src/engine/indicators/chartIndicatorManager.ts +3 -2
  419. package/src/engine/indicators/macdState.ts +1 -1
  420. package/src/engine/indicators/registerBuiltins.ts +1 -0
  421. package/src/engine/indicators/rsiState.ts +1 -1
  422. package/src/engine/indicators/scheduler.ts +1 -7
  423. package/src/engine/layout/chartPaneLayout.ts +26 -6
  424. package/src/engine/modes/kLineMode.ts +57 -0
  425. package/src/engine/modes/timeShareMode.ts +95 -0
  426. package/src/engine/modes/types.ts +63 -0
  427. package/src/engine/paneRenderer.ts +37 -46
  428. package/src/engine/render/chartRenderer.ts +120 -22
  429. package/src/engine/renderers/Indicator/atr.ts +4 -29
  430. package/src/engine/renderers/Indicator/boll.ts +3 -24
  431. package/src/engine/renderers/Indicator/cci.ts +9 -27
  432. package/src/engine/renderers/Indicator/chaikinVol.ts +3 -23
  433. package/src/engine/renderers/Indicator/cmf.ts +3 -22
  434. package/src/engine/renderers/Indicator/dema.ts +5 -26
  435. package/src/engine/renderers/Indicator/donchian.ts +3 -3
  436. package/src/engine/renderers/Indicator/ene.ts +3 -24
  437. package/src/engine/renderers/Indicator/expma.ts +2 -2
  438. package/src/engine/renderers/Indicator/fastk.ts +12 -95
  439. package/src/engine/renderers/Indicator/fib.ts +2 -2
  440. package/src/engine/renderers/Indicator/hma.ts +5 -26
  441. package/src/engine/renderers/Indicator/hv.ts +3 -23
  442. package/src/engine/renderers/Indicator/ichimoku.ts +3 -3
  443. package/src/engine/renderers/Indicator/kama.ts +5 -26
  444. package/src/engine/renderers/Indicator/keltner.ts +3 -3
  445. package/src/engine/renderers/Indicator/kst.ts +3 -3
  446. package/src/engine/renderers/Indicator/ma.ts +1 -1
  447. package/src/engine/renderers/Indicator/macd.ts +4 -21
  448. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +127 -2
  449. package/src/engine/renderers/Indicator/mfi.ts +3 -22
  450. package/src/engine/renderers/Indicator/mom.ts +9 -30
  451. package/src/engine/renderers/Indicator/obv.ts +3 -21
  452. package/src/engine/renderers/Indicator/parkinson.ts +3 -23
  453. package/src/engine/renderers/Indicator/pivot.ts +2 -2
  454. package/src/engine/renderers/Indicator/pvt.ts +3 -21
  455. package/src/engine/renderers/Indicator/roc.ts +4 -23
  456. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  457. package/src/engine/renderers/Indicator/sar.ts +3 -3
  458. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +11 -4
  459. package/src/engine/renderers/Indicator/shared/dashedLines.ts +81 -0
  460. package/src/engine/renderers/Indicator/shared/titleInfo.ts +52 -0
  461. package/src/engine/renderers/Indicator/shared/webglBand.ts +23 -0
  462. package/src/engine/renderers/Indicator/stoch.ts +6 -71
  463. package/src/engine/renderers/Indicator/structure.ts +2 -2
  464. package/src/engine/renderers/Indicator/supertrend.ts +3 -3
  465. package/src/engine/renderers/Indicator/tema.ts +5 -26
  466. package/src/engine/renderers/Indicator/trix.ts +3 -3
  467. package/src/engine/renderers/Indicator/vma.ts +3 -22
  468. package/src/engine/renderers/Indicator/volumeProfile.ts +2 -2
  469. package/src/engine/renderers/Indicator/vwap.ts +3 -21
  470. package/src/engine/renderers/Indicator/wma.ts +5 -26
  471. package/src/engine/renderers/Indicator/wmsr.ts +9 -30
  472. package/src/engine/renderers/Indicator/zones.ts +2 -2
  473. package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +30 -26
  474. package/src/engine/renderers/candle.ts +1 -1
  475. package/src/engine/renderers/comparisonLine.ts +1 -0
  476. package/src/engine/renderers/extremaMarkers.ts +1 -0
  477. package/src/engine/renderers/gridLines.ts +7 -36
  478. package/src/engine/renderers/lastPrice.ts +5 -2
  479. package/src/engine/renderers/leftYAxis.ts +93 -0
  480. package/src/engine/renderers/subVolume.ts +3 -3
  481. package/src/engine/renderers/timeAxis.ts +16 -13
  482. package/src/engine/renderers/timeShare.ts +271 -0
  483. package/src/engine/renderers/yAxis.ts +28 -24
  484. package/src/engine/scale/price.ts +2 -2
  485. package/src/engine/theme/fonts.ts +1 -1
  486. package/src/engine/utils/klineConfig.ts +1 -5
  487. package/src/engine/utils/tickPosition.ts +34 -0
  488. package/src/engine/viewport/chartViewportManager.ts +11 -15
  489. package/src/plugin/types.ts +11 -0
  490. package/src/semantic/types.ts +1 -1
  491. package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +14 -0
  492. package/src/tokens/theme-base.ts +36 -0
  493. package/src/tokens/theme-china.ts +4 -0
  494. package/src/tokens/theme-dark.ts +12 -32
  495. package/src/tokens/theme-light.ts +13 -33
  496. package/src/tokens/types.ts +9 -0
  497. package/src/types/price.ts +13 -0
  498. package/src/utils/dateFormat.ts +27 -4
  499. package/src/utils/kLineDraw/axis.ts +40 -107
  500. package/src/utils/volumePrice.ts +2 -2
  501. package/src/version.ts +1 -1
@@ -2,7 +2,8 @@ import type { KLineData } from '../../types/price'
2
2
  import type { ChartSettings } from '../../config/chartSettings'
3
3
  import type { SymbolSpec } from '../../controllers/types'
4
4
  import { getVisibleRange } from '../viewport/viewport'
5
- import type { RendererPlugin, RendererPluginWithHost, PluginHostImpl, RenderContext, YAxisLabel, XAxisLabel, YAxisRange, XAxisRange } from '../../plugin'
5
+ import type { RendererPlugin, RendererPluginWithHost, PluginHostImpl, RenderContext, YAxisLabel, XAxisLabel, YAxisRange, XAxisRange, YAxisTick } from '../../plugin'
6
+ import { calculateTickCount } from '../utils/tickCount'
6
7
  import { RendererPluginManager, wrapPaneInfo } from '../../plugin'
7
8
  import type { ChartDom, PaneSpec, ChartOptions, KLinePositions, Viewport, ViewportState } from '../chartTypes'
8
9
  import { PaneRenderer } from '../paneRenderer'
@@ -16,6 +17,7 @@ import { InteractionController } from '../controller/interaction'
16
17
  import { UpdateLevel } from '../layout/pane'
17
18
  import type { VisibleRange } from '../layout/pane'
18
19
  import { DrawingStore } from '../drawing'
20
+ import type { ChartModeHandler } from '../modes/types'
19
21
  import { createMainIndicatorLegendRendererPlugin } from '../renderers/Indicator/mainIndicatorLegend'
20
22
  import { createDrawingRendererPlugin, createDrawingLabelOverlayPlugin } from '../drawing/plugin'
21
23
  import { createGridLinesRendererPlugin } from '../renderers/gridLines'
@@ -25,6 +27,7 @@ import { createLastPriceLineRendererPlugin, createLastPriceLabelRegistrarPlugin
25
27
  import { createCustomMarkersRenderer } from '../renderers/customMarkers'
26
28
  import { createExtremaMarkersRendererPlugin } from '../renderers/extremaMarkers'
27
29
  import { createYAxisRendererPlugin } from '../renderers/yAxis'
30
+ import { createLeftYAxisRendererPlugin } from '../renderers/leftYAxis'
28
31
  import { createCrosshairRendererPlugin } from '../renderers/crosshair'
29
32
  import { createTimeAxisRendererPlugin } from '../renderers/timeAxis'
30
33
 
@@ -33,7 +36,7 @@ type ResolvedChartOptions = Omit<ChartOptions, 'kWidth' | 'kGap'> & {
33
36
  kGap: number
34
37
  }
35
38
 
36
- export type FrameContext = {
39
+ type FrameContext = {
37
40
  vp: Viewport
38
41
  range: VisibleRange
39
42
  kLinePositions: KLinePositions
@@ -62,6 +65,7 @@ export interface RendererDependencies {
62
65
  getViewportManager: () => ChartViewportManager
63
66
  getDataManager: () => ChartDataManager
64
67
  getIndicatorManager: () => ChartIndicatorManager
68
+ getActiveMode: () => ChartModeHandler
65
69
  }
66
70
 
67
71
  export class ChartRenderer {
@@ -127,6 +131,19 @@ export class ChartRenderer {
127
131
  price: interaction.crosshairPrice,
128
132
  }),
129
133
  }))
134
+ this.useDrawingPlugin(createLeftYAxisRendererPlugin({
135
+ axisWidth: opt.leftAxisWidth,
136
+ yPaddingPx: opt.yPaddingPx,
137
+ getCrosshair: () => {
138
+ const pos = interaction.crosshairPos
139
+ const price = interaction.crosshairPrice
140
+ const activePaneId = interaction.activePaneId
141
+ if (pos && price !== null) {
142
+ return { y: pos.y, price, activePaneId }
143
+ }
144
+ return null
145
+ },
146
+ }))
130
147
  this.useDrawingPlugin(createTimeAxisRendererPlugin({
131
148
  height: opt.bottomAxisHeight,
132
149
  getCrosshair: () => {
@@ -191,8 +208,15 @@ export class ChartRenderer {
191
208
  const levelToDraw = this.pendingUpdateLevel
192
209
  this.pendingUpdateLevel = UpdateLevel.All
193
210
  this.draw(levelToDraw)
194
- const c = this.deps.getDom().container
211
+ const dom = this.deps.getDom()
212
+ const c = dom.container
195
213
  if (c) {
214
+ const scrollContent = dom.scrollContent
215
+ if (scrollContent) {
216
+ const dataManager = this.deps.getDataManager()
217
+ const w = Math.max(dataManager.getContentWidth(), dataManager.getLeftLoadBufferWidth()) + 'px'
218
+ if (scrollContent.style.width !== w) scrollContent.style.width = w
219
+ }
196
220
  this.deps.getViewportManager().applyPendingScrollLeft(c)
197
221
  }
198
222
  })
@@ -203,19 +227,24 @@ export class ChartRenderer {
203
227
 
204
228
  const frame = this.prepareFrameData(level)
205
229
  if (!frame) {
206
- if (this.deps.getDataManager().getInternalData().length === 0) this.clearAllCanvases()
230
+ const dataManager = this.deps.getDataManager()
231
+ if (dataManager.getInternalData().length === 0 && dataManager.getTimeShareData().length === 0) this.clearAllCanvases()
207
232
  return
208
233
  }
209
234
 
210
235
  const { vp, range, kLinePositions, kLineCenters, kBarRects, kWidthPx, useCachedFrame } = frame
211
236
 
212
- this.deps.getInteraction().setKLinePositions(kLinePositions, range, kWidthPx)
237
+ this.deps.getInteraction().setKLinePositions(kLinePositions, range, kWidthPx, kLineCenters)
213
238
 
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()
239
+ const dataManager = this.deps.getDataManager()
240
+ const mode = this.deps.getActiveMode()
241
+ if (mode.useIndicatorScheduler) {
242
+ const indicatorManager = this.deps.getIndicatorManager()
243
+ indicatorManager.indicatorSchedulerAccessor.setActiveMainIndicators(
244
+ [...indicatorManager.mainIndicatorsSignalPeek.entries()].map(([id, entry]) => ({ id, params: entry.params })),
245
+ )
246
+ }
247
+ const mainIndicatorRange = useCachedFrame ? null : this.deps.getIndicatorManager().indicatorSchedulerAccessor.getMainIndicatorPriceRange()
219
248
  const hasCrosshair = this.deps.getInteraction().getCrosshairIndex() !== null
220
249
 
221
250
  const { sharedXAxisLabels, sharedXAxisRanges } = this.renderPanes(
@@ -233,7 +262,7 @@ export class ChartRenderer {
233
262
  const vp = useCachedFrame ? this.cachedDrawFrame!.viewport : this.deps.getViewportManager().computeViewport()
234
263
  if (!vp) return null
235
264
 
236
- const internalData = this.deps.getDataManager().getInternalData()
265
+ const internalData = this.deps.getDataManager().getRenderData() as KLineData[]
237
266
  if (internalData.length === 0) return null
238
267
 
239
268
  const opt = this.deps.getOption()
@@ -253,13 +282,16 @@ export class ChartRenderer {
253
282
  const range = { start: Math.max(0, rawRange.start), end: rawRange.end }
254
283
 
255
284
  const dataManager = this.deps.getDataManager()
285
+ const mode = this.deps.getActiveMode()
256
286
  if (!useCachedFrame && (
257
287
  range.start !== dataManager.lastVisibleRange.start
258
288
  || range.end !== dataManager.lastVisibleRange.end
259
289
  || rawRange.start !== dataManager.lastRawVisibleRange.start
260
290
  || rawRange.end !== dataManager.lastRawVisibleRange.end
261
291
  )) {
262
- this.deps.getIndicatorManager().indicatorSchedulerAccessor.updateVisibleRange(range)
292
+ if (mode.useIndicatorScheduler) {
293
+ this.deps.getIndicatorManager().indicatorSchedulerAccessor.updateVisibleRange(range)
294
+ }
263
295
  dataManager.lastVisibleRange = range
264
296
  dataManager.lastRawVisibleRange = rawRange
265
297
  this.checkVisibleRangeGapWhenIdle()
@@ -295,7 +327,34 @@ export class ChartRenderer {
295
327
  kBarRects[i] = { x: barLeftPx / vp.dpr, width: barWidthPx / vp.dpr }
296
328
  }
297
329
 
298
- kWidthPx = getPhysicalKLineConfig(opt.kWidth, opt.kGap, vp.dpr).kWidthPx
330
+ if (mode.debugName === 'TimeShare') {
331
+ const totalWidth = vp.plotWidth
332
+ const count = kLineCenters.length
333
+ if (count > 0) {
334
+ const dpr = vp.dpr
335
+ const step = totalWidth / count
336
+ for (let i = 0; i < count; i++) {
337
+ kLineCenters[i] = Math.round((i + 0.5) * step * dpr) / dpr
338
+ kLinePositions[i] = Math.round(i * step * dpr) / dpr
339
+ }
340
+ kWidthPx = Math.round(totalWidth * dpr / count)
341
+
342
+ const logicalBarWidth = Math.max(1, step * 0.6)
343
+ const barWidthPx = Math.round(logicalBarWidth * dpr)
344
+ const halfBarPx = Math.floor(barWidthPx / 2)
345
+ for (let i = 0; i < count; i++) {
346
+ const centerPx = Math.round(kLineCenters[i] * dpr)
347
+ kBarRects[i] = {
348
+ x: (centerPx - halfBarPx) / dpr,
349
+ width: barWidthPx / dpr,
350
+ }
351
+ }
352
+ } else {
353
+ kWidthPx = getPhysicalKLineConfig(opt.kWidth, opt.kGap, vp.dpr).kWidthPx
354
+ }
355
+ } else {
356
+ kWidthPx = getPhysicalKLineConfig(opt.kWidth, opt.kGap, vp.dpr).kWidthPx
357
+ }
299
358
  this.cachedDrawFrame = {
300
359
  viewport: { ...vp },
301
360
  range: { ...range },
@@ -316,15 +375,28 @@ export class ChartRenderer {
316
375
  }
317
376
  }
318
377
 
378
+ private clearAxisCtx(ctx: CanvasRenderingContext2D, dpr: number, width: number, height: number): void {
379
+ ctx.setTransform(1, 0, 0, 1, 0, 0)
380
+ ctx.scale(dpr, dpr)
381
+ ctx.clearRect(0, 0, width, height + 2 / dpr)
382
+ }
383
+
319
384
  clearAllCanvases(): void {
320
385
  const vp = this.deps.getViewportManager().computeViewport()
321
386
  if (!vp) return
322
387
  for (const r of this.deps.getPaneRenderers()) {
323
- const { mainCtx, overlayCtx, yAxisCtx } = r.getContexts()
388
+ const { mainCtx, overlayCtx, yAxisCtx, leftAxisCtx } = r.getContexts()
324
389
  const pane = r.getPane()
325
390
  mainCtx?.clearRect(0, 0, vp.plotWidth + 1, pane.height + 2 / vp.dpr)
326
391
  overlayCtx?.clearRect(0, 0, vp.plotWidth + 1, pane.height + 2 / vp.dpr)
327
392
  yAxisCtx?.clearRect(0, 0, vp.plotWidth + 1, pane.height + 2 / vp.dpr)
393
+ if (leftAxisCtx) {
394
+ const leftCanvas = leftAxisCtx.canvas
395
+ if (leftCanvas) {
396
+ const laW = leftCanvas.width / vp.dpr
397
+ leftAxisCtx.clearRect(0, 0, laW, pane.height + 2 / vp.dpr)
398
+ }
399
+ }
328
400
  }
329
401
  const xCtx = this.xAxisCtx
330
402
  if (xCtx) {
@@ -354,17 +426,18 @@ export class ChartRenderer {
354
426
  const dataManager = this.deps.getDataManager()
355
427
  const rendererPluginManager = this.deps.getRendererPluginManager()
356
428
  const pluginHost = this.deps.getPluginHost()
429
+ const mode = this.deps.getActiveMode()
357
430
 
358
431
  for (const renderer of this.deps.getPaneRenderers()) {
359
432
  const pane = renderer.getPane()
360
- const { mainCtx, overlayCtx, yAxisCtx } = renderer.getContexts()
433
+ const { mainCtx, overlayCtx, yAxisCtx, leftAxisCtx } = renderer.getContexts()
361
434
  const { candleSurface, lineSurface } = renderer.getWebGL()
362
435
 
363
436
  if (!useCachedFrame) {
364
- const indicatorRange = pane.role === 'price' ? mainIndicatorRange : null
437
+ const indicatorRange = pane.role === 'price' && mode.useIndicatorScheduler ? mainIndicatorRange : null
365
438
  const comparisonRange = pane.id === 'main' ? dataManager.getComparisonEquivalentPriceRange(range) : null
366
439
  const mergedRange = this.mergeNumericRanges(indicatorRange, comparisonRange)
367
- pane.updateRange(dataManager.getInternalData(), range, mergedRange)
440
+ mode.updatePaneRange(pane as any, range, dataManager, mergedRange)
368
441
  if (pane.id === 'main' && this.settings.disableMainPaneVerticalScroll) {
369
442
  pane.yAxis.resetTransform()
370
443
  }
@@ -390,9 +463,11 @@ export class ChartRenderer {
390
463
 
391
464
  if (yAxisCtx && !useCachedFrame) {
392
465
  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)
466
+ this.clearAxisCtx(yAxisCtx, vp.dpr, yAxisWidth, pane.height)
467
+ }
468
+ if (leftAxisCtx && !useCachedFrame) {
469
+ const leftAxisWidth = leftAxisCtx.canvas.width / vp.dpr
470
+ this.clearAxisCtx(leftAxisCtx, vp.dpr, leftAxisWidth, pane.height)
396
471
  }
397
472
 
398
473
  const opt = this.deps.getOption()
@@ -400,7 +475,7 @@ export class ChartRenderer {
400
475
  ctx: mainCtx!,
401
476
  overlayCtx: overlayCtx ?? undefined,
402
477
  pane: wrapPaneInfo(pane),
403
- data: dataManager.getInternalData(),
478
+ data: dataManager.getRenderData(),
404
479
  period: dataManager.currentPeriod,
405
480
  comparisonData: dataManager.getComparisonData(),
406
481
  comparisonSymbols: dataManager.getComparisonSpecs(),
@@ -417,6 +492,7 @@ export class ChartRenderer {
417
492
  markerManager: this.markerManager,
418
493
  crosshairIndex: this.deps.getInteraction().getCrosshairIndex(),
419
494
  yAxisCtx: yAxisCtx ?? undefined,
495
+ leftAxisCtx: leftAxisCtx ?? undefined,
420
496
  candleWebGLSurface: candleSurface ?? undefined,
421
497
  lineWebGLSurface: lineSurface ?? undefined,
422
498
  zoomLevel: this.deps.getCurrentZoomLevel(),
@@ -436,6 +512,23 @@ export class ChartRenderer {
436
512
  colorPresetSettings: this.settings.colorPresetSettings,
437
513
  }
438
514
 
515
+ {
516
+ const pt = pane.yAxis.getPaddingTop()
517
+ const pb = pane.yAxis.getPaddingBottom()
518
+ const yStart = pt
519
+ const yEnd = Math.max(pt, pane.height - pb)
520
+ const viewH = Math.max(0, yEnd - yStart)
521
+ const tickCount = Math.max(2, calculateTickCount(pane.height, pane.role === 'price'))
522
+ const yAxisTicks: YAxisTick[] = []
523
+ for (let i = 0; i < tickCount; i++) {
524
+ const t = tickCount <= 1 ? 0 : i / (tickCount - 1)
525
+ const y = yStart + t * viewH
526
+ const value = pane.yAxis.yToPrice(y)
527
+ yAxisTicks.push({ y, value })
528
+ }
529
+ context.yAxisTicks = yAxisTicks
530
+ }
531
+
439
532
  if (shouldUpdateMain || shouldUpdateOverlay) {
440
533
  const errors = rendererPluginManager.render(pane.id, context, level)
441
534
  if (errors.length > 0) {
@@ -446,6 +539,11 @@ export class ChartRenderer {
446
539
  if (yAxisErrors.length > 0) {
447
540
  pluginHost.events.emit('renderer:error', { paneId: pane.id, errors: yAxisErrors })
448
541
  }
542
+
543
+ const leftAxisErrors = rendererPluginManager.renderPlugin('leftYAxis', context)
544
+ if (leftAxisErrors.length > 0) {
545
+ pluginHost.events.emit('renderer:error', { paneId: pane.id, errors: leftAxisErrors })
546
+ }
449
547
  }
450
548
  }
451
549
 
@@ -498,7 +596,7 @@ export class ChartRenderer {
498
596
  priceRange: { maxPrice: 0, minPrice: 0 },
499
597
  },
500
598
  period: this.deps.getDataManager().currentPeriod,
501
- data: this.deps.getDataManager().getInternalData(),
599
+ data: this.deps.getDataManager().getRenderData(),
502
600
  range,
503
601
  scrollLeft: vp.scrollLeft,
504
602
  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>,