@363045841yyt/klinechart-core 0.7.9 → 0.7.10

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 (234) hide show
  1. package/dist/engine/chart.d.ts.map +1 -1
  2. package/dist/engine/chart.js +39 -229
  3. package/dist/engine/chart.js.map +1 -1
  4. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts +10 -3
  5. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  6. package/dist/engine/indicators/indicatorDefinitionRegistry.js +29 -2
  7. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  8. package/dist/engine/indicators/indicatorMetadata.d.ts +79 -2
  9. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  10. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  11. package/dist/engine/indicators/indicatorRegistry.d.ts +5 -0
  12. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  13. package/dist/engine/indicators/indicatorRegistry.js +49 -5
  14. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  15. package/dist/engine/indicators/registerBuiltins.d.ts +42 -0
  16. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -0
  17. package/dist/engine/indicators/registerBuiltins.js +46 -0
  18. package/dist/engine/indicators/registerBuiltins.js.map +1 -0
  19. package/dist/engine/indicators/scheduler.d.ts +2 -2
  20. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  21. package/dist/engine/indicators/scheduler.js +41 -11
  22. package/dist/engine/indicators/scheduler.js.map +1 -1
  23. package/dist/engine/indicators/stateComposer.d.ts +6 -4
  24. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  25. package/dist/engine/indicators/stateComposer.js +80 -984
  26. package/dist/engine/indicators/stateComposer.js.map +1 -1
  27. package/dist/engine/indicators/visibleStateComposers.d.ts +145 -0
  28. package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -0
  29. package/dist/engine/indicators/visibleStateComposers.js +469 -0
  30. package/dist/engine/indicators/visibleStateComposers.js.map +1 -0
  31. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  32. package/dist/engine/renderers/Indicator/atr.js +8 -0
  33. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  34. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  35. package/dist/engine/renderers/Indicator/boll.js +47 -0
  36. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  37. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  38. package/dist/engine/renderers/Indicator/cci.js +8 -1
  39. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  40. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  41. package/dist/engine/renderers/Indicator/chaikinVol.js +7 -1
  42. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  43. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  44. package/dist/engine/renderers/Indicator/cmf.js +7 -1
  45. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  46. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  47. package/dist/engine/renderers/Indicator/dema.js +8 -1
  48. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  49. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  50. package/dist/engine/renderers/Indicator/donchian.js +8 -1
  51. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  52. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  53. package/dist/engine/renderers/Indicator/ene.js +45 -0
  54. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  55. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  56. package/dist/engine/renderers/Indicator/expma.js +45 -0
  57. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  58. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  59. package/dist/engine/renderers/Indicator/fastk.js +8 -1
  60. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  61. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  62. package/dist/engine/renderers/Indicator/fib.js +8 -1
  63. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  64. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  65. package/dist/engine/renderers/Indicator/hma.js +8 -1
  66. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  67. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  68. package/dist/engine/renderers/Indicator/hv.js +7 -0
  69. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  70. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  71. package/dist/engine/renderers/Indicator/ichimoku.js +8 -1
  72. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  73. package/dist/engine/renderers/Indicator/index.d.ts +7 -2
  74. package/dist/engine/renderers/Indicator/index.d.ts.map +1 -1
  75. package/dist/engine/renderers/Indicator/index.js +2 -114
  76. package/dist/engine/renderers/Indicator/index.js.map +1 -1
  77. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  78. package/dist/engine/renderers/Indicator/kama.js +8 -1
  79. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  80. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  81. package/dist/engine/renderers/Indicator/keltner.js +8 -1
  82. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  83. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  84. package/dist/engine/renderers/Indicator/kst.js +8 -0
  85. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  86. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  87. package/dist/engine/renderers/Indicator/ma.js +63 -0
  88. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  89. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  90. package/dist/engine/renderers/Indicator/macd.js +8 -1
  91. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  92. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  93. package/dist/engine/renderers/Indicator/mfi.js +7 -1
  94. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  95. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  96. package/dist/engine/renderers/Indicator/mom.js +8 -0
  97. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  98. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  99. package/dist/engine/renderers/Indicator/obv.js +7 -1
  100. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  101. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  102. package/dist/engine/renderers/Indicator/parkinson.js +7 -0
  103. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  104. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  105. package/dist/engine/renderers/Indicator/pivot.js +8 -1
  106. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  107. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  108. package/dist/engine/renderers/Indicator/pvt.js +7 -1
  109. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  110. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  111. package/dist/engine/renderers/Indicator/roc.js +7 -1
  112. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  113. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  114. package/dist/engine/renderers/Indicator/rsi.js +8 -1
  115. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  116. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  117. package/dist/engine/renderers/Indicator/sar.js +8 -1
  118. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  119. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  120. package/dist/engine/renderers/Indicator/stoch.js +8 -1
  121. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  122. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  123. package/dist/engine/renderers/Indicator/structure.js +8 -1
  124. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  125. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts +1 -1
  126. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts.map +1 -1
  127. package/dist/engine/renderers/Indicator/subPaneConfig.js.map +1 -1
  128. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  129. package/dist/engine/renderers/Indicator/supertrend.js +8 -1
  130. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  131. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  132. package/dist/engine/renderers/Indicator/tema.js +8 -1
  133. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  134. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  135. package/dist/engine/renderers/Indicator/trix.js +7 -0
  136. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  137. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  138. package/dist/engine/renderers/Indicator/vma.js +7 -0
  139. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  140. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  141. package/dist/engine/renderers/Indicator/volumeProfile.js +7 -1
  142. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  143. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  144. package/dist/engine/renderers/Indicator/vwap.js +7 -1
  145. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  146. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  147. package/dist/engine/renderers/Indicator/wma.js +8 -1
  148. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  149. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  150. package/dist/engine/renderers/Indicator/wmsr.js +8 -1
  151. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  152. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  153. package/dist/engine/renderers/Indicator/zones.js +8 -1
  154. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  155. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  156. package/dist/engine/renderers/extremaMarkers.js +0 -22
  157. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  158. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  159. package/dist/engine/renderers/subVolume.js +3 -0
  160. package/dist/engine/renderers/subVolume.js.map +1 -1
  161. package/dist/engine/subPaneManager.d.ts +1 -0
  162. package/dist/engine/subPaneManager.d.ts.map +1 -1
  163. package/dist/engine/subPaneManager.js +30 -237
  164. package/dist/engine/subPaneManager.js.map +1 -1
  165. package/dist/semantic/controller.d.ts +9 -4
  166. package/dist/semantic/controller.d.ts.map +1 -1
  167. package/dist/semantic/controller.js +57 -53
  168. package/dist/semantic/controller.js.map +1 -1
  169. package/dist/version.d.ts +1 -1
  170. package/dist/version.d.ts.map +1 -1
  171. package/dist/version.js +1 -1
  172. package/dist/version.js.map +1 -1
  173. package/package.json +1 -1
  174. package/src/engine/chart.ts +49 -229
  175. package/src/engine/indicators/__tests__/indicatorDefinitionRegistry.test.ts +59 -0
  176. package/src/engine/indicators/__tests__/indicatorRegistry.test.ts +62 -0
  177. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +380 -0
  178. package/src/engine/indicators/__tests__/scheduler.test.ts +62 -32
  179. package/src/engine/indicators/__tests__/stateComposer.test.ts +444 -0
  180. package/src/engine/indicators/indicatorDefinitionRegistry.ts +49 -4
  181. package/src/engine/indicators/indicatorMetadata.ts +107 -2
  182. package/src/engine/indicators/indicatorRegistry.ts +54 -5
  183. package/src/engine/indicators/registerBuiltins.ts +47 -0
  184. package/src/engine/indicators/scheduler.ts +61 -13
  185. package/src/engine/indicators/stateComposer.ts +110 -1040
  186. package/src/engine/indicators/visibleStateComposers.ts +734 -0
  187. package/src/engine/renderers/Indicator/__tests__/createSubIndicatorRenderer.test.ts +61 -0
  188. package/src/engine/renderers/Indicator/atr.ts +9 -1
  189. package/src/engine/renderers/Indicator/boll.ts +53 -1
  190. package/src/engine/renderers/Indicator/cci.ts +9 -2
  191. package/src/engine/renderers/Indicator/chaikinVol.ts +8 -2
  192. package/src/engine/renderers/Indicator/cmf.ts +8 -2
  193. package/src/engine/renderers/Indicator/dema.ts +9 -2
  194. package/src/engine/renderers/Indicator/donchian.ts +9 -2
  195. package/src/engine/renderers/Indicator/ene.ts +51 -1
  196. package/src/engine/renderers/Indicator/expma.ts +51 -1
  197. package/src/engine/renderers/Indicator/fastk.ts +9 -2
  198. package/src/engine/renderers/Indicator/fib.ts +9 -2
  199. package/src/engine/renderers/Indicator/hma.ts +9 -2
  200. package/src/engine/renderers/Indicator/hv.ts +8 -1
  201. package/src/engine/renderers/Indicator/ichimoku.ts +9 -2
  202. package/src/engine/renderers/Indicator/index.ts +9 -121
  203. package/src/engine/renderers/Indicator/kama.ts +9 -2
  204. package/src/engine/renderers/Indicator/keltner.ts +9 -2
  205. package/src/engine/renderers/Indicator/kst.ts +9 -1
  206. package/src/engine/renderers/Indicator/ma.ts +69 -0
  207. package/src/engine/renderers/Indicator/macd.ts +9 -2
  208. package/src/engine/renderers/Indicator/mfi.ts +8 -2
  209. package/src/engine/renderers/Indicator/mom.ts +9 -1
  210. package/src/engine/renderers/Indicator/obv.ts +8 -2
  211. package/src/engine/renderers/Indicator/parkinson.ts +8 -1
  212. package/src/engine/renderers/Indicator/pivot.ts +9 -2
  213. package/src/engine/renderers/Indicator/pvt.ts +8 -2
  214. package/src/engine/renderers/Indicator/roc.ts +8 -2
  215. package/src/engine/renderers/Indicator/rsi.ts +9 -2
  216. package/src/engine/renderers/Indicator/sar.ts +9 -2
  217. package/src/engine/renderers/Indicator/stoch.ts +9 -2
  218. package/src/engine/renderers/Indicator/structure.ts +9 -2
  219. package/src/engine/renderers/Indicator/subPaneConfig.ts +1 -1
  220. package/src/engine/renderers/Indicator/supertrend.ts +9 -2
  221. package/src/engine/renderers/Indicator/tema.ts +9 -2
  222. package/src/engine/renderers/Indicator/trix.ts +8 -1
  223. package/src/engine/renderers/Indicator/vma.ts +8 -1
  224. package/src/engine/renderers/Indicator/volumeProfile.ts +8 -2
  225. package/src/engine/renderers/Indicator/vwap.ts +8 -2
  226. package/src/engine/renderers/Indicator/wma.ts +9 -2
  227. package/src/engine/renderers/Indicator/wmsr.ts +9 -2
  228. package/src/engine/renderers/Indicator/zones.ts +9 -2
  229. package/src/engine/renderers/extremaMarkers.ts +0 -24
  230. package/src/engine/renderers/subVolume.ts +3 -0
  231. package/src/engine/subPaneManager.ts +34 -274
  232. package/src/semantic/__tests__/controller.test.ts +84 -0
  233. package/src/semantic/controller.ts +69 -65
  234. package/src/version.ts +1 -1
