@363045841yyt/klinechart-core 0.8.5 → 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 (517) 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 +50 -3
  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 +12 -1
  67. package/dist/engine/controller/interaction.d.ts.map +1 -1
  68. package/dist/engine/controller/interaction.js +105 -14
  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 +77 -171
  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/ichimokuState.d.ts +2 -0
  86. package/dist/engine/indicators/ichimokuState.d.ts.map +1 -1
  87. package/dist/engine/indicators/ichimokuState.js.map +1 -1
  88. package/dist/engine/indicators/macdState.d.ts +0 -5
  89. package/dist/engine/indicators/macdState.d.ts.map +1 -1
  90. package/dist/engine/indicators/macdState.js +1 -1
  91. package/dist/engine/indicators/macdState.js.map +1 -1
  92. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  93. package/dist/engine/indicators/registerBuiltins.js +1 -0
  94. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  95. package/dist/engine/indicators/rsiState.d.ts +0 -4
  96. package/dist/engine/indicators/rsiState.d.ts.map +1 -1
  97. package/dist/engine/indicators/rsiState.js +1 -1
  98. package/dist/engine/indicators/rsiState.js.map +1 -1
  99. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  100. package/dist/engine/indicators/scheduler.js +1 -7
  101. package/dist/engine/indicators/scheduler.js.map +1 -1
  102. package/dist/engine/indicators/visibleStateComposers.d.ts +14 -0
  103. package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -1
  104. package/dist/engine/indicators/visibleStateComposers.js +34 -0
  105. package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
  106. package/dist/engine/layout/chartPaneLayout.d.ts +2 -0
  107. package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
  108. package/dist/engine/layout/chartPaneLayout.js +24 -6
  109. package/dist/engine/layout/chartPaneLayout.js.map +1 -1
  110. package/dist/engine/modes/kLineMode.d.ts +37 -0
  111. package/dist/engine/modes/kLineMode.d.ts.map +1 -0
  112. package/dist/engine/modes/kLineMode.js +22 -0
  113. package/dist/engine/modes/kLineMode.js.map +1 -0
  114. package/dist/engine/modes/timeShareMode.d.ts +37 -0
  115. package/dist/engine/modes/timeShareMode.d.ts.map +1 -0
  116. package/dist/engine/modes/timeShareMode.js +59 -0
  117. package/dist/engine/modes/timeShareMode.js.map +1 -0
  118. package/dist/engine/modes/types.d.ts +47 -0
  119. package/dist/engine/modes/types.d.ts.map +1 -0
  120. package/dist/engine/modes/types.js +2 -0
  121. package/dist/engine/modes/types.js.map +1 -0
  122. package/dist/engine/paneRenderer.d.ts +4 -0
  123. package/dist/engine/paneRenderer.d.ts.map +1 -1
  124. package/dist/engine/paneRenderer.js +27 -40
  125. package/dist/engine/paneRenderer.js.map +1 -1
  126. package/dist/engine/render/chartRenderer.d.ts +4 -23
  127. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  128. package/dist/engine/render/chartRenderer.js +87 -17
  129. package/dist/engine/render/chartRenderer.js.map +1 -1
  130. package/dist/engine/renderers/Indicator/atr.d.ts +1 -18
  131. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  132. package/dist/engine/renderers/Indicator/atr.js +3 -22
  133. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  134. package/dist/engine/renderers/Indicator/boll.d.ts +1 -4
  135. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  136. package/dist/engine/renderers/Indicator/boll.js +3 -18
  137. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  138. package/dist/engine/renderers/Indicator/cci.d.ts +1 -22
  139. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  140. package/dist/engine/renderers/Indicator/cci.js +8 -20
  141. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  142. package/dist/engine/renderers/Indicator/chaikinVol.d.ts +1 -7
  143. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  144. package/dist/engine/renderers/Indicator/chaikinVol.js +3 -16
  145. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  146. package/dist/engine/renderers/Indicator/cmf.d.ts +1 -7
  147. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  148. package/dist/engine/renderers/Indicator/cmf.js +3 -15
  149. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  150. package/dist/engine/renderers/Indicator/dema.d.ts +1 -7
  151. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  152. package/dist/engine/renderers/Indicator/dema.js +3 -17
  153. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  154. package/dist/engine/renderers/Indicator/donchian.d.ts +1 -8
  155. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  156. package/dist/engine/renderers/Indicator/donchian.js +2 -2
  157. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  158. package/dist/engine/renderers/Indicator/ene.d.ts +1 -12
  159. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  160. package/dist/engine/renderers/Indicator/ene.js +3 -18
  161. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  162. package/dist/engine/renderers/Indicator/expma.d.ts +1 -4
  163. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  164. package/dist/engine/renderers/Indicator/expma.js +2 -2
  165. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  166. package/dist/engine/renderers/Indicator/fastk.d.ts +1 -22
  167. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  168. package/dist/engine/renderers/Indicator/fastk.js +11 -64
  169. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  170. package/dist/engine/renderers/Indicator/fib.d.ts +1 -6
  171. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  172. package/dist/engine/renderers/Indicator/fib.js +2 -2
  173. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  174. package/dist/engine/renderers/Indicator/hma.d.ts +1 -7
  175. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  176. package/dist/engine/renderers/Indicator/hma.js +3 -17
  177. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  178. package/dist/engine/renderers/Indicator/hv.d.ts +1 -7
  179. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  180. package/dist/engine/renderers/Indicator/hv.js +3 -16
  181. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  182. package/dist/engine/renderers/Indicator/ichimoku.d.ts +1 -8
  183. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  184. package/dist/engine/renderers/Indicator/ichimoku.js +27 -5
  185. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  186. package/dist/engine/renderers/Indicator/kama.d.ts +1 -7
  187. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  188. package/dist/engine/renderers/Indicator/kama.js +3 -17
  189. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  190. package/dist/engine/renderers/Indicator/keltner.d.ts +1 -8
  191. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  192. package/dist/engine/renderers/Indicator/keltner.js +2 -2
  193. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  194. package/dist/engine/renderers/Indicator/kst.d.ts +1 -22
  195. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  196. package/dist/engine/renderers/Indicator/kst.js +2 -2
  197. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  198. package/dist/engine/renderers/Indicator/ma.d.ts +1 -4
  199. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  200. package/dist/engine/renderers/Indicator/ma.js +1 -1
  201. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  202. package/dist/engine/renderers/Indicator/macd.d.ts +1 -49
  203. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  204. package/dist/engine/renderers/Indicator/macd.js +2 -12
  205. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  206. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  207. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +205 -0
  208. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  209. package/dist/engine/renderers/Indicator/mfi.d.ts +1 -7
  210. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  211. package/dist/engine/renderers/Indicator/mfi.js +3 -15
  212. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  213. package/dist/engine/renderers/Indicator/mom.d.ts +1 -22
  214. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  215. package/dist/engine/renderers/Indicator/mom.js +8 -23
  216. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  217. package/dist/engine/renderers/Indicator/obv.d.ts +1 -7
  218. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  219. package/dist/engine/renderers/Indicator/obv.js +3 -14
  220. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  221. package/dist/engine/renderers/Indicator/parkinson.d.ts +1 -7
  222. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  223. package/dist/engine/renderers/Indicator/parkinson.js +3 -16
  224. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  225. package/dist/engine/renderers/Indicator/pivot.d.ts +1 -6
  226. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  227. package/dist/engine/renderers/Indicator/pivot.js +2 -2
  228. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  229. package/dist/engine/renderers/Indicator/pvt.d.ts +1 -7
  230. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  231. package/dist/engine/renderers/Indicator/pvt.js +3 -14
  232. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  233. package/dist/engine/renderers/Indicator/roc.d.ts +1 -8
  234. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  235. package/dist/engine/renderers/Indicator/roc.js +3 -15
  236. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  237. package/dist/engine/renderers/Indicator/rsi.d.ts +0 -32
  238. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  239. package/dist/engine/renderers/Indicator/rsi.js +3 -3
  240. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  241. package/dist/engine/renderers/Indicator/sar.d.ts +1 -8
  242. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  243. package/dist/engine/renderers/Indicator/sar.js +2 -2
  244. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  245. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +2 -0
  246. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  247. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +10 -6
  248. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  249. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts +4 -0
  250. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts.map +1 -0
  251. package/dist/engine/renderers/Indicator/shared/dashedLines.js +50 -0
  252. package/dist/engine/renderers/Indicator/shared/dashedLines.js.map +1 -0
  253. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts +14 -0
  254. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -0
  255. package/dist/engine/renderers/Indicator/shared/titleInfo.js +25 -0
  256. package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -0
  257. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts +5 -0
  258. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts.map +1 -0
  259. package/dist/engine/renderers/Indicator/shared/webglBand.js +17 -0
  260. package/dist/engine/renderers/Indicator/shared/webglBand.js.map +1 -0
  261. package/dist/engine/renderers/Indicator/stoch.d.ts +1 -22
  262. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  263. package/dist/engine/renderers/Indicator/stoch.js +5 -46
  264. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  265. package/dist/engine/renderers/Indicator/structure.d.ts +1 -7
  266. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  267. package/dist/engine/renderers/Indicator/structure.js +2 -2
  268. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  269. package/dist/engine/renderers/Indicator/supertrend.d.ts +1 -8
  270. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  271. package/dist/engine/renderers/Indicator/supertrend.js +2 -2
  272. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  273. package/dist/engine/renderers/Indicator/tema.d.ts +1 -7
  274. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  275. package/dist/engine/renderers/Indicator/tema.js +3 -17
  276. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  277. package/dist/engine/renderers/Indicator/trix.d.ts +1 -8
  278. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  279. package/dist/engine/renderers/Indicator/trix.js +2 -2
  280. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  281. package/dist/engine/renderers/Indicator/vma.d.ts +1 -7
  282. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  283. package/dist/engine/renderers/Indicator/vma.js +3 -15
  284. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  285. package/dist/engine/renderers/Indicator/volumeProfile.d.ts +1 -7
  286. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  287. package/dist/engine/renderers/Indicator/volumeProfile.js +2 -2
  288. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  289. package/dist/engine/renderers/Indicator/vwap.d.ts +1 -7
  290. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  291. package/dist/engine/renderers/Indicator/vwap.js +3 -14
  292. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  293. package/dist/engine/renderers/Indicator/wma.d.ts +1 -7
  294. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  295. package/dist/engine/renderers/Indicator/wma.js +3 -17
  296. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  297. package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -22
  298. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  299. package/dist/engine/renderers/Indicator/wmsr.js +8 -23
  300. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  301. package/dist/engine/renderers/Indicator/zones.d.ts +1 -6
  302. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  303. package/dist/engine/renderers/Indicator/zones.js +2 -2
  304. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  305. package/dist/engine/renderers/candle.d.ts +0 -16
  306. package/dist/engine/renderers/candle.d.ts.map +1 -1
  307. package/dist/engine/renderers/candle.js +1 -1
  308. package/dist/engine/renderers/candle.js.map +1 -1
  309. package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
  310. package/dist/engine/renderers/comparisonLine.js +2 -0
  311. package/dist/engine/renderers/comparisonLine.js.map +1 -1
  312. package/dist/engine/renderers/crosshair.js +1 -1
  313. package/dist/engine/renderers/crosshair.js.map +1 -1
  314. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  315. package/dist/engine/renderers/extremaMarkers.js +2 -0
  316. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  317. package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
  318. package/dist/engine/renderers/lastPrice.js +7 -2
  319. package/dist/engine/renderers/lastPrice.js.map +1 -1
  320. package/dist/engine/renderers/leftYAxis.d.ts +11 -0
  321. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -0
  322. package/dist/engine/renderers/leftYAxis.js +67 -0
  323. package/dist/engine/renderers/leftYAxis.js.map +1 -0
  324. package/dist/engine/renderers/subVolume.d.ts +1 -13
  325. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  326. package/dist/engine/renderers/subVolume.js +1 -1
  327. package/dist/engine/renderers/subVolume.js.map +1 -1
  328. package/dist/engine/renderers/timeAxis.d.ts +0 -2
  329. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  330. package/dist/engine/renderers/timeAxis.js +4 -1
  331. package/dist/engine/renderers/timeAxis.js.map +1 -1
  332. package/dist/engine/renderers/timeShare.d.ts +3 -0
  333. package/dist/engine/renderers/timeShare.d.ts.map +1 -0
  334. package/dist/engine/renderers/timeShare.js +260 -0
  335. package/dist/engine/renderers/timeShare.js.map +1 -0
  336. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  337. package/dist/engine/renderers/yAxis.js +9 -1
  338. package/dist/engine/renderers/yAxis.js.map +1 -1
  339. package/dist/engine/scale/price.d.ts +0 -7
  340. package/dist/engine/scale/price.d.ts.map +1 -1
  341. package/dist/engine/scale/price.js +3 -2
  342. package/dist/engine/scale/price.js.map +1 -1
  343. package/dist/engine/theme/fonts.d.ts +0 -2
  344. package/dist/engine/theme/fonts.d.ts.map +1 -1
  345. package/dist/engine/theme/fonts.js +1 -1
  346. package/dist/engine/theme/fonts.js.map +1 -1
  347. package/dist/engine/utils/klineConfig.d.ts.map +1 -1
  348. package/dist/engine/utils/klineConfig.js +1 -5
  349. package/dist/engine/utils/klineConfig.js.map +1 -1
  350. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  351. package/dist/engine/viewport/chartViewportManager.js +6 -5
  352. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  353. package/dist/index.d.ts +1 -0
  354. package/dist/index.d.ts.map +1 -1
  355. package/dist/index.js +1 -0
  356. package/dist/index.js.map +1 -1
  357. package/dist/mcp/chartBridge.d.ts.map +1 -1
  358. package/dist/mcp/chartBridge.js +2 -1
  359. package/dist/mcp/chartBridge.js.map +1 -1
  360. package/dist/plugin/types.d.ts +1 -0
  361. package/dist/plugin/types.d.ts.map +1 -1
  362. package/dist/plugin/types.js.map +1 -1
  363. package/dist/semantic/types.d.ts +1 -1
  364. package/dist/semantic/types.d.ts.map +1 -1
  365. package/dist/tokens/theme-base.d.ts +5 -0
  366. package/dist/tokens/theme-base.d.ts.map +1 -0
  367. package/dist/tokens/theme-base.js +31 -0
  368. package/dist/tokens/theme-base.js.map +1 -0
  369. package/dist/tokens/theme-china.d.ts.map +1 -1
  370. package/dist/tokens/theme-china.js +3 -0
  371. package/dist/tokens/theme-china.js.map +1 -1
  372. package/dist/tokens/theme-dark.d.ts.map +1 -1
  373. package/dist/tokens/theme-dark.js +12 -31
  374. package/dist/tokens/theme-dark.js.map +1 -1
  375. package/dist/tokens/theme-light.d.ts.map +1 -1
  376. package/dist/tokens/theme-light.js +11 -30
  377. package/dist/tokens/theme-light.js.map +1 -1
  378. package/dist/tokens/types.d.ts +7 -0
  379. package/dist/tokens/types.d.ts.map +1 -1
  380. package/dist/types/price.d.ts +8 -0
  381. package/dist/types/price.d.ts.map +1 -1
  382. package/dist/types/price.js +4 -0
  383. package/dist/types/price.js.map +1 -1
  384. package/dist/utils/dateFormat.d.ts +5 -42
  385. package/dist/utils/dateFormat.d.ts.map +1 -1
  386. package/dist/utils/dateFormat.js +24 -4
  387. package/dist/utils/dateFormat.js.map +1 -1
  388. package/dist/utils/kLineDraw/axis.d.ts +9 -28
  389. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  390. package/dist/utils/kLineDraw/axis.js +33 -58
  391. package/dist/utils/kLineDraw/axis.js.map +1 -1
  392. package/dist/utils/uuid.d.ts +2 -0
  393. package/dist/utils/uuid.d.ts.map +1 -0
  394. package/dist/utils/uuid.js +10 -0
  395. package/dist/utils/uuid.js.map +1 -0
  396. package/dist/utils/volumePrice.d.ts +0 -40
  397. package/dist/utils/volumePrice.d.ts.map +1 -1
  398. package/dist/utils/volumePrice.js +2 -2
  399. package/dist/utils/volumePrice.js.map +1 -1
  400. package/dist/version.d.ts +1 -1
  401. package/dist/version.js +1 -1
  402. package/package.json +1 -1
  403. package/src/config/chartSettings.ts +9 -1
  404. package/src/controllers/createChartController.ts +53 -3
  405. package/src/controllers/types.ts +36 -17
  406. package/src/data-fetchers/__tests__/dataBuffer.test.ts +39 -5
  407. package/src/data-fetchers/baostock.ts +1 -1
  408. package/src/data-fetchers/dataBuffer.ts +48 -11
  409. package/src/data-fetchers/dataBufferTypes.ts +11 -0
  410. package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -4
  411. package/src/data-fetchers/gotdx/gotdx.ts +6 -0
  412. package/src/data-fetchers/gotdx.ts +45 -7
  413. package/src/data-fetchers/hundred-mock.ts +1 -1
  414. package/src/data-fetchers/index.ts +10 -20
  415. package/src/data-fetchers/router.ts +12 -1
  416. package/src/data-fetchers/thousand-mock.ts +1 -1
  417. package/src/data-fetchers/timeShareBuffer.ts +92 -0
  418. package/src/data-fetchers/tradingview.ts +2 -2
  419. package/src/data-fetchers/types.ts +15 -2
  420. package/src/engine/__tests__/chart.dpr.test.ts +1 -0
  421. package/src/engine/chart.ts +157 -7
  422. package/src/engine/chartTypes.ts +3 -0
  423. package/src/engine/controller/__tests__/interaction.dpr.test.ts +2 -0
  424. package/src/engine/controller/interaction.ts +115 -16
  425. package/src/engine/data/chartDataManager.ts +557 -214
  426. package/src/engine/draw/pixelAlign.ts +1 -1
  427. package/src/engine/indicators/__tests__/_propertyAssertions.ts +2 -2
  428. package/src/engine/indicators/__tests__/ichimoku.test.ts +3 -3
  429. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -1
  430. package/src/engine/indicators/calculators.ts +105 -236
  431. package/src/engine/indicators/chartIndicatorManager.ts +3 -2
  432. package/src/engine/indicators/ichimokuState.ts +2 -0
  433. package/src/engine/indicators/macdState.ts +1 -1
  434. package/src/engine/indicators/registerBuiltins.ts +1 -0
  435. package/src/engine/indicators/rsiState.ts +1 -1
  436. package/src/engine/indicators/scheduler.ts +1 -7
  437. package/src/engine/indicators/visibleStateComposers.ts +51 -0
  438. package/src/engine/layout/chartPaneLayout.ts +26 -6
  439. package/src/engine/modes/kLineMode.ts +57 -0
  440. package/src/engine/modes/timeShareMode.ts +95 -0
  441. package/src/engine/modes/types.ts +63 -0
  442. package/src/engine/paneRenderer.ts +37 -46
  443. package/src/engine/render/chartRenderer.ts +93 -20
  444. package/src/engine/renderers/Indicator/atr.ts +4 -29
  445. package/src/engine/renderers/Indicator/boll.ts +3 -24
  446. package/src/engine/renderers/Indicator/cci.ts +9 -27
  447. package/src/engine/renderers/Indicator/chaikinVol.ts +3 -23
  448. package/src/engine/renderers/Indicator/cmf.ts +3 -22
  449. package/src/engine/renderers/Indicator/dema.ts +5 -26
  450. package/src/engine/renderers/Indicator/donchian.ts +3 -3
  451. package/src/engine/renderers/Indicator/ene.ts +3 -24
  452. package/src/engine/renderers/Indicator/expma.ts +2 -2
  453. package/src/engine/renderers/Indicator/fastk.ts +12 -95
  454. package/src/engine/renderers/Indicator/fib.ts +2 -2
  455. package/src/engine/renderers/Indicator/hma.ts +5 -26
  456. package/src/engine/renderers/Indicator/hv.ts +3 -23
  457. package/src/engine/renderers/Indicator/ichimoku.ts +26 -6
  458. package/src/engine/renderers/Indicator/kama.ts +5 -26
  459. package/src/engine/renderers/Indicator/keltner.ts +3 -3
  460. package/src/engine/renderers/Indicator/kst.ts +3 -3
  461. package/src/engine/renderers/Indicator/ma.ts +1 -1
  462. package/src/engine/renderers/Indicator/macd.ts +4 -21
  463. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +228 -1
  464. package/src/engine/renderers/Indicator/mfi.ts +3 -22
  465. package/src/engine/renderers/Indicator/mom.ts +9 -30
  466. package/src/engine/renderers/Indicator/obv.ts +3 -21
  467. package/src/engine/renderers/Indicator/parkinson.ts +3 -23
  468. package/src/engine/renderers/Indicator/pivot.ts +2 -2
  469. package/src/engine/renderers/Indicator/pvt.ts +3 -21
  470. package/src/engine/renderers/Indicator/roc.ts +4 -23
  471. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  472. package/src/engine/renderers/Indicator/sar.ts +3 -3
  473. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +11 -4
  474. package/src/engine/renderers/Indicator/shared/dashedLines.ts +81 -0
  475. package/src/engine/renderers/Indicator/shared/titleInfo.ts +52 -0
  476. package/src/engine/renderers/Indicator/shared/webglBand.ts +23 -0
  477. package/src/engine/renderers/Indicator/stoch.ts +6 -71
  478. package/src/engine/renderers/Indicator/structure.ts +2 -2
  479. package/src/engine/renderers/Indicator/supertrend.ts +3 -3
  480. package/src/engine/renderers/Indicator/tema.ts +5 -26
  481. package/src/engine/renderers/Indicator/trix.ts +3 -3
  482. package/src/engine/renderers/Indicator/vma.ts +3 -22
  483. package/src/engine/renderers/Indicator/volumeProfile.ts +2 -2
  484. package/src/engine/renderers/Indicator/vwap.ts +3 -21
  485. package/src/engine/renderers/Indicator/wma.ts +5 -26
  486. package/src/engine/renderers/Indicator/wmsr.ts +9 -30
  487. package/src/engine/renderers/Indicator/zones.ts +2 -2
  488. package/src/engine/renderers/candle.ts +1 -1
  489. package/src/engine/renderers/comparisonLine.ts +1 -0
  490. package/src/engine/renderers/crosshair.ts +1 -1
  491. package/src/engine/renderers/extremaMarkers.ts +1 -0
  492. package/src/engine/renderers/lastPrice.ts +5 -2
  493. package/src/engine/renderers/leftYAxis.ts +77 -0
  494. package/src/engine/renderers/subVolume.ts +3 -3
  495. package/src/engine/renderers/timeAxis.ts +16 -13
  496. package/src/engine/renderers/timeShare.ts +271 -0
  497. package/src/engine/renderers/yAxis.ts +9 -1
  498. package/src/engine/scale/price.ts +2 -2
  499. package/src/engine/theme/fonts.ts +1 -1
  500. package/src/engine/utils/klineConfig.ts +1 -5
  501. package/src/engine/viewport/chartViewportManager.ts +6 -5
  502. package/src/index.ts +1 -0
  503. package/src/mcp/chartBridge.ts +2 -1
  504. package/src/plugin/types.ts +1 -0
  505. package/src/semantic/types.ts +1 -1
  506. package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +15 -1
  507. package/src/tokens/theme-base.ts +36 -0
  508. package/src/tokens/theme-china.ts +4 -0
  509. package/src/tokens/theme-dark.ts +13 -33
  510. package/src/tokens/theme-light.ts +13 -33
  511. package/src/tokens/types.ts +9 -0
  512. package/src/types/price.ts +13 -0
  513. package/src/utils/dateFormat.ts +27 -4
  514. package/src/utils/kLineDraw/axis.ts +40 -107
  515. package/src/utils/uuid.ts +8 -0
  516. package/src/utils/volumePrice.ts +2 -2
  517. package/src/version.ts +1 -1
