@363045841yyt/klinechart-core 0.8.6 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/dist/config/chartSettings.d.ts +21 -2
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +9 -1
  4. package/dist/config/chartSettings.js.map +1 -1
  5. package/dist/controllers/createChartController.d.ts.map +1 -1
  6. package/dist/controllers/createChartController.js +49 -2
  7. package/dist/controllers/createChartController.js.map +1 -1
  8. package/dist/controllers/types.d.ts +34 -23
  9. package/dist/controllers/types.d.ts.map +1 -1
  10. package/dist/data-fetchers/baostock.d.ts +0 -3
  11. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  12. package/dist/data-fetchers/baostock.js +0 -1
  13. package/dist/data-fetchers/baostock.js.map +1 -1
  14. package/dist/data-fetchers/dataBuffer.d.ts +13 -2
  15. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  16. package/dist/data-fetchers/dataBuffer.js +41 -7
  17. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  18. package/dist/data-fetchers/dataBufferTypes.d.ts +11 -0
  19. package/dist/data-fetchers/dataBufferTypes.d.ts.map +1 -0
  20. package/dist/data-fetchers/dataBufferTypes.js +2 -0
  21. package/dist/data-fetchers/dataBufferTypes.js.map +1 -0
  22. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts +4 -3
  23. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  24. package/dist/data-fetchers/fetcherDefinitionRegistry.js +9 -2
  25. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  26. package/dist/data-fetchers/gotdx/gotdx.d.ts +7 -0
  27. package/dist/data-fetchers/gotdx/gotdx.d.ts.map +1 -0
  28. package/dist/data-fetchers/gotdx/gotdx.js +7 -0
  29. package/dist/data-fetchers/gotdx/gotdx.js.map +1 -0
  30. package/dist/data-fetchers/gotdx.d.ts +0 -8
  31. package/dist/data-fetchers/gotdx.d.ts.map +1 -1
  32. package/dist/data-fetchers/gotdx.js +40 -3
  33. package/dist/data-fetchers/gotdx.js.map +1 -1
  34. package/dist/data-fetchers/hundred-mock.d.ts +0 -3
  35. package/dist/data-fetchers/hundred-mock.d.ts.map +1 -1
  36. package/dist/data-fetchers/hundred-mock.js +0 -1
  37. package/dist/data-fetchers/hundred-mock.js.map +1 -1
  38. package/dist/data-fetchers/index.d.ts +10 -8
  39. package/dist/data-fetchers/index.d.ts.map +1 -1
  40. package/dist/data-fetchers/index.js +8 -7
  41. package/dist/data-fetchers/index.js.map +1 -1
  42. package/dist/data-fetchers/router.d.ts +2 -0
  43. package/dist/data-fetchers/router.d.ts.map +1 -1
  44. package/dist/data-fetchers/router.js +8 -1
  45. package/dist/data-fetchers/router.js.map +1 -1
  46. package/dist/data-fetchers/thousand-mock.d.ts +0 -3
  47. package/dist/data-fetchers/thousand-mock.d.ts.map +1 -1
  48. package/dist/data-fetchers/thousand-mock.js +0 -1
  49. package/dist/data-fetchers/thousand-mock.js.map +1 -1
  50. package/dist/data-fetchers/timeShareBuffer.d.ts +27 -0
  51. package/dist/data-fetchers/timeShareBuffer.d.ts.map +1 -0
  52. package/dist/data-fetchers/timeShareBuffer.js +79 -0
  53. package/dist/data-fetchers/timeShareBuffer.js.map +1 -0
  54. package/dist/data-fetchers/tradingview.d.ts +0 -8
  55. package/dist/data-fetchers/tradingview.d.ts.map +1 -1
  56. package/dist/data-fetchers/tradingview.js +1 -2
  57. package/dist/data-fetchers/tradingview.js.map +1 -1
  58. package/dist/data-fetchers/types.d.ts +9 -1
  59. package/dist/data-fetchers/types.d.ts.map +1 -1
  60. package/dist/engine/chart.d.ts +29 -1
  61. package/dist/engine/chart.d.ts.map +1 -1
  62. package/dist/engine/chart.js +140 -5
  63. package/dist/engine/chart.js.map +1 -1
  64. package/dist/engine/chartTypes.d.ts +3 -0
  65. package/dist/engine/chartTypes.d.ts.map +1 -1
  66. package/dist/engine/controller/interaction.d.ts +6 -1
  67. package/dist/engine/controller/interaction.d.ts.map +1 -1
  68. package/dist/engine/controller/interaction.js +76 -28
  69. package/dist/engine/controller/interaction.js.map +1 -1
  70. package/dist/engine/data/chartDataManager.d.ts +38 -11
  71. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  72. package/dist/engine/data/chartDataManager.js +491 -188
  73. package/dist/engine/data/chartDataManager.js.map +1 -1
  74. package/dist/engine/draw/pixelAlign.d.ts +0 -27
  75. package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
  76. package/dist/engine/draw/pixelAlign.js +1 -1
  77. package/dist/engine/draw/pixelAlign.js.map +1 -1
  78. package/dist/engine/indicators/calculators.d.ts +0 -104
  79. package/dist/engine/indicators/calculators.d.ts.map +1 -1
  80. package/dist/engine/indicators/calculators.js +57 -168
  81. package/dist/engine/indicators/calculators.js.map +1 -1
  82. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  83. package/dist/engine/indicators/chartIndicatorManager.js +3 -2
  84. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  85. package/dist/engine/indicators/macdState.d.ts +0 -5
  86. package/dist/engine/indicators/macdState.d.ts.map +1 -1
  87. package/dist/engine/indicators/macdState.js +1 -1
  88. package/dist/engine/indicators/macdState.js.map +1 -1
  89. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  90. package/dist/engine/indicators/registerBuiltins.js +1 -0
  91. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  92. package/dist/engine/indicators/rsiState.d.ts +0 -4
  93. package/dist/engine/indicators/rsiState.d.ts.map +1 -1
  94. package/dist/engine/indicators/rsiState.js +1 -1
  95. package/dist/engine/indicators/rsiState.js.map +1 -1
  96. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  97. package/dist/engine/indicators/scheduler.js +1 -7
  98. package/dist/engine/indicators/scheduler.js.map +1 -1
  99. package/dist/engine/layout/chartPaneLayout.d.ts +2 -0
  100. package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
  101. package/dist/engine/layout/chartPaneLayout.js +24 -6
  102. package/dist/engine/layout/chartPaneLayout.js.map +1 -1
  103. package/dist/engine/modes/kLineMode.d.ts +37 -0
  104. package/dist/engine/modes/kLineMode.d.ts.map +1 -0
  105. package/dist/engine/modes/kLineMode.js +22 -0
  106. package/dist/engine/modes/kLineMode.js.map +1 -0
  107. package/dist/engine/modes/timeShareMode.d.ts +37 -0
  108. package/dist/engine/modes/timeShareMode.d.ts.map +1 -0
  109. package/dist/engine/modes/timeShareMode.js +59 -0
  110. package/dist/engine/modes/timeShareMode.js.map +1 -0
  111. package/dist/engine/modes/types.d.ts +47 -0
  112. package/dist/engine/modes/types.d.ts.map +1 -0
  113. package/dist/engine/modes/types.js +2 -0
  114. package/dist/engine/modes/types.js.map +1 -0
  115. package/dist/engine/paneRenderer.d.ts +4 -0
  116. package/dist/engine/paneRenderer.d.ts.map +1 -1
  117. package/dist/engine/paneRenderer.js +27 -40
  118. package/dist/engine/paneRenderer.js.map +1 -1
  119. package/dist/engine/render/chartRenderer.d.ts +4 -23
  120. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  121. package/dist/engine/render/chartRenderer.js +87 -17
  122. package/dist/engine/render/chartRenderer.js.map +1 -1
  123. package/dist/engine/renderers/Indicator/atr.d.ts +1 -18
  124. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  125. package/dist/engine/renderers/Indicator/atr.js +3 -22
  126. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  127. package/dist/engine/renderers/Indicator/boll.d.ts +1 -4
  128. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  129. package/dist/engine/renderers/Indicator/boll.js +3 -18
  130. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  131. package/dist/engine/renderers/Indicator/cci.d.ts +1 -22
  132. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  133. package/dist/engine/renderers/Indicator/cci.js +8 -20
  134. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  135. package/dist/engine/renderers/Indicator/chaikinVol.d.ts +1 -7
  136. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  137. package/dist/engine/renderers/Indicator/chaikinVol.js +3 -16
  138. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  139. package/dist/engine/renderers/Indicator/cmf.d.ts +1 -7
  140. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  141. package/dist/engine/renderers/Indicator/cmf.js +3 -15
  142. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  143. package/dist/engine/renderers/Indicator/dema.d.ts +1 -7
  144. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  145. package/dist/engine/renderers/Indicator/dema.js +3 -17
  146. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  147. package/dist/engine/renderers/Indicator/donchian.d.ts +1 -8
  148. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  149. package/dist/engine/renderers/Indicator/donchian.js +2 -2
  150. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  151. package/dist/engine/renderers/Indicator/ene.d.ts +1 -12
  152. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  153. package/dist/engine/renderers/Indicator/ene.js +3 -18
  154. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  155. package/dist/engine/renderers/Indicator/expma.d.ts +1 -4
  156. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  157. package/dist/engine/renderers/Indicator/expma.js +2 -2
  158. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  159. package/dist/engine/renderers/Indicator/fastk.d.ts +1 -22
  160. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  161. package/dist/engine/renderers/Indicator/fastk.js +11 -64
  162. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  163. package/dist/engine/renderers/Indicator/fib.d.ts +1 -6
  164. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  165. package/dist/engine/renderers/Indicator/fib.js +2 -2
  166. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  167. package/dist/engine/renderers/Indicator/hma.d.ts +1 -7
  168. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  169. package/dist/engine/renderers/Indicator/hma.js +3 -17
  170. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  171. package/dist/engine/renderers/Indicator/hv.d.ts +1 -7
  172. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  173. package/dist/engine/renderers/Indicator/hv.js +3 -16
  174. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  175. package/dist/engine/renderers/Indicator/ichimoku.d.ts +1 -8
  176. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  177. package/dist/engine/renderers/Indicator/ichimoku.js +2 -2
  178. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  179. package/dist/engine/renderers/Indicator/kama.d.ts +1 -7
  180. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  181. package/dist/engine/renderers/Indicator/kama.js +3 -17
  182. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  183. package/dist/engine/renderers/Indicator/keltner.d.ts +1 -8
  184. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  185. package/dist/engine/renderers/Indicator/keltner.js +2 -2
  186. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  187. package/dist/engine/renderers/Indicator/kst.d.ts +1 -22
  188. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  189. package/dist/engine/renderers/Indicator/kst.js +2 -2
  190. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  191. package/dist/engine/renderers/Indicator/ma.d.ts +1 -4
  192. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  193. package/dist/engine/renderers/Indicator/ma.js +1 -1
  194. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  195. package/dist/engine/renderers/Indicator/macd.d.ts +1 -49
  196. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  197. package/dist/engine/renderers/Indicator/macd.js +2 -12
  198. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  199. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  200. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +114 -1
  201. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  202. package/dist/engine/renderers/Indicator/mfi.d.ts +1 -7
  203. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  204. package/dist/engine/renderers/Indicator/mfi.js +3 -15
  205. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  206. package/dist/engine/renderers/Indicator/mom.d.ts +1 -22
  207. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  208. package/dist/engine/renderers/Indicator/mom.js +8 -23
  209. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  210. package/dist/engine/renderers/Indicator/obv.d.ts +1 -7
  211. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  212. package/dist/engine/renderers/Indicator/obv.js +3 -14
  213. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  214. package/dist/engine/renderers/Indicator/parkinson.d.ts +1 -7
  215. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  216. package/dist/engine/renderers/Indicator/parkinson.js +3 -16
  217. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  218. package/dist/engine/renderers/Indicator/pivot.d.ts +1 -6
  219. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  220. package/dist/engine/renderers/Indicator/pivot.js +2 -2
  221. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  222. package/dist/engine/renderers/Indicator/pvt.d.ts +1 -7
  223. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  224. package/dist/engine/renderers/Indicator/pvt.js +3 -14
  225. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  226. package/dist/engine/renderers/Indicator/roc.d.ts +1 -8
  227. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  228. package/dist/engine/renderers/Indicator/roc.js +3 -15
  229. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  230. package/dist/engine/renderers/Indicator/rsi.d.ts +0 -32
  231. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  232. package/dist/engine/renderers/Indicator/rsi.js +3 -3
  233. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  234. package/dist/engine/renderers/Indicator/sar.d.ts +1 -8
  235. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  236. package/dist/engine/renderers/Indicator/sar.js +2 -2
  237. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  238. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +2 -0
  239. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  240. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +10 -6
  241. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  242. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts +4 -0
  243. package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts.map +1 -0
  244. package/dist/engine/renderers/Indicator/shared/dashedLines.js +50 -0
  245. package/dist/engine/renderers/Indicator/shared/dashedLines.js.map +1 -0
  246. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts +14 -0
  247. package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -0
  248. package/dist/engine/renderers/Indicator/shared/titleInfo.js +25 -0
  249. package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -0
  250. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts +5 -0
  251. package/dist/engine/renderers/Indicator/shared/webglBand.d.ts.map +1 -0
  252. package/dist/engine/renderers/Indicator/shared/webglBand.js +17 -0
  253. package/dist/engine/renderers/Indicator/shared/webglBand.js.map +1 -0
  254. package/dist/engine/renderers/Indicator/stoch.d.ts +1 -22
  255. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  256. package/dist/engine/renderers/Indicator/stoch.js +5 -46
  257. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  258. package/dist/engine/renderers/Indicator/structure.d.ts +1 -7
  259. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  260. package/dist/engine/renderers/Indicator/structure.js +2 -2
  261. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  262. package/dist/engine/renderers/Indicator/supertrend.d.ts +1 -8
  263. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  264. package/dist/engine/renderers/Indicator/supertrend.js +2 -2
  265. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  266. package/dist/engine/renderers/Indicator/tema.d.ts +1 -7
  267. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  268. package/dist/engine/renderers/Indicator/tema.js +3 -17
  269. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  270. package/dist/engine/renderers/Indicator/trix.d.ts +1 -8
  271. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  272. package/dist/engine/renderers/Indicator/trix.js +2 -2
  273. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  274. package/dist/engine/renderers/Indicator/vma.d.ts +1 -7
  275. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  276. package/dist/engine/renderers/Indicator/vma.js +3 -15
  277. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  278. package/dist/engine/renderers/Indicator/volumeProfile.d.ts +1 -7
  279. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  280. package/dist/engine/renderers/Indicator/volumeProfile.js +2 -2
  281. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  282. package/dist/engine/renderers/Indicator/vwap.d.ts +1 -7
  283. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  284. package/dist/engine/renderers/Indicator/vwap.js +3 -14
  285. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  286. package/dist/engine/renderers/Indicator/wma.d.ts +1 -7
  287. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  288. package/dist/engine/renderers/Indicator/wma.js +3 -17
  289. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  290. package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -22
  291. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  292. package/dist/engine/renderers/Indicator/wmsr.js +8 -23
  293. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  294. package/dist/engine/renderers/Indicator/zones.d.ts +1 -6
  295. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  296. package/dist/engine/renderers/Indicator/zones.js +2 -2
  297. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  298. package/dist/engine/renderers/candle.d.ts +0 -16
  299. package/dist/engine/renderers/candle.d.ts.map +1 -1
  300. package/dist/engine/renderers/candle.js +1 -1
  301. package/dist/engine/renderers/candle.js.map +1 -1
  302. package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
  303. package/dist/engine/renderers/comparisonLine.js +2 -0
  304. package/dist/engine/renderers/comparisonLine.js.map +1 -1
  305. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  306. package/dist/engine/renderers/extremaMarkers.js +2 -0
  307. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  308. package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
  309. package/dist/engine/renderers/lastPrice.js +7 -2
  310. package/dist/engine/renderers/lastPrice.js.map +1 -1
  311. package/dist/engine/renderers/leftYAxis.d.ts +11 -0
  312. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -0
  313. package/dist/engine/renderers/leftYAxis.js +67 -0
  314. package/dist/engine/renderers/leftYAxis.js.map +1 -0
  315. package/dist/engine/renderers/subVolume.d.ts +1 -13
  316. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  317. package/dist/engine/renderers/subVolume.js +1 -1
  318. package/dist/engine/renderers/subVolume.js.map +1 -1
  319. package/dist/engine/renderers/timeAxis.d.ts +0 -2
  320. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  321. package/dist/engine/renderers/timeAxis.js +4 -1
  322. package/dist/engine/renderers/timeAxis.js.map +1 -1
  323. package/dist/engine/renderers/timeShare.d.ts +3 -0
  324. package/dist/engine/renderers/timeShare.d.ts.map +1 -0
  325. package/dist/engine/renderers/timeShare.js +260 -0
  326. package/dist/engine/renderers/timeShare.js.map +1 -0
  327. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  328. package/dist/engine/renderers/yAxis.js +9 -1
  329. package/dist/engine/renderers/yAxis.js.map +1 -1
  330. package/dist/engine/scale/price.d.ts +0 -7
  331. package/dist/engine/scale/price.d.ts.map +1 -1
  332. package/dist/engine/scale/price.js +3 -2
  333. package/dist/engine/scale/price.js.map +1 -1
  334. package/dist/engine/theme/fonts.d.ts +0 -2
  335. package/dist/engine/theme/fonts.d.ts.map +1 -1
  336. package/dist/engine/theme/fonts.js +1 -1
  337. package/dist/engine/theme/fonts.js.map +1 -1
  338. package/dist/engine/utils/klineConfig.d.ts.map +1 -1
  339. package/dist/engine/utils/klineConfig.js +1 -5
  340. package/dist/engine/utils/klineConfig.js.map +1 -1
  341. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  342. package/dist/engine/viewport/chartViewportManager.js +6 -5
  343. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  344. package/dist/plugin/types.d.ts +1 -0
  345. package/dist/plugin/types.d.ts.map +1 -1
  346. package/dist/plugin/types.js.map +1 -1
  347. package/dist/semantic/types.d.ts +1 -1
  348. package/dist/semantic/types.d.ts.map +1 -1
  349. package/dist/tokens/theme-base.d.ts +5 -0
  350. package/dist/tokens/theme-base.d.ts.map +1 -0
  351. package/dist/tokens/theme-base.js +31 -0
  352. package/dist/tokens/theme-base.js.map +1 -0
  353. package/dist/tokens/theme-china.d.ts.map +1 -1
  354. package/dist/tokens/theme-china.js +3 -0
  355. package/dist/tokens/theme-china.js.map +1 -1
  356. package/dist/tokens/theme-dark.d.ts.map +1 -1
  357. package/dist/tokens/theme-dark.js +11 -30
  358. package/dist/tokens/theme-dark.js.map +1 -1
  359. package/dist/tokens/theme-light.d.ts.map +1 -1
  360. package/dist/tokens/theme-light.js +11 -30
  361. package/dist/tokens/theme-light.js.map +1 -1
  362. package/dist/tokens/types.d.ts +7 -0
  363. package/dist/tokens/types.d.ts.map +1 -1
  364. package/dist/types/price.d.ts +8 -0
  365. package/dist/types/price.d.ts.map +1 -1
  366. package/dist/types/price.js +4 -0
  367. package/dist/types/price.js.map +1 -1
  368. package/dist/utils/dateFormat.d.ts +5 -42
  369. package/dist/utils/dateFormat.d.ts.map +1 -1
  370. package/dist/utils/dateFormat.js +24 -4
  371. package/dist/utils/dateFormat.js.map +1 -1
  372. package/dist/utils/kLineDraw/axis.d.ts +9 -28
  373. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  374. package/dist/utils/kLineDraw/axis.js +33 -58
  375. package/dist/utils/kLineDraw/axis.js.map +1 -1
  376. package/dist/utils/volumePrice.d.ts +0 -40
  377. package/dist/utils/volumePrice.d.ts.map +1 -1
  378. package/dist/utils/volumePrice.js +2 -2
  379. package/dist/utils/volumePrice.js.map +1 -1
  380. package/dist/version.d.ts +1 -1
  381. package/dist/version.js +1 -1
  382. package/package.json +1 -1
  383. package/src/config/chartSettings.ts +9 -1
  384. package/src/controllers/createChartController.ts +52 -2
  385. package/src/controllers/types.ts +36 -17
  386. package/src/data-fetchers/__tests__/dataBuffer.test.ts +39 -5
  387. package/src/data-fetchers/baostock.ts +1 -1
  388. package/src/data-fetchers/dataBuffer.ts +48 -11
  389. package/src/data-fetchers/dataBufferTypes.ts +11 -0
  390. package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -4
  391. package/src/data-fetchers/gotdx/gotdx.ts +6 -0
  392. package/src/data-fetchers/gotdx.ts +45 -7
  393. package/src/data-fetchers/hundred-mock.ts +1 -1
  394. package/src/data-fetchers/index.ts +10 -20
  395. package/src/data-fetchers/router.ts +12 -1
  396. package/src/data-fetchers/thousand-mock.ts +1 -1
  397. package/src/data-fetchers/timeShareBuffer.ts +92 -0
  398. package/src/data-fetchers/tradingview.ts +2 -2
  399. package/src/data-fetchers/types.ts +15 -2
  400. package/src/engine/__tests__/chart.dpr.test.ts +1 -0
  401. package/src/engine/chart.ts +157 -7
  402. package/src/engine/chartTypes.ts +3 -0
  403. package/src/engine/controller/__tests__/interaction.dpr.test.ts +2 -0
  404. package/src/engine/controller/interaction.ts +80 -28
  405. package/src/engine/data/chartDataManager.ts +557 -214
  406. package/src/engine/draw/pixelAlign.ts +1 -1
  407. package/src/engine/indicators/__tests__/_propertyAssertions.ts +2 -2
  408. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -1
  409. package/src/engine/indicators/calculators.ts +83 -233
  410. package/src/engine/indicators/chartIndicatorManager.ts +3 -2
  411. package/src/engine/indicators/macdState.ts +1 -1
  412. package/src/engine/indicators/registerBuiltins.ts +1 -0
  413. package/src/engine/indicators/rsiState.ts +1 -1
  414. package/src/engine/indicators/scheduler.ts +1 -7
  415. package/src/engine/layout/chartPaneLayout.ts +26 -6
  416. package/src/engine/modes/kLineMode.ts +57 -0
  417. package/src/engine/modes/timeShareMode.ts +95 -0
  418. package/src/engine/modes/types.ts +63 -0
  419. package/src/engine/paneRenderer.ts +37 -46
  420. package/src/engine/render/chartRenderer.ts +93 -20
  421. package/src/engine/renderers/Indicator/atr.ts +4 -29
  422. package/src/engine/renderers/Indicator/boll.ts +3 -24
  423. package/src/engine/renderers/Indicator/cci.ts +9 -27
  424. package/src/engine/renderers/Indicator/chaikinVol.ts +3 -23
  425. package/src/engine/renderers/Indicator/cmf.ts +3 -22
  426. package/src/engine/renderers/Indicator/dema.ts +5 -26
  427. package/src/engine/renderers/Indicator/donchian.ts +3 -3
  428. package/src/engine/renderers/Indicator/ene.ts +3 -24
  429. package/src/engine/renderers/Indicator/expma.ts +2 -2
  430. package/src/engine/renderers/Indicator/fastk.ts +12 -95
  431. package/src/engine/renderers/Indicator/fib.ts +2 -2
  432. package/src/engine/renderers/Indicator/hma.ts +5 -26
  433. package/src/engine/renderers/Indicator/hv.ts +3 -23
  434. package/src/engine/renderers/Indicator/ichimoku.ts +3 -3
  435. package/src/engine/renderers/Indicator/kama.ts +5 -26
  436. package/src/engine/renderers/Indicator/keltner.ts +3 -3
  437. package/src/engine/renderers/Indicator/kst.ts +3 -3
  438. package/src/engine/renderers/Indicator/ma.ts +1 -1
  439. package/src/engine/renderers/Indicator/macd.ts +4 -21
  440. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +127 -2
  441. package/src/engine/renderers/Indicator/mfi.ts +3 -22
  442. package/src/engine/renderers/Indicator/mom.ts +9 -30
  443. package/src/engine/renderers/Indicator/obv.ts +3 -21
  444. package/src/engine/renderers/Indicator/parkinson.ts +3 -23
  445. package/src/engine/renderers/Indicator/pivot.ts +2 -2
  446. package/src/engine/renderers/Indicator/pvt.ts +3 -21
  447. package/src/engine/renderers/Indicator/roc.ts +4 -23
  448. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  449. package/src/engine/renderers/Indicator/sar.ts +3 -3
  450. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +11 -4
  451. package/src/engine/renderers/Indicator/shared/dashedLines.ts +81 -0
  452. package/src/engine/renderers/Indicator/shared/titleInfo.ts +52 -0
  453. package/src/engine/renderers/Indicator/shared/webglBand.ts +23 -0
  454. package/src/engine/renderers/Indicator/stoch.ts +6 -71
  455. package/src/engine/renderers/Indicator/structure.ts +2 -2
  456. package/src/engine/renderers/Indicator/supertrend.ts +3 -3
  457. package/src/engine/renderers/Indicator/tema.ts +5 -26
  458. package/src/engine/renderers/Indicator/trix.ts +3 -3
  459. package/src/engine/renderers/Indicator/vma.ts +3 -22
  460. package/src/engine/renderers/Indicator/volumeProfile.ts +2 -2
  461. package/src/engine/renderers/Indicator/vwap.ts +3 -21
  462. package/src/engine/renderers/Indicator/wma.ts +5 -26
  463. package/src/engine/renderers/Indicator/wmsr.ts +9 -30
  464. package/src/engine/renderers/Indicator/zones.ts +2 -2
  465. package/src/engine/renderers/candle.ts +1 -1
  466. package/src/engine/renderers/comparisonLine.ts +1 -0
  467. package/src/engine/renderers/extremaMarkers.ts +1 -0
  468. package/src/engine/renderers/lastPrice.ts +5 -2
  469. package/src/engine/renderers/leftYAxis.ts +77 -0
  470. package/src/engine/renderers/subVolume.ts +3 -3
  471. package/src/engine/renderers/timeAxis.ts +16 -13
  472. package/src/engine/renderers/timeShare.ts +271 -0
  473. package/src/engine/renderers/yAxis.ts +9 -1
  474. package/src/engine/scale/price.ts +2 -2
  475. package/src/engine/theme/fonts.ts +1 -1
  476. package/src/engine/utils/klineConfig.ts +1 -5
  477. package/src/engine/viewport/chartViewportManager.ts +6 -5
  478. package/src/plugin/types.ts +1 -0
  479. package/src/semantic/types.ts +1 -1
  480. package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +14 -0
  481. package/src/tokens/theme-base.ts +36 -0
  482. package/src/tokens/theme-china.ts +4 -0
  483. package/src/tokens/theme-dark.ts +12 -32
  484. package/src/tokens/theme-light.ts +13 -33
  485. package/src/tokens/types.ts +9 -0
  486. package/src/types/price.ts +13 -0
  487. package/src/utils/dateFormat.ts +27 -4
  488. package/src/utils/kLineDraw/axis.ts +40 -107
  489. package/src/utils/volumePrice.ts +2 -2
  490. package/src/version.ts +1 -1