@@ -2,10 +2,11 @@ import { resolveThemeColors } from '../../../tokens'
2
2
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
3
3
  import { RENDERER_PRIORITY } from '../../../plugin'
4
4
  import type { StructureRenderState } from '../../indicators/structureState'
5
- import { createStructureStateKey } from '../../indicators/structureState'
5
+ import { createStructureStateKey, EMPTY_STRUCTURE_STATE } from '../../indicators/structureState'
6
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
7
+ import { createFixedUnitVisibleStateComposer } from '../../indicators/visibleStateComposers'
7
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
- import type { IndicatorScheduler } from '../../indicators/scheduler'
9
+ import type { IndicatorScheduler, StructureSchedulerConfig } from '../../indicators/scheduler'
9
10
 
10
11
  const LABEL_FONT = '11px sans-serif'
11
12
 
@@ -117,6 +118,12 @@ export function createStructureRendererPlugin(options: { paneId?: string } = {})
117
118
  defaultPaneId: 'sub_Structure',
118
119
  paneIdField: 'structurePaneId',
119
120
  allowMainPane: true,
121
+ mainPane: { rendererName: 'structure_main', toActiveConfig: (params, active) => ({ ...params, showSwingLabels: active, showBOS: active, showCHOCH: active }) },
122
+ scale: { indicatorKey: 'structure', label: 'Structure', decimals: 2 },
123
+ visibleState: { compose: createFixedUnitVisibleStateComposer('structure', EMPTY_STRUCTURE_STATE) },
124
+ updateConfig: (scheduler, params, paneId) => {
125
+ (scheduler as IndicatorScheduler).updateStructureConfig(params as Partial<StructureSchedulerConfig>, paneId)
126
+ },
120
127
  applyResult: (host, state, paneId) => {
121
128
  host.setSharedState(createStructureStateKey(paneId), state as any, 'indicator_scheduler')
122
129
  },