@@ -1,6 +1,6 @@
1
1
  import type { RendererPluginWithHost, PluginHost, RenderContext } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
- import type { KLineData } from '../../../types/price'
3
+ import type { KLineData, TimeShareData } from '../../../types/price'
4
4
  import { resolveThemeColors } from '../../../tokens'
5
5
  import { getFont, setCanvasFont } from '../../theme/fonts'
6
6
  import type { IndicatorScheduler } from '../../indicators/scheduler'
@@ -81,6 +81,221 @@ export function createMainIndicatorLegendRendererPlugin(options: {
81
81
  const targetIndex = crosshairIndex ?? Math.min(range.end - 1, klineData.length - 1)
82
82
  const rows: Array<{ draw: (rowIndex: number) => void }> = []
83
83
 
84
+ // ── Timeshare legend ──
85
+ if (context.period === 'timeshare') {
86
+ const tsData = data as TimeShareData[]
87
+ const preClose = (context.settings?.preClose as number) ?? tsData[0]?.price ?? 0
88
+ const item = tsData[targetIndex]
89
+ if (item) {
90
+ const changeAmount = item.price - preClose
91
+ const changePercent = preClose !== 0 ? (changeAmount / preClose) * 100 : 0
92
+ const changeColor = changeAmount >= 0 ? colors.candleUpBody : colors.candleDownBody
93
+
94
+ if (context.paneWidth >= 400) {
95
+ rows.push({
96
+ draw: (rowIndex: number) => {
97
+ let x = legendX
98
+ const y = config.yPaddingPx / 2 + legendYOffset + rowIndex * lineHeight
99
+
100
+ overlayCtx.fillStyle = colors.text.primary
101
+ overlayCtx.fillText('现价 ', x, y)
102
+ x += measureTextWidth(overlayCtx, '现价 ')
103
+ overlayCtx.fillStyle = changeColor
104
+ overlayCtx.fillText(item.price.toFixed(2), x, y)
105
+ x += measureTextWidth(overlayCtx, item.price.toFixed(2)) + gap
106
+
107
+ overlayCtx.fillStyle = colors.text.primary
108
+ overlayCtx.fillText('均价 ', x, y)
109
+ x += measureTextWidth(overlayCtx, '均价 ')
110
+ overlayCtx.fillText(item.average.toFixed(2), x, y)
111
+ x += measureTextWidth(overlayCtx, item.average.toFixed(2)) + gap
112
+
113
+ overlayCtx.fillStyle = colors.text.primary
114
+ overlayCtx.fillText('涨跌 ', x, y)
115
+ x += measureTextWidth(overlayCtx, '涨跌 ')
116
+ overlayCtx.fillStyle = changeColor
117
+ const sign = changeAmount > 0 ? '+' : ''
118
+ overlayCtx.fillText(`${sign}${changeAmount.toFixed(2)}`, x, y)
119
+ x += measureTextWidth(overlayCtx, `${sign}${changeAmount.toFixed(2)}`) + gap
120
+
121
+ overlayCtx.fillStyle = colors.text.primary
122
+ overlayCtx.fillText('涨幅 ', x, y)
123
+ x += measureTextWidth(overlayCtx, '涨幅 ')
124
+ overlayCtx.fillStyle = changeColor
125
+ const pctSign = changePercent > 0 ? '+' : ''
126
+ overlayCtx.fillText(`${pctSign}${changePercent.toFixed(2)}%`, x, y)
127
+ x += measureTextWidth(overlayCtx, `${pctSign}${changePercent.toFixed(2)}%`) + gap
128
+
129
+ const volText = formatVolumeShort(item.volume)
130
+ overlayCtx.fillStyle = colors.text.tertiary
131
+ overlayCtx.fillText('成交量 ', x, y)
132
+ x += measureTextWidth(overlayCtx, '成交量 ')
133
+ overlayCtx.fillStyle = colors.text.primary
134
+ overlayCtx.fillText(volText, x, y)
135
+ x += measureTextWidth(overlayCtx, volText) + gap
136
+
137
+ const amtText = formatAmountShort(item.amount)
138
+ overlayCtx.fillStyle = colors.text.tertiary
139
+ overlayCtx.fillText('成交额 ', x, y)
140
+ x += measureTextWidth(overlayCtx, '成交额 ')
141
+ overlayCtx.fillStyle = colors.text.primary
142
+ overlayCtx.fillText(amtText, x, y)
143
+ },
144
+ })
145
+ } else {
146
+ rows.push({
147
+ draw: (rowIndex: number) => {
148
+ let x = legendX
149
+ const y = config.yPaddingPx / 2 + legendYOffset + rowIndex * lineHeight
150
+
151
+ overlayCtx.fillStyle = colors.text.primary
152
+ overlayCtx.fillText('现价 ', x, y)
153
+ x += measureTextWidth(overlayCtx, '现价 ')
154
+ overlayCtx.fillStyle = changeColor
155
+ overlayCtx.fillText(item.price.toFixed(2), x, y)
156
+ x += measureTextWidth(overlayCtx, item.price.toFixed(2)) + gap
157
+
158
+ overlayCtx.fillStyle = colors.text.primary
159
+ overlayCtx.fillText('均价 ', x, y)
160
+ x += measureTextWidth(overlayCtx, '均价 ')
161
+ overlayCtx.fillText(item.average.toFixed(2), x, y)
162
+ x += measureTextWidth(overlayCtx, item.average.toFixed(2)) + gap
163
+
164
+ overlayCtx.fillStyle = colors.text.tertiary
165
+ overlayCtx.fillText('成交量 ', x, y)
166
+ x += measureTextWidth(overlayCtx, '成交量 ')
167
+ overlayCtx.fillStyle = colors.text.primary
168
+ overlayCtx.fillText(formatVolumeShort(item.volume), x, y)
169
+ },
170
+ })
171
+ rows.push({
172
+ draw: (rowIndex: number) => {
173
+ let x = legendX
174
+ const y = config.yPaddingPx / 2 + legendYOffset + rowIndex * lineHeight
175
+
176
+ overlayCtx.fillStyle = colors.text.primary
177
+ overlayCtx.fillText('涨跌 ', x, y)
178
+ x += measureTextWidth(overlayCtx, '涨跌 ')
179
+ overlayCtx.fillStyle = changeColor
180
+ const sign = changeAmount > 0 ? '+' : ''
181
+ overlayCtx.fillText(`${sign}${changeAmount.toFixed(2)}`, x, y)
182
+ x += measureTextWidth(overlayCtx, `${sign}${changeAmount.toFixed(2)}`) + gap
183
+
184
+ overlayCtx.fillStyle = colors.text.primary
185
+ overlayCtx.fillText('涨幅 ', x, y)
186
+ x += measureTextWidth(overlayCtx, '涨幅 ')
187
+ overlayCtx.fillStyle = changeColor
188
+ const pctSign = changePercent > 0 ? '+' : ''
189
+ overlayCtx.fillText(`${pctSign}${changePercent.toFixed(2)}%`, x, y)
190
+ x += measureTextWidth(overlayCtx, `${pctSign}${changePercent.toFixed(2)}%`) + gap
191
+
192
+ overlayCtx.fillStyle = colors.text.tertiary
193
+ overlayCtx.fillText('成交额 ', x, y)
194
+ x += measureTextWidth(overlayCtx, '成交额 ')
195
+ overlayCtx.fillStyle = colors.text.primary
196
+ overlayCtx.fillText(formatAmountShort(item.amount), x, y)
197
+ },
198
+ })
199
+ }
200
+ }
201
+ }
202
+
203
+ if (typeof crosshairIndex === 'number') {
204
+ const k = klineData[targetIndex]
205
+ if (k && typeof k.close === 'number') {
206
+ const isUp = k.close >= k.open
207
+ const volText = typeof k.volume === 'number' ? formatVolumeShort(k.volume) : null
208
+ const upColor = isUp ? colors.candleUpBody : colors.candleDownBody
209
+
210
+ if (context.paneWidth >= 400) {
211
+ rows.push({
212
+ draw: (rowIndex: number) => {
213
+ let x = legendX
214
+ const y = config.yPaddingPx / 2 + legendYOffset + rowIndex * lineHeight
215
+
216
+ overlayCtx.fillStyle = colors.text.primary
217
+ overlayCtx.fillText('O ', x, y)
218
+ x += measureTextWidth(overlayCtx, 'O ')
219
+ overlayCtx.fillStyle = upColor
220
+ overlayCtx.fillText(k.open.toFixed(2), x, y)
221
+ x += measureTextWidth(overlayCtx, k.open.toFixed(2)) + gap
222
+
223
+ overlayCtx.fillStyle = colors.text.primary
224
+ overlayCtx.fillText('H ', x, y)
225
+ x += measureTextWidth(overlayCtx, 'H ')
226
+ overlayCtx.fillText(k.high.toFixed(2), x, y)
227
+ x += measureTextWidth(overlayCtx, k.high.toFixed(2)) + gap
228
+
229
+ overlayCtx.fillText('L ', x, y)
230
+ x += measureTextWidth(overlayCtx, 'L ')
231
+ overlayCtx.fillText(k.low.toFixed(2), x, y)
232
+ x += measureTextWidth(overlayCtx, k.low.toFixed(2)) + gap
233
+
234
+ overlayCtx.fillStyle = colors.text.primary
235
+ overlayCtx.fillText('C ', x, y)
236
+ x += measureTextWidth(overlayCtx, 'C ')
237
+ overlayCtx.fillStyle = upColor
238
+ overlayCtx.fillText(k.close.toFixed(2), x, y)
239
+ x += measureTextWidth(overlayCtx, k.close.toFixed(2)) + gap
240
+
241
+ if (volText) {
242
+ overlayCtx.fillStyle = colors.text.tertiary
243
+ overlayCtx.fillText('Vol ', x, y)
244
+ x += measureTextWidth(overlayCtx, 'Vol ')
245
+ overlayCtx.fillStyle = colors.text.primary
246
+ overlayCtx.fillText(volText, x, y)
247
+ }
248
+ },
249
+ })
250
+ } else {
251
+ rows.push({
252
+ draw: (rowIndex: number) => {
253
+ let x = legendX
254
+ const y = config.yPaddingPx / 2 + legendYOffset + rowIndex * lineHeight
255
+
256
+ overlayCtx.fillStyle = colors.text.primary
257
+ overlayCtx.fillText('O ', x, y)
258
+ x += measureTextWidth(overlayCtx, 'O ')
259
+ overlayCtx.fillStyle = upColor
260
+ overlayCtx.fillText(k.open.toFixed(2), x, y)
261
+ x += measureTextWidth(overlayCtx, k.open.toFixed(2)) + gap
262
+
263
+ overlayCtx.fillStyle = colors.text.primary
264
+ overlayCtx.fillText('H ', x, y)
265
+ x += measureTextWidth(overlayCtx, 'H ')
266
+ overlayCtx.fillText(k.high.toFixed(2), x, y)
267
+ x += measureTextWidth(overlayCtx, k.high.toFixed(2)) + gap
268
+
269
+ overlayCtx.fillText('L ', x, y)
270
+ x += measureTextWidth(overlayCtx, 'L ')
271
+ overlayCtx.fillText(k.low.toFixed(2), x, y)
272
+ },
273
+ })
274
+ rows.push({
275
+ draw: (rowIndex: number) => {
276
+ let x = legendX
277
+ const y = config.yPaddingPx / 2 + legendYOffset + rowIndex * lineHeight
278
+
279
+ overlayCtx.fillStyle = colors.text.primary
280
+ overlayCtx.fillText('C ', x, y)
281
+ x += measureTextWidth(overlayCtx, 'C ')
282
+ overlayCtx.fillStyle = upColor
283
+ overlayCtx.fillText(k.close.toFixed(2), x, y)
284
+ x += measureTextWidth(overlayCtx, k.close.toFixed(2)) + gap
285
+
286
+ if (volText) {
287
+ overlayCtx.fillStyle = colors.text.tertiary
288
+ overlayCtx.fillText('Vol ', x, y)
289
+ x += measureTextWidth(overlayCtx, 'Vol ')
290
+ overlayCtx.fillStyle = colors.text.primary
291
+ overlayCtx.fillText(volText, x, y)
292
+ }
293
+ },
294
+ })
295
+ }
296
+ }
297
+ }
298
+
84
299
  const scheduler = pluginHost && typeof pluginHost.getService === 'function'
85
300
  ? pluginHost.getService<IndicatorScheduler>('indicatorScheduler')
86
301
  : undefined
@@ -237,3 +452,15 @@ function findBaselineByTimestamp(data: ReadonlyArray<KLineData>, timestamp: numb
237
452
  }
238
453
  return null
239
454
  }
455
+
456
+ function formatVolumeShort(v: number): string {
457
+ if (v >= 1e8) return (v / 1e8).toFixed(2) + '亿'
458
+ if (v >= 1e4) return (v / 1e4).toFixed(2) + '万'
459
+ return v.toFixed(2)
460
+ }
461
+
462
+ function formatAmountShort(v: number): string {
463
+ if (v >= 1e8) return (v / 1e8).toFixed(2) + '亿'
464
+ if (v >= 1e4) return (v / 1e4).toFixed(2) + '万'
465
+ return v.toFixed(2)
466
+ }
@@ -2,8 +2,7 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { MFIRenderState } from '../../indicators/mfiState'
4
4
  import { createMFIStateKey, EMPTY_MFI_STATE } from '../../indicators/mfiState'
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 getMFIStateKey(host: PluginHost | null, paneId: string): string | null
28
27
  return resolveStateKey(meta.stateKey, paneId)
29
28
  }
