@363045841yyt/klinechart-core 0.7.12 → 0.7.13

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 (261) hide show
  1. package/dist/controllers/createIndicatorSelectorController.d.ts.map +1 -1
  2. package/dist/controllers/createIndicatorSelectorController.js +4 -6
  3. package/dist/controllers/createIndicatorSelectorController.js.map +1 -1
  4. package/dist/controllers/index.d.ts +0 -1
  5. package/dist/controllers/index.d.ts.map +1 -1
  6. package/dist/controllers/index.js +0 -1
  7. package/dist/controllers/index.js.map +1 -1
  8. package/dist/engine/chart.d.ts +6 -2
  9. package/dist/engine/chart.d.ts.map +1 -1
  10. package/dist/engine/chart.js +26 -23
  11. package/dist/engine/chart.js.map +1 -1
  12. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts +3 -2
  13. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  14. package/dist/engine/indicators/indicatorDefinitionRegistry.js +26 -1
  15. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  16. package/dist/engine/indicators/indicatorMetadata.d.ts +29 -2
  17. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  18. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  19. package/dist/engine/indicators/indicatorRuntime.d.ts.map +1 -1
  20. package/dist/engine/indicators/indicatorRuntime.js +5 -4
  21. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  22. package/dist/engine/indicators/scheduler.d.ts +16 -1
  23. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  24. package/dist/engine/indicators/scheduler.js +26 -7
  25. package/dist/engine/indicators/scheduler.js.map +1 -1
  26. package/dist/engine/renderers/Indicator/atr.d.ts +2 -1
  27. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  28. package/dist/engine/renderers/Indicator/atr.js +5 -9
  29. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  30. package/dist/engine/renderers/Indicator/boll.d.ts +4 -1
  31. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  32. package/dist/engine/renderers/Indicator/boll.js +22 -10
  33. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  34. package/dist/engine/renderers/Indicator/cci.d.ts +2 -1
  35. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  36. package/dist/engine/renderers/Indicator/cci.js +6 -10
  37. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  38. package/dist/engine/renderers/Indicator/chaikinVol.d.ts +4 -1
  39. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  40. package/dist/engine/renderers/Indicator/chaikinVol.js +16 -8
  41. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  42. package/dist/engine/renderers/Indicator/cmf.d.ts +4 -1
  43. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  44. package/dist/engine/renderers/Indicator/cmf.js +15 -8
  45. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  46. package/dist/engine/renderers/Indicator/dema.d.ts +2 -0
  47. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  48. package/dist/engine/renderers/Indicator/dema.js +18 -8
  49. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  50. package/dist/engine/renderers/Indicator/donchian.d.ts +4 -1
  51. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  52. package/dist/engine/renderers/Indicator/donchian.js +19 -8
  53. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  54. package/dist/engine/renderers/Indicator/ene.d.ts +12 -1
  55. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  56. package/dist/engine/renderers/Indicator/ene.js +22 -10
  57. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  58. package/dist/engine/renderers/Indicator/expma.d.ts +4 -1
  59. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  60. package/dist/engine/renderers/Indicator/expma.js +21 -10
  61. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  62. package/dist/engine/renderers/Indicator/fastk.d.ts +2 -1
  63. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  64. package/dist/engine/renderers/Indicator/fastk.js +6 -10
  65. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  66. package/dist/engine/renderers/Indicator/fib.d.ts +2 -0
  67. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  68. package/dist/engine/renderers/Indicator/fib.js +25 -8
  69. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  70. package/dist/engine/renderers/Indicator/hma.d.ts +2 -0
  71. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  72. package/dist/engine/renderers/Indicator/hma.js +18 -8
  73. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  74. package/dist/engine/renderers/Indicator/hv.d.ts +4 -1
  75. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  76. package/dist/engine/renderers/Indicator/hv.js +17 -8
  77. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  78. package/dist/engine/renderers/Indicator/ichimoku.d.ts +4 -1
  79. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  80. package/dist/engine/renderers/Indicator/ichimoku.js +26 -8
  81. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  82. package/dist/engine/renderers/Indicator/index.d.ts +27 -28
  83. package/dist/engine/renderers/Indicator/index.d.ts.map +1 -1
  84. package/dist/engine/renderers/Indicator/index.js +27 -28
  85. package/dist/engine/renderers/Indicator/index.js.map +1 -1
  86. package/dist/engine/renderers/Indicator/kama.d.ts +2 -0
  87. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  88. package/dist/engine/renderers/Indicator/kama.js +18 -8
  89. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  90. package/dist/engine/renderers/Indicator/keltner.d.ts +4 -1
  91. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  92. package/dist/engine/renderers/Indicator/keltner.js +19 -8
  93. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  94. package/dist/engine/renderers/Indicator/kst.d.ts +2 -1
  95. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  96. package/dist/engine/renderers/Indicator/kst.js +11 -10
  97. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  98. package/dist/engine/renderers/Indicator/ma.d.ts +4 -1
  99. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  100. package/dist/engine/renderers/Indicator/ma.js +32 -9
  101. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  102. package/dist/engine/renderers/Indicator/macd.d.ts +1 -1
  103. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  104. package/dist/engine/renderers/Indicator/macd.js +9 -10
  105. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  106. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  107. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +38 -136
  108. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  109. package/dist/engine/renderers/Indicator/mfi.d.ts +4 -1
  110. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  111. package/dist/engine/renderers/Indicator/mfi.js +15 -8
  112. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  113. package/dist/engine/renderers/Indicator/mom.d.ts +2 -1
  114. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  115. package/dist/engine/renderers/Indicator/mom.js +6 -10
  116. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  117. package/dist/engine/renderers/Indicator/obv.d.ts +4 -1
  118. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  119. package/dist/engine/renderers/Indicator/obv.js +14 -8
  120. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  121. package/dist/engine/renderers/Indicator/parkinson.d.ts +4 -1
  122. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  123. package/dist/engine/renderers/Indicator/parkinson.js +17 -8
  124. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  125. package/dist/engine/renderers/Indicator/pivot.d.ts +2 -0
  126. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  127. package/dist/engine/renderers/Indicator/pivot.js +42 -8
  128. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  129. package/dist/engine/renderers/Indicator/pvt.d.ts +4 -1
  130. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  131. package/dist/engine/renderers/Indicator/pvt.js +14 -8
  132. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  133. package/dist/engine/renderers/Indicator/roc.d.ts +4 -1
  134. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  135. package/dist/engine/renderers/Indicator/roc.js +15 -8
  136. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  137. package/dist/engine/renderers/Indicator/rsi.d.ts +2 -1
  138. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  139. package/dist/engine/renderers/Indicator/rsi.js +9 -10
  140. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  141. package/dist/engine/renderers/Indicator/sar.d.ts +4 -1
  142. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  143. package/dist/engine/renderers/Indicator/sar.js +17 -8
  144. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  145. package/dist/engine/renderers/Indicator/stoch.d.ts +2 -1
  146. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  147. package/dist/engine/renderers/Indicator/stoch.js +8 -10
  148. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  149. package/dist/engine/renderers/Indicator/structure.d.ts +4 -1
  150. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  151. package/dist/engine/renderers/Indicator/structure.js +20 -8
  152. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  153. package/dist/engine/renderers/Indicator/supertrend.d.ts +4 -1
  154. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  155. package/dist/engine/renderers/Indicator/supertrend.js +17 -8
  156. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  157. package/dist/engine/renderers/Indicator/tema.d.ts +2 -0
  158. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  159. package/dist/engine/renderers/Indicator/tema.js +18 -8
  160. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  161. package/dist/engine/renderers/Indicator/trix.d.ts +4 -1
  162. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  163. package/dist/engine/renderers/Indicator/trix.js +29 -8
  164. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  165. package/dist/engine/renderers/Indicator/vma.d.ts +4 -1
  166. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  167. package/dist/engine/renderers/Indicator/vma.js +15 -8
  168. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  169. package/dist/engine/renderers/Indicator/volumeProfile.d.ts +4 -1
  170. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  171. package/dist/engine/renderers/Indicator/volumeProfile.js +27 -8
  172. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  173. package/dist/engine/renderers/Indicator/vwap.d.ts +4 -1
  174. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  175. package/dist/engine/renderers/Indicator/vwap.js +14 -8
  176. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  177. package/dist/engine/renderers/Indicator/wma.d.ts +2 -0
  178. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  179. package/dist/engine/renderers/Indicator/wma.js +18 -8
  180. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  181. package/dist/engine/renderers/Indicator/wmsr.d.ts +2 -1
  182. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  183. package/dist/engine/renderers/Indicator/wmsr.js +6 -10
  184. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  185. package/dist/engine/renderers/Indicator/zones.d.ts +2 -0
  186. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  187. package/dist/engine/renderers/Indicator/zones.js +23 -8
  188. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  189. package/dist/engine/renderers/paneTitle.d.ts +4 -10
  190. package/dist/engine/renderers/paneTitle.d.ts.map +1 -1
  191. package/dist/engine/renderers/paneTitle.js +28 -6
  192. package/dist/engine/renderers/paneTitle.js.map +1 -1
  193. package/dist/engine/renderers/subVolume.js +0 -3
  194. package/dist/engine/renderers/subVolume.js.map +1 -1
  195. package/dist/version.d.ts +1 -1
  196. package/dist/version.js +1 -1
  197. package/package.json +4 -4
  198. package/src/controllers/__tests__/indicatorSelector.test.ts +4 -3
  199. package/src/controllers/createIndicatorSelectorController.ts +4 -6
  200. package/src/controllers/index.ts +0 -4
  201. package/src/engine/chart.ts +30 -22
  202. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +4 -5
  203. package/src/engine/indicators/indicatorDefinitionRegistry.ts +35 -2
  204. package/src/engine/indicators/indicatorMetadata.ts +39 -2
  205. package/src/engine/indicators/indicatorRuntime.ts +5 -4
  206. package/src/engine/indicators/scheduler.ts +32 -8
  207. package/src/engine/renderers/Indicator/atr.ts +8 -11
  208. package/src/engine/renderers/Indicator/boll.ts +31 -10
  209. package/src/engine/renderers/Indicator/cci.ts +9 -14
  210. package/src/engine/renderers/Indicator/chaikinVol.ts +24 -8
  211. package/src/engine/renderers/Indicator/cmf.ts +23 -8
  212. package/src/engine/renderers/Indicator/dema.ts +27 -9
  213. package/src/engine/renderers/Indicator/donchian.ts +27 -9
  214. package/src/engine/renderers/Indicator/ene.ts +31 -10
  215. package/src/engine/renderers/Indicator/expma.ts +30 -10
  216. package/src/engine/renderers/Indicator/fastk.ts +9 -14
  217. package/src/engine/renderers/Indicator/fib.ts +28 -9
  218. package/src/engine/renderers/Indicator/hma.ts +27 -9
  219. package/src/engine/renderers/Indicator/hv.ts +26 -8
  220. package/src/engine/renderers/Indicator/ichimoku.ts +30 -9
  221. package/src/engine/renderers/Indicator/index.ts +27 -28
  222. package/src/engine/renderers/Indicator/kama.ts +27 -9
  223. package/src/engine/renderers/Indicator/keltner.ts +27 -9
  224. package/src/engine/renderers/Indicator/kst.ts +14 -18
  225. package/src/engine/renderers/Indicator/ma.ts +43 -9
  226. package/src/engine/renderers/Indicator/macd.ts +27 -32
  227. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +43 -162
  228. package/src/engine/renderers/Indicator/mfi.ts +23 -8
  229. package/src/engine/renderers/Indicator/mom.ts +9 -14
  230. package/src/engine/renderers/Indicator/obv.ts +22 -8
  231. package/src/engine/renderers/Indicator/parkinson.ts +26 -8
  232. package/src/engine/renderers/Indicator/pivot.ts +46 -9
  233. package/src/engine/renderers/Indicator/pvt.ts +22 -8
  234. package/src/engine/renderers/Indicator/roc.ts +24 -8
  235. package/src/engine/renderers/Indicator/rsi.ts +12 -16
  236. package/src/engine/renderers/Indicator/sar.ts +25 -9
  237. package/src/engine/renderers/Indicator/stoch.ts +11 -15
  238. package/src/engine/renderers/Indicator/structure.ts +30 -8
  239. package/src/engine/renderers/Indicator/supertrend.ts +25 -9
  240. package/src/engine/renderers/Indicator/tema.ts +27 -9
  241. package/src/engine/renderers/Indicator/trix.ts +38 -8
  242. package/src/engine/renderers/Indicator/vma.ts +23 -8
  243. package/src/engine/renderers/Indicator/volumeProfile.ts +39 -8
  244. package/src/engine/renderers/Indicator/vwap.ts +22 -8
  245. package/src/engine/renderers/Indicator/wma.ts +27 -9
  246. package/src/engine/renderers/Indicator/wmsr.ts +9 -14
  247. package/src/engine/renderers/Indicator/zones.ts +28 -9
  248. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +142 -79
  249. package/src/engine/renderers/paneTitle.ts +43 -18
  250. package/src/engine/renderers/subVolume.ts +0 -2
  251. package/src/version.ts +1 -1
  252. package/dist/engine/renderers/Indicator/macdLegend.d.ts +0 -13
  253. package/dist/engine/renderers/Indicator/macdLegend.d.ts.map +0 -1
  254. package/dist/engine/renderers/Indicator/macdLegend.js +0 -116
  255. package/dist/engine/renderers/Indicator/macdLegend.js.map +0 -1
  256. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts +0 -16
  257. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts.map +0 -1
  258. package/dist/engine/renderers/Indicator/subPaneConfig.js +0 -194
  259. package/dist/engine/renderers/Indicator/subPaneConfig.js.map +0 -1
  260. package/src/engine/renderers/Indicator/macdLegend.ts +0 -141
  261. package/src/engine/renderers/Indicator/subPaneConfig.ts +0 -265
