@363045841yyt/klinechart-core 0.7.12 → 0.8.1-alpha.1

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 (323) hide show
  1. package/dist/config/chartSettings.d.ts +0 -6
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +0 -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 +22 -0
  7. package/dist/controllers/createChartController.js.map +1 -1
  8. package/dist/controllers/createIndicatorSelectorController.d.ts.map +1 -1
  9. package/dist/controllers/createIndicatorSelectorController.js +4 -6
  10. package/dist/controllers/createIndicatorSelectorController.js.map +1 -1
  11. package/dist/controllers/index.d.ts +4 -4
  12. package/dist/controllers/index.d.ts.map +1 -1
  13. package/dist/controllers/index.js +3 -2
  14. package/dist/controllers/index.js.map +1 -1
  15. package/dist/controllers/types.d.ts +21 -0
  16. package/dist/controllers/types.d.ts.map +1 -1
  17. package/dist/data-fetchers/baostock.d.ts +3 -0
  18. package/dist/data-fetchers/baostock.d.ts.map +1 -0
  19. package/dist/data-fetchers/baostock.js +34 -0
  20. package/dist/data-fetchers/baostock.js.map +1 -0
  21. package/dist/data-fetchers/hundred-mock.d.ts +3 -0
  22. package/dist/data-fetchers/hundred-mock.d.ts.map +1 -0
  23. package/dist/data-fetchers/hundred-mock.js +30 -0
  24. package/dist/data-fetchers/hundred-mock.js.map +1 -0
  25. package/dist/data-fetchers/index.d.ts +5 -0
  26. package/dist/data-fetchers/index.d.ts.map +1 -0
  27. package/dist/data-fetchers/index.js +5 -0
  28. package/dist/data-fetchers/index.js.map +1 -0
  29. package/dist/data-fetchers/router.d.ts +3 -0
  30. package/dist/data-fetchers/router.d.ts.map +1 -0
  31. package/dist/data-fetchers/router.js +16 -0
  32. package/dist/data-fetchers/router.js.map +1 -0
  33. package/dist/data-fetchers/thousand-mock.d.ts +3 -0
  34. package/dist/data-fetchers/thousand-mock.d.ts.map +1 -0
  35. package/dist/data-fetchers/thousand-mock.js +29 -0
  36. package/dist/data-fetchers/thousand-mock.js.map +1 -0
  37. package/dist/engine/chart.d.ts +20 -2
  38. package/dist/engine/chart.d.ts.map +1 -1
  39. package/dist/engine/chart.js +81 -24
  40. package/dist/engine/chart.js.map +1 -1
  41. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts +3 -2
  42. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  43. package/dist/engine/indicators/indicatorDefinitionRegistry.js +26 -1
  44. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  45. package/dist/engine/indicators/indicatorMetadata.d.ts +29 -2
  46. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  47. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  48. package/dist/engine/indicators/indicatorRuntime.d.ts.map +1 -1
  49. package/dist/engine/indicators/indicatorRuntime.js +5 -4
  50. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  51. package/dist/engine/indicators/scheduler.d.ts +16 -1
  52. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  53. package/dist/engine/indicators/scheduler.js +26 -7
  54. package/dist/engine/indicators/scheduler.js.map +1 -1
  55. package/dist/engine/renderers/Indicator/atr.d.ts +2 -1
  56. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  57. package/dist/engine/renderers/Indicator/atr.js +5 -9
  58. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  59. package/dist/engine/renderers/Indicator/boll.d.ts +4 -1
  60. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  61. package/dist/engine/renderers/Indicator/boll.js +22 -10
  62. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  63. package/dist/engine/renderers/Indicator/cci.d.ts +2 -1
  64. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  65. package/dist/engine/renderers/Indicator/cci.js +6 -10
  66. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  67. package/dist/engine/renderers/Indicator/chaikinVol.d.ts +4 -1
  68. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  69. package/dist/engine/renderers/Indicator/chaikinVol.js +16 -8
  70. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  71. package/dist/engine/renderers/Indicator/cmf.d.ts +4 -1
  72. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  73. package/dist/engine/renderers/Indicator/cmf.js +15 -8
  74. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  75. package/dist/engine/renderers/Indicator/dema.d.ts +2 -0
  76. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  77. package/dist/engine/renderers/Indicator/dema.js +18 -8
  78. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  79. package/dist/engine/renderers/Indicator/donchian.d.ts +4 -1
  80. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  81. package/dist/engine/renderers/Indicator/donchian.js +19 -8
  82. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  83. package/dist/engine/renderers/Indicator/ene.d.ts +12 -1
  84. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  85. package/dist/engine/renderers/Indicator/ene.js +22 -10
  86. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  87. package/dist/engine/renderers/Indicator/expma.d.ts +4 -1
  88. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  89. package/dist/engine/renderers/Indicator/expma.js +21 -10
  90. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  91. package/dist/engine/renderers/Indicator/fastk.d.ts +2 -1
  92. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  93. package/dist/engine/renderers/Indicator/fastk.js +6 -10
  94. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  95. package/dist/engine/renderers/Indicator/fib.d.ts +2 -0
  96. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  97. package/dist/engine/renderers/Indicator/fib.js +25 -8
  98. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  99. package/dist/engine/renderers/Indicator/hma.d.ts +2 -0
  100. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  101. package/dist/engine/renderers/Indicator/hma.js +18 -8
  102. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  103. package/dist/engine/renderers/Indicator/hv.d.ts +4 -1
  104. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  105. package/dist/engine/renderers/Indicator/hv.js +17 -8
  106. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  107. package/dist/engine/renderers/Indicator/ichimoku.d.ts +4 -1
  108. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  109. package/dist/engine/renderers/Indicator/ichimoku.js +26 -8
  110. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  111. package/dist/engine/renderers/Indicator/index.d.ts +27 -28
  112. package/dist/engine/renderers/Indicator/index.d.ts.map +1 -1
  113. package/dist/engine/renderers/Indicator/index.js +27 -28
  114. package/dist/engine/renderers/Indicator/index.js.map +1 -1
  115. package/dist/engine/renderers/Indicator/{indicatorData.d.ts → indicatorCatalog.d.ts} +1 -1
  116. package/dist/engine/renderers/Indicator/indicatorCatalog.d.ts.map +1 -0
  117. package/dist/engine/renderers/Indicator/{indicatorData.js → indicatorCatalog.js} +94 -406
  118. package/dist/engine/renderers/Indicator/indicatorCatalog.js.map +1 -0
  119. package/dist/engine/renderers/Indicator/kama.d.ts +2 -0
  120. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  121. package/dist/engine/renderers/Indicator/kama.js +18 -8
  122. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  123. package/dist/engine/renderers/Indicator/keltner.d.ts +4 -1
  124. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  125. package/dist/engine/renderers/Indicator/keltner.js +19 -8
  126. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  127. package/dist/engine/renderers/Indicator/kst.d.ts +2 -1
  128. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  129. package/dist/engine/renderers/Indicator/kst.js +11 -10
  130. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  131. package/dist/engine/renderers/Indicator/ma.d.ts +4 -1
  132. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  133. package/dist/engine/renderers/Indicator/ma.js +32 -9
  134. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  135. package/dist/engine/renderers/Indicator/macd.d.ts +1 -1
  136. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  137. package/dist/engine/renderers/Indicator/macd.js +9 -10
  138. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  139. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  140. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +38 -136
  141. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  142. package/dist/engine/renderers/Indicator/mfi.d.ts +4 -1
  143. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  144. package/dist/engine/renderers/Indicator/mfi.js +15 -8
  145. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  146. package/dist/engine/renderers/Indicator/mom.d.ts +2 -1
  147. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  148. package/dist/engine/renderers/Indicator/mom.js +6 -10
  149. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  150. package/dist/engine/renderers/Indicator/obv.d.ts +4 -1
  151. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  152. package/dist/engine/renderers/Indicator/obv.js +14 -8
  153. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  154. package/dist/engine/renderers/Indicator/parkinson.d.ts +4 -1
  155. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  156. package/dist/engine/renderers/Indicator/parkinson.js +17 -8
  157. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  158. package/dist/engine/renderers/Indicator/pivot.d.ts +2 -0
  159. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  160. package/dist/engine/renderers/Indicator/pivot.js +42 -8
  161. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  162. package/dist/engine/renderers/Indicator/pvt.d.ts +4 -1
  163. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  164. package/dist/engine/renderers/Indicator/pvt.js +14 -8
  165. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  166. package/dist/engine/renderers/Indicator/roc.d.ts +4 -1
  167. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  168. package/dist/engine/renderers/Indicator/roc.js +15 -8
  169. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  170. package/dist/engine/renderers/Indicator/rsi.d.ts +2 -1
  171. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  172. package/dist/engine/renderers/Indicator/rsi.js +9 -10
  173. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  174. package/dist/engine/renderers/Indicator/sar.d.ts +4 -1
  175. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  176. package/dist/engine/renderers/Indicator/sar.js +17 -8
  177. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  178. package/dist/engine/renderers/Indicator/stoch.d.ts +2 -1
  179. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  180. package/dist/engine/renderers/Indicator/stoch.js +8 -10
  181. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  182. package/dist/engine/renderers/Indicator/structure.d.ts +4 -1
  183. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  184. package/dist/engine/renderers/Indicator/structure.js +21 -9
  185. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  186. package/dist/engine/renderers/Indicator/supertrend.d.ts +4 -1
  187. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  188. package/dist/engine/renderers/Indicator/supertrend.js +18 -9
  189. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  190. package/dist/engine/renderers/Indicator/tema.d.ts +2 -0
  191. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  192. package/dist/engine/renderers/Indicator/tema.js +18 -8
  193. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  194. package/dist/engine/renderers/Indicator/trix.d.ts +4 -1
  195. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  196. package/dist/engine/renderers/Indicator/trix.js +29 -8
  197. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  198. package/dist/engine/renderers/Indicator/vma.d.ts +4 -1
  199. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  200. package/dist/engine/renderers/Indicator/vma.js +15 -8
  201. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  202. package/dist/engine/renderers/Indicator/volumeProfile.d.ts +4 -1
  203. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  204. package/dist/engine/renderers/Indicator/volumeProfile.js +27 -8
  205. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  206. package/dist/engine/renderers/Indicator/vwap.d.ts +4 -1
  207. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  208. package/dist/engine/renderers/Indicator/vwap.js +14 -8
  209. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  210. package/dist/engine/renderers/Indicator/wma.d.ts +2 -0
  211. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  212. package/dist/engine/renderers/Indicator/wma.js +18 -8
  213. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  214. package/dist/engine/renderers/Indicator/wmsr.d.ts +2 -1
  215. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  216. package/dist/engine/renderers/Indicator/wmsr.js +6 -10
  217. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  218. package/dist/engine/renderers/Indicator/zones.d.ts +2 -0
  219. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  220. package/dist/engine/renderers/Indicator/zones.js +23 -8
  221. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  222. package/dist/engine/renderers/paneTitle.d.ts +4 -10
  223. package/dist/engine/renderers/paneTitle.d.ts.map +1 -1
  224. package/dist/engine/renderers/paneTitle.js +30 -7
  225. package/dist/engine/renderers/paneTitle.js.map +1 -1
  226. package/dist/engine/renderers/subVolume.js +0 -3
  227. package/dist/engine/renderers/subVolume.js.map +1 -1
  228. package/dist/engine/subPaneManager.d.ts.map +1 -1
  229. package/dist/engine/subPaneManager.js +2 -1
  230. package/dist/engine/subPaneManager.js.map +1 -1
  231. package/dist/semantic/controller.d.ts +3 -14
  232. package/dist/semantic/controller.d.ts.map +1 -1
  233. package/dist/semantic/controller.js +9 -43
  234. package/dist/semantic/controller.js.map +1 -1
  235. package/dist/semantic/index.d.ts +3 -2
  236. package/dist/semantic/index.d.ts.map +1 -1
  237. package/dist/semantic/index.js +1 -1
  238. package/dist/semantic/index.js.map +1 -1
  239. package/dist/version.d.ts +1 -1
  240. package/dist/version.d.ts.map +1 -1
  241. package/dist/version.js +1 -1
  242. package/dist/version.js.map +1 -1
  243. package/package.json +7 -7
  244. package/src/config/chartSettings.ts +0 -1
  245. package/src/controllers/__tests__/indicatorSelector.test.ts +5 -4
  246. package/src/controllers/createChartController.ts +28 -1
  247. package/src/controllers/createIndicatorSelectorController.ts +4 -6
  248. package/src/controllers/index.ts +7 -6
  249. package/src/controllers/types.ts +30 -0
  250. package/src/data-fetchers/baostock.ts +34 -0
  251. package/src/data-fetchers/hundred-mock.ts +31 -0
  252. package/src/data-fetchers/index.ts +4 -0
  253. package/src/data-fetchers/router.ts +17 -0
  254. package/src/data-fetchers/thousand-mock.ts +30 -0
  255. package/src/engine/chart.ts +91 -23
  256. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +4 -5
  257. package/src/engine/indicators/indicatorDefinitionRegistry.ts +35 -2
  258. package/src/engine/indicators/indicatorMetadata.ts +39 -2
  259. package/src/engine/indicators/indicatorRuntime.ts +5 -4
  260. package/src/engine/indicators/scheduler.ts +32 -8
  261. package/src/engine/renderers/Indicator/atr.ts +8 -11
  262. package/src/engine/renderers/Indicator/boll.ts +31 -10
  263. package/src/engine/renderers/Indicator/cci.ts +9 -14
  264. package/src/engine/renderers/Indicator/chaikinVol.ts +24 -8
  265. package/src/engine/renderers/Indicator/cmf.ts +23 -8
  266. package/src/engine/renderers/Indicator/dema.ts +27 -9
  267. package/src/engine/renderers/Indicator/donchian.ts +27 -9
  268. package/src/engine/renderers/Indicator/ene.ts +31 -10
  269. package/src/engine/renderers/Indicator/expma.ts +30 -10
  270. package/src/engine/renderers/Indicator/fastk.ts +9 -14
  271. package/src/engine/renderers/Indicator/fib.ts +28 -9
  272. package/src/engine/renderers/Indicator/hma.ts +27 -9
  273. package/src/engine/renderers/Indicator/hv.ts +26 -8
  274. package/src/engine/renderers/Indicator/ichimoku.ts +30 -9
  275. package/src/engine/renderers/Indicator/index.ts +27 -28
  276. package/src/engine/renderers/Indicator/indicatorCatalog.ts +346 -0
  277. package/src/engine/renderers/Indicator/kama.ts +27 -9
  278. package/src/engine/renderers/Indicator/keltner.ts +27 -9
  279. package/src/engine/renderers/Indicator/kst.ts +14 -18
  280. package/src/engine/renderers/Indicator/ma.ts +43 -9
  281. package/src/engine/renderers/Indicator/macd.ts +27 -32
  282. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +43 -162
  283. package/src/engine/renderers/Indicator/mfi.ts +23 -8
  284. package/src/engine/renderers/Indicator/mom.ts +9 -14
  285. package/src/engine/renderers/Indicator/obv.ts +22 -8
  286. package/src/engine/renderers/Indicator/parkinson.ts +26 -8
  287. package/src/engine/renderers/Indicator/pivot.ts +46 -9
  288. package/src/engine/renderers/Indicator/pvt.ts +22 -8
  289. package/src/engine/renderers/Indicator/roc.ts +24 -8
  290. package/src/engine/renderers/Indicator/rsi.ts +12 -16
  291. package/src/engine/renderers/Indicator/sar.ts +25 -9
  292. package/src/engine/renderers/Indicator/stoch.ts +11 -15
  293. package/src/engine/renderers/Indicator/structure.ts +31 -9
  294. package/src/engine/renderers/Indicator/supertrend.ts +26 -10
  295. package/src/engine/renderers/Indicator/tema.ts +27 -9
  296. package/src/engine/renderers/Indicator/trix.ts +38 -8
  297. package/src/engine/renderers/Indicator/vma.ts +23 -8
  298. package/src/engine/renderers/Indicator/volumeProfile.ts +39 -8
  299. package/src/engine/renderers/Indicator/vwap.ts +22 -8
  300. package/src/engine/renderers/Indicator/wma.ts +27 -9
  301. package/src/engine/renderers/Indicator/wmsr.ts +9 -14
  302. package/src/engine/renderers/Indicator/zones.ts +28 -9
  303. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +142 -79
  304. package/src/engine/renderers/paneTitle.ts +45 -19
  305. package/src/engine/renderers/subVolume.ts +0 -2
  306. package/src/engine/subPaneManager.ts +2 -1
  307. package/src/semantic/__tests__/controller.test.ts +19 -7
  308. package/src/semantic/controller.ts +9 -57
  309. package/src/semantic/index.ts +3 -2
  310. package/src/version.ts +1 -1
  311. package/dist/engine/renderers/Indicator/indicatorData.d.ts.map +0 -1
  312. package/dist/engine/renderers/Indicator/indicatorData.js.map +0 -1
  313. package/dist/engine/renderers/Indicator/macdLegend.d.ts +0 -13
  314. package/dist/engine/renderers/Indicator/macdLegend.d.ts.map +0 -1
  315. package/dist/engine/renderers/Indicator/macdLegend.js +0 -116
  316. package/dist/engine/renderers/Indicator/macdLegend.js.map +0 -1
  317. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts +0 -16
  318. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts.map +0 -1
  319. package/dist/engine/renderers/Indicator/subPaneConfig.js +0 -194
  320. package/dist/engine/renderers/Indicator/subPaneConfig.js.map +0 -1
  321. package/src/engine/renderers/Indicator/indicatorData.ts +0 -650
  322. package/src/engine/renderers/Indicator/macdLegend.ts +0 -141
  323. package/src/engine/renderers/Indicator/subPaneConfig.ts +0 -265
