@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
@@ -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 ?? []
@@ -30,7 +30,7 @@ export function createCrosshairRendererPlugin(options: {
30
30
  const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
31
31
  const state = options.getCrosshairState()
32
32
 
33
- if (state.isDragging || !state.pos) return
33
+ if (!state.pos) return
34
34
 
35
35
  const { x } = state.pos
36
36
  const isActive = pane.id === state.activePaneId
@@ -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[]
@@ -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,77 @@
1
+ import type { RendererPlugin, RenderContext } from '../../plugin'
2
+ import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
+ import { drawScaleTicks } from '../renderers/Indicator/scale/indicator_scale'
4
+ import { drawCrosshairPriceLabel } from '../../utils/kLineDraw/axis'
5
+ import { resolveThemeColors } from '../../tokens'
6
+ import type { ScaleType } from '../utils/tickPosition'
7
+
8
+ export function createLeftYAxisRendererPlugin(options: {
9
+ axisWidth: number
10
+ yPaddingPx: number
11
+ getCrosshair?: () => { y: number; price: number; activePaneId: string | null } | null
12
+ }): RendererPlugin {
13
+ return {
14
+ name: 'leftYAxis',
15
+ version: '1.0.0',
16
+ description: '左侧Y轴价格刻度渲染器',
17
+ debugName: '左侧Y轴',
18
+ paneId: GLOBAL_PANE_ID,
19
+ priority: RENDERER_PRIORITY.SYSTEM_YAXIS,
20
+
21
+ draw(context: RenderContext) {
22
+ const { leftAxisCtx, pane, dpr, period } = context
23
+ if (!leftAxisCtx) return
24
+
25
+ const axisWidth = leftAxisCtx.canvas ? (leftAxisCtx.canvas.width / dpr) : 0
26
+ if (axisWidth <= 0) return
27
+
28
+ // 分时模式始终显示左轴(线性),不受设置约束
29
+ if (period !== 'timeshare') {
30
+ const leftType = context.settings?.leftAxisType as string | undefined
31
+ if (!leftType || leftType === 'none') return
32
+ }
33
+
34
+ const tokenColors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
35
+ const displayRange = pane.yAxis.getDisplayRange()
36
+ const { minPrice, maxPrice } = displayRange
37
+
38
+ if (!pane.capabilities.showPriceAxisTicks) return
39
+
40
+ const scaleType: ScaleType = period === 'timeshare' ? 'linear' : ((context.settings?.leftAxisType as ScaleType) ?? 'linear')
41
+
42
+ drawScaleTicks({
43
+ tickColor: tokenColors.text.secondary,
44
+ ctx: leftAxisCtx,
45
+ dpr,
46
+ axisWidth,
47
+ height: pane.height,
48
+ paddingTop: pane.yAxis.getPaddingTop(),
49
+ paddingBottom: pane.yAxis.getPaddingBottom(),
50
+ valueMin: minPrice,
51
+ valueMax: maxPrice,
52
+ isMain: true,
53
+ decimals: 2,
54
+ hideEdgeTicks: false,
55
+ scaleType,
56
+ textAlign: 'center',
57
+ })
58
+
59
+ const crosshair = options.getCrosshair?.()
60
+ if (!crosshair || crosshair.activePaneId !== pane.id || crosshair.price === null) return
61
+
62
+ drawCrosshairPriceLabel(leftAxisCtx, {
63
+ x: 0,
64
+ y: pane.top,
65
+ width: axisWidth,
66
+ height: pane.height,
67
+ crosshairY: crosshair.y,
68
+ priceRange: displayRange,
69
+ yPaddingPx: options.yPaddingPx,
70
+ dpr,
71
+ fontSize: 12,
72
+ priceOffset: 0,
73
+ price: crosshair.price,
74
+ }, context.theme, context.isAsiaMarket, context.colorPresetSettings)
75
+ },
76
+ }
77
+ }
@@ -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
+ }
@@ -25,7 +25,14 @@ export function createYAxisRendererPlugin(options: {
25
25
  priority: RENDERER_PRIORITY.SYSTEM_YAXIS,
26
26
 
27
27
  draw(context: RenderContext) {
28
- const { ctx, pane, dpr, yAxisCtx, data } = context
28
+ const { ctx, pane, dpr, yAxisCtx, data, period } = context
29
+
30
+ // 分时模式始终显示右轴,不受设置约束
31
+ if (period !== 'timeshare') {
32
+ const rightType = context.settings?.rightAxisType as string | undefined
33
+ if (rightType === 'none') return
34
+ }
35
+
29
36
  const tokenColors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
30
37
  const scaleType = pane.yAxis.getScaleType()
31
38
 
@@ -80,6 +87,7 @@ export function createYAxisRendererPlugin(options: {
80
87
  // 绘制来自 yAxisLabels 的标签(最新价格、极值点、绘图锚点等)
81
88
  if (context.yAxisLabels && pane.role === 'price') {
82
89
  for (const label of context.yAxisLabels) {
90
+ if (label.price == null || !Number.isFinite(label.price)) continue
83
91
  const isLastPrice = label.type === 'lastPrice'
84
92
  drawAxisPriceLabel(targetCtx, {
85
93
  x: 0,
@@ -2,7 +2,7 @@
2
2
 
3
3
  export type PriceRange = { maxPrice: number; minPrice: number }
4
4
 
5
- export function priceToY(
5
+ function priceToY(
6
6
  price: number,
7
7
  maxPrice: number,
8
8
  minPrice: number,
@@ -22,7 +22,7 @@ export function priceToY(
22
22
  * - y 是相对于绘图区顶部的逻辑像素坐标(不含额外 translate)
23
23
  * - paddingTop/paddingBottom 需与 priceToY 使用一致
24
24
  */
25
- export function yToPrice(
25
+ function yToPrice(
26
26
  y: number,
27
27
  maxPrice: number,
28
28
  minPrice: number,
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  /** 数字和文本的标准字体栈 */
8
- export const FONT_FAMILY = '"Trebuchet MS", Roboto, Ubuntu, sans-serif'
8
+ const FONT_FAMILY = '"Trebuchet MS", Roboto, Ubuntu, sans-serif'
9
9
 
10
10
  /** 获取指定字号的字体字符串,用于 Canvas ctx.font */
11
11
  export function getFont(size: number, options?: { bold?: boolean }): string {
@@ -10,11 +10,7 @@
10
10
  * @returns 奇数化后的物理像素宽度
11
11
  */
12
12
  export function calcKWidthPx(kWidth: number, dpr: number): number {
13
- let kWidthPx = Math.round(kWidth * dpr)
14
- if (kWidthPx % 2 === 0) {
15
- kWidthPx += 1
16
- }
17
- return Math.max(1, kWidthPx)
13
+ return Math.max(1, Math.round(kWidth * dpr))
18
14
  }
19
15
 
20
16
  /**
@@ -206,7 +206,8 @@ export class ChartViewportManager {
206
206
 
207
207
  const dom = this.deps.getDom()
208
208
 
209
- const canvasLayerWidth = `${viewWidth}px`
209
+ const dprRoundedViewWidth = Math.round(viewWidth * dpr) / dpr
210
+ const canvasLayerWidth = `${dprRoundedViewWidth}px`
210
211
  if (dom.canvasLayer.style.width !== canvasLayerWidth) {
211
212
  dom.canvasLayer.style.width = canvasLayerWidth
212
213
  }
@@ -216,9 +217,9 @@ export class ChartViewportManager {
216
217
  dom.canvasLayer.style.height = canvasLayerHeight
217
218
  }
218
219
 
219
- const xAxisWidth = Math.round(plotWidth * dpr)
220
- if (dom.xAxisCanvas.width !== xAxisWidth) {
221
- dom.xAxisCanvas.width = xAxisWidth
220
+ const xAxisWidthPx = Math.round(dprRoundedViewWidth * dpr)
221
+ if (dom.xAxisCanvas.width !== xAxisWidthPx) {
222
+ dom.xAxisCanvas.width = xAxisWidthPx
222
223
  }
223
224
 
224
225
  const xAxisHeight = Math.round(this.deps.getBottomAxisHeight() * dpr)
@@ -226,7 +227,7 @@ export class ChartViewportManager {
226
227
  dom.xAxisCanvas.height = xAxisHeight
227
228
  }
228
229
 
229
- const xAxisCssWidth = `${xAxisWidth / dpr}px`
230
+ const xAxisCssWidth = `${dprRoundedViewWidth}px`
230
231
  if (dom.xAxisCanvas.style.width !== xAxisCssWidth) {
231
232
  dom.xAxisCanvas.style.width = xAxisCssWidth
232
233
  }
package/src/index.ts CHANGED
@@ -4,3 +4,4 @@ export * from './mcp'
4
4
  export { VERSION } from './version'
5
5
  export * from './tokens'
6
6
  export { formatTimestamp } from './utils/dateFormat'
7
+ export { generateUUID } from './utils/uuid'
@@ -1,4 +1,5 @@
1
1
  import type { ToolCall, ToolResult, ControllerDescription, ToolCallHandler } from './types'
2
+ import { generateUUID } from '../utils/uuid'
2
3
 
3
4
  export interface ChartBridgeOptions {
4
5
  wsUrl: string
@@ -42,7 +43,7 @@ export class ChartBridge {
42
43
  onStateChange?: () => void
43
44
 
44
45
  constructor(options: ChartBridgeOptions) {
45
- this.sessionId = options.sessionId ?? crypto.randomUUID()
46
+ this.sessionId = options.sessionId ?? generateUUID()
46
47
  this.autoReconnect = options.autoReconnect ?? true
47
48
  this.reconnectDelay = options.reconnectDelay ?? 3000
48
49
  this.maxReconnectDelay = options.maxReconnectDelay ?? 30_000
@@ -294,6 +294,7 @@ export interface RenderContext {
294
294
  crosshairIndex?: number | null
295
295
  // 可选的其他 Canvas 上下文
296
296
  yAxisCtx?: CanvasRenderingContext2D
297
+ leftAxisCtx?: CanvasRenderingContext2D
297
298
  xAxisCtx?: CanvasRenderingContext2D
298
299
  borderCtx?: CanvasRenderingContext2D
299
300
  /** 覆盖层 Canvas 上下文(用于十字线、Tooltip 等动态内容) */
@@ -31,7 +31,7 @@ export interface DataConfig {
31
31
  startDate: string
32
32
  /** 结束日期 YYYY-MM-DD */
33
33
  endDate: string
34
- period: 'daily' | 'weekly' | 'monthly' | '5min' | '15min' | '30min' | '60min'
34
+ period: 'daily' | 'weekly' | 'monthly' | '5min' | '15min' | '30min' | '60min' | 'timeshare'
35
35
  adjust: AdjustType
36
36
  }
37
37
 
@@ -14,6 +14,7 @@ exports[`theme baseline — dark > CSS declaration block (snapshot) 1`] = `
14
14
  --klc-color-candle-doji-border: #8A8F98;
15
15
  --klc-color-volume-up: #22D69B66;
16
16
  --klc-color-volume-down: #FF646466;
17
+ --klc-color-volume-neutral: #FFFFFF66;
17
18
  --klc-color-axis-text: #9AA0A6;
18
19
  --klc-color-axis-line: #2A2F36;
19
20
  --klc-color-axis-tick: #2A2F36;
@@ -41,6 +42,12 @@ exports[`theme baseline — dark > CSS declaration block (snapshot) 1`] = `
41
42
  --klc-color-avwap-line: #A78BFA;
42
43
  --klc-color-avwap-band: #A78BFA33;
43
44
  --klc-color-mtf-overlay: #38BDF8;
45
+ --klc-color-time-share-price-line: #60A5FA;
46
+ --klc-color-time-share-avg-line: #FBBF24;
47
+ --klc-color-time-share-area-up: rgba(34, 214, 155, 0.20);
48
+ --klc-color-time-share-area-down: rgba(255, 100, 100, 0.20);
49
+ --klc-color-time-share-pre-close: #9CA3AF;
50
+ --klc-color-time-share-volume: #60A5FA;
44
51
  --klc-color-palette-i1: #4A9EFF;
45
52
  --klc-color-palette-i2: #FFB95A;
46
53
  --klc-color-palette-i3: #22D69B;
@@ -64,7 +71,7 @@ exports[`theme baseline — dark > CSS declaration block (snapshot) 1`] = `
64
71
  --klc-color-tag-bg-transparent: transparent;
65
72
  --klc-color-tag-bg-active: #1890ff;
66
73
  --klc-color-tag-bg-active-hover: #40a9ff;
67
- --klc-color-tag-bg-hover: #3a3a4a;
74
+ --klc-color-tag-bg-hover: #262C36;
68
75
  --klc-color-border-dark: rgba(255, 255, 255, 0.15);
69
76
  --klc-color-border-medium: rgba(255, 255, 255, 0.12);
70
77
  --klc-color-border-light: rgba(255, 255, 255, 0.08);
@@ -207,6 +214,7 @@ exports[`theme baseline — light > CSS declaration block (snapshot) 1`] = `
207
214
  --klc-color-candle-doji-border: #6E6E6E;
208
215
  --klc-color-volume-up: #0F8B5C66;
209
216
  --klc-color-volume-down: #C2363B66;
217
+ --klc-color-volume-neutral: #00000066;
210
218
  --klc-color-axis-text: #5A5A5A;
211
219
  --klc-color-axis-line: #D0D0D0;
212
220
  --klc-color-axis-tick: #D0D0D0;
@@ -234,6 +242,12 @@ exports[`theme baseline — light > CSS declaration block (snapshot) 1`] = `
234
242
  --klc-color-avwap-line: #7C3AED;
235
243
  --klc-color-avwap-band: #7C3AED33;
236
244
  --klc-color-mtf-overlay: #0369A1;
245
+ --klc-color-time-share-price-line: #4A90D9;
246
+ --klc-color-time-share-avg-line: #F5A623;
247
+ --klc-color-time-share-area-up: rgba(15, 139, 92, 0.15);
248
+ --klc-color-time-share-area-down: rgba(213, 19, 26, 0.15);
249
+ --klc-color-time-share-pre-close: #888888;
250
+ --klc-color-time-share-volume: #4A90D9;
237
251
  --klc-color-palette-i1: #0072B2;
238
252
  --klc-color-palette-i2: #E69F00;
239
253
  --klc-color-palette-i3: #009E73;