@@ -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
  }
@@ -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;
@@ -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;
@@ -0,0 +1,36 @@
1
+ import type { SpacingTokens, TypographyTokens, MotionTokens } from './types'
2
+
3
+ export const spacing: SpacingTokens = {
4
+ none: '0',
5
+ xxs: '2px',
6
+ xs: '4px',
7
+ sm: '8px',
8
+ md: '12px',
9
+ lg: '16px',
10
+ xl: '24px',
11
+ xxl: '32px',
12
+ xxxl: '64px',
13
+ }
14
+
15
+ export const typography: TypographyTokens = {
16
+ fontFamily:
17
+ "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
18
+ fontFamilyMono:
19
+ "ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace",
20
+ fontSizeSm: '10px',
21
+ fontSizeMd: '12px',
22
+ fontSizeLg: '14px',
23
+ fontWeightRegular: 400,
24
+ fontWeightMedium: 500,
25
+ fontWeightBold: 700,
26
+ lineHeightTight: 1.2,
27
+ lineHeightStandard: 1.4,
28
+ }
29
+
30
+ export const motion: MotionTokens = {
31
+ durationInstant: '0ms',
32
+ durationFast: '120ms',
33
+ durationModerate: '200ms',
34
+ easingStandard: 'cubic-bezier(0.4, 0, 0.2, 1)',
35
+ easingDecelerate: 'cubic-bezier(0, 0, 0.2, 1)',
36
+ }
@@ -45,6 +45,10 @@ export function withAsiaMarketColors(theme: Theme): Theme {
45
45
  candleUpWick: theme.colors.candleDownWick,
46
46
  candleDownWick: theme.colors.candleUpWick,
47
47
 
48
+ // ── Time-share area fill ──
49
+ timeShareAreaUp: theme.colors.timeShareAreaDown,
50
+ timeShareAreaDown: theme.colors.timeShareAreaUp,
51
+
48
52
  // ── Volume bars ──
49
53
  volumeUp: theme.colors.volumeDown,
50
54
  volumeDown: theme.colors.volumeUp,
@@ -18,9 +18,13 @@
18
18
  */
19
19
 
20
20
  import type { Theme } from './types'
21
+ import { spacing, typography, motion } from './theme-base'
21
22
 
22
23
  export const darkTheme: Theme = {
23
24
  name: 'dark',
25
+ spacing,
26
+ typography,
27
+ motion,
24
28
  colors: {
25
29
  background: '#111827',
26
30
  foreground: '#E8EAED',
@@ -36,6 +40,7 @@ export const darkTheme: Theme = {
36
40
 
37
41
  volumeUp: '#22D69B66',
38
42
  volumeDown: '#FF646466',
43
+ volumeNeutral: '#FFFFFF66',
39
44
 
40
45
  axisText: '#9AA0A6',
41
46
  axisLine: '#2A2F36',
@@ -72,6 +77,13 @@ export const darkTheme: Theme = {
72
77
  avwapBand: '#A78BFA33',
73
78
  mtfOverlay: '#38BDF8',
74
79
 
80
+ timeSharePriceLine: '#60A5FA',
81
+ timeShareAvgLine: '#FBBF24',
82
+ timeShareAreaUp: 'rgba(34, 214, 155, 0.20)',
83
+ timeShareAreaDown: 'rgba(255, 100, 100, 0.20)',
84
+ timeSharePreClose: '#9CA3AF',
85
+ timeShareVolume: '#60A5FA',
86
+
75
87
  palette: {
76
88
  // Same hue ordering as light theme; values tuned for dark BG.
77
89
  i1: '#4A9EFF', // blue (brightened)
@@ -205,36 +217,4 @@ export const darkTheme: Theme = {
205
217
  },
206
218
  wmsrGrid: 'rgba(255, 255, 255, 0.1)',
207
219
  },
208
- spacing: {
209
- none: '0',
210
- xxs: '2px',
211
- xs: '4px',
212
- sm: '8px',
213
- md: '12px',
214
- lg: '16px',
215
- xl: '24px',
216
- xxl: '32px',
217
- xxxl: '64px',
218
- },
219
- typography: {
220
- fontFamily:
221
- "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
222
- fontFamilyMono:
223
- "ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace",
224
- fontSizeSm: '10px',
225
- fontSizeMd: '12px',
226
- fontSizeLg: '14px',
227
- fontWeightRegular: 400,
228
- fontWeightMedium: 500,
229
- fontWeightBold: 700,
230
- lineHeightTight: 1.2,
231
- lineHeightStandard: 1.4,
232
- },
233
- motion: {
234
- durationInstant: '0ms',
235
- durationFast: '120ms',
236
- durationModerate: '200ms',
237
- easingStandard: 'cubic-bezier(0.4, 0, 0.2, 1)',
238
- easingDecelerate: 'cubic-bezier(0, 0, 0.2, 1)',
239
- },
240
220
  }
@@ -20,9 +20,13 @@
20
20
  */
21
21
 
22
22
  import type { Theme } from './types'
23
+ import { spacing, typography, motion } from './theme-base'
23
24
 
24
25
  export const lightTheme: Theme = {
25
26
  name: 'light',
27
+ spacing,
28
+ typography,
29
+ motion,
26
30
  colors: {
27
31
  background: '#FAFAFA',
28
32
  foreground: '#1F1F1F',
@@ -38,6 +42,7 @@ export const lightTheme: Theme = {
38
42
 
39
43
  volumeUp: '#0F8B5C66', // 40% alpha — paired with candleUp
40
44
  volumeDown: '#C2363B66',
45
+ volumeNeutral: '#00000066',
41
46
 
42
47
  axisText: '#5A5A5A',
43
48
  axisLine: '#D0D0D0',
@@ -78,6 +83,13 @@ export const lightTheme: Theme = {
78
83
  // #0369A1 → 4.59:1.
79
84
  mtfOverlay: '#0369A1',
80
85
 
86
+ timeSharePriceLine: '#4A90D9',
87
+ timeShareAvgLine: '#F5A623',
88
+ timeShareAreaUp: 'rgba(15, 139, 92, 0.15)',
89
+ timeShareAreaDown: 'rgba(213, 19, 26, 0.15)',
90
+ timeSharePreClose: '#888888',
91
+ timeShareVolume: '#4A90D9',
92
+
81
93
  palette: {
82
94
  // Okabe-Ito-derived qualitative scale, AA on #FAFAFA
83
95
  i1: '#0072B2', // strong blue
@@ -101,7 +113,7 @@ export const lightTheme: Theme = {
101
113
  weak: 'hsl(210, 7%, 65%)',
102
114
  white: 'rgba(255, 255, 255, 0.92)',
103
115
  },
104
- price: {
116
+ price: {
105
117
  lastPrice: 'rgba(230, 100, 115, 0.95)',
106
118
  },
107
119
  tagBg: {
@@ -211,36 +223,4 @@ price: {
211
223
  },
212
224
  wmsrGrid: 'rgba(0, 0, 0, 0.1)',
213
225
  },
214
- spacing: {
215
- none: '0',
216
- xxs: '2px',
217
- xs: '4px',
218
- sm: '8px',
219
- md: '12px',
220
- lg: '16px',
221
- xl: '24px',
222
- xxl: '32px',
223
- xxxl: '64px',
224
- },
225
- typography: {
226
- fontFamily:
227
- "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
228
- fontFamilyMono:
229
- "ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace",
230
- fontSizeSm: '10px',
231
- fontSizeMd: '12px',
232
- fontSizeLg: '14px',
233
- fontWeightRegular: 400,
234
- fontWeightMedium: 500,
235
- fontWeightBold: 700,
236
- lineHeightTight: 1.2,
237
- lineHeightStandard: 1.4,
238
- },
239
- motion: {
240
- durationInstant: '0ms',
241
- durationFast: '120ms',
242
- durationModerate: '200ms',
243
- easingStandard: 'cubic-bezier(0.4, 0, 0.2, 1)',
244
- easingDecelerate: 'cubic-bezier(0, 0, 0.2, 1)',
245
- },
246
226
  }