@@ -10,6 +10,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
10
10
  import type { IndicatorScheduler, ATRSchedulerConfig } from '../../indicators/scheduler'
11
11
  import { createAtrScaleRendererPlugin } from './scale/atr_scale'
12
12
  import { calcATRData } from '../../indicators/calculators'
13
+ import type { KLineData } from '../../../types/price'
13
14
 
14
15
  type LinePoint = { x: number; y: number }
15
16
 
@@ -209,11 +210,14 @@ function drawWithCanvas2D(
209
210
  * 获取 ATR 标题信息(供 paneTitle 使用)
210
211
  */
211
212
  export function getATRTitleInfo(
212
- index: number,
213
- period: number,
213
+ _data: KLineData[],
214
+ index: number | null,
215
+ params: Record<string, number | boolean | string>,
214
216
  pluginHost: PluginHost,
215
- paneId: string = 'sub_ATR',
217
+ paneId: string,
216
218
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
219
+ if (index === null) return null
220
+ const period = (params.period as number) ?? 14
217
221
  const state = pluginHost.getSharedState<ATRRenderState>(createATRStateKey(paneId))
218
222
  if (!state) return null
219
223
 
@@ -233,18 +237,11 @@ export function getATRTitleInfo(
233
237
  name: 'atr',
234
238
  displayName: 'ATR',
235
239
  category: 'oscillator',
236
- stateKey: createATRStateKey,
237
240
  defaultPaneId: 'sub_ATR',
238
241
  scaleRendererFactory: createAtrScaleRendererPlugin,
239
- updateConfig: (scheduler, params, paneId) => {
240
- (scheduler as IndicatorScheduler).updateIndicatorConfig('atr', params, paneId)
241
- },
242
242
  visibleState: { compose: createNonNegativeSparseVisibleStateComposer('atr', EMPTY_ATR_STATE) },
243
- applyResult: (host, state, paneId) => {
244
- host.setSharedState(createATRStateKey(paneId), state as any, 'indicator_scheduler')
245
- },
243
+ getTitleInfo: getATRTitleInfo,
246
244
  runtime: {
247
- configKey: 'atr',
248
245
  defaultConfig: { period: 14, showATR: true },
249
246
  computeKey: 'calcATRData',
250
247
  compute: (data, c) => calcATRData(data, c.period),
@@ -6,7 +6,7 @@ import { resolveThemeColors } from '../../../tokens'
6
6
  import { BOLL_STATE_KEY, type BOLLRenderState } from '../../indicators/bollState'
7
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
- import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer } from '../../indicators/indicatorMetadata'
9
+ import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer, GetTitleInfoFn, TitleInfo, TitleValueItem } from '../../indicators/indicatorMetadata'
10
10
  import type { BOLLSchedulerConfig, IndicatorScheduler } from '../../indicators/scheduler'
11
11
  import { calcBOLLData } from '../../indicators/calculators'
12
12
 
@@ -110,7 +110,7 @@ function buildPriceCacheKey(
110
110
  return `${range.start}|${range.end}|${dataLength}|${lastTimestamp}|${period}`
111
111
  }
112
112
 
113
- function getBOLLStateKey(host: PluginHost | null): string | null {
113
+ export function getBOLLStateKey(host: PluginHost | null): string | null {
114
114
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
115
115
  if (!scheduler) {
116
116
  console.warn('[BOLLRenderer] Scheduler not available via service locator')
@@ -155,11 +155,37 @@ const composeBOLLRenderState: IndicatorRenderStateComposer = (bundle, range, tim
155
155
  }
156
156
  }
157
157
 
158
+ export const getBOLLTitleInfo: GetTitleInfoFn = (
159
+ _data: KLineData[],
160
+ index: number | null,
161
+ _params: Record<string, number | boolean | string>,
162
+ pluginHost: PluginHost,
163
+ _paneId: string,
164
+ ): TitleInfo | null => {
165
+ if (index === null) return null
166
+
167
+ const stateKey = getBOLLStateKey(pluginHost)
168
+ if (!stateKey) return null
169
+
170
+ const state = pluginHost?.getSharedState<BOLLRenderState>(stateKey)
171
+ if (!state || state.visibleMin > state.visibleMax) return null
172
+
173
+ const bollPoint = state.series[index]
174
+ if (!bollPoint) return null
175
+
176
+ const values: TitleValueItem[] = [
177
+ { label: 'UP', value: bollPoint.upper, color: '#C83C3C' },
178
+ { label: 'MID', value: bollPoint.middle, color: '#5A8CFF' },
179
+ { label: 'DN', value: bollPoint.lower, color: '#32AA3C' },
180
+ ]
181
+
182
+ return { name: 'BOLL', params: [state.params.period, state.params.multiplier], values }
183
+ }
184
+
158
185
  @Indicator({
159
186
  name: 'boll',
160
187
  displayName: 'BOLL',
161
188
  category: 'main',
162
- stateKey: BOLL_STATE_KEY,
163
189
  defaultPaneId: 'main',
164
190
  mainPane: {
165
191
  rendererName: 'boll',
@@ -169,9 +195,6 @@ const composeBOLLRenderState: IndicatorRenderStateComposer = (bundle, range, tim
169
195
  computePriceRange: computeBOLLPriceRange,
170
196
  composeRenderState: composeBOLLRenderState,
171
197
  },
172
- updateConfig: (scheduler, params) => {
173
- (scheduler as IndicatorScheduler).updateIndicatorConfig('boll', params)
174
- },
175
198
  semantic: {
176
199
  apply: (chart, indicator) => {
177
200
  const params = (indicator as { params?: { period?: number; multiplier?: number } }).params
@@ -181,10 +204,8 @@ const composeBOLLRenderState: IndicatorRenderStateComposer = (bundle, range, tim
181
204
  })
182
205
  },
183
206
  },
184
- applyResult: (host, state, _paneId) => {
185
- host.setSharedState(BOLL_STATE_KEY, state as any, 'indicator_scheduler')
186
- },
187
- runtime: { configKey:'boll', defaultConfig:{period:20,multiplier:2,showUpper:true,showMiddle:true,showLower:true,showBand:true}, computeKey:'calcBOLLData', compute:(data,c)=>calcBOLLData(data,c.period,c.multiplier) },
207
+ runtime: { defaultConfig:{period:20,multiplier:2,showUpper:true,showMiddle:true,showLower:true,showBand:true}, computeKey:'calcBOLLData', compute:(data,c)=>calcBOLLData(data,c.period,c.multiplier) },
208
+ getTitleInfo: getBOLLTitleInfo,
188
209
  })
189
210
  class BOLLDefinition {
190
211
  static rendererFactory = createBOLLRendererPlugin
@@ -9,6 +9,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
9
  import type { IndicatorScheduler, CCISchedulerConfig } from '../../indicators/scheduler'
10
10
  import { createCciScaleRendererPlugin } from './scale/cci_scale'
11
11
  import { calcCCIData } from '../../indicators/calculators'
12
+ import type { KLineData } from '../../../types/price'
12
13
 
13
14
  type LinePoint = { x: number; y: number }
14
15
 
@@ -240,14 +241,15 @@ function drawCCILineWithCanvas2D(
240
241
  * 获取 CCI 标题信息(供 paneTitle 使用)
241
242
  */
242
243
  export function getCCITitleInfo(
243
- index: number,
244
- period: number,
244
+ _data: KLineData[],
245
+ index: number | null,
246
+ params: Record<string, number | boolean | string>,
245
247
  pluginHost: PluginHost,
246
- paneId: string = 'sub_CCI',
247
- theme: 'light' | 'dark' = 'light',
248
- isAsiaMarket?: boolean
248
+ paneId: string,
249
249
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
250
- const colors = resolveThemeColors(theme, isAsiaMarket)
250
+ if (index === null) return null
251
+ const period = (params.period as number) ?? 14
252
+ const colors = resolveThemeColors('light')
251
253
  const state = pluginHost.getSharedState<CCIRenderState>(createCCIStateKey(paneId))
252
254
  if (!state) return null
253
255
 
@@ -267,18 +269,11 @@ export function getCCITitleInfo(
267
269
  name: 'cci',
268
270
  displayName: 'CCI',
269
271
  category: 'oscillator',
270
- stateKey: createCCIStateKey,
271
272
  defaultPaneId: 'sub_CCI',
272
273
  scaleRendererFactory: createCciScaleRendererPlugin,
273
274
  visibleState: { compose: createCCIVisibleStateComposer('cci', EMPTY_CCI_STATE) },
274
- updateConfig: (scheduler, params, paneId) => {
275
- (scheduler as IndicatorScheduler).updateIndicatorConfig('cci', params, paneId)
276
- },
277
- applyResult: (host, state, paneId) => {
278
- host.setSharedState(createCCIStateKey(paneId), state as any, 'indicator_scheduler')
279
- },
275
+ getTitleInfo: getCCITitleInfo,
280
276
  runtime: {
281
- configKey: 'cci',
282
277
  defaultConfig: { period: 14, showCCI: true },
283
278
  computeKey: 'calcCCIData',
284
279
  compute: (data, c) => calcCCIData(data, c.period),
@@ -2,6 +2,8 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { ChaikinVolRenderState } from '../../indicators/chaikinVolState'
4
4
  import { createChaikinVolStateKey, EMPTY_CHAIKIN_VOL_STATE } from '../../indicators/chaikinVolState'
5
+ import type { TitleInfo } from '../../indicators/indicatorMetadata'
6
+ import type { KLineData } from '../../../types/price'
5
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
9
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
@@ -124,22 +126,36 @@ export function createChaikinVolRendererPlugin(options: { paneId?: string } = {}
124
126
  }
125
127
  }
126
128
 
129
+ export function getChaikinVolTitleInfo(
130
+ _data: KLineData[],
131
+ index: number | null,
132
+ params: Record<string, number | boolean | string>,
133
+ host: PluginHost,
134
+ paneId: string,
135
+ ): TitleInfo | null {
136
+ if (index === null) return null
137
+ const emaPeriod = (params.emaPeriod as number) ?? 10
138
+ const rocPeriod = (params.rocPeriod as number) ?? 10
139
+ const state = host.getSharedState<ChaikinVolRenderState>(createChaikinVolStateKey(paneId))
140
+ const value = state?.series[index]
141
+ if (value === undefined) return null
142
+
143
+ return {
144
+ name: 'ChaikinVol',
145
+ params: [emaPeriod, rocPeriod],
146
+ values: [{ label: 'ChaikinVol', value, color: CHAIKIN_VOL_COLOR }],
147
+ }
148
+ }
149
+
127
150
  @Indicator({
128
151
  name: 'chaikinVol',
129
152
  displayName: 'ChaikinVol',
130
153
  category: 'oscillator',
131
- stateKey: createChaikinVolStateKey,
132
154
  defaultPaneId: 'sub_ChaikinVol',
133
155
  visibleState: { compose: createSparseVisibleStateComposer('chaikinVol', EMPTY_CHAIKIN_VOL_STATE) },
134
156
  scale: { indicatorKey: 'chaikinVol', label: 'ChaikinVol', decimals: 2 },
135
- updateConfig: (scheduler, params, paneId) => {
136
- (scheduler as IndicatorScheduler).updateIndicatorConfig('chaikinVol', params, paneId)
137
- },
138
- applyResult: (host, state, paneId) => {
139
- host.setSharedState(createChaikinVolStateKey(paneId), state as any, 'indicator_scheduler')
140
- },
157
+ getTitleInfo: getChaikinVolTitleInfo,
141
158
  runtime: {
142
- configKey: 'chaikinVol',
143
159
  defaultConfig: { emaPeriod: 10, rocPeriod: 10, showChaikinVol: true },
144
160
  computeKey: 'calcChaikinVolData',
145
161
  compute: (data, c) => calcChaikinVolData(data, c.emaPeriod, c.rocPeriod),
@@ -2,6 +2,8 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { CMFRenderState } from '../../indicators/cmfState'
4
4
  import { createCMFStateKey, EMPTY_CMF_STATE } from '../../indicators/cmfState'
5
+ import type { TitleInfo } from '../../indicators/indicatorMetadata'
6
+ import type { KLineData } from '../../../types/price'
5
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
8
  import { createFixedRangeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
7
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
@@ -123,22 +125,35 @@ export function createCMFRendererPlugin(options: { paneId?: string } = {}): Rend
123
125
  }
124
126
  }
125
127
 
128
+ export function getCMFTitleInfo(
129
+ _data: KLineData[],
130
+ index: number | null,
131
+ params: Record<string, number | boolean | string>,
132
+ host: PluginHost,
133
+ paneId: string,
134
+ ): TitleInfo | null {
135
+ if (index === null) return null
136
+ const period = (params.period as number) ?? 20
137
+ const state = host.getSharedState<CMFRenderState>(createCMFStateKey(paneId))
138
+ const value = state?.series[index]
139
+ if (value === undefined) return null
140
+
141
+ return {
142
+ name: 'CMF',
143
+ params: [period],
144
+ values: [{ label: 'CMF', value, color: CMF_COLOR }],
145
+ }
146
+ }
147
+
126
148
  @Indicator({
127
149
  name: 'cmf',
128
150
  displayName: 'CMF',
129
151
  category: 'volume',
130
- stateKey: createCMFStateKey,
131
152
  defaultPaneId: 'sub_CMF',
132
153
  visibleState: { compose: createFixedRangeSparseVisibleStateComposer('cmf', EMPTY_CMF_STATE) },
133
154
  scale: { indicatorKey: 'cmf', label: 'CMF', decimals: 4 },
134
- updateConfig: (scheduler, params, paneId) => {
135
- (scheduler as IndicatorScheduler).updateIndicatorConfig('cmf', params, paneId)
136
- },
137
- applyResult: (host, state, paneId) => {
138
- host.setSharedState(createCMFStateKey(paneId), state as any, 'indicator_scheduler')
139
- },
155
+ getTitleInfo: getCMFTitleInfo,
140
156
  runtime: {
141
- configKey: 'cmf',
142
157
  defaultConfig: { period: 20, showCMF: true },
143
158
  computeKey: 'calcCMFData',
144
159
  compute: (data, c) => calcCMFData(data, c.period),
@@ -1,9 +1,10 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
+ import type { KLineData } from '../../../types/price'
2
3
  import { RENDERER_PRIORITY } from '../../../plugin'
3
4
  import type { DEMARenderState } from '../../indicators/demaState'
4
5
  import { createDEMAStateKey, EMPTY_DEMA_STATE } from '../../indicators/demaState'
5
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
- import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
+ import { resolveStateKey, type TitleInfo, type TitleValueItem, type GetTitleInfoFn } from '../../indicators/indicatorMetadata'
7
8
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
  import type { IndicatorScheduler, DEMASchedulerConfig } from '../../indicators/scheduler'
9
10
  import { calcDEMAData } from '../../indicators/calculators'
@@ -121,23 +122,40 @@ export function createDEMARendererPlugin(options: DEMARendererOptions = {}): Ren
121
122
  }
122
123
  }
123
124
 
125
+ export const getDEMATitleInfo: GetTitleInfoFn = (
126
+ _data: KLineData[],
127
+ index: number | null,
128
+ _params: Record<string, number | boolean | string>,
129
+ pluginHost: PluginHost,
130
+ paneId: string,
131
+ ): TitleInfo | null => {
132
+ if (index === null) return null
133
+
134
+ const stateKey = createDEMAStateKey(paneId)
135
+ const state = pluginHost?.getSharedState<DEMARenderState>(stateKey)
136
+ if (!state || state.visibleMin > state.visibleMax) return null
137
+
138
+ const value = state.series[index]
139
+ if (value === undefined) return null
140
+
141
+ return {
142
+ name: 'DEMA',
143
+ params: [state.params.period],
144
+ values: [{ label: 'DEMA', value, color: '#6366f1' }],
145
+ }
146
+ }
147
+
124
148
  @Indicator({
125
149
  name: 'dema',
126
150
  displayName: 'DEMA',
151
+ getTitleInfo: getDEMATitleInfo,
127
152
  category: 'main',
128
- stateKey: createDEMAStateKey,
129
153
  defaultPaneId: 'main',
130
154
  allowMainPane: true,
131
155
  mainPane: { rendererName: 'dema_main', toActiveConfig: (params, active) => ({ ...params, showDEMA: active }) },
132
156
  visibleState: { compose: createSparseVisibleStateComposer('dema', EMPTY_DEMA_STATE) },
133
157
  scale: { indicatorKey: 'dema', label: 'DEMA', decimals: 2 },
134
- updateConfig: (scheduler, params, paneId) => {
135
- (scheduler as IndicatorScheduler).updateIndicatorConfig('dema', params, paneId)
136
- },
137
- applyResult: (host, state, paneId) => {
138
- host.setSharedState(createDEMAStateKey(paneId), state as any, 'indicator_scheduler')
139
- },
140
- runtime: { configKey:'dema', defaultConfig:{period:14,showDEMA:true}, computeKey:'calcDEMAData', compute:(data,c)=>calcDEMAData(data,c.period) },
158
+ runtime: { defaultConfig:{period:14,showDEMA:true}, computeKey:'calcDEMAData', compute:(data,c)=>calcDEMAData(data,c.period) },
141
159
  })
142
160
  class DEMADefinition {
143
161
  static rendererFactory = createDEMARendererPlugin
@@ -1,9 +1,10 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
+ import type { KLineData } from '../../../types/price'
3
4
  import type { DonchianRenderState } from '../../indicators/donchianState'
4
5
  import { createDonchianStateKey, EMPTY_DONCHIAN_STATE } from '../../indicators/donchianState'
5
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
- import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
+ import { resolveStateKey, type TitleInfo, type GetTitleInfoFn } from '../../indicators/indicatorMetadata'
7
8
  import type { IndicatorScheduler, DonchianSchedulerConfig } from '../../indicators/scheduler'
8
9
  import { calcDonchianData } from '../../indicators/calculators'
9
10
  import { createBandVisibleStateComposer } from '../../indicators/visibleStateComposers'
@@ -123,23 +124,40 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
123
124
  ctx.stroke()
124
125
  }
125
126
 
127
+ export function getDonchianTitleInfo(
128
+ _data: KLineData[],
129
+ index: number | null,
130
+ params: Record<string, number | boolean | string>,
131
+ host: PluginHost,
132
+ paneId: string,
133
+ ): TitleInfo | null {
134
+ if (index === null) return null
135
+ const state = host.getSharedState<DonchianRenderState>(createDonchianStateKey(paneId))
136
+ const p = state?.series[index]
137
+ if (!p) return null
138
+
139
+ return {
140
+ name: 'Donchian',
141
+ params: [(params.period as number) ?? 20],
142
+ values: [
143
+ { label: 'Upper', value: p.upper, color: '#0891b2' },
144
+ { label: 'Mid', value: p.middle, color: '#94a3b8' },
145
+ { label: 'Lower', value: p.lower, color: '#0891b2' },
146
+ ],
147
+ }
148
+ }
149
+
126
150
  @Indicator({
127
151
  name: 'donchian',
128
152
  displayName: 'Donchian',
153
+ getTitleInfo: getDonchianTitleInfo,
129
154
  category: 'main',
130
- stateKey: createDonchianStateKey,
131
155
  defaultPaneId: 'main',
132
156
  allowMainPane: true,
133
157
  mainPane: { rendererName: 'donchian_main', toActiveConfig: (params, active) => ({ ...params, showUpper: active, showMiddle: active, showLower: active }) },
134
158
  scale: { indicatorKey: 'donchian', label: 'Donchian', decimals: 2 },
135
159
  visibleState: { compose: createBandVisibleStateComposer('donchian', EMPTY_DONCHIAN_STATE, 'lower', 'upper') },
136
- updateConfig: (scheduler, params, paneId) => {
137
- (scheduler as IndicatorScheduler).updateIndicatorConfig('donchian', params, paneId)
138
- },
139
- applyResult: (host, state, paneId) => {
140
- host.setSharedState(createDonchianStateKey(paneId), state as any, 'indicator_scheduler')
141
- },
142
- runtime: { configKey:'donchian', defaultConfig:{period:20,showUpper:true,showMiddle:true,showLower:true}, computeKey:'calcDonchianData', compute:(data,c)=>calcDonchianData(data,c.period) },
160
+ runtime: { defaultConfig:{period:20,showUpper:true,showMiddle:true,showLower:true}, computeKey:'calcDonchianData', compute:(data,c)=>calcDonchianData(data,c.period) },
143
161
  })
144
162
  class DonchianDefinition {
145
163
  static rendererFactory = createDonchianRendererPlugin
@@ -6,7 +6,7 @@ import { resolveThemeColors } from '../../../tokens'
6
6
  import { ENE_STATE_KEY, type ENERenderState } from '../../indicators/eneState'
7
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
- import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer } from '../../indicators/indicatorMetadata'
9
+ import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer, GetTitleInfoFn, TitleInfo, TitleValueItem } from '../../indicators/indicatorMetadata'
10
10
  import type { ENESchedulerConfig, IndicatorScheduler } from '../../indicators/scheduler'
11
11
  import { calcENEData } from '../../indicators/calculators'
12
12
 
@@ -94,7 +94,7 @@ function drawENEWithWebGL(
94
94
  * 3. 配置变更通过外部 IndicatorScheduler 处理
95
95
  * 4. 纯绘制函数,无副作用
96
96
  */
97
- function getENEStateKey(host: PluginHost | null): string | null {
97
+ export function getENEStateKey(host: PluginHost | null): string | null {
98
98
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
99
99
  if (!scheduler) {
100
100
  console.warn('[ENERenderer] Scheduler not available via service locator')
@@ -289,11 +289,37 @@ export function createENERendererPlugin(): RendererPluginWithHost {
289
289
  }
290
290
  }
291
291
 
292
+ export const getENETitleInfo: GetTitleInfoFn = (
293
+ _data: KLineData[],
294
+ index: number | null,
295
+ _params: Record<string, number | boolean | string>,
296
+ pluginHost: PluginHost,
297
+ _paneId: string,
298
+ ): TitleInfo | null => {
299
+ if (index === null) return null
300
+
301
+ const stateKey = getENEStateKey(pluginHost)
302
+ if (!stateKey) return null
303
+
304
+ const state = pluginHost?.getSharedState<ENERenderState>(stateKey)
305
+ if (!state || state.visibleMin > state.visibleMax) return null
306
+
307
+ const enePoint = state.series[index]
308
+ if (!enePoint) return null
309
+
310
+ const values: TitleValueItem[] = [
311
+ { label: 'UP', value: enePoint.upper, color: '#FF5064' },
312
+ { label: 'MID', value: enePoint.middle, color: '#5A8CFF' },
313
+ { label: 'DN', value: enePoint.lower, color: '#3CC8A0' },
314
+ ]
315
+
316
+ return { name: 'ENE', params: [state.params.period, state.params.deviation], values }
317
+ }
318
+
292
319
  @Indicator({
293
320
  name: 'ene',
294
321
  displayName: 'ENE',
295
322
  category: 'main',
296
- stateKey: ENE_STATE_KEY,
297
323
  defaultPaneId: 'main',
298
324
  mainPane: {
299
325
  rendererName: 'ene',
@@ -301,9 +327,6 @@ export function createENERendererPlugin(): RendererPluginWithHost {
301
327
  computePriceRange: computeENEPriceRange,
302
328
  composeRenderState: composeENERenderState,
303
329
  },
304
- updateConfig: (scheduler, params) => {
305
- (scheduler as IndicatorScheduler).updateIndicatorConfig('ene', params)
306
- },
307
330
  semantic: {
308
331
  apply: (chart, indicator) => {
309
332
  const params = (indicator as { params?: { period?: number; deviation?: number } }).params
@@ -313,10 +336,8 @@ export function createENERendererPlugin(): RendererPluginWithHost {
313
336
  })
314
337
  },
315
338
  },
316
- applyResult: (host, state, _paneId) => {
317
- host.setSharedState(ENE_STATE_KEY, state as any, 'indicator_scheduler')
318
- },
319
- runtime: { configKey:'ene', defaultConfig:{period:10,deviation:11}, computeKey:'calcENEData', compute:(data,c)=>calcENEData(data,c.period,c.deviation) },
339
+ runtime: { defaultConfig:{period:10,deviation:11}, computeKey:'calcENEData', compute:(data,c)=>calcENEData(data,c.period,c.deviation) },
340
+ getTitleInfo: getENETitleInfo,
320
341
  })
321
342
  class ENEDefinition {
322
343
  static rendererFactory = createENERendererPlugin
@@ -6,7 +6,7 @@ import { resolveThemeColors } from '../../../tokens'
6
6
  import { EXPMA_STATE_KEY, type EXPMARenderState } from '../../indicators/expmaState'
7
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
- import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer } from '../../indicators/indicatorMetadata'
9
+ import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer, GetTitleInfoFn, TitleInfo, TitleValueItem } from '../../indicators/indicatorMetadata'
10
10
  import type { EXPMASchedulerConfig, IndicatorScheduler } from '../../indicators/scheduler'
11
11
  import { calcEXPMAData } from '../../indicators/calculators'
12
12
 
@@ -34,7 +34,7 @@ function buildEXPMACacheKey(
34
34
  ].join('|')
35
35
  }
36
36
 
37
- function getEXPMAStateKey(host: PluginHost | null): string | null {
37
+ export function getEXPMAStateKey(host: PluginHost | null): string | null {
38
38
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
39
39
  if (!scheduler) {
40
40
  console.warn('[EXPMARenderer] Scheduler not available via service locator')
@@ -215,11 +215,36 @@ export function createEXPMARendererPlugin(): RendererPluginWithHost {
215
215
  }
216
216
  }
217
217
 
218
+ export const getEXPMATitleInfo: GetTitleInfoFn = (
219
+ _data: KLineData[],
220
+ index: number | null,
221
+ _params: Record<string, number | boolean | string>,
222
+ pluginHost: PluginHost,
223
+ _paneId: string,
224
+ ): TitleInfo | null => {
225
+ if (index === null) return null
226
+
227
+ const stateKey = getEXPMAStateKey(pluginHost)
228
+ if (!stateKey) return null
229
+
230
+ const state = pluginHost?.getSharedState<EXPMARenderState>(stateKey)
231
+ if (!state || state.visibleMin > state.visibleMax) return null
232
+
233
+ const expmaPoint = state.series[index]
234
+ if (!expmaPoint) return null
235
+
236
+ const values: TitleValueItem[] = [
237
+ { label: 'FAST', value: expmaPoint.fast, color: '#FFAA32' },
238
+ { label: 'SLOW', value: expmaPoint.slow, color: '#5A8CFF' },
239
+ ]
240
+
241
+ return { name: 'EXPMA', params: [state.params.fastPeriod, state.params.slowPeriod], values }
242
+ }
243
+
218
244
  @Indicator({
219
245
  name: 'expma',
220
246
  displayName: 'EXPMA',
221
247
  category: 'main',
222
- stateKey: EXPMA_STATE_KEY,
223
248
  defaultPaneId: 'main',
224
249
  mainPane: {
225
250
  rendererName: 'expma',
@@ -227,9 +252,6 @@ export function createEXPMARendererPlugin(): RendererPluginWithHost {
227
252
  computePriceRange: computeEXPMAPriceRange,
228
253
  composeRenderState: composeEXPMARenderState,
229
254
  },
230
- updateConfig: (scheduler, params) => {
231
- (scheduler as IndicatorScheduler).updateIndicatorConfig('expma', params)
232
- },
233
255
  semantic: {
234
256
  apply: (chart, indicator) => {
235
257
  const params = (indicator as { params?: { fastPeriod?: number; slowPeriod?: number } }).params
@@ -239,10 +261,8 @@ export function createEXPMARendererPlugin(): RendererPluginWithHost {
239
261
  })
240
262
  },
241
263
  },
242
- applyResult: (host, state, _paneId) => {
243
- host.setSharedState(EXPMA_STATE_KEY, state as any, 'indicator_scheduler')
244
- },
245
- runtime: { configKey:'expma', defaultConfig:{fastPeriod:12,slowPeriod:50}, computeKey:'calcEXPMAData', compute:(data,c)=>calcEXPMAData(data,c.fastPeriod,c.slowPeriod) },
264
+ runtime: { defaultConfig:{fastPeriod:12,slowPeriod:50}, computeKey:'calcEXPMAData', compute:(data,c)=>calcEXPMAData(data,c.fastPeriod,c.slowPeriod) },
265
+ getTitleInfo: getEXPMATitleInfo,
246
266
  })
247
267
  class EXPMADefinition {
248
268
  static rendererFactory = createEXPMARendererPlugin
@@ -10,6 +10,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
10
10
  import type { IndicatorScheduler, FASTKSchedulerConfig } from '../../indicators/scheduler'
11
11
  import { createFastkScaleRendererPlugin } from './scale/fastk_scale'
12
12
  import { calcFASTKData } from '../../indicators/calculators'
13
+ import type { KLineData } from '../../../types/price'
13
14
 
14
15
  type LinePoint = { x: number; y: number }
15
16
 
@@ -281,14 +282,15 @@ function drawFASTKLineWithCanvas2D(
281
282
  * 获取 FASTK 标题信息(供 paneTitle 使用)
282
283
  */
283
284
  export function getFASTKTitleInfo(
284
- index: number,
285
- period: number,
285
+ _data: KLineData[],
286
+ index: number | null,
287
+ params: Record<string, number | boolean | string>,
286
288
  pluginHost: PluginHost,
287
- paneId: string = 'sub_FASTK',
288
- theme: 'light' | 'dark' = 'light',
289
- isAsiaMarket?: boolean
289
+ paneId: string,
290
290
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
291
- const colors = resolveThemeColors(theme, isAsiaMarket)
291
+ if (index === null) return null
292
+ const period = (params.period as number) ?? 9
293
+ const colors = resolveThemeColors('light')
292
294
  const state = pluginHost.getSharedState<FASTKRenderState>(createFASTKStateKey(paneId))
293
295
  if (!state) return null
294
296
 
@@ -308,18 +310,11 @@ export function getFASTKTitleInfo(
308
310
  name: 'fastk',
309
311
  displayName: 'FASTK',
310
312
  category: 'oscillator',
311
- stateKey: createFASTKStateKey,
312
313
  defaultPaneId: 'sub_FASTK',
313
314
  visibleState: { compose: createFixedRangeSparseVisibleStateComposer('fastk', EMPTY_FASTK_STATE) },
314
315
  scaleRendererFactory: createFastkScaleRendererPlugin,
315
- updateConfig: (scheduler, params, paneId) => {
316
- (scheduler as IndicatorScheduler).updateIndicatorConfig('fastk', params, paneId)
317
- },
318
- applyResult: (host, state, paneId) => {
319
- host.setSharedState(createFASTKStateKey(paneId), state as any, 'indicator_scheduler')
320
- },
316
+ getTitleInfo: getFASTKTitleInfo,
321
317
  runtime: {
322
- configKey: 'fastk',
323
318
  defaultConfig: { period: 9, showFASTK: true },
324
319
  computeKey: 'calcFASTKData',
325
320
  compute: (data, c) => calcFASTKData(data, c.period),