@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
@@ -1,8 +1,9 @@
1
- import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn } from './types'
1
+ import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn, TimeShareFetcherFn } from './types'
2
2
 
3
3
  type DataFetcherClass = {
4
4
  new(...args: never[]): unknown
5
5
  fetcher: DataFetcherFn
6
+ timeShareFetcher?: TimeShareFetcherFn
6
7
  }
7
8
 
8
9
  const definitions = new Map<string, DataFetcherDefinition>()
@@ -18,6 +19,7 @@ export function DataFetcher(config: DataFetcherDefinitionConfig) {
18
19
  definitions.set(config.name, {
19
20
  ...config,
20
21
  fetcher: this.fetcher,
22
+ timeShareFetcher: this.timeShareFetcher,
21
23
  })
22
24
  })
23
25
  return value
@@ -30,11 +32,11 @@ export function getRegisteredFetcher(
30
32
  return definitions.get(name)
31
33
  }
32
34
 
33
- export function getRegisteredFetchers(): DataFetcherDefinition[] {
35
+ function getRegisteredFetchers(): DataFetcherDefinition[] {
34
36
  return Array.from(definitions.values())
35
37
  }
36
38
 
37
- export function fetcherHasCapability(name: string, capability: string): boolean {
39
+ function fetcherHasCapability(name: string, capability: string): boolean {
38
40
  return definitions.get(name)?.capabilities?.includes(capability) ?? false
39
41
  }
40
42
 
@@ -45,6 +47,14 @@ export function fetcherSupportsPeriod(name: string, period: string): boolean {
45
47
  return def.capabilities.includes('*') || def.capabilities.includes(period)
46
48
  }
47
49
 
50
+ export function getTimeShareFetcher(name: string): TimeShareFetcherFn | undefined {
51
+ return definitions.get(name)?.timeShareFetcher
52
+ }
53
+
54
+ export function fetcherSupportsTimeShare(name: string): boolean {
55
+ return typeof definitions.get(name)?.timeShareFetcher === 'function'
56
+ }
57
+
48
58
  export function clearRegisteredFetchersForTest(): void {
49
59
  definitions.clear()
50
- }
60
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-export from root gotdx fetcher.
3
+ * This file exists for backward compatibility only.
4
+ * All implementation lives in packages/core/src/data-fetchers/gotdx.ts
5
+ */
6
+ export * from '../gotdx'
@@ -1,6 +1,6 @@
1
- import type { KLineData } from '../controllers/types'
1
+ import type { KLineData, TimeShareData } from '../controllers/types'
2
2
  import { DataFetcher } from './fetcherDefinitionRegistry'
3
- import type { FetchConfig } from './types'
3
+ import type { FetchConfig, TimeShareFetchConfig } from './types'
4
4
 
5
5
  const PERIOD_TO_CATEGORY: Record<string, number> = {
6
6
  '1min': 8,
@@ -31,6 +31,46 @@ const EXCHANGE_EX_CATEGORY: Record<string, number> = {
31
31
 
32
32
  const BASE_URL = 'http://127.0.0.1:8080'
33
33
 
34
+ function getShanghaiDateYYYYMMDD(): number {
35
+ const formatter = new Intl.DateTimeFormat('zh-CN', {
36
+ timeZone: 'Asia/Shanghai',
37
+ year: 'numeric', month: '2-digit', day: '2-digit',
38
+ })
39
+ const parts = formatter.formatToParts(new Date())
40
+ let y = '', m = '', d = ''
41
+ for (const p of parts) {
42
+ if (p.type === 'year') y = p.value
43
+ else if (p.type === 'month') m = p.value
44
+ else if (p.type === 'day') d = p.value
45
+ }
46
+ return +y * 10000 + +m * 100 + +d
47
+ }
48
+
49
+ async function fetchGotdxHistoryTick(
50
+ _source: string,
51
+ config: TimeShareFetchConfig,
52
+ ): Promise<ReadonlyArray<TimeShareData>> {
53
+ const body = {
54
+ date: config.date ?? getShanghaiDateYYYYMMDD(),
55
+ market: config.symbol.startsWith('6') || config.symbol.startsWith('9') ? 1 : 0,
56
+ code: config.symbol,
57
+ }
58
+ const res = await fetch(`${BASE_URL}/api/stock/history-tick`, {
59
+ method: 'POST',
60
+ headers: { 'Content-Type': 'application/json' },
61
+ body: JSON.stringify(body),
62
+ })
63
+ if (!res.ok) throw new Error(`[gotdx] history-tick failed: ${res.status} ${res.statusText}`)
64
+ const list: Array<{ timestamp: string; Price: number; Avg: number; Vol: number }> = await res.json()
65
+ return list.map((item) => ({
66
+ timestamp: new Date(item.timestamp).getTime(),
67
+ price: item.Price,
68
+ average: item.Avg,
69
+ volume: item.Vol,
70
+ amount: item.Price * item.Vol,
71
+ }))
72
+ }
73
+
34
74
  interface SecurityBar {
35
75
  Last: number
36
76
  Open: number
@@ -154,9 +194,7 @@ async function fetchGotdx(
154
194
  'daily', 'weekly', 'monthly', 'quarterly', 'yearly',
155
195
  ],
156
196
  })
157
- export class GotdxFetcher {
197
+ class GotdxFetcher {
158
198
  static fetcher = fetchGotdx
159
- }
160
-
161
- /** @deprecated Use `GotdxFetcher.fetcher` directly or rely on routerDataFetcher. */
162
- export const gotdxDataFetcher = fetchGotdx
199
+ static timeShareFetcher = fetchGotdxHistoryTick
200
+ }
@@ -70,7 +70,7 @@ async function fetchHundredMock(
70
70
  version: '1.0.0',
71
71
  capabilities: ['*'],
72
72
  })
73
- export class HundredMockFetcher {
73
+ class HundredMockFetcher {
74
74
  static fetcher = fetchHundredMock
75
75
  }
76
76
 
@@ -1,22 +1,12 @@
1
- export { HundredMockFetcher, hundredMockDataFetcher } from './hundred-mock'
2
- export { ThousandMockFetcher, thousandMockDataFetcher } from './thousand-mock'
3
- export { BaoStockFetcher, baostockDataFetcher } from './baostock'
4
- export { TradingviewFetcher, tradingviewDataFetcher } from './tradingview'
5
- export { GotdxFetcher, gotdxDataFetcher } from './gotdx'
6
- export { routerDataFetcher } from './router'
1
+ export { hundredMockDataFetcher } from './hundred-mock'
2
+ export { thousandMockDataFetcher } from './thousand-mock'
3
+ export { baostockDataFetcher } from './baostock'
4
+ export { routerDataFetcher, routerTimeShareFetcher } from './router'
7
5
  export { DataBuffer } from './dataBuffer'
8
6
  export type { DataWindow } from './dataBuffer'
9
- export {
10
- DataFetcher,
11
- getRegisteredFetcher,
12
- getRegisteredFetchers,
13
- fetcherHasCapability,
14
- fetcherSupportsPeriod,
15
- clearRegisteredFetchersForTest,
16
- } from './fetcherDefinitionRegistry'
17
- export type {
18
- FetchConfig,
19
- DataFetcherDefinitionConfig,
20
- DataFetcherDefinition,
21
- DataFetcherFn,
22
- } from './types'
7
+ export { TimeShareBuffer } from './timeShareBuffer'
8
+ export type { DataBufferLike } from './dataBufferTypes'
9
+ export { getRegisteredFetcher, getTimeShareFetcher, fetcherSupportsTimeShare } from './fetcherDefinitionRegistry'
10
+ export type { TimeShareFetcherFn, TimeShareFetchConfig } from './types'
11
+ import './gotdx'
12
+ import './tradingview'
@@ -1,5 +1,6 @@
1
1
  import type { DataFetcher } from '../controllers/types'
2
- import { getRegisteredFetcher, fetcherSupportsPeriod } from './fetcherDefinitionRegistry'
2
+ import type { TimeShareFetcherFn } from './types'
3
+ import { getRegisteredFetcher, fetcherSupportsPeriod, getTimeShareFetcher } from './fetcherDefinitionRegistry'
3
4
 
4
5
  const FALLBACK_SOURCE = 'baostock'
5
6
 
@@ -30,3 +31,13 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
30
31
 
31
32
  return def.fetcher(source, config)
32
33
  }
34
+
35
+ export const routerTimeShareFetcher: TimeShareFetcherFn = (source, config) => {
36
+ const fetcher = getTimeShareFetcher(source)
37
+ if (!fetcher) {
38
+ return Promise.reject(
39
+ new Error(`[DataFetcher] "${source}" does not support timeshare data fetching`),
40
+ )
41
+ }
42
+ return fetcher(source, config)
43
+ }
@@ -55,7 +55,7 @@ async function fetchThousandMock(
55
55
  version: '1.0.0',
56
56
  capabilities: ['*'],
57
57
  })
58
- export class ThousandMockFetcher {
58
+ class ThousandMockFetcher {
59
59
  static fetcher = fetchThousandMock
60
60
  }
61
61
 
@@ -0,0 +1,92 @@
1
+ import { createSignal, type Signal } from '../reactivity/signal'
2
+ import type { SymbolSpec } from '../controllers/types'
3
+ import type { TimeShareData } from '../types/price'
4
+ import type { TimeShareFetcherFn } from './types'
5
+ import type { DataBufferLike } from './dataBufferTypes'
6
+ import type { DataWindow } from './dataBuffer'
7
+ import { routerTimeShareFetcher } from './router'
8
+
9
+ export class TimeShareBuffer implements DataBufferLike {
10
+ private _data: TimeShareData[] = []
11
+ private _dataSignal = createSignal<ReadonlyArray<TimeShareData>>([])
12
+ private _loadingSignal = createSignal<boolean>(false)
13
+ private _fetcher: TimeShareFetcherFn | null = null
14
+ private _queryDate = 0
15
+ private _requestSeq = 0
16
+ private _disposed = false
17
+
18
+ get data(): Signal<ReadonlyArray<unknown>> {
19
+ return this._dataSignal as Signal<ReadonlyArray<unknown>>
20
+ }
21
+
22
+ get loading(): Signal<boolean> {
23
+ return this._loadingSignal
24
+ }
25
+
26
+ get loadedWindow(): DataWindow | null {
27
+ if (this._data.length === 0) return null
28
+ return {
29
+ earliestTs: this._data[0]!.timestamp,
30
+ latestTs: this._data[this._data.length - 1]!.timestamp,
31
+ }
32
+ }
33
+
34
+ getRawData(): TimeShareData[] {
35
+ return this._data
36
+ }
37
+
38
+ setFetcher(fetcher: TimeShareFetcherFn | null): void {
39
+ this._fetcher = fetcher
40
+ }
41
+
42
+ setQueryDate(date: number): void {
43
+ this._queryDate = date
44
+ }
45
+
46
+ getFetcher(): TimeShareFetcherFn | null {
47
+ return this._fetcher
48
+ }
49
+
50
+ getQueryDate(): number {
51
+ return this._queryDate
52
+ }
53
+
54
+ async load(spec: SymbolSpec): Promise<void> {
55
+ if (this._disposed) return
56
+ const fetcher = this._fetcher ?? routerTimeShareFetcher
57
+ const requestSeq = ++this._requestSeq
58
+ this._loadingSignal.set(true)
59
+
60
+ try {
61
+ const data = await fetcher(spec.source ?? 'gotdx', {
62
+ symbol: spec.symbol,
63
+ exchange: spec.exchange,
64
+ date: this._queryDate || undefined,
65
+ })
66
+ this._queryDate = 0
67
+
68
+ if (requestSeq !== this._requestSeq) return
69
+ if (this._disposed) return
70
+
71
+ this._data = [...data]
72
+ this._dataSignal.set([...data])
73
+ } finally {
74
+ if (requestSeq === this._requestSeq) {
75
+ this._loadingSignal.set(false)
76
+ }
77
+ }
78
+ }
79
+
80
+ setInlineData(data: unknown[]): void {
81
+ if (this._disposed) return
82
+ this._data = data as TimeShareData[]
83
+ this._dataSignal.set([...(data as TimeShareData[])])
84
+ }
85
+
86
+ dispose(): void {
87
+ this._disposed = true
88
+ this._requestSeq++
89
+ this._data = []
90
+ this._loadingSignal.set(false)
91
+ }
92
+ }
@@ -66,9 +66,9 @@ async function fetchTradingview(
66
66
  version: '1.0.0',
67
67
  capabilities: ['daily', 'weekly', 'monthly', '5min', '15min', '30min', '60min'],
68
68
  })
69
- export class TradingviewFetcher {
69
+ class TradingviewFetcher {
70
70
  static fetcher = fetchTradingview
71
71
  }
72
72
 
73
73
  /** @deprecated Use `TradingviewFetcher.fetcher` directly or rely on routerDataFetcher. */
74
- export const tradingviewDataFetcher = fetchTradingview
74
+ const tradingviewDataFetcher = fetchTradingview
@@ -1,4 +1,4 @@
1
- import type { KLineData } from '../controllers/types'
1
+ import type { KLineData, TimeShareData } from '../controllers/types'
2
2
 
3
3
  export type FetchConfig = {
4
4
  symbol: string
@@ -9,11 +9,23 @@ export type FetchConfig = {
9
9
  exchange?: string
10
10
  }
11
11
 
12
+ export type TimeShareFetchConfig = {
13
+ symbol: string
14
+ exchange?: string
15
+ /** YYYYMMDD format query date, e.g. 20260618 */
16
+ date?: number
17
+ }
18
+
12
19
  export type DataFetcherFn = (
13
20
  source: string,
14
21
  config: FetchConfig,
15
22
  ) => Promise<ReadonlyArray<KLineData>>
16
23
 
24
+ export type TimeShareFetcherFn = (
25
+ source: string,
26
+ config: TimeShareFetchConfig,
27
+ ) => Promise<ReadonlyArray<TimeShareData>>
28
+
17
29
  export interface DataFetcherDefinitionConfig {
18
30
  name: string
19
31
  displayName: string
@@ -24,4 +36,5 @@ export interface DataFetcherDefinitionConfig {
24
36
 
25
37
  export interface DataFetcherDefinition extends DataFetcherDefinitionConfig {
26
38
  fetcher: DataFetcherFn
27
- }
39
+ timeShareFetcher?: TimeShareFetcherFn
40
+ }
@@ -35,6 +35,7 @@ const defaultOptions: ChartOptions = {
35
35
  kGap: 2,
36
36
  yPaddingPx: 0,
37
37
  rightAxisWidth: 0,
38
+ leftAxisWidth: 0,
38
39
  bottomAxisHeight: 24,
39
40
  minKWidth: 2,
40
41
  maxKWidth: 50,
@@ -1,7 +1,7 @@
1
1
  import type { KLineData } from '../types/price'
2
2
  import type { ChartSettings } from '../config/chartSettings'
3
3
  import { createSignal, type Signal, type Computed } from '../reactivity/signal'
4
- import type { SymbolSpec } from '../controllers/types'
4
+ import type { SymbolSpec, CustomDataSource } from '../controllers/types'
5
5
  import { ChartDataManager } from './data/chartDataManager'
6
6
  import { ChartPaneLayout } from './layout/chartPaneLayout'
7
7
  import { UpdateLevel } from './layout/pane'
@@ -19,6 +19,9 @@ import { ChartIndicatorManager } from './indicators/chartIndicatorManager'
19
19
  import type { IndicatorScheduler } from './indicators/scheduler'
20
20
  import type { SubPaneEntry } from './subPaneManager'
21
21
  import { ChartRenderer } from './render/chartRenderer'
22
+ import { KLineMode } from './modes/kLineMode'
23
+ import { TimeShareMode } from './modes/timeShareMode'
24
+ import type { ChartModeHandler } from './modes/types'
22
25
 
23
26
  import {
24
27
  createPluginHost,
@@ -70,6 +73,19 @@ export class Chart {
70
73
  /** 渲染器 */
71
74
  private renderer: ChartRenderer
72
75
 
76
+ /** 当前活跃的模式处理器 */
77
+ private _activeMode: ChartModeHandler
78
+ private _kLineMode = new KLineMode()
79
+ private _timeShareMode = new TimeShareMode()
80
+
81
+ /** 模式切换时保存的渲染状态(退出分时时恢复) */
82
+ private _modeSavedKWidth = 0
83
+ private _modeSavedKGap = 0
84
+ private _modeSavedZoomLevel = 0
85
+
86
+ /** 分时模式激活前的 pane Y 轴刻度类型(退出分时时恢复) */
87
+ private _savedScaleTypes: Map<string, ScaleType> | undefined
88
+
73
89
  /**
74
90
  * 启用主图指标
75
91
  * @param indicatorId 指标ID
@@ -125,6 +141,7 @@ export class Chart {
125
141
  const { kWidth: _kWidth, kGap: _kGap, ...restOpt } = opt
126
142
  // Chart 不持有业务 SSOT,kWidth/kGap/zoomLevel 由外部通过 applyRenderState() 传入
127
143
  this.opt = { ...restOpt, kWidth: _kWidth ?? 0, kGap: _kGap ?? 0 }
144
+ this._activeMode = this._kLineMode
128
145
  this.interaction = new InteractionController(this)
129
146
  this.interaction.setOnInteractionChange((snapshot) => {
130
147
  this._interactionSignal.set(snapshot)
@@ -154,6 +171,7 @@ export class Chart {
154
171
  getDom: () => this.dom,
155
172
  getOption: () => ({
156
173
  rightAxisWidth: this.opt.rightAxisWidth,
174
+ leftAxisWidth: this.opt.leftAxisWidth,
157
175
  yPaddingPx: this.opt.yPaddingPx,
158
176
  priceLabelWidth: this.opt.priceLabelWidth,
159
177
  paneGap: this.opt.paneGap,
@@ -186,6 +204,20 @@ export class Chart {
186
204
  getIndicatorScheduler: () => this.indicatorManager.indicatorSchedulerAccessor,
187
205
  setPendingIndicatorDataUpdate: (v) => { this.dataManager.pendingIndicatorDataUpdate = v },
188
206
  isPointerDown: () => this.interaction.isPointerDown(),
207
+ onTimeShareDataReady: (dataLength) => {
208
+ const vp = this.viewportManager.computeViewport()
209
+ if (!vp || vp.plotWidth <= 0) return
210
+ const result = this._activeMode.computeKWidth(dataLength, vp.plotWidth, vp.dpr)
211
+ if (result) {
212
+ this.applyRenderState(result.kWidth, result.kGap)
213
+ const container = this.dom.container
214
+ if (container) {
215
+ const leftBuffer = this.dataManager.getLeftLoadBufferWidth()
216
+ this.viewportManager.setScrollLeft(leftBuffer)
217
+ this.viewportManager.applyPendingScrollLeft(container)
218
+ }
219
+ }
220
+ },
189
221
  })
190
222
 
191
223
  this.zoomController = new ChartZoomController({
@@ -248,6 +280,7 @@ export class Chart {
248
280
  getViewportManager: () => this.viewportManager,
249
281
  getDataManager: () => this.dataManager,
250
282
  getIndicatorManager: () => this.indicatorManager,
283
+ getActiveMode: () => this._activeMode,
251
284
  })
252
285
  this.renderer.registerDrawingPlugins()
253
286
  this.renderer.initCoreRenderers()
@@ -259,15 +292,69 @@ export class Chart {
259
292
  return this.viewportManager.getViewport()
260
293
  }
261
294
 
295
+ /** 获取当前活跃的模式处理器 */
296
+ get activeMode(): ChartModeHandler {
297
+ return this._activeMode
298
+ }
299
+
300
+ /** 切换模式处理器 */
301
+ setActiveMode(mode: ChartModeHandler): void {
302
+ if (this._activeMode === mode) return
303
+ const prev = this._activeMode
304
+
305
+ if (mode === this._timeShareMode) {
306
+ this._modeSavedKWidth = this.opt.kWidth
307
+ this._modeSavedKGap = this.opt.kGap
308
+ this._modeSavedZoomLevel = this.zoomController.currentZoomLevel
309
+ this._savedScaleTypes = new Map<string, ScaleType>()
310
+ for (const r of this.paneRenderers) {
311
+ this._savedScaleTypes.set(r.getPane().id, r.getPane().yAxis.getScaleType())
312
+ }
313
+ } else if (prev === this._timeShareMode) {
314
+ for (const renderer of this.paneRenderers) {
315
+ const p = renderer.getPane()
316
+ const saved = this._savedScaleTypes?.get(p.id) ?? 'linear'
317
+ p.yAxis.setScaleType(saved)
318
+ p.yAxis.setBasePrice(null)
319
+ }
320
+ this._savedScaleTypes = undefined
321
+ }
322
+
323
+ if (this._modeSavedKWidth > 0 && mode !== this._timeShareMode) {
324
+ this.applyRenderState(this._modeSavedKWidth, this._modeSavedKGap, this._modeSavedZoomLevel)
325
+ this._modeSavedKWidth = 0
326
+ }
327
+
328
+ prev.onDeactivate(
329
+ { enableMainIndicator: (id, p) => this.enableMainIndicator(id, p), disableMainIndicator: (id) => this.disableMainIndicator(id), setRendererEnabled: (n, e) => this.setRendererEnabled(n, e), dataManager: this.dataManager },
330
+ mode,
331
+ )
332
+ this._activeMode = mode
333
+ this._activeMode.onActivate(
334
+ { enableMainIndicator: (id, p) => this.enableMainIndicator(id, p), disableMainIndicator: (id) => this.disableMainIndicator(id), setRendererEnabled: (n, e) => this.setRendererEnabled(n, e), dataManager: this.dataManager, currentPeriod: this.dataManager.currentPeriod },
335
+ prev,
336
+ )
337
+ }
338
+
262
339
  getCurrentDpr(): number {
263
340
  return this.viewportManager.getEffectiveDpr()
264
341
  }
265
342
 
343
+ /** 获取当前周期 */
344
+ get currentPeriod(): string {
345
+ return this.dataManager.currentPeriod
346
+ }
347
+
266
348
  /** 获取缓存的 scrollLeft(避免读取 DOM 触发强制回流) */
267
349
  getCachedScrollLeft(): number {
268
350
  return this.viewportManager.getCachedScrollLeft()
269
351
  }
270
352
 
353
+ /** 同步程序性 scrollLeft 写入后的缓存,避免等待异步 scroll 事件 */
354
+ syncScrollLeft(scrollLeft: number): void {
355
+ this.viewportManager.setCachedScrollLeft(scrollLeft)
356
+ }
357
+
271
358
  /** 获取逻辑 scrollLeft(减去左侧加载缓冲宽度,可为负值) */
272
359
  getLogicalScrollLeft(): number {
273
360
  return this.viewportManager.getLogicalScrollLeft()
@@ -318,14 +405,13 @@ export class Chart {
318
405
  this.renderer.updateSettings(settings)
319
406
  this.interaction.updateSettings(settings)
320
407
 
321
- // 同步刻度类型设置到所有 pane(百分比仅用于主图)
322
- if ('axisType' in settings) {
323
- const axisType = (settings.axisType as ScaleType) ?? 'linear'
324
- const currentType = this.paneRenderers[0]?.getPane().yAxis.getScaleType()
325
- if (axisType !== currentType) {
408
+ // 同步右轴刻度类型设置到所有 pane(百分比仅用于主图)
409
+ if ('rightAxisType' in settings) {
410
+ const axisType = settings.rightAxisType as string
411
+ if (axisType !== 'none') {
326
412
  for (const renderer of this.paneRenderers) {
327
413
  const pane = renderer.getPane()
328
- const scaleType = axisType === 'percent' && pane.role !== 'price' ? 'linear' : axisType
414
+ const scaleType = axisType === 'percent' && pane.role !== 'price' ? 'linear' : (axisType as ScaleType)
329
415
  pane.yAxis.setScaleType(scaleType)
330
416
  }
331
417
  }
@@ -631,6 +717,11 @@ export class Chart {
631
717
  return this.dataManager.getData()
632
718
  }
633
719
 
720
+ /** 获取渲染数据源(分时图下为 TimeShareData,K线图为 KLineData) */
721
+ getRenderData(): unknown[] {
722
+ return this.dataManager.getRenderData()
723
+ }
724
+
634
725
  /** 获取指标调度器(供外部控制器更新指标配置) */
635
726
  getIndicatorScheduler(): IndicatorScheduler {
636
727
  return this.indicatorManager.indicatorSchedulerAccessor
@@ -667,6 +758,28 @@ export class Chart {
667
758
 
668
759
  /** 容器尺寸变化时调用 */
669
760
  resize() {
761
+ if (this._activeMode.debugName === 'TimeShare') {
762
+ const tsData = this.dataManager.getTimeShareData()
763
+ const vp = this.viewportManager.computeViewport()
764
+ if (!vp || vp.plotWidth <= 0) return
765
+ if (tsData.length > 0) {
766
+ const result = this._activeMode.computeKWidth(tsData.length, vp.plotWidth, vp.dpr)
767
+ if (result) {
768
+ this.applyRenderState(result.kWidth, result.kGap)
769
+ const container = this.dom.container
770
+ if (container) {
771
+ const leftBuffer = this.dataManager.getLeftLoadBufferWidth()
772
+ this.viewportManager.setScrollLeft(leftBuffer)
773
+ this.viewportManager.applyPendingScrollLeft(container)
774
+ }
775
+ }
776
+ }
777
+ this.renderer.clearCachedFrame()
778
+ this.layoutManager.layoutPanes()
779
+ this.viewportManager.updateViewportSignal()
780
+ this.scheduleDraw()
781
+ return
782
+ }
670
783
  const vp = this.viewportManager.computeViewport()
671
784
  // 防御性检查:容器尺寸无效时跳过布局
672
785
  if (!vp || vp.viewWidth < 10 || vp.viewHeight < 10) {
@@ -736,6 +849,11 @@ export class Chart {
736
849
  return this.dataManager.data
737
850
  }
738
851
 
852
+ /** 加载信号 */
853
+ get loading(): Signal<boolean> {
854
+ return this.dataManager.loading
855
+ }
856
+
739
857
  /** 符号信号 */
740
858
  get symbols(): Signal<ReadonlyArray<SymbolSpec>> {
741
859
  return this.dataManager.symbols
@@ -813,6 +931,10 @@ export class Chart {
813
931
  }
814
932
 
815
933
  setSymbols(specs: ReadonlyArray<SymbolSpec>): void {
934
+ const primaryPeriod = specs[0]?.period
935
+ if (primaryPeriod) {
936
+ this.setActiveMode(primaryPeriod === 'timeshare' ? this._timeShareMode : this._kLineMode)
937
+ }
816
938
  this.dataManager.setSymbols(specs)
817
939
  }
818
940
 
@@ -824,6 +946,29 @@ export class Chart {
824
946
  this.dataManager.removeComparisonSymbol(symbol)
825
947
  }
826
948
 
949
+ setComparisonData(symbol: string, data: KLineData[]): void {
950
+ this.dataManager.setComparisonData(symbol, data)
951
+ }
952
+
953
+ setCurrentSymbol(symbol: string): void {
954
+ this.dataManager.setCurrentSymbol(symbol)
955
+ }
956
+
957
+ setCurrentPeriod(period: string): void {
958
+ this.setActiveMode(period === 'timeshare' ? this._timeShareMode : this._kLineMode)
959
+ this.dataManager.setCurrentPeriod(period)
960
+ }
961
+
962
+ switchToTimeShareForDate(dateYYYYMMDD: number): void {
963
+ this.dataManager.setTimeShareQueryDate(dateYYYYMMDD)
964
+ this.setActiveMode(this._timeShareMode)
965
+ this.dataManager.setCurrentPeriod('timeshare')
966
+ }
967
+
968
+ applyCustomData(source: CustomDataSource): void {
969
+ this.dataManager.applyCustomData(source)
970
+ }
971
+
827
972
  // ---------- Theme ----------
828
973
 
829
974
  /**
@@ -841,6 +986,7 @@ export class Chart {
841
986
  * 计算并应用新的 render state,更新 viewport signal
842
987
  */
843
988
  zoomToLevel(level: number, anchorX?: number): void {
989
+ if (!this._activeMode.allowZoom) return
844
990
  this.zoomController.zoomToLevel(level, anchorX)
845
991
  }
846
992
 
@@ -848,6 +994,7 @@ export class Chart {
848
994
  * 放大(高层 API)
849
995
  */
850
996
  zoomIn(anchorX?: number): void {
997
+ if (!this._activeMode.allowZoom) return
851
998
  this.zoomController.zoomIn(anchorX)
852
999
  }
853
1000
 
@@ -855,6 +1002,7 @@ export class Chart {
855
1002
  * 缩小(高层 API)
856
1003
  */
857
1004
  zoomOut(anchorX?: number): void {
1005
+ if (!this._activeMode.allowZoom) return
858
1006
  this.zoomController.zoomOut(anchorX)
859
1007
  }
860
1008
 
@@ -931,6 +1079,7 @@ export class Chart {
931
1079
  * 使用 computeZoom 计算精确的 scrollLeft,更新 viewport signal
932
1080
  */
933
1081
  handleWheelEvent(e: WheelEvent): void {
1082
+ if (!this._activeMode.allowZoom) return
934
1083
  const rect = this.dom.container.getBoundingClientRect()
935
1084
  this.zoomController.handleWheel(e.deltaY, e.clientX - rect.left)
936
1085
  }
@@ -951,6 +1100,7 @@ export class Chart {
951
1100
  * @param centerClientX 捏合中心在视口中的 X 坐标
952
1101
  */
953
1102
  handlePinchZoom(delta: number, centerClientX: number): void {
1103
+ if (!this._activeMode.allowZoom) return
954
1104
  this.zoomController.handlePinch(delta, centerClientX)
955
1105
  }
956
1106
 
@@ -5,6 +5,7 @@ export type ChartDom = {
5
5
  scrollContent?: HTMLDivElement
6
6
  canvasLayer: HTMLDivElement
7
7
  rightAxisLayer: HTMLDivElement
8
+ leftAxisLayer?: HTMLDivElement
8
9
  xAxisCanvas: HTMLCanvasElement
9
10
  }
10
11
 
@@ -21,6 +22,7 @@ export type PaneRendererDom = {
21
22
  mainCanvas: HTMLCanvasElement
22
23
  overlayCanvas: HTMLCanvasElement
23
24
  yAxisCanvas: HTMLCanvasElement
25
+ leftYAxisCanvas?: HTMLCanvasElement
24
26
  }
25
27
 
26
28
  export type ChartOptions = {
@@ -28,6 +30,7 @@ export type ChartOptions = {
28
30
  kGap?: number
29
31
  yPaddingPx: number
30
32
  rightAxisWidth: number
33
+ leftAxisWidth: number
31
34
  bottomAxisHeight: number
32
35
  minKWidth: number
33
36
  maxKWidth: number