30
29
 
31
- export function createMFIRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
30
+ function createMFIRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
32
31
  const { paneId = 'sub_MFI' } = options
33
32
  let pluginHost: PluginHost | null = null
34
33
 
@@ -130,25 +129,7 @@ export function createMFIRendererPlugin(options: { paneId?: string } = {}): Rend
130
129
  }
131
130
  }
132
131
 
133
- export function getMFITitleInfo(
134
- _data: KLineData[],
135
- index: number | null,
136
- params: Record<string, number | boolean | string>,
137
- host: PluginHost,
138
- paneId: string,
139
- ): TitleInfo | null {
140
- if (index === null) return null
141
- const period = (params.period as number) ?? 14
142
- const state = host.getSharedState<MFIRenderState>(createMFIStateKey(paneId))
143
- const value = state?.series[index]
144
- if (value === undefined) return null
145
-
146
- return {
147
- name: 'MFI',
148
- params: [period],
149
- values: [{ label: 'MFI', value, color: MFI_COLOR }],
150
- }
151
- }
132
+ const getMFITitleInfo = createSingleLineTitleInfo({ createStateKey: createMFIStateKey, name: 'MFI', defaultPeriod: 14, color: MFI_COLOR })
152
133
 
153
134
  @Indicator({
154
135
  name: 'mfi',
@@ -11,11 +11,11 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
11
11
  import type { IndicatorScheduler, MOMSchedulerConfig } from '../../indicators/scheduler'
12
12
  import { createMomScaleRendererPlugin } from './scale/mom_scale'
13
13
  import { calcMOMData } from '../../indicators/calculators'
14
- import type { KLineData } from '../../../types/price'
14
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
15
15
 
16
16
  type LinePoint = { x: number; y: number }
17
17
 
18
- export interface MOMRendererOptions {
18
+ interface MOMRendererOptions {
19
19
  /** 目标 pane ID(默认 'sub') */
20
20
  paneId?: string
21
21
  }
@@ -37,7 +37,7 @@ function getMOMStateKey(host: PluginHost | null, paneId: string): string | null
37
37
  /**
38
38
  * 创建 MOM 渲染器插件
39
39
  */
40
- export function createMOMRendererPlugin(options: MOMRendererOptions = {}): RendererPluginWithHost {
40
+ function createMOMRendererPlugin(options: MOMRendererOptions = {}): RendererPluginWithHost {
41
41
  const { paneId = 'sub' } = options
42
42
  let pluginHost: PluginHost | null = null
43
43
 
@@ -274,33 +274,12 @@ function drawMOMLineWithCanvas2D(
274
274
  ctx.restore()
275
275
  }
276
276
 
277
- /**
278
- * 获取 MOM 标题信息(供 paneTitle 使用)
279
- */
280
- export function getMOMTitleInfo(
281
- _data: KLineData[],
282
- index: number | null,
283
- params: Record<string, number | boolean | string>,
284
- pluginHost: PluginHost,
285
- paneId: string,
286
- ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
287
- if (index === null) return null
288
- const period = (params.period as number) ?? 10
289
- const colors = resolveThemeColors('light')
290
- const state = pluginHost.getSharedState<MOMRenderState>(createMOMStateKey(paneId))
291
- if (!state) return null
292
-
293
- const mom = state.series[index]
294
- if (mom === undefined) return null
295
-
296
- return {
297
- name: 'MOM',
298
- params: [period],
299
- values: [
300
- { label: 'MOM', value: mom, color: colors.mom.mom },
301
- ],
302
- }
303
- }
277
+ const getMOMTitleInfo = createSingleLineTitleInfo({
278
+ createStateKey: createMOMStateKey,
279
+ name: 'MOM',
280
+ defaultPeriod: 10,
281
+ getColor: (colors) => colors.mom.mom,
282
+ })
304
283
 
305
284
  @Indicator({
306
285
  name: 'mom',
@@ -7,8 +7,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
7
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
8
  import type { IndicatorScheduler, OBVSchedulerConfig } from '../../indicators/scheduler'
9
9
  import { calcOBVData } from '../../indicators/calculators'
10
- import type { TitleInfo } from '../../indicators/indicatorMetadata'
11
- import type { KLineData } from '../../../types/price'
10
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
12
11
 
13
12
  const OBV_COLOR = '#16a34a'
14
13
 
@@ -28,7 +27,7 @@ function getOBVStateKey(host: PluginHost | null, paneId: string): string | null
28
27
  return resolveStateKey(meta.stateKey, paneId)
29
28
  }
30
29
 
31
- export function createOBVRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
30
+ function createOBVRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
32
31
  const { paneId = 'sub_OBV' } = options
33
32
  let pluginHost: PluginHost | null = null
34
33
 
@@ -111,24 +110,7 @@ export function createOBVRendererPlugin(options: { paneId?: string } = {}): Rend
111
110
  }
112
111
  }
113
112
 
114
- export function getOBVTitleInfo(
115
- _data: KLineData[],
116
- index: number | null,
117
- _params: Record<string, number | boolean | string>,
118
- host: PluginHost,
119
- paneId: string,
120
- ): TitleInfo | null {
121
- if (index === null) return null
122
- const state = host.getSharedState<OBVRenderState>(createOBVStateKey(paneId))
123
- const value = state?.series[index]
124
- if (value === undefined) return null
125
-
126
- return {
127
- name: 'OBV',
128
- params: [],
129
- values: [{ label: 'OBV', value, color: OBV_COLOR }],
130
- }
131
- }
113
+ const getOBVTitleInfo = createSingleLineTitleInfo({ createStateKey: createOBVStateKey, name: 'OBV', color: OBV_COLOR })
132
114
 
133
115
  @Indicator({
134
116
  name: 'obv',
@@ -9,8 +9,7 @@ import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
9
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
10
10
  import type { IndicatorScheduler, ParkinsonSchedulerConfig } from '../../indicators/scheduler'
11
11
  import { calcParkinsonData } from '../../indicators/calculators'
12
- import type { TitleInfo } from '../../indicators/indicatorMetadata'
13
- import type { KLineData } from '../../../types/price'
12
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
14
13
 
15
14
  const PARKINSON_COLOR = '#0891b2'
16
15
 
@@ -30,7 +29,7 @@ function getParkinsonStateKey(host: PluginHost | null, paneId: string): string |
30
29
  return resolveStateKey(meta.stateKey, paneId)
31
30
  }
32
31
 
33
- export function createParkinsonRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
32
+ function createParkinsonRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
34
33
  const { paneId = 'sub_Parkinson' } = options
35
34
  let pluginHost: PluginHost | null = null
36
35
 
@@ -114,26 +113,7 @@ export function createParkinsonRendererPlugin(options: { paneId?: string } = {})
114
113
  }
115
114
  }
116
115
 
117
- export function getParkinsonTitleInfo(
118
- _data: KLineData[],
119
- index: number | null,
120
- params: Record<string, number | boolean | string>,
121
- host: PluginHost,
122
- paneId: string,
123
- ): TitleInfo | null {
124
- if (index === null) return null
125
- const period = (params.period as number) ?? 20
126
- const annualizationFactor = (params.annualizationFactor as number) ?? 252
127
- const state = host.getSharedState<ParkinsonRenderState>(createParkinsonStateKey(paneId))
128
- const value = state?.series[index]
129
- if (value === undefined) return null
130
-
131
- return {
132
- name: 'Parkinson',
133
- params: [period, annualizationFactor],
134
- values: [{ label: 'Parkinson', value, color: PARKINSON_COLOR }],
135
- }
136
- }
116
+ const getParkinsonTitleInfo = createSingleLineTitleInfo({ createStateKey: createParkinsonStateKey, name: 'Parkinson', getParams: (p) => [(p.period as number) ?? 20, (p.annualizationFactor as number) ?? 252], color: PARKINSON_COLOR })
137
117
 
138
118
  @Indicator({
139
119
  name: 'parkinson',
@@ -28,7 +28,7 @@ function getPivotStateKey(host: PluginHost | null, paneId: string): string | nul
28
28
  return resolveStateKey(meta.stateKey, paneId)
29
29
  }
30
30
 
31
- export function createPivotRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
31
+ function createPivotRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
32
32
  const { paneId = 'main' } = options
33
33
  let pluginHost: PluginHost | null = null
34
34
 
@@ -116,7 +116,7 @@ function drawStep(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
116
116
  ctx.stroke()
117
117
  }
118
118
 
119
- export const getPivotTitleInfo: GetTitleInfoFn = (_data, index, _params, host, paneId) => {
119
+ const getPivotTitleInfo: GetTitleInfoFn = (_data, index, _params, host, paneId) => {
120
120
  if (index === null || index < 0) return null
121
121
 
122
122
  const stateKey = createPivotStateKey(paneId)
@@ -7,8 +7,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
7
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
8
  import type { IndicatorScheduler, PVTSchedulerConfig } from '../../indicators/scheduler'
9
9
  import { calcPVTData } from '../../indicators/calculators'
10
- import type { TitleInfo } from '../../indicators/indicatorMetadata'
11
- import type { KLineData } from '../../../types/price'
10
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
12
11
 
13
12
  const PVT_COLOR = '#a855f7'
14
13
 
@@ -28,7 +27,7 @@ function getPVTStateKey(host: PluginHost | null, paneId: string): string | null
28
27
  return resolveStateKey(meta.stateKey, paneId)
29
28
  }
30
29
 
31
- export function createPVTRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
30
+ function createPVTRendererPlugin(options: { paneId?: string } = {}): RendererPluginWithHost {
32
31
  const { paneId = 'sub_PVT' } = options
33
32
  let pluginHost: PluginHost | null = null
34
33
 
@@ -111,24 +110,7 @@ export function createPVTRendererPlugin(options: { paneId?: string } = {}): Rend
111
110
  }
112
111
  }
113
112
 
114
- export function getPVTTitleInfo(
115
- _data: KLineData[],
116
- index: number | null,
117
- _params: Record<string, number | boolean | string>,
118
- host: PluginHost,
119
- paneId: string,
120
- ): TitleInfo | null {
121
- if (index === null) return null
122
- const state = host.getSharedState<PVTRenderState>(createPVTStateKey(paneId))
123
- const value = state?.series[index]
124
- if (value === undefined) return null
125
-
126
- return {
127
- name: 'PVT',
128
- params: [],
129
- values: [{ label: 'PVT', value, color: PVT_COLOR }],
130
- }
131
- }
113
+ const getPVTTitleInfo = createSingleLineTitleInfo({ createStateKey: createPVTStateKey, name: 'PVT', color: PVT_COLOR })
132
114
 
133
115
  @Indicator({
134
116
  name: 'pvt',
@@ -8,14 +8,13 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
8
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
9
9
  import type { IndicatorScheduler, ROCSchedulerConfig } from '../../indicators/scheduler'
10
10
  import { calcROCData } from '../../indicators/calculators'
11
- import type { KLineData } from '../../../types/price'
12
- import type { TitleInfo } from '../../indicators/indicatorMetadata'
11
+ import { createSingleLineTitleInfo } from './shared/titleInfo'
13
12
 
14
13
  const ROC_COLOR = '#0ea5e9'
15
14
 
16
15
  type LinePoint = { x: number; y: number }
17
16
 
18
- export interface ROCRendererOptions { paneId?: string }
17
+ interface ROCRendererOptions { paneId?: string }
19
18
 
20
19
  function getROCStateKey(host: PluginHost | null, paneId: string): string | null {
21
20
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
@@ -31,7 +30,7 @@ function getROCStateKey(host: PluginHost | null, paneId: string): string | null
31
30
  return resolveStateKey(meta.stateKey, paneId)
32
31
  }
33
32
 
34
- export function createROCRendererPlugin(options: ROCRendererOptions = {}): RendererPluginWithHost {
33
+ function createROCRendererPlugin(options: ROCRendererOptions = {}): RendererPluginWithHost {
35
34
  const { paneId = 'sub_ROC' } = options
36
35
  let pluginHost: PluginHost | null = null
37
36
 
@@ -132,25 +131,7 @@ export function createROCRendererPlugin(options: ROCRendererOptions = {}): Rende
132
131
  }
133
132
  }
134
133
 
135
- export function getROCTitleInfo(
136
- _data: KLineData[],
137
- index: number | null,
138
- params: Record<string, number | boolean | string>,
139
- pluginHost: PluginHost,
140
- paneId: string,
141
- ): TitleInfo | null {
142
- if (index === null) return null
143
- const period = (params.period as number) ?? 12
144
- const state = pluginHost.getSharedState<ROCRenderState>(createROCStateKey(paneId))
145
- const value = state?.series[index]
146
- if (value === undefined) return null
147
-
148
- return {
149
- name: 'ROC',
150
- params: [period],
151
- values: [{ label: 'ROC', value, color: ROC_COLOR }],
152
- }
153
- }
134
+ const getROCTitleInfo = createSingleLineTitleInfo({ createStateKey: createROCStateKey, name: 'ROC', defaultPeriod: 12, color: ROC_COLOR })
154
135
 
155
136
  @Indicator({
156
137
  name: 'roc',
@@ -14,7 +14,7 @@ import type { KLineData } from '../../../types/price'
14
14
 
15
15
  type LinePoint = { x: number; y: number }
16
16
 
17
- export interface RSIRendererOptions {
17
+ interface RSIRendererOptions {
18
18
  /** 目标 pane ID(默认 'sub') */
19
19
  paneId?: string
20
20
  }
@@ -36,7 +36,7 @@ function getRSIStateKey(host: PluginHost | null, paneId: string): string | null
36
36
  /**
37
37
  * 创建 RSI 渲染器插件
38
38
  */
39
- export function createRSIRendererPlugin(options: RSIRendererOptions = {}): RendererPluginWithHost {
39
+ function createRSIRendererPlugin(options: RSIRendererOptions = {}): RendererPluginWithHost {
40
40
  const { paneId = 'sub' } = options
41
41
  let pluginHost: PluginHost | null = null
42
42
 
@@ -298,7 +298,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
298
298
  * 获取 RSI 标题信息(供 paneTitle 使用)
299
299
  * 从 StateStore 读取已计算的 RSI 数据
300
300
  */
301
- export function drawRSILinesWithCanvas2D(
301
+ function drawRSILinesWithCanvas2D(
302
302
  ctx: CanvasRenderingContext2D,
303
303
  scrollLeft: number,
304
304
  rsi1Points: LinePoint[],
@@ -351,7 +351,7 @@ export function drawRSILinesWithCanvas2D(
351
351
  ctx.restore()
352
352
  }
353
353
 
354
- export function getRSITitleInfo(
354
+ function getRSITitleInfo(
355
355
  _data: KLineData[],
356
356
  index: number | null,
357
357
  params: Record<string, number | boolean | string>,
@@ -13,7 +13,7 @@ import { createValuePointVisibleStateComposer } from '../../indicators/visibleSt
13
13
  const DOT_RADIUS = 1.5
14
14
  const TAU = Math.PI * 2
15
15
 
16
- export interface SARRendererOptions {
16
+ interface SARRendererOptions {
17
17
  paneId?: string
18
18
  }
19
19
 
@@ -31,7 +31,7 @@ function getSARStateKey(host: PluginHost | null, paneId: string): string | null
31
31
  return resolveStateKey(meta.stateKey, paneId)
32
32
  }
33
33
 
34
- export function createSARRendererPlugin(options: SARRendererOptions = {}): RendererPluginWithHost {
34
+ function createSARRendererPlugin(options: SARRendererOptions = {}): RendererPluginWithHost {
35
35
  const { paneId = 'main' } = options
36
36
  let pluginHost: PluginHost | null = null
37
37
 
@@ -99,7 +99,7 @@ export function createSARRendererPlugin(options: SARRendererOptions = {}): Rende
99
99
  }
100
100
  }
101
101
 
102
- export function getSARTitleInfo(
102
+ function getSARTitleInfo(
103
103
  _data: KLineData[],
104
104
  index: number | null,
105
105
  params: Record<string, number | boolean | string>,
@@ -57,6 +57,8 @@ export interface DrawScaleTicksOptions {
57
57
  hideEdgeTicks?: boolean
58
58
  scaleType?: ScaleType
59
59
  formatLabel?: (value: number) => string
60
+ /** 文字对齐方式,默认 'center'。左侧轴应使用 'right' */
61
+ textAlign?: CanvasTextAlign
60
62
  }
61
63
 
62
64
  const BASELINE_MIDDLE = 'middle' as const
@@ -77,6 +79,7 @@ export function drawScaleTicks(options: DrawScaleTicksOptions & { tickColor: str
77
79
  hideEdgeTicks = true,
78
80
  scaleType = 'linear',
79
81
  formatLabel,
82
+ textAlign = 'center',
80
83
  } = options
81
84
 
82
85
  ctx.clearRect(0, 0, axisWidth, height)
@@ -84,11 +87,15 @@ export function drawScaleTicks(options: DrawScaleTicksOptions & { tickColor: str
84
87
  const font = getFont(12)
85
88
  setCanvasFont(ctx, font)
86
89
  ctx.textBaseline = BASELINE_MIDDLE
87
- ctx.textAlign = ALIGN_CENTER
90
+ ctx.textAlign = textAlign as CanvasTextAlign
88
91
  ctx.fillStyle = options.tickColor
89
92
 
90
- const centerX = axisWidth / 2
91
- const centerXPx = roundToPhysicalPixel(centerX, dpr)
93
+ const alignTo = textAlign === 'center'
94
+ ? roundToPhysicalPixel(axisWidth / 2, dpr)
95
+ : textAlign === 'right'
96
+ ? roundToPhysicalPixel(axisWidth - 4, dpr)
97
+ : roundToPhysicalPixel(4, dpr)
98
+ const textX = alignTo
92
99
 
93
100
  const positions = calculateValueTickPositions({
94
101
  height,
@@ -106,7 +113,7 @@ export function drawScaleTicks(options: DrawScaleTicksOptions & { tickColor: str
106
113
 
107
114
  for (let i = 0; i < positions.length; i++) {
108
115
  const { y, value } = positions[i]!
109
- ctx.fillText(format(value), centerXPx, alignToPhysicalPixelCenter(y, dpr))
116
+ ctx.fillText(format(value), textX, y)
110
117
  }
111
118
  }
112
119