@@ -31,7 +31,7 @@ export interface SubPaneIndicatorConfig {
31
31
  ) => TitleInfo | null
32
32
  }
33
33
 
34
- export const SUB_PANE_INDICATOR_CONFIGS: Record<SubIndicatorType, SubPaneIndicatorConfig> = {
34
+ export const SUB_PANE_INDICATOR_CONFIGS: Record<string, SubPaneIndicatorConfig> = {
35
35
  VOLUME: {
36
36
  defaultParams: {},
37
37
  getTitleInfo: () => ({ name: 'VOL', params: [], values: [] }),
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { SuperTrendRenderState } from '../../indicators/supertrendState'
4
- import { createSuperTrendStateKey } from '../../indicators/supertrendState'
4
+ import { createSuperTrendStateKey, EMPTY_SUPERTREND_STATE } from '../../indicators/supertrendState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
6
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
7
+ import type { IndicatorScheduler, SuperTrendSchedulerConfig } from '../../indicators/scheduler'
8
+ import { createValuePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
 
9
10
  const ST_UP_COLOR = '#22c55e'
10
11
  const ST_DOWN_COLOR = '#ef4444'
@@ -106,6 +107,12 @@ export function createSuperTrendRendererPlugin(options: SuperTrendRendererOption
106
107
  defaultPaneId: 'sub_SuperTrend',
107
108
  paneIdField: 'supertrendPaneId',
108
109
  allowMainPane: true,
110
+ mainPane: { rendererName: 'supertrend_main', toActiveConfig: (params, active) => ({ ...params, showSuperTrend: active }) },
111
+ scale: { indicatorKey: 'supertrend', label: 'SuperTrend', decimals: 2 },
112
+ visibleState: { compose: createValuePointVisibleStateComposer('supertrend', EMPTY_SUPERTREND_STATE, ['value']) },
113
+ updateConfig: (scheduler, params, paneId) => {
114
+ (scheduler as IndicatorScheduler).updateSuperTrendConfig(params as Partial<SuperTrendSchedulerConfig>, paneId)
115
+ },
109
116
  applyResult: (host, state, paneId) => {
110
117
  host.setSharedState(createSuperTrendStateKey(paneId), state as any, 'indicator_scheduler')
111
118
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { TEMARenderState } from '../../indicators/temaState'
4
- import { createTEMAStateKey } from '../../indicators/temaState'
4
+ import { createTEMAStateKey, EMPTY_TEMA_STATE } from '../../indicators/temaState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
6
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
7
+ import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
+ import type { IndicatorScheduler, TEMASchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const TEMA_COLOR = '#d946ef'
10
11
 
@@ -127,6 +128,12 @@ export function createTEMARendererPlugin(options: TEMARendererOptions = {}): Ren
127
128
  defaultPaneId: 'main',
128
129
  paneIdField: 'temaPaneId',
129
130
  allowMainPane: true,
131
+ mainPane: { rendererName: 'tema_main', toActiveConfig: (params, active) => ({ ...params, showTEMA: active }) },
132
+ visibleState: { compose: createSparseVisibleStateComposer('tema', EMPTY_TEMA_STATE) },
133
+ scale: { indicatorKey: 'tema', label: 'TEMA', decimals: 2 },
134
+ updateConfig: (scheduler, params, paneId) => {
135
+ (scheduler as IndicatorScheduler).updateTEMAConfig(params as Partial<TEMASchedulerConfig>, paneId)
136
+ },
130
137
  applyResult: (host, state, paneId) => {
131
138
  host.setSharedState(createTEMAStateKey(paneId), state as any, 'indicator_scheduler')
132
139
  },
@@ -2,9 +2,11 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { TRIXRenderState } from '../../indicators/trixState'
4
4
  import { createTRIXStateKey } from '../../indicators/trixState'
5
+ import { EMPTY_TRIX_STATE } from '../../indicators/trixState'
6
+ import { createDualSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
5
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
9
+ import type { IndicatorScheduler, TRIXSchedulerConfig } from '../../indicators/scheduler'
8
10
 
9
11
  const TRIX_COLOR = '#e11d48'
10
12
  const SIGNAL_COLOR = '#f59e0b'
@@ -149,6 +151,11 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
149
151
  stateKey: createTRIXStateKey,
150
152
  defaultPaneId: 'sub_TRIX',
151
153
  paneIdField: 'trixPaneId',
154
+ scale: { indicatorKey: 'trix', label: 'TRIX', decimals: 6 },
155
+ updateConfig: (scheduler, params, paneId) => {
156
+ (scheduler as IndicatorScheduler).updateTRIXConfig(params as Partial<TRIXSchedulerConfig>, paneId)
157
+ },
158
+ visibleState: { compose: createDualSparseVisibleStateComposer('trix', EMPTY_TRIX_STATE) },
152
159
  applyResult: (host, state, paneId) => {
153
160
  host.setSharedState(createTRIXStateKey(paneId), state as any, 'indicator_scheduler')
154
161
  },
@@ -2,9 +2,11 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { VMARenderState } from '../../indicators/vmaState'
4
4
  import { createVMAStateKey } from '../../indicators/vmaState'
5
+ import { EMPTY_VMA_STATE } from '../../indicators/vmaState'
6
+ import { createNonNegativeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
5
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
9
+ import type { IndicatorScheduler, VMASchedulerConfig } from '../../indicators/scheduler'
8
10
 
9
11
  const VMA_COLOR = '#0ea5e9'
10
12
 
@@ -115,6 +117,11 @@ export function createVMARendererPlugin(options: { paneId?: string } = {}): Rend
115
117
  stateKey: createVMAStateKey,
116
118
  defaultPaneId: 'sub_VMA',
117
119
  paneIdField: 'vmaPaneId',
120
+ scale: { indicatorKey: 'vma', label: 'VMA', decimals: 0 },
121
+ updateConfig: (scheduler, params, paneId) => {
122
+ (scheduler as IndicatorScheduler).updateVMAConfig(params as Partial<VMASchedulerConfig>, paneId)
123
+ },
124
+ visibleState: { compose: createNonNegativeSparseVisibleStateComposer('vma', EMPTY_VMA_STATE) },
118
125
  applyResult: (host, state, paneId) => {
119
126
  host.setSharedState(createVMAStateKey(paneId), state as any, 'indicator_scheduler')
120
127
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { VolumeProfileRenderState } from '../../indicators/volumeProfileState'
4
- import { createVolumeProfileStateKey } from '../../indicators/volumeProfileState'
4
+ import { createVolumeProfileStateKey, EMPTY_VOLUME_PROFILE_STATE } from '../../indicators/volumeProfileState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
+ import { createVolumeProfileVisibleStateComposer } from '../../indicators/visibleStateComposers'
6
7
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
8
+ import type { IndicatorScheduler, VolumeProfileSchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const BAR_FILL = 'rgba(99, 102, 241, 0.35)'
10
11
  const POC_COLOR = '#f59e0b'
@@ -116,6 +117,11 @@ export function createVolumeProfileRendererPlugin(options: { paneId?: string } =
116
117
  stateKey: createVolumeProfileStateKey,
117
118
  defaultPaneId: 'sub_VolumeProfile',
118
119
  paneIdField: 'volumeProfilePaneId',
120
+ scale: { indicatorKey: 'volumeProfile', label: 'VP', decimals: 0 },
121
+ visibleState: { compose: createVolumeProfileVisibleStateComposer('volumeProfile', EMPTY_VOLUME_PROFILE_STATE) },
122
+ updateConfig: (scheduler, params, paneId) => {
123
+ (scheduler as IndicatorScheduler).updateVolumeProfileConfig(params as Partial<VolumeProfileSchedulerConfig>, paneId)
124
+ },
119
125
  applyResult: (host, state, paneId) => {
120
126
  host.setSharedState(createVolumeProfileStateKey(paneId), state as any, 'indicator_scheduler')
121
127
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { VWAPRenderState } from '../../indicators/vwapState'
4
- import { createVWAPStateKey } from '../../indicators/vwapState'
4
+ import { createVWAPStateKey, EMPTY_VWAP_STATE } from '../../indicators/vwapState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
6
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
7
+ import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
+ import type { IndicatorScheduler, VWAPSchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const VWAP_COLOR = '#ec4899'
10
11
 
@@ -114,6 +115,11 @@ export function createVWAPRendererPlugin(options: { paneId?: string } = {}): Ren
114
115
  stateKey: createVWAPStateKey,
115
116
  defaultPaneId: 'sub_VWAP',
116
117
  paneIdField: 'vwapPaneId',
118
+ visibleState: { compose: createSparseVisibleStateComposer('vwap', EMPTY_VWAP_STATE) },
119
+ scale: { indicatorKey: 'vwap', label: 'VWAP', decimals: 2 },
120
+ updateConfig: (scheduler, params, paneId) => {
121
+ (scheduler as IndicatorScheduler).updateVWAPConfig(params as Partial<VWAPSchedulerConfig>, paneId)
122
+ },
117
123
  applyResult: (host, state, paneId) => {
118
124
  host.setSharedState(createVWAPStateKey(paneId), state as any, 'indicator_scheduler')
119
125
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { WMARenderState } from '../../indicators/wmaState'
4
- import { createWMAStateKey } from '../../indicators/wmaState'
4
+ import { createWMAStateKey, EMPTY_WMA_STATE } from '../../indicators/wmaState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
6
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
7
+ import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
+ import type { IndicatorScheduler, WMASchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const WMA_COLOR = '#10b981'
10
11
 
@@ -127,6 +128,12 @@ export function createWMARendererPlugin(options: WMARendererOptions = {}): Rende
127
128
  defaultPaneId: 'main',
128
129
  paneIdField: 'wmaPaneId',
129
130
  allowMainPane: true,
131
+ mainPane: { rendererName: 'wma_main', toActiveConfig: (params, active) => ({ ...params, showWMA: active }) },
132
+ visibleState: { compose: createSparseVisibleStateComposer('wma', EMPTY_WMA_STATE) },
133
+ scale: { indicatorKey: 'wma', label: 'WMA', decimals: 2 },
134
+ updateConfig: (scheduler, params, paneId) => {
135
+ (scheduler as IndicatorScheduler).updateWMAConfig(params as Partial<WMASchedulerConfig>, paneId)
136
+ },
130
137
  applyResult: (host, state, paneId) => {
131
138
  host.setSharedState(createWMAStateKey(paneId), state as any, 'indicator_scheduler')
132
139
  },
@@ -3,10 +3,12 @@ import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import { resolveThemeColors } from '../../../tokens'
4
4
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
5
5
  import type { WMSRRenderState } from '../../indicators/wmsrState'
6
- import { createWMSRStateKey } from '../../indicators/wmsrState'
6
+ import { createWMSRStateKey, EMPTY_WMSR_STATE } from '../../indicators/wmsrState'
7
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
+ import { createFixedRangeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
- import type { IndicatorScheduler } from '../../indicators/scheduler'
10
+ import type { IndicatorScheduler, WMSRSchedulerConfig } from '../../indicators/scheduler'
11
+ import { createWmsrScaleRendererPlugin } from './scale/wmsr_scale'
10
12
 
11
13
  type LinePoint = { x: number; y: number }
12
14
 
@@ -320,6 +322,11 @@ export function getWMSRTitleInfo(
320
322
  stateKey: createWMSRStateKey,
321
323
  defaultPaneId: 'sub_WMSR',
322
324
  paneIdField: 'wmsrPaneId',
325
+ visibleState: { compose: createFixedRangeSparseVisibleStateComposer('wmsr', EMPTY_WMSR_STATE) },
326
+ scaleRendererFactory: createWmsrScaleRendererPlugin,
327
+ updateConfig: (scheduler, params, paneId) => {
328
+ (scheduler as IndicatorScheduler).updateWMSRConfig(params as Partial<WMSRSchedulerConfig>, paneId)
329
+ },
323
330
  applyResult: (host, state, paneId) => {
324
331
  host.setSharedState(createWMSRStateKey(paneId), state as any, 'indicator_scheduler')
325
332
  },
@@ -2,10 +2,11 @@ import { resolveThemeColors } from '../../../tokens'
2
2
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
3
3
  import { RENDERER_PRIORITY } from '../../../plugin'
4
4
  import type { ZonesRenderState } from '../../indicators/zonesState'
5
- import { createZonesStateKey } from '../../indicators/zonesState'
5
+ import { createZonesStateKey, EMPTY_ZONES_STATE } from '../../indicators/zonesState'
6
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
7
+ import { createFixedUnitVisibleStateComposer } from '../../indicators/visibleStateComposers'
7
8
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
- import type { IndicatorScheduler } from '../../indicators/scheduler'
9
+ import type { IndicatorScheduler, ZonesSchedulerConfig } from '../../indicators/scheduler'
9
10
 
10
11
  function getZonesStateKey(host: PluginHost | null, paneId: string): string | null {
11
12
  const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
@@ -96,6 +97,12 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
96
97
  defaultPaneId: 'main',
97
98
  paneIdField: 'zonesPaneId',
98
99
  allowMainPane: true,
100
+ mainPane: { rendererName: 'zones_main', toActiveConfig: (params, active) => ({ ...params, showFVG: active, showOB: active, showFilledZones: active }) },
101
+ scale: { indicatorKey: 'zones', label: 'Zones', decimals: 2 },
102
+ visibleState: { compose: createFixedUnitVisibleStateComposer('zones', EMPTY_ZONES_STATE) },
103
+ updateConfig: (scheduler, params, paneId) => {
104
+ (scheduler as IndicatorScheduler).updateZonesConfig(params as Partial<ZonesSchedulerConfig>, paneId)
105
+ },
99
106
  applyResult: (host, state, paneId) => {
100
107
  host.setSharedState(createZonesStateKey(paneId), state as any, 'indicator_scheduler')
101
108
  },
@@ -144,30 +144,6 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
144
144
  return kLineCenters[localIdx]!
145
145
  }
146
146
 
147
- if (!context.yAxisLabels) context.yAxisLabels = []
148
-
149
- context.yAxisLabels.push({
150
- dataIndex: maxIndex,
151
- price: max,
152
- y: pane.yAxis.priceToY(max),
153
- style: {
154
- bgColor: colors.lastPriceLabel.bg,
155
- borderColor: colors.price.lastPrice,
156
- textColor: colors.price.lastPrice,
157
- }
158
- })
159
-
160
- context.yAxisLabels.push({
161
- dataIndex: minIndex,
162
- price: min,
163
- y: pane.yAxis.priceToY(min),
164
- style: {
165
- bgColor: colors.lastPriceLabel.bg,
166
- borderColor: colors.price.lastPrice,
167
- textColor: colors.price.lastPrice,
168
- }
169
- })
170
-
171
147
  // 收集所有 marker 数据
172
148
  const markers: MarkerData[] = []
173
149
 
@@ -6,6 +6,7 @@ import { resolveThemeColors } from '../../tokens'
6
6
  import { Indicator } from '../indicators/indicatorDefinitionRegistry'
7
7
  import { resolveStateKey } from '../indicators/indicatorMetadata'
8
8
  import type { IndicatorScheduler } from '../indicators/scheduler'
9
+ import { createVolumeScaleRendererPlugin } from './Indicator/scale/volume_scale'
9
10
 
10
11
  export interface VolumeRendererOptions {
11
12
  /** 目标 pane ID(默认 'sub') */
@@ -233,6 +234,8 @@ function judgeColor(dayData: KLineData, upColor: string, downColor: string, neut
233
234
  category: 'volume',
234
235
  stateKey: (paneId: string) => createIndicatorStateKey('volume', paneId),
235
236
  defaultPaneId: 'sub',
237
+ scaleRendererFactory: createVolumeScaleRendererPlugin,
238
+ updateConfig: () => {},
236
239
  })
237
240
  class VolumeIndicatorDefinition {
238
241
  static rendererFactory = createVolumeRendererPlugin