@@ -1,5 +1,6 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
+ import { resolveThemeColors } from '../../../tokens'
3
4
  import type { TRIXRenderState } from '../../indicators/trixState'
4
5
  import { createTRIXStateKey } from '../../indicators/trixState'
5
6
  import { EMPTY_TRIX_STATE } from '../../indicators/trixState'
@@ -8,6 +9,8 @@ import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
10
  import type { IndicatorScheduler, TRIXSchedulerConfig } from '../../indicators/scheduler'
10
11
  import { calcTRIXData } from '../../indicators/calculators'
12
+ import type { KLineData } from '../../../types/price'
13
+ import type { TitleInfo } from '../../indicators/indicatorMetadata'
11
14
 
12
15
  const TRIX_COLOR = '#e11d48'
13
16
  const SIGNAL_COLOR = '#f59e0b'
@@ -145,21 +148,48 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
145
148
  ctx.stroke()
146
149
  }
147
150
 
151
+ export function getTRIXTitleInfo(
152
+ _data: KLineData[],
153
+ index: number | null,
154
+ params: Record<string, number | boolean | string>,
155
+ pluginHost: PluginHost,
156
+ paneId: string,
157
+ ): TitleInfo | null {
158
+ if (index === null) return null
159
+ const period = (params.period as number) ?? 15
160
+ const signalPeriod = (params.signalPeriod as number) ?? 9
161
+ const state = pluginHost.getSharedState<TRIXRenderState>(createTRIXStateKey(paneId))
162
+ if (!state) return null
163
+
164
+ const values: Array<{ label: string; value: number; color: string }> = []
165
+
166
+ if (state.params.showTRIX) {
167
+ const v = state.series[index]
168
+ if (v !== undefined) values.push({ label: 'TRIX', value: v, color: TRIX_COLOR })
169
+ }
170
+ if (state.params.showSignal) {
171
+ const v = state.signalSeries[index]
172
+ if (v !== undefined) values.push({ label: 'Signal', value: v, color: SIGNAL_COLOR })
173
+ }
174
+
175
+ if (values.length === 0) return null
176
+
177
+ return {
178
+ name: 'TRIX',
179
+ params: [period, signalPeriod],
180
+ values,
181
+ }
182
+ }
183
+
148
184
  @Indicator({
149
185
  name: 'trix',
150
186
  displayName: 'TRIX',
151
187
  category: 'oscillator',
152
- stateKey: createTRIXStateKey,
153
188
  defaultPaneId: 'sub_TRIX',
154
189
  scale: { indicatorKey: 'trix', label: 'TRIX', decimals: 6 },
155
- updateConfig: (scheduler, params, paneId) => {
156
- (scheduler as IndicatorScheduler).updateIndicatorConfig('trix', params, paneId)
157
- },
158
190
  visibleState: { compose: createDualSparseVisibleStateComposer('trix', EMPTY_TRIX_STATE) },
159
- applyResult: (host, state, paneId) => {
160
- host.setSharedState(createTRIXStateKey(paneId), state as any, 'indicator_scheduler')
161
- },
162
- runtime: { configKey:'trix', defaultConfig:{period:15,signalPeriod:9,showTRIX:true,showSignal:true}, computeKey:'calcTRIXData', compute:(data,c)=>calcTRIXData(data,c.period,c.signalPeriod) },
191
+ getTitleInfo: getTRIXTitleInfo,
192
+ runtime: { defaultConfig:{period:15,signalPeriod:9,showTRIX:true,showSignal:true}, computeKey:'calcTRIXData', compute:(data,c)=>calcTRIXData(data,c.period,c.signalPeriod) },
163
193
  })
