@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
@@ -1,23 +1,12 @@
1
1
  import { describe, it, expect, vi, beforeEach } from 'vitest'
2
2
  import { createYAxisRendererPlugin } from '@/core/renderers/yAxis'
3
- import type { RenderContext, PaneInfo } from '@/plugin'
4
-
5
- vi.mock('@/core/renderers/Indicator/scale/indicator_scale', async () => {
6
- const actual = await vi.importActual<typeof import('@/core/renderers/Indicator/scale/indicator_scale')>(
7
- '@/core/renderers/Indicator/scale/indicator_scale',
8
- )
9
- return {
10
- ...actual,
11
- drawScaleTicks: vi.fn(),
12
- }
13
- })
3
+ import type { RenderContext, PaneInfo, YAxisTick } from '@/plugin'
14
4
 
15
5
  vi.mock('@/utils/kLineDraw/axis', () => ({
16
6
  drawCrosshairPriceLabel: vi.fn(),
17
7
  drawAxisPriceLabel: vi.fn(),
18
8
  }))
19
9
 
20
- import { drawScaleTicks } from '@/core/renderers/Indicator/scale/indicator_scale'
21
10
  import { drawCrosshairPriceLabel, drawAxisPriceLabel } from '@/utils/kLineDraw/axis'
22
11
 
23
12
  function createPane(overrides: Partial<PaneInfo> = {}): PaneInfo {
@@ -53,12 +42,27 @@ function createPane(overrides: Partial<PaneInfo> = {}): PaneInfo {
53
42
  }
54
43
  }
55
44
 
45
+ const mockYAxisTicks: YAxisTick[] = [
46
+ { y: 10, value: 120 },
47
+ { y: 55, value: 110 },
48
+ { y: 100, value: 100 },
49
+ { y: 145, value: 90 },
50
+ { y: 190, value: 80 },
51
+ ]
52
+
53
+ function createCtx() {
54
+ return {
55
+ canvas: { width: 80, height: 200 },
56
+ clearRect: vi.fn(),
57
+ fillText: vi.fn(),
58
+ measureText: vi.fn(() => ({ width: 10 })),
59
+ save: vi.fn(),
60
+ restore: vi.fn(),
61
+ } as unknown as CanvasRenderingContext2D
62
+ }
63
+
56
64
  function createContext(overrides: Partial<RenderContext> = {}): RenderContext {
57
- const ctx = {} as CanvasRenderingContext2D
58
- Object.defineProperty(ctx, 'canvas', {
59
- value: { width: 80, height: 200 },
60
- configurable: true,
61
- })
65
+ const ctx = createCtx()
62
66
 
63
67
  return {
64
68
  ctx,
@@ -78,6 +82,7 @@ function createContext(overrides: Partial<RenderContext> = {}): RenderContext {
78
82
  xAxisLabels: [],
79
83
  period: 'daily',
80
84
  theme: 'light',
85
+ yAxisTicks: mockYAxisTicks,
81
86
  ...overrides,
82
87
  }
83
88
  }
@@ -93,7 +98,9 @@ describe('yAxis renderer', () => {
93
98
 
94
99
  plugin.draw(context)
95
100
 
96
- expect(drawScaleTicks).toHaveBeenCalledTimes(1)
101
+ const targetCtx = context.yAxisCtx!
102
+ expect(targetCtx.clearRect).toHaveBeenCalled()
103
+ expect(targetCtx.fillText).toHaveBeenCalled()
97
104
  })
98
105
 
99
106
  it('does not draw ticks when pane capability showPriceAxisTicks is false', () => {
@@ -111,21 +118,19 @@ describe('yAxis renderer', () => {
111
118
 
112
119
  plugin.draw(context)
113
120
 
114
- expect(drawScaleTicks).toHaveBeenCalledTimes(0)
121
+ const targetCtx = context.yAxisCtx!
122
+ expect(targetCtx.fillText).toHaveBeenCalledTimes(0)
115
123
  })
116
124
 
117
125
  it('uses ctx when yAxisCtx is not provided', () => {
118
126
  const plugin = createYAxisRendererPlugin({ axisWidth: 80, yPaddingPx: 0 })
119
- const fallbackCtx = {} as CanvasRenderingContext2D
127
+ const fallbackCtx = createCtx()
120
128
  const context = createContext({ ctx: fallbackCtx, yAxisCtx: undefined })
121
129
 
122
130
  plugin.draw(context)
123
131
 
124
- expect(drawScaleTicks).toHaveBeenCalledWith(
125
- expect.objectContaining({
126
- ctx: fallbackCtx,
127
- }),
128
- )
132
+ expect(fallbackCtx.clearRect).toHaveBeenCalled()
133
+ expect(fallbackCtx.fillText).toHaveBeenCalled()
129
134
  })
130
135
 
131
136
  it('draws last price label via drawAxisPriceLabel for main pane when yAxisLabels contains lastPrice', () => {
@@ -162,7 +167,6 @@ describe('yAxis renderer', () => {
162
167
 
163
168
  plugin.draw(context)
164
169
 
165
- // Last price now flows through drawAxisPriceLabel; only the crosshair label uses drawCrosshairPriceLabel
166
170
  expect(drawCrosshairPriceLabel).toHaveBeenCalledTimes(1)
167
171
  })
168
172
 
@@ -342,7 +342,7 @@ function drawVolumePriceMarkers(
342
342
  * @param gap - 三角形与K线的间距,默认为4
343
343
  * @param dpr - 设备像素比
344
344
  */
345
- export function drawVolumePriceMarker(
345
+ function drawVolumePriceMarker(
346
346
  ctx: CanvasRenderingContext2D,
347
347
  x: number,
348
348
  y: number,
@@ -14,6 +14,7 @@ export function createComparisonLineRenderer(): RendererPlugin {
14
14
  priority: RENDERER_PRIORITY.MAIN + 2,
15
15
 
16
16
  draw(context: RenderContext) {
17
+ if (context.period === 'timeshare') return
17
18
  const mainData = context.data as KLineData[]
18
19
  const comparisonData = context.comparisonData
19
20
  const comparisonSymbols = context.comparisonSymbols ?? []
@@ -108,6 +108,7 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
108
108
  priority: RENDERER_PRIORITY.OVERLAY,
109
109
 
110
110
  draw(context: RenderContext) {
111
+ if (context.period === 'timeshare') return
111
112
  const { ctx, pane, data, range, scrollLeft, dpr, paneWidth, kLineCenters } = context
112
113
  const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
113
114
  const klineData = data as KLineData[]
@@ -4,7 +4,7 @@ import type { KLineData } from '../../types/price'
4
4
  import { createHorizontalLineRect, createVerticalLineRect } from '../draw/pixelAlign'
5
5
  import { findMonthBoundaries } from '../../utils/dateFormat'
6
6
  import { resolveThemeColors } from '../../tokens'
7
- import { calculateTickPositions, calculateValueTickPositions, type ScaleType } from '../utils/tickPosition'
7
+
8
8
 
9
9
  /**
10
10
  * 创建网格线渲染器插件
@@ -34,41 +34,12 @@ export function createGridLinesRendererPlugin(): RendererPlugin {
34
34
  const plotWidth = ctx.canvas.width / dpr
35
35
  const startX = scrollLeft
36
36
  const endX = scrollLeft + plotWidth
37
- const pt = pane.yAxis.getPaddingTop()
38
- const pb = pane.yAxis.getPaddingBottom()
39
-
40
- // 水平网格线:与 Y 轴刻度对齐
41
- const scaleType = pane.yAxis.getScaleType()
42
- let yPositions: number[]
43
-
44
- if ((scaleType === 'log' || scaleType === 'percent') && pane.role === 'price') {
45
- const displayRange = pane.yAxis.getDisplayRange(pane.priceRange)
46
- const valueMin = scaleType === 'percent' ? pane.yAxis.getDisplayPercentRange().minPct : displayRange.minPrice
47
- const valueMax = scaleType === 'percent' ? pane.yAxis.getDisplayPercentRange().maxPct : displayRange.maxPrice
48
- const tickValues = calculateValueTickPositions({
49
- height: pane.height,
50
- paddingTop: pt,
51
- paddingBottom: pb,
52
- isMain: true,
53
- valueMin,
54
- valueMax,
55
- scaleType,
56
- })
57
- yPositions = tickValues.map(t => t.y)
58
- } else {
59
- // 线性模式:均匀分布
60
- const tickPositions = calculateTickPositions({
61
- height: pane.height,
62
- paddingTop: pt,
63
- paddingBottom: pb,
64
- isMain: pane.role === 'price',
65
- })
66
- yPositions = tickPositions.map(t => t.y)
67
- }
68
-
69
- for (const y of yPositions) {
70
- const h = createHorizontalLineRect(startX, endX, y, dpr)
71
- if (h) ctx.fillRect(h.x, h.y, h.width, h.height)
37
+ // 水平网格线:从预计算的 yAxisTicks 取 Y 位置,确保与轴刻度对齐
38
+ if (context.yAxisTicks) {
39
+ for (const tick of context.yAxisTicks) {
40
+ const h = createHorizontalLineRect(startX, endX, tick.y, dpr)
41
+ if (h) ctx.fillRect(h.x, h.y, h.width, h.height)
42
+ }
72
43
  }
73
44
 
74
45
  const boundaries = findMonthBoundaries(klineData)
@@ -35,6 +35,7 @@ export function createLastPriceLabelRegistrarPlugin(): RendererPlugin {
35
35
  priority: RENDERER_PRIORITY.LAST_PRICE_LABEL,
36
36
 
37
37
  draw(context: RenderContext) {
38
+ if (context.period === 'timeshare') return
38
39
  const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
39
40
  const info = getLastPriceInfo(context)
40
41
  if (!info) return
@@ -68,7 +69,8 @@ export function createLastPriceLineRendererPlugin(): RendererPlugin {
68
69
  priority: RENDERER_PRIORITY.LAST_PRICE_LABEL,
69
70
 
70
71
  draw(context: RenderContext) {
71
- const { ctx, scrollLeft, dpr, kLinePositions, paneWidth } = context
72
+ if (context.period === 'timeshare') return
73
+ const { ctx, scrollLeft, dpr, paneWidth } = context
72
74
  const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
73
75
  const info = getLastPriceInfo(context)
74
76
  if (!info) return
@@ -78,7 +80,8 @@ export function createLastPriceLineRendererPlugin(): RendererPlugin {
78
80
  ctx.save()
79
81
  ctx.translate(-scrollLeft, 0)
80
82
 
81
- const startX = kLinePositions[0] ?? 0
83
+ // 最新价水平线横贯整个视口(从左边缘到右边缘)
84
+ const startX = scrollLeft
82
85
  const endX = paneWidth + scrollLeft
83
86
 
84
87
  ctx.strokeStyle = colors.price.lastPrice
@@ -0,0 +1,93 @@
1
+ import type { RendererPlugin, RenderContext } from '../../plugin'
2
+ import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
+ import { drawCrosshairPriceLabel } from '../../utils/kLineDraw/axis'
4
+ import { resolveThemeColors } from '../../tokens'
5
+ import { getFont, setCanvasFont } from '../theme/fonts'
6
+ import { roundToPhysicalPixel } from '../draw/pixelAlign'
7
+ import { priceAtYForScaleType, type ScaleType } from '../utils/tickPosition'
8
+
9
+ export function createLeftYAxisRendererPlugin(options: {
10
+ axisWidth: number
11
+ yPaddingPx: number
12
+ getCrosshair?: () => { y: number; price: number; activePaneId: string | null } | null
13
+ }): RendererPlugin {
14
+ return {
15
+ name: 'leftYAxis',
16
+ version: '1.0.0',
17
+ description: '左侧Y轴价格刻度渲染器',
18
+ debugName: '左侧Y轴',
19
+ paneId: GLOBAL_PANE_ID,
20
+ priority: RENDERER_PRIORITY.SYSTEM_YAXIS,
21
+
22
+ draw(context: RenderContext) {
23
+ const { leftAxisCtx, pane, dpr, period } = context
24
+ if (!leftAxisCtx) return
25
+
26
+ const axisWidth = leftAxisCtx.canvas ? (leftAxisCtx.canvas.width / dpr) : 0
27
+ if (axisWidth <= 0) return
28
+
29
+ // 分时模式始终显示左轴(线性),不受设置约束
30
+ if (period !== 'timeshare') {
31
+ const leftType = context.settings?.leftAxisType as string | undefined
32
+ if (!leftType || leftType === 'none') return
33
+ }
34
+
35
+ const tokenColors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
36
+
37
+ if (!pane.capabilities.showPriceAxisTicks) return
38
+
39
+ const scaleType: ScaleType = period === 'timeshare' ? 'linear' : ((context.settings?.leftAxisType as ScaleType) ?? 'linear')
40
+ const paneScaleType = pane.yAxis.getScaleType()
41
+
42
+ if (!context.yAxisTicks) return
43
+
44
+ leftAxisCtx.clearRect(0, 0, axisWidth, pane.height)
45
+
46
+ const font = getFont(12)
47
+ setCanvasFont(leftAxisCtx, font)
48
+ leftAxisCtx.textBaseline = 'middle'
49
+ leftAxisCtx.textAlign = 'center'
50
+ leftAxisCtx.fillStyle = tokenColors.text.secondary
51
+
52
+ const textX = roundToPhysicalPixel(axisWidth / 2, dpr)
53
+
54
+ const needsOwnValues = scaleType !== paneScaleType
55
+ const crosshairPriceRange = pane.yAxis.getDisplayRange()
56
+
57
+ for (const tick of context.yAxisTicks) {
58
+ let displayValue: number
59
+ if (needsOwnValues) {
60
+ if (scaleType === 'percent') {
61
+ displayValue = pane.yAxis.toPercent(tick.value)
62
+ } else {
63
+ const { minPrice, maxPrice } = crosshairPriceRange
64
+ displayValue = priceAtYForScaleType(
65
+ tick.y, minPrice, maxPrice, scaleType,
66
+ pane.height, pane.yAxis.getPaddingTop(), pane.yAxis.getPaddingBottom(),
67
+ )
68
+ }
69
+ } else {
70
+ displayValue = tick.value
71
+ }
72
+ leftAxisCtx.fillText(displayValue.toFixed(2), textX, tick.y)
73
+ }
74
+
75
+ const crosshair = options.getCrosshair?.()
76
+ if (!crosshair || crosshair.activePaneId !== pane.id || crosshair.price === null) return
77
+
78
+ drawCrosshairPriceLabel(leftAxisCtx, {
79
+ x: 0,
80
+ y: pane.top,
81
+ width: axisWidth,
82
+ height: pane.height,
83
+ crosshairY: crosshair.y,
84
+ priceRange: crosshairPriceRange,
85
+ yPaddingPx: options.yPaddingPx,
86
+ dpr,
87
+ fontSize: 12,
88
+ priceOffset: 0,
89
+ price: crosshair.price,
90
+ }, context.theme, context.isAsiaMarket, context.colorPresetSettings)
91
+ },
92
+ }
93
+ }
@@ -8,12 +8,12 @@ import { resolveStateKey } from '../indicators/indicatorMetadata'
8
8
  import type { IndicatorScheduler } from '../indicators/scheduler'
9
9
  import { createVolumeScaleRendererPlugin } from './Indicator/scale/volume_scale'
10
10
 
11
- export interface VolumeRendererOptions {
11
+ interface VolumeRendererOptions {
12
12
  /** 目标 pane ID(默认 'sub') */
13
13
  paneId?: string
14
14
  }
15
15
 
16
- export interface VolumeRenderState extends BaseIndicatorState {
16
+ interface VolumeRenderState extends BaseIndicatorState {
17
17
  valueMin: number
18
18
  valueMax: number
19
19
  }
@@ -35,7 +35,7 @@ function getVolumeStateKey(host: PluginHost | null, paneId: string): string | nu
35
35
  /**
36
36
  * 创建副图成交量渲染器插件
37
37
  */
38
- export function createVolumeRendererPlugin(options: VolumeRendererOptions = {}): RendererPluginWithHost {
38
+ function createVolumeRendererPlugin(options: VolumeRendererOptions = {}): RendererPluginWithHost {
39
39
  const { paneId = 'sub' } = options
40
40
  let pluginHost: PluginHost | null = null
41
41
 
@@ -5,7 +5,7 @@ import type { KLineData } from '../../types/price'
5
5
  import { drawTimeAxis, drawCrosshairTimeLabel, drawAxisTimeLabel } from '../../utils/kLineDraw/axis'
6
6
 
7
7
  /** 时间轴面板 ID(特殊标识,用于单独渲染) */
8
- export const TIME_AXIS_PANE_ID = Symbol('time-axis')
8
+ const TIME_AXIS_PANE_ID = Symbol('time-axis')
9
9
 
10
10
  /**
11
11
  * 创建时间轴渲染器插件
@@ -52,6 +52,8 @@ export function createTimeAxisRendererPlugin(options: {
52
52
  startIndex: range.start,
53
53
  endIndex: range.end,
54
54
  dpr,
55
+ kLineCenters: context.kLineCenters,
56
+ visibleRange: range,
55
57
  textColor: colors.text.secondary,
56
58
  lineColor: colors.border.dark,
57
59
  drawTopBorder: false,
@@ -79,18 +81,19 @@ export function createTimeAxisRendererPlugin(options: {
79
81
  if (crosshair && typeof crosshair.index === 'number') {
80
82
  const k = klineData[crosshair.index]
81
83
  if (k) {
82
- drawCrosshairTimeLabel(targetCtx, {
83
- x: 0,
84
- y: 0,
85
- width: w,
86
- height: h,
87
- crosshairX: crosshair.x,
88
- timestamp: k.timestamp,
89
- dpr,
90
- fontSize: 12,
91
- bgColor: colors.crosshairLabelBg,
92
- textColor: colors.crosshairLabelText,
93
- }, context.theme, context.isAsiaMarket, context.colorPresetSettings)
84
+ drawCrosshairTimeLabel(targetCtx, {
85
+ x: 0,
86
+ y: 0,
87
+ width: w,
88
+ height: h,
89
+ crosshairX: crosshair.x,
90
+ timestamp: k.timestamp,
91
+ dpr,
92
+ fontSize: 12,
93
+ bgColor: colors.crosshairLabelBg,
94
+ textColor: colors.crosshairLabelText,
95
+ period: context.period,
96
+ }, context.theme, context.isAsiaMarket, context.colorPresetSettings)
94
97
  }
95
98
  }
96
99
 
@@ -0,0 +1,271 @@
1
+ import type { RendererPlugin, RenderContext, RendererPluginWithHost, PluginHost } from '../../plugin'
2
+ import { RENDERER_PRIORITY } from '../../plugin'
3
+ import type { TimeShareData } from '../../types/price'
4
+ import { resolveThemeColors } from '../../tokens'
5
+ import { Indicator } from '../indicators/indicatorDefinitionRegistry'
6
+
7
+ /** 成交量区域占 pane 高度的比例(底部) */
8
+ const VOLUME_RATIO = 0.25
9
+
10
+ export function createTimeShareRendererPlugin(): RendererPluginWithHost {
11
+ return {
12
+ name: 'timeShare',
13
+ version: '1.0.0',
14
+ description: '股票分时图渲染器',
15
+ debugName: '分时图',
16
+ paneId: 'main',
17
+ priority: RENDERER_PRIORITY.MAIN,
18
+
19
+ onInstall(_host: PluginHost) {
20
+ },
21
+
22
+ draw(context: RenderContext) {
23
+ const { ctx, pane, data, range, dpr, kLineCenters, scrollLeft, settings, kBarRects } = context
24
+ if (context.period !== 'timeshare') return
25
+ const tsData = data as TimeShareData[]
26
+ if (!tsData.length) return
27
+
28
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
29
+ const preClose = (settings?.preClose as number) ?? tsData[0]?.price ?? 0
30
+ if (preClose === 0) return
31
+
32
+ const paneHeight = pane.height
33
+ const volumeAreaHeight = Math.round(paneHeight * VOLUME_RATIO * dpr) / dpr
34
+ const priceAreaHeight = paneHeight - volumeAreaHeight
35
+
36
+ const { start, end } = range
37
+ const visibleCount = Math.min(end - start, tsData.length - start)
38
+ const itemCount = Math.min(end, tsData.length) - start
39
+
40
+ const xPositions: number[] = []
41
+ const yPrices: number[] = []
42
+ const yAvgs: number[] = []
43
+ const volumes: number[] = []
44
+ let maxVolume = 0
45
+
46
+ for (let i = start; i < start + itemCount; i++) {
47
+ const item = tsData[i]
48
+ if (!item) continue
49
+ const x = kLineCenters[i - start]
50
+ if (x === undefined) continue
51
+ xPositions.push(x)
52
+ yPrices.push(pane.yAxis.priceToY(item.price))
53
+ yAvgs.push(pane.yAxis.priceToY(item.average))
54
+ volumes.push(item.volume)
55
+ maxVolume = Math.max(maxVolume, item.volume)
56
+ }
57
+
58
+ if (xPositions.length < 2) return
59
+
60
+ ctx.save()
61
+ ctx.translate(-scrollLeft, 0)
62
+
63
+ const preCloseY = pane.yAxis.priceToY(preClose)
64
+
65
+ drawPreCloseLine(ctx, xPositions, preCloseY, dpr, colors.timeSharePreClose)
66
+
67
+ drawAreaFill(ctx, xPositions, yPrices, preCloseY, dpr,
68
+ colors.timeShareAreaUp, colors.timeShareAreaDown)
69
+
70
+ drawSegmentLine(ctx, xPositions, yPrices, dpr, colors.timeSharePriceLine, 2)
71
+
72
+ drawSegmentLine(ctx, xPositions, yAvgs, dpr, colors.timeShareAvgLine, 1.5)
73
+
74
+ drawVolumeBars(ctx, kBarRects, volumes, maxVolume, volumeAreaHeight, paneHeight, preClose, dpr, colors.volumeUp, colors.volumeDown, colors.volumeNeutral, tsData, start)
75
+
76
+ ctx.restore()
77
+ },
78
+ }
79
+ }
80
+
81
+ function drawPreCloseLine(
82
+ ctx: CanvasRenderingContext2D,
83
+ xPositions: number[],
84
+ y: number,
85
+ dpr: number,
86
+ color: string,
87
+ ): void {
88
+ if (xPositions.length < 2) return
89
+ const firstX = xPositions[0]
90
+ const lastX = xPositions[xPositions.length - 1]
91
+
92
+ ctx.save()
93
+ ctx.strokeStyle = color
94
+ ctx.lineWidth = 1
95
+ ctx.setLineDash([4, 4])
96
+ ctx.beginPath()
97
+ ctx.moveTo(firstX, y)
98
+ ctx.lineTo(lastX, y)
99
+ ctx.stroke()
100
+ ctx.setLineDash([])
101
+ ctx.restore()
102
+ }
103
+
104
+ function drawAreaFill(
105
+ ctx: CanvasRenderingContext2D,
106
+ xPositions: number[],
107
+ yPrices: number[],
108
+ baselineY: number,
109
+ dpr: number,
110
+ upColor: string,
111
+ downColor: string,
112
+ ): void {
113
+ if (xPositions.length < 2) return
114
+
115
+ const n = xPositions.length
116
+
117
+ function buildPolygon(isAbove: boolean): Array<{ x: number; y: number }> {
118
+ const pts: Array<{ x: number; y: number }> = [{ x: xPositions[0]!, y: baselineY }]
119
+ const firstOnOurSide = isAbove
120
+ ? yPrices[0]! <= baselineY
121
+ : yPrices[0]! >= baselineY
122
+ if (firstOnOurSide) {
123
+ pts.push({ x: xPositions[0]!, y: yPrices[0]! })
124
+ }
125
+
126
+ for (let i = 0; i < n - 1; i++) {
127
+ const x1 = xPositions[i]!, y1 = yPrices[i]!
128
+ const x2 = xPositions[i + 1]!, y2 = yPrices[i + 1]!
129
+
130
+ const y1OnOurSide = isAbove ? y1 <= baselineY : y1 >= baselineY
131
+ const y2OnOurSide = isAbove ? y2 <= baselineY : y2 >= baselineY
132
+
133
+ if (y1OnOurSide !== y2OnOurSide) {
134
+ const t = (baselineY - y1) / (y2 - y1)
135
+ const cx = x1 + t * (x2 - x1)
136
+ pts.push({ x: cx, y: baselineY })
137
+ }
138
+ if (y2OnOurSide) {
139
+ pts.push({ x: x2, y: y2 })
140
+ }
141
+ }
142
+
143
+ pts.push({ x: xPositions[n - 1]!, y: baselineY })
144
+ return pts
145
+ }
146
+
147
+ const abovePts = buildPolygon(true)
148
+ if (abovePts.length >= 3) {
149
+ const topY = Math.min(...abovePts.map((p) => p.y))
150
+ ctx.save()
151
+ const grad = ctx.createLinearGradient(0, topY, 0, baselineY)
152
+ grad.addColorStop(0, upColor)
153
+ grad.addColorStop(1, 'rgba(0,0,0,0)')
154
+ ctx.beginPath()
155
+ ctx.moveTo(abovePts[0]!.x, abovePts[0]!.y)
156
+ for (let i = 1; i < abovePts.length; i++) {
157
+ ctx.lineTo(abovePts[i]!.x, abovePts[i]!.y)
158
+ }
159
+ ctx.closePath()
160
+ ctx.fillStyle = grad
161
+ ctx.fill()
162
+ ctx.restore()
163
+ }
164
+
165
+ const belowPts = buildPolygon(false)
166
+ if (belowPts.length >= 3) {
167
+ const botY = Math.max(...belowPts.map((p) => p.y))
168
+ ctx.save()
169
+ const grad = ctx.createLinearGradient(0, baselineY, 0, botY)
170
+ grad.addColorStop(0, 'rgba(0,0,0,0)')
171
+ grad.addColorStop(1, downColor)
172
+ ctx.beginPath()
173
+ ctx.moveTo(belowPts[0]!.x, belowPts[0]!.y)
174
+ for (let i = 1; i < belowPts.length; i++) {
175
+ ctx.lineTo(belowPts[i]!.x, belowPts[i]!.y)
176
+ }
177
+ ctx.closePath()
178
+ ctx.fillStyle = grad
179
+ ctx.fill()
180
+ ctx.restore()
181
+ }
182
+ }
183
+
184
+ function drawSegmentLine(
185
+ ctx: CanvasRenderingContext2D,
186
+ xPositions: number[],
187
+ yPositions: number[],
188
+ _dpr: number,
189
+ color: string,
190
+ lineWidth: number,
191
+ ): void {
192
+ if (xPositions.length < 2) return
193
+
194
+ ctx.save()
195
+ ctx.strokeStyle = color
196
+ ctx.lineWidth = lineWidth
197
+ ctx.lineJoin = 'round'
198
+ ctx.lineCap = 'round'
199
+
200
+ ctx.beginPath()
201
+ ctx.moveTo(xPositions[0], yPositions[0])
202
+
203
+ for (let i = 1; i < xPositions.length; i++) {
204
+ ctx.lineTo(xPositions[i], yPositions[i])
205
+ }
206
+
207
+ ctx.stroke()
208
+ ctx.restore()
209
+ }
210
+
211
+ function drawVolumeBars(
212
+ ctx: CanvasRenderingContext2D,
213
+ barRects: Array<{ x: number; width: number }>,
214
+ volumes: number[],
215
+ maxVolume: number,
216
+ volumeAreaHeight: number,
217
+ paneHeight: number,
218
+ preClose: number,
219
+ dpr: number,
220
+ upColor: string,
221
+ downColor: string,
222
+ neutralColor: string,
223
+ data: TimeShareData[],
224
+ startIdx: number,
225
+ ): void {
226
+ if (!barRects.length || maxVolume <= 0) return
227
+
228
+ const snappedBottom = Math.round(paneHeight * dpr) / dpr
229
+
230
+ for (let i = 0; i < barRects.length; i++) {
231
+ const volume = volumes[i]
232
+ if (volume <= 0) continue
233
+
234
+ const barHeight = (volume / maxVolume) * volumeAreaHeight
235
+ const snappedH = Math.round(barHeight * dpr) / dpr
236
+ const snappedY = snappedBottom - snappedH
237
+ const { x, width } = barRects[i]!
238
+ const idx = startIdx + i
239
+
240
+ let barColor: string
241
+ if (i > 0) {
242
+ const price = data[idx].price
243
+ const prevPrice = data[idx - 1].price
244
+ if (price > prevPrice) barColor = upColor
245
+ else if (price < prevPrice) barColor = downColor
246
+ else barColor = neutralColor
247
+ } else {
248
+ if (data[idx].price > preClose) barColor = upColor
249
+ else if (data[idx].price < preClose) barColor = downColor
250
+ else barColor = neutralColor
251
+ }
252
+
253
+ const minSize = 1 / dpr
254
+ const finalW = width > 0 ? Math.max(width, minSize) : 0
255
+ const finalH = snappedH > 0 ? Math.max(snappedH, minSize) : 0
256
+
257
+ ctx.fillStyle = barColor
258
+ ctx.fillRect(x, snappedY, finalW, finalH)
259
+ }
260
+ }
261
+
262
+ @Indicator({
263
+ name: 'timeShare',
264
+ displayName: '分时',
265
+ category: 'main',
266
+ defaultPaneId: 'main',
267
+ mainPane: { rendererName: 'timeShare' },
268
+ })
269
+ class TimeShareIndicatorDefinition {
270
+ static rendererFactory = createTimeShareRendererPlugin
271
+ }