164
194
  class TRIXIndicatorDefinition {
165
195
  static rendererFactory = createTRIXRendererPlugin
@@ -3,6 +3,8 @@ import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { VMARenderState } from '../../indicators/vmaState'
4
4
  import { createVMAStateKey } from '../../indicators/vmaState'
5
5
  import { EMPTY_VMA_STATE } from '../../indicators/vmaState'
6
+ import type { TitleInfo } from '../../indicators/indicatorMetadata'
7
+ import type { KLineData } from '../../../types/price'
6
8
  import { createNonNegativeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
7
9
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
10
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
@@ -111,22 +113,35 @@ export function createVMARendererPlugin(options: { paneId?: string } = {}): Rend
111
113
  }
112
114
  }
113
115
 
116
+ export function getVMATitleInfo(
117
+ _data: KLineData[],
118
+ index: number | null,
119
+ params: Record<string, number | boolean | string>,
120
+ host: PluginHost,
121
+ paneId: string,
122
+ ): TitleInfo | null {
123
+ if (index === null) return null
124
+ const period = (params.period as number) ?? 5
125
+ const state = host.getSharedState<VMARenderState>(createVMAStateKey(paneId))
126
+ const value = state?.series[index]
127
+ if (value === undefined) return null
128
+
129
+ return {
130
+ name: 'VMA',
131
+ params: [period],
132
+ values: [{ label: 'VMA', value, color: VMA_COLOR }],
133
+ }
134
+ }
135
+
114
136
  @Indicator({
115
137
  name: 'vma',
116
138
  displayName: 'VMA',
117
139
  category: 'volume',
118
- stateKey: createVMAStateKey,
119
140
  defaultPaneId: 'sub_VMA',
120
141
  scale: { indicatorKey: 'vma', label: 'VMA', decimals: 0 },
121
- updateConfig: (scheduler, params, paneId) => {
122
- (scheduler as IndicatorScheduler).updateIndicatorConfig('vma', params, paneId)
123
- },
142
+ getTitleInfo: getVMATitleInfo,
124
143
  visibleState: { compose: createNonNegativeSparseVisibleStateComposer('vma', EMPTY_VMA_STATE) },
125
- applyResult: (host, state, paneId) => {
126
- host.setSharedState(createVMAStateKey(paneId), state as any, 'indicator_scheduler')
127
- },
128
144
  runtime: {
129
- configKey: 'vma',
130
145
  defaultConfig: { period: 5, showVMA: true },
131
146
  computeKey: 'calcVMAData',
132
147
  compute: (data, c) => calcVMAData(data, c.period),
@@ -7,6 +7,9 @@ import { createVolumeProfileVisibleStateComposer } from '../../indicators/visibl
7
7
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
8
  import type { IndicatorScheduler, VolumeProfileSchedulerConfig } from '../../indicators/scheduler'
9
9
  import { calcVolumeProfileData } from '../../indicators/calculators'
10
+ import type { TitleInfo } from '../../indicators/indicatorMetadata'
11
+ import type { KLineData } from '../../../types/price'
12
+ import { resolveThemeColors } from '../../../tokens'
10
13
 
11
14
  const BAR_FILL = 'rgba(99, 102, 241, 0.35)'
12
15
  const POC_COLOR = '#f59e0b'
@@ -111,21 +114,49 @@ export function createVolumeProfileRendererPlugin(options: { paneId?: string } =
111
114
  }
112
115
  }
113
116
 
117
+ const VP_POC_COLOR = '#8b5cf6'
118
+ const VP_VAH_COLOR = '#6366f1'
119
+ const VP_VAL_COLOR = '#818cf8'
120
+
121
+ export function getVolumeProfileTitleInfo(
122
+ _data: KLineData[],
123
+ index: number | null,
124
+ params: Record<string, number | boolean | string>,
125
+ host: PluginHost,
126
+ paneId: string,
127
+ ): TitleInfo | null {
128
+ if (index === null) return null
129
+ const bins = (params.bins as number) ?? 24
130
+ const state = host.getSharedState<VolumeProfileRenderState>(createVolumeProfileStateKey(paneId))
131
+ const vp = state?.series
132
+
133
+ const values: Array<{ label: string; value: number; color: string }> = []
134
+ if (vp && vp.bins.length > 0) {
135
+ if (state.params.showPOC) {
136
+ values.push({ label: 'POC', value: vp.poc, color: VP_POC_COLOR })
137
+ }
138
+ if (state.params.showValueArea) {
139
+ values.push({ label: 'VAH', value: vp.vah, color: VP_VAH_COLOR })
140
+ values.push({ label: 'VAL', value: vp.val, color: VP_VAL_COLOR })
141
+ }
142
+ }
143
+
144
+ return {
145
+ name: 'VP',
146
+ params: [bins],
147
+ values,
148
+ }
149
+ }
150
+
114
151
  @Indicator({
115
152
  name: 'volumeProfile',
116
153
  displayName: 'VP',
117
154
  category: 'volume',
118
- stateKey: createVolumeProfileStateKey,
119
155
  defaultPaneId: 'sub_VolumeProfile',
120
156
  scale: { indicatorKey: 'volumeProfile', label: 'VP', decimals: 0 },
157
+ getTitleInfo: getVolumeProfileTitleInfo,
121
158
  visibleState: { compose: createVolumeProfileVisibleStateComposer('volumeProfile', EMPTY_VOLUME_PROFILE_STATE) },
122
- updateConfig: (scheduler, params, paneId) => {
123
- (scheduler as IndicatorScheduler).updateIndicatorConfig('volumeProfile', params, paneId)
124
- },
125
- applyResult: (host, state, paneId) => {
126
- host.setSharedState(createVolumeProfileStateKey(paneId), state as any, 'indicator_scheduler')
127
- },
128
- runtime: { configKey:'volumeProfile', defaultConfig:{bins:24,lookback:100,valueAreaPercent:70,showPOC:true,showValueArea:true}, computeKey:'calcVolumeProfileData', compute:(data,c)=>calcVolumeProfileData(data,c.bins,c.lookback,c.valueAreaPercent) },
159
+ runtime: { defaultConfig:{bins:24,lookback:100,valueAreaPercent:70,showPOC:true,showValueArea:true}, computeKey:'calcVolumeProfileData', compute:(data,c)=>calcVolumeProfileData(data,c.bins,c.lookback,c.valueAreaPercent) },
129
160
  })
130
161
  class VolumeProfileIndicatorDefinition {
131
162
  static rendererFactory = createVolumeProfileRendererPlugin
@@ -7,6 +7,8 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
7
  import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
8
  import type { IndicatorScheduler, VWAPSchedulerConfig } from '../../indicators/scheduler'
9
9
  import { calcVWAPData } from '../../indicators/calculators'
10
+ import type { TitleInfo } from '../../indicators/indicatorMetadata'
11
+ import type { KLineData } from '../../../types/price'
10
12
 
11
13
  const VWAP_COLOR = '#ec4899'
12
14
 
@@ -109,22 +111,34 @@ export function createVWAPRendererPlugin(options: { paneId?: string } = {}): Ren
109
111
  }
110
112
  }
111
113
 
114
+ export function getVWAPTitleInfo(
115
+ _data: KLineData[],
116
+ index: number | null,
117
+ _params: Record<string, number | boolean | string>,
118
+ host: PluginHost,
119
+ paneId: string,
120
+ ): TitleInfo | null {
121
+ if (index === null) return null
122
+ const state = host.getSharedState<VWAPRenderState>(createVWAPStateKey(paneId))
123
+ const value = state?.series[index]
124
+ if (value === undefined) return null
125
+
126
+ return {
127
+ name: 'VWAP',
128
+ params: [],
129
+ values: [{ label: 'VWAP', value, color: VWAP_COLOR }],
130
+ }
131
+ }
132
+
112
133
  @Indicator({
113
134
  name: 'vwap',
114
135
  displayName: 'VWAP',
115
136
  category: 'volume',
116
- stateKey: createVWAPStateKey,
117
137
  defaultPaneId: 'sub_VWAP',
118
138
  visibleState: { compose: createSparseVisibleStateComposer('vwap', EMPTY_VWAP_STATE) },
119
139
  scale: { indicatorKey: 'vwap', label: 'VWAP', decimals: 2 },
120
- updateConfig: (scheduler, params, paneId) => {
121
- (scheduler as IndicatorScheduler).updateIndicatorConfig('vwap', params, paneId)
122
- },
123
- applyResult: (host, state, paneId) => {
124
- host.setSharedState(createVWAPStateKey(paneId), state as any, 'indicator_scheduler')
125
- },
140
+ getTitleInfo: getVWAPTitleInfo,
126
141
  runtime: {
127
- configKey: 'vwap',
128
142
  defaultConfig: { sessionResetGapMs: 0, showVWAP: true },
129
143
  computeKey: 'calcVWAPData',
130
144
  compute: (data, c) => calcVWAPData(data, c.sessionResetGapMs),
@@ -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 { WMARenderState } from '../../indicators/wmaState'
4
5
  import { createWMAStateKey, EMPTY_WMA_STATE } from '../../indicators/wmaState'
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, WMASchedulerConfig } from '../../indicators/scheduler'
9
10
  import { calcWMAData } from '../../indicators/calculators'
@@ -121,23 +122,40 @@ export function createWMARendererPlugin(options: WMARendererOptions = {}): Rende
121
122
  }
122
123
  }
123
124
 
125
+ export const getWMATitleInfo: 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 = createWMAStateKey(paneId)
135
+ const state = pluginHost?.getSharedState<WMARenderState>(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: 'WMA',
143
+ params: [state.params.period],
144
+ values: [{ label: 'WMA', value, color: '#10b981' }],
145
+ }
146
+ }
147
+
124
148
  @Indicator({
125
149
  name: 'wma',
126
150
  displayName: 'WMA',
151
+ getTitleInfo: getWMATitleInfo,
127
152
  category: 'main',
128
- stateKey: createWMAStateKey,
129
153
  defaultPaneId: 'main',
130
154
  allowMainPane: true,
131
155
  mainPane: { rendererName: 'wma_main', toActiveConfig: (params, active) => ({ ...params, showWMA: active }) },
132
156
  visibleState: { compose: createSparseVisibleStateComposer('wma', EMPTY_WMA_STATE) },
133
157
  scale: { indicatorKey: 'wma', label: 'WMA', decimals: 2 },
134
- updateConfig: (scheduler, params, paneId) => {
135
- (scheduler as IndicatorScheduler).updateIndicatorConfig('wma', params, paneId)
136
- },
137
- applyResult: (host, state, paneId) => {
138
- host.setSharedState(createWMAStateKey(paneId), state as any, 'indicator_scheduler')
139
- },
140
- runtime: { configKey:'wma', defaultConfig:{period:10,showWMA:true}, computeKey:'calcWMAData', compute:(data,c)=>calcWMAData(data,c.period) },
158
+ runtime: { defaultConfig:{period:10,showWMA:true}, computeKey:'calcWMAData', compute:(data,c)=>calcWMAData(data,c.period) },
141
159
  })
142
160
  class WMADefinition {
143
161
  static rendererFactory = createWMARendererPlugin
@@ -10,6 +10,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
10
10
  import type { IndicatorScheduler, WMSRSchedulerConfig } from '../../indicators/scheduler'
11
11
  import { createWmsrScaleRendererPlugin } from './scale/wmsr_scale'
12
12
  import { calcWMSRData } from '../../indicators/calculators'
13
+ import type { KLineData } from '../../../types/price'
13
14
 
14
15
  type LinePoint = { x: number; y: number }
15
16
 
@@ -293,14 +294,15 @@ function drawWMSRLineWithCanvas2D(
293
294
  * 获取 WMSR 标题信息(供 paneTitle 使用)
294
295
  */
295
296
  export function getWMSRTitleInfo(
296
- index: number,
297
- period: number,
297
+ _data: KLineData[],
298
+ index: number | null,
299
+ params: Record<string, number | boolean | string>,
298
300
  pluginHost: PluginHost,
299
- paneId: string = 'sub_WMSR',
300
- theme: 'light' | 'dark' = 'light',
301
- isAsiaMarket?: boolean
301
+ paneId: string,
302
302
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
303
- const colors = resolveThemeColors(theme, isAsiaMarket)
303
+ if (index === null) return null
304
+ const period = (params.period as number) ?? 14
305
+ const colors = resolveThemeColors('light')
304
306
  const state = pluginHost.getSharedState<WMSRRenderState>(createWMSRStateKey(paneId))
305
307
  if (!state) return null
306
308
 
@@ -320,18 +322,11 @@ export function getWMSRTitleInfo(
320
322
  name: 'wmsr',
321
323
  displayName: 'WMSR',
322
324
  category: 'oscillator',
323
- stateKey: createWMSRStateKey,
324
325
  defaultPaneId: 'sub_WMSR',
325
326
  visibleState: { compose: createFixedRangeSparseVisibleStateComposer('wmsr', EMPTY_WMSR_STATE) },
326
327
  scaleRendererFactory: createWmsrScaleRendererPlugin,
327
- updateConfig: (scheduler, params, paneId) => {
328
- (scheduler as IndicatorScheduler).updateIndicatorConfig('wmsr', params, paneId)
329
- },
330
- applyResult: (host, state, paneId) => {
331
- host.setSharedState(createWMSRStateKey(paneId), state as any, 'indicator_scheduler')
332
- },
328
+ getTitleInfo: getWMSRTitleInfo,
333
329
  runtime: {
334
- configKey: 'wmsr',
335
330
  defaultConfig: { period: 14, showWMSR: true },
336
331
  computeKey: 'calcWMSRData',
337
332
  compute: (data, c) => calcWMSRData(data, c.period),
@@ -5,7 +5,7 @@ import type { ZonesRenderState } from '../../indicators/zonesState'
5
5
  import { createZonesStateKey, EMPTY_ZONES_STATE } from '../../indicators/zonesState'
6
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
7
7
  import { createFixedUnitVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
- import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
+ import { resolveStateKey, type TitleInfo, type TitleValueItem, type GetTitleInfoFn } from '../../indicators/indicatorMetadata'
9
9
  import type { IndicatorScheduler, ZonesSchedulerConfig } from '../../indicators/scheduler'
10
10
  import { calcZonesData } from '../../indicators/calculators'
11
11
 
@@ -90,23 +90,42 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
90
90
  }
91
91
  }
92
92
 
93
+ export const getZonesTitleInfo: GetTitleInfoFn = (_data, index, _params, host, paneId) => {
94
+ if (index === null) return null
95
+
96
+ const stateKey = createZonesStateKey(paneId)
97
+ const state = host?.getSharedState<ZonesRenderState>(stateKey)
98
+ if (!state) return null
99
+
100
+ const activeZones = state.series.filter(
101
+ z => z.startIndex <= index && (z.endIndex === undefined || z.endIndex >= index)
102
+ )
103
+ if (activeZones.length === 0) return null
104
+
105
+ const values: TitleValueItem[] = activeZones.slice(0, 5).map(z => ({
106
+ label: z.kind,
107
+ value: z.high,
108
+ color: z.kind.includes('Bull') ? '#22c55e' : '#ef4444',
109
+ }))
110
+
111
+ return {
112
+ name: 'Zones',
113
+ params: [activeZones.length],
114
+ values,
115
+ }
116
+ }
117
+
93
118
  @Indicator({
94
119
  name: 'zones',
95
120
  displayName: 'Zones',
121
+ getTitleInfo: getZonesTitleInfo,
96
122
  category: 'main',
97
- stateKey: createZonesStateKey,
98
123
  defaultPaneId: 'main',
99
124
  allowMainPane: true,
100
125
  mainPane: { rendererName: 'zones_main', toActiveConfig: (params, active) => ({ ...params, showFVG: active, showOB: active, showFilledZones: active }) },
101
126
  scale: { indicatorKey: 'zones', label: 'Zones', decimals: 2 },
102
127
  visibleState: { compose: createFixedUnitVisibleStateComposer('zones', EMPTY_ZONES_STATE) },
103
- updateConfig: (scheduler, params, paneId) => {
104
- (scheduler as IndicatorScheduler).updateIndicatorConfig('zones', params, paneId)
105
- },
106
- applyResult: (host, state, paneId) => {
107
- host.setSharedState(createZonesStateKey(paneId), state as any, 'indicator_scheduler')
108
- },
109
- runtime: { configKey:'zones', defaultConfig:{showFVG:true,showOB:true,showFilledZones:true,obLookback:20}, computeKey:'calcZonesData', compute:(data,c)=>calcZonesData(data,c.obLookback,5,2,'close') },
128
+ runtime: { defaultConfig:{showFVG:true,showOB:true,showFilledZones:true,obLookback:20}, computeKey:'calcZonesData', compute:(data,c)=>calcZonesData(data,c.obLookback,5,2,'close') },
110
129
  })
111
130
  class ZonesDefinition {
112
131
  static rendererFactory = createZonesRendererPlugin