@363045841yyt/klinechart-core 0.7.9 → 0.7.11

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
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import type { RendererPlugin } from '../../../plugin'
6
- import { createVolumeRendererPlugin } from '../subVolume'
6
+ import type { IndicatorMetadata } from '../../indicators/indicatorMetadata'
7
7
 
8
8
  // MA 均线
9
9
  export { createMARendererPlugin, type MAFlags } from './ma'
@@ -104,138 +104,26 @@ export { createVolumeProfileRendererPlugin } from './volumeProfile'
104
104
  /**
105
105
  * 副图指标类型
106
106
  */
107
- export type SubIndicatorType = 'VOLUME' | 'MACD' | 'RSI' | 'CCI' | 'STOCH' | 'MOM' | 'WMSR' | 'KST' | 'FASTK' | 'ATR'
108
- | 'WMA' | 'DEMA' | 'TEMA' | 'HMA' | 'KAMA' | 'SAR' | 'SUPERTREND' | 'KELTNER' | 'DONCHIAN' | 'ICHIMOKU'
109
- | 'ROC' | 'TRIX' | 'HV' | 'PARKINSON' | 'CHAIKIN_VOL' | 'VMA' | 'OBV' | 'PVT' | 'VWAP'
110
- | 'CMF' | 'MFI' | 'PIVOT' | 'FIB' | 'STRUCTURE' | 'ZONES' | 'VOLUME_PROFILE'
107
+ export type SubIndicatorType = string
111
108
 
112
109
  /**
113
110
  * 渲染器工厂选项
114
111
  */
115
112
  export interface IndicatorRendererOptions {
116
113
  /** 指标类型 */
117
- indicatorId: SubIndicatorType
114
+ indicatorId: string
118
115
  /** 目标 pane ID */
119
116
  paneId: string
117
+ /** 指标元数据 */
118
+ definition: IndicatorMetadata
119
+ /** 初始配置 */
120
+ params?: Record<string, unknown>
120
121
  }
121
122
 
122
- // 导入各个创建函数用于工厂函数
123
- import { createMACDRendererPlugin } from './macd'
124
- import { createRSIRendererPlugin } from './rsi'
125
- import { createCCIRendererPlugin } from './cci'
126
- import { createSTOCHRendererPlugin } from './stoch'
127
- import { createMOMRendererPlugin } from './mom'
128
- import { createWMSRRendererPlugin } from './wmsr'
129
- import { createKSTRendererPlugin } from './kst'
130
- import { createFASTKRendererPlugin } from './fastk'
131
- import { createATRRendererPlugin } from './atr'
132
- import { createWMARendererPlugin } from './wma'
133
- import { createDEMARendererPlugin } from './dema'
134
- import { createTEMARendererPlugin } from './tema'
135
- import { createHMARendererPlugin } from './hma'
136
- import { createKAMARendererPlugin } from './kama'
137
- import { createSARRendererPlugin } from './sar'
138
- import { createSuperTrendRendererPlugin } from './supertrend'
139
- import { createKeltnerRendererPlugin } from './keltner'
140
- import { createDonchianRendererPlugin } from './donchian'
141
- import { createIchimokuRendererPlugin } from './ichimoku'
142
- import { createROCRendererPlugin } from './roc'
143
- import { createTRIXRendererPlugin } from './trix'
144
- import { createHVRendererPlugin } from './hv'
145
- import { createParkinsonRendererPlugin } from './parkinson'
146
- import { createChaikinVolRendererPlugin } from './chaikinVol'
147
- import { createVMARendererPlugin } from './vma'
148
- import { createOBVRendererPlugin } from './obv'
149
- import { createPVTRendererPlugin } from './pvt'
150
- import { createVWAPRendererPlugin } from './vwap'
151
- import { createCMFRendererPlugin } from './cmf'
152
- import { createMFIRendererPlugin } from './mfi'
153
- import { createPivotRendererPlugin } from './pivot'
154
- import { createFibRendererPlugin } from './fib'
155
- import { createStructureRendererPlugin } from './structure'
156
- import { createZonesRendererPlugin } from './zones'
157
- import { createVolumeProfileRendererPlugin } from './volumeProfile'
158
-
159
123
  /**
160
124
  * 创建副图指标渲染器(统一工厂函数)
161
125
  */
162
126
  export function createSubIndicatorRenderer(options: IndicatorRendererOptions): RendererPlugin {
163
- const { indicatorId, paneId } = options
164
-
165
- switch (indicatorId) {
166
- case 'VOLUME':
167
- return createVolumeRendererPlugin({ paneId })
168
- case 'MACD':
169
- return createMACDRendererPlugin({ paneId })
170
- case 'RSI':
171
- return createRSIRendererPlugin({ paneId })
172
- case 'CCI':
173
- return createCCIRendererPlugin({ paneId })
174
- case 'STOCH':
175
- return createSTOCHRendererPlugin({ paneId })
176
- case 'MOM':
177
- return createMOMRendererPlugin({ paneId })
178
- case 'WMSR':
179
- return createWMSRRendererPlugin({ paneId })
180
- case 'KST':
181
- return createKSTRendererPlugin({ paneId })
182
- case 'FASTK':
183
- return createFASTKRendererPlugin({ paneId })
184
- case 'ATR':
185
- return createATRRendererPlugin({ paneId })
186
- case 'WMA':
187
- return createWMARendererPlugin({ paneId })
188
- case 'DEMA':
189
- return createDEMARendererPlugin({ paneId })
190
- case 'TEMA':
191
- return createTEMARendererPlugin({ paneId })
192
- case 'HMA':
193
- return createHMARendererPlugin({ paneId })
194
- case 'KAMA':
195
- return createKAMARendererPlugin({ paneId })
196
- case 'SAR':
197
- return createSARRendererPlugin({ paneId })
198
- case 'SUPERTREND':
199
- return createSuperTrendRendererPlugin({ paneId })
200
- case 'KELTNER':
201
- return createKeltnerRendererPlugin({ paneId })
202
- case 'DONCHIAN':
203
- return createDonchianRendererPlugin({ paneId })
204
- case 'ICHIMOKU':
205
- return createIchimokuRendererPlugin({ paneId })
206
- case 'ROC':
207
- return createROCRendererPlugin({ paneId })
208
- case 'TRIX':
209
- return createTRIXRendererPlugin({ paneId })
210
- case 'HV':
211
- return createHVRendererPlugin({ paneId })
212
- case 'PARKINSON':
213
- return createParkinsonRendererPlugin({ paneId })
214
- case 'CHAIKIN_VOL':
215
- return createChaikinVolRendererPlugin({ paneId })
216
- case 'VMA':
217
- return createVMARendererPlugin({ paneId })
218
- case 'OBV':
219
- return createOBVRendererPlugin({ paneId })
220
- case 'PVT':
221
- return createPVTRendererPlugin({ paneId })
222
- case 'VWAP':
223
- return createVWAPRendererPlugin({ paneId })
224
- case 'CMF':
225
- return createCMFRendererPlugin({ paneId })
226
- case 'MFI':
227
- return createMFIRendererPlugin({ paneId })
228
- case 'PIVOT':
229
- return createPivotRendererPlugin({ paneId })
230
- case 'FIB':
231
- return createFibRendererPlugin({ paneId })
232
- case 'STRUCTURE':
233
- return createStructureRendererPlugin({ paneId })
234
- case 'ZONES':
235
- return createZonesRendererPlugin({ paneId })
236
- case 'VOLUME_PROFILE':
237
- return createVolumeProfileRendererPlugin({ paneId })
238
- default:
239
- throw new Error(`Unknown indicator: ${indicatorId}`)
240
- }
127
+ const { indicatorId, paneId, definition, params } = options
128
+ return definition.rendererFactory({ paneId, indicatorId, params })
241
129
  }
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { KAMARenderState } from '../../indicators/kamaState'
4
- import { createKAMAStateKey } from '../../indicators/kamaState'
4
+ import { createKAMAStateKey, EMPTY_KAMA_STATE } from '../../indicators/kamaState'
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, KAMASchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const KAMA_COLOR = '#0ea5e9'
10
11
 
@@ -127,6 +128,12 @@ export function createKAMARendererPlugin(options: KAMARendererOptions = {}): Ren
127
128
  defaultPaneId: 'main',
128
129
  paneIdField: 'kamaPaneId',
129
130
  allowMainPane: true,
131
+ mainPane: { rendererName: 'kama_main', toActiveConfig: (params, active) => ({ ...params, showKAMA: active }) },
132
+ visibleState: { compose: createSparseVisibleStateComposer('kama', EMPTY_KAMA_STATE) },
133
+ scale: { indicatorKey: 'kama', label: 'KAMA', decimals: 2 },
134
+ updateConfig: (scheduler, params, paneId) => {
135
+ (scheduler as IndicatorScheduler).updateKAMAConfig(params as Partial<KAMASchedulerConfig>, paneId)
136
+ },
130
137
  applyResult: (host, state, paneId) => {
131
138
  host.setSharedState(createKAMAStateKey(paneId), state as any, 'indicator_scheduler')
132
139
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { KeltnerRenderState } from '../../indicators/keltnerState'
4
- import { createKeltnerStateKey } from '../../indicators/keltnerState'
4
+ import { createKeltnerStateKey, EMPTY_KELTNER_STATE } from '../../indicators/keltnerState'
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, KeltnerSchedulerConfig } from '../../indicators/scheduler'
8
+ import { createBandVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
 
9
10
  const KELTNER_UPPER_COLOR = '#7c3aed'
10
11
  const KELTNER_MIDDLE_COLOR = '#f59e0b'
@@ -129,6 +130,12 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
129
130
  defaultPaneId: 'main',
130
131
  paneIdField: 'keltnerPaneId',
131
132
  allowMainPane: true,
133
+ mainPane: { rendererName: 'keltner_main', toActiveConfig: (params, active) => ({ ...params, showUpper: active, showMiddle: active, showLower: active }) },
134
+ scale: { indicatorKey: 'keltner', label: 'Keltner', decimals: 2 },
135
+ visibleState: { compose: createBandVisibleStateComposer('keltner', EMPTY_KELTNER_STATE, 'lower', 'upper') },
136
+ updateConfig: (scheduler, params, paneId) => {
137
+ (scheduler as IndicatorScheduler).updateKeltnerConfig(params as Partial<KeltnerSchedulerConfig>, paneId)
138
+ },
132
139
  applyResult: (host, state, paneId) => {
133
140
  host.setSharedState(createKeltnerStateKey(paneId), state as any, 'indicator_scheduler')
134
141
  },
@@ -3,9 +3,12 @@ import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import { resolveThemeColors } from '../../../tokens'
4
4
  import type { KSTRenderState } from '../../indicators/kstState'
5
5
  import { createKSTStateKey } from '../../indicators/kstState'
6
+ import { EMPTY_KST_STATE } from '../../indicators/kstState'
7
+ import { createPaddedPointVisibleStateComposer } from '../../indicators/visibleStateComposers'
6
8
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
7
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
8
- import type { IndicatorScheduler } from '../../indicators/scheduler'
10
+ import type { IndicatorScheduler, KSTSchedulerConfig } from '../../indicators/scheduler'
11
+ import { createKstScaleRendererPlugin } from './scale/kst_scale'
9
12
 
10
13
  type LinePoint = { x: number; y: number }
11
14
 
@@ -294,6 +297,11 @@ export function getKSTTitleInfo(
294
297
  stateKey: createKSTStateKey,
295
298
  defaultPaneId: 'sub_KST',
296
299
  paneIdField: 'kstPaneId',
300
+ scaleRendererFactory: createKstScaleRendererPlugin,
301
+ updateConfig: (scheduler, params, paneId) => {
302
+ (scheduler as IndicatorScheduler).updateKSTConfig(params as Partial<KSTSchedulerConfig>, paneId)
303
+ },
304
+ visibleState: { compose: createPaddedPointVisibleStateComposer('kst', EMPTY_KST_STATE, ['kst', 'signal'] as const) },
297
305
  applyResult: (host, state, paneId) => {
298
306
  host.setSharedState(createKSTStateKey(paneId), state as any, 'indicator_scheduler')
299
307
  },
@@ -3,7 +3,9 @@ import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import { MA_STATE_KEY, type MARenderState } from '../../indicators/maState'
4
4
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
5
5
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
6
+ import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer } from '../../indicators/indicatorMetadata'
6
7
  import type { IndicatorScheduler } from '../../indicators/scheduler'
8
+ import type { MAFlags } from '../../indicators/calculators'
7
9
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
8
10
  import { resolveThemeColors } from '../../../tokens'
9
11
 
@@ -12,6 +14,47 @@ export type { MAFlags } from '../../indicators/calculators'
12
14
 
13
15
  type LinePoint = { x: number; y: number }
14
16
 
17
+ const SEMANTIC_MA_PERIOD_FLAGS = new Map<number, keyof MAFlags>([
18
+ [5, 'ma5'],
19
+ [10, 'ma10'],
20
+ [20, 'ma20'],
21
+ [30, 'ma30'],
22
+ [60, 'ma60'],
23
+ ])
24
+
25
+ const computeMAPriceRange: IndicatorPriceRangeComputer = (bundle, range) => {
26
+ const seriesList = Object.values(bundle.ma.series)
27
+ if (seriesList.length === 0 || range.start >= seriesList[0]!.length) {
28
+ return null
29
+ }
30
+
31
+ let min = Infinity
32
+ let max = -Infinity
33
+ for (const values of seriesList) {
34
+ const end = Math.min(range.end, values.length)
35
+ for (let i = range.start; i < end; i++) {
36
+ const v = values[i]
37
+ if (v !== undefined) {
38
+ min = Math.min(min, v)
39
+ max = Math.max(max, v)
40
+ }
41
+ }
42
+ }
43
+
44
+ return Number.isFinite(min) && Number.isFinite(max) ? { min, max } : null
45
+ }
46
+
47
+ const composeMARenderState: IndicatorRenderStateComposer = (bundle, range, timestamp): MARenderState => {
48
+ const priceRange = computeMAPriceRange(bundle, range) ?? { min: Infinity, max: -Infinity }
49
+ return {
50
+ timestamp,
51
+ series: bundle.ma.series,
52
+ enabledPeriods: bundle.ma.enabledPeriods,
53
+ visibleMin: priceRange.min,
54
+ visibleMax: priceRange.max,
55
+ }
56
+ }
57
+
15
58
  function buildMACacheKey(
16
59
  range: { start: number; end: number },
17
60
  kLineCenters: number[],
@@ -56,6 +99,32 @@ function getMAStateKey(host: PluginHost | null): string | null {
56
99
  category: 'main',
57
100
  stateKey: MA_STATE_KEY,
58
101
  defaultPaneId: 'main',
102
+ mainPane: {
103
+ rendererName: 'ma',
104
+ toActiveConfig: (_params, active) => ({
105
+ ma5: active,
106
+ ma10: active,
107
+ ma20: active,
108
+ ma30: active,
109
+ ma60: active,
110
+ }),
111
+ computePriceRange: computeMAPriceRange,
112
+ composeRenderState: composeMARenderState,
113
+ },
114
+ updateConfig: (scheduler, params) => {
115
+ (scheduler as IndicatorScheduler).updateMAConfig(params as MAFlags)
116
+ },
117
+ semantic: {
118
+ apply: (chart, indicator) => {
119
+ const periods = (indicator as { params?: { periods?: number[] } }).params?.periods ?? [5, 10, 20, 30, 60]
120
+ const maFlags: Partial<MAFlags> = {}
121
+ for (const period of periods) {
122
+ const flag = SEMANTIC_MA_PERIOD_FLAGS.get(period)
123
+ if (flag) maFlags[flag] = true
124
+ }
125
+ chart.updateRendererConfig('ma', maFlags)
126
+ },
127
+ },
59
128
  applyResult: (host, state, _paneId) => {
60
129
  host.setSharedState(MA_STATE_KEY, state as any, 'ma_scheduler')
61
130
  },
@@ -4,12 +4,14 @@ import type { KLineData } from '../../../types/price'
4
4
  import { resolveThemeColors } from '../../../tokens'
5
5
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
6
6
  import type { MACDRenderState } from '../../indicators/macdState'
7
- import { createMACDStateKey } from '../../indicators/macdState'
7
+ import { createMACDStateKey, EMPTY_MACD_STATE } from '../../indicators/macdState'
8
8
  import type { MACDPoint } from '../../indicators/calculators'
9
9
  import { calcMACDData } from '../../indicators/calculators'
10
10
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
11
+ import { createMACDVisibleStateComposer } from '../../indicators/visibleStateComposers'
11
12
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
12
- import type { IndicatorScheduler } from '../../indicators/scheduler'
13
+ import type { IndicatorScheduler, MACDSchedulerConfig } from '../../indicators/scheduler'
14
+ import { createMacdScaleRendererPlugin } from './scale/macd_scale'
13
15
 
14
16
  type LinePoint = { x: number; y: number }
15
17
 
@@ -470,6 +472,11 @@ export function getMACDTitleInfo(
470
472
  stateKey: createMACDStateKey,
471
473
  defaultPaneId: 'sub_MACD',
472
474
  paneIdField: 'macdPaneId',
475
+ scaleRendererFactory: createMacdScaleRendererPlugin,
476
+ visibleState: { compose: createMACDVisibleStateComposer('macd', EMPTY_MACD_STATE) },
477
+ updateConfig: (scheduler, params, paneId) => {
478
+ (scheduler as IndicatorScheduler).updateMACDConfig(params as Partial<MACDSchedulerConfig>, paneId)
479
+ },
473
480
  applyResult: (host, state, paneId) => {
474
481
  host.setSharedState(createMACDStateKey(paneId), state as any, 'indicator_scheduler')
475
482
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { MFIRenderState } from '../../indicators/mfiState'
4
- import { createMFIStateKey } from '../../indicators/mfiState'
4
+ import { createMFIStateKey, EMPTY_MFI_STATE } from '../../indicators/mfiState'
5
5
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
6
+ import { createFixedRangeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
6
7
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
7
- import type { IndicatorScheduler } from '../../indicators/scheduler'
8
+ import type { IndicatorScheduler, MFISchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const MFI_COLOR = '#fb923c'
10
11
 
@@ -133,6 +134,11 @@ export function createMFIRendererPlugin(options: { paneId?: string } = {}): Rend
133
134
  stateKey: createMFIStateKey,
134
135
  defaultPaneId: 'sub_MFI',
135
136
  paneIdField: 'mfiPaneId',
137
+ visibleState: { compose: createFixedRangeSparseVisibleStateComposer('mfi', EMPTY_MFI_STATE) },
138
+ scale: { indicatorKey: 'mfi', label: 'MFI', decimals: 2 },
139
+ updateConfig: (scheduler, params, paneId) => {
140
+ (scheduler as IndicatorScheduler).updateMFIConfig(params as Partial<MFISchedulerConfig>, paneId)
141
+ },
136
142
  applyResult: (host, state, paneId) => {
137
143
  host.setSharedState(createMFIStateKey(paneId), state as any, 'indicator_scheduler')
138
144
  },
@@ -4,9 +4,12 @@ import { resolveThemeColors } from '../../../tokens'
4
4
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
5
5
  import type { MOMRenderState } from '../../indicators/momState'
6
6
  import { createMOMStateKey } from '../../indicators/momState'
7
+ import { EMPTY_MOM_STATE } from '../../indicators/momState'
8
+ import { createPaddedSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
7
9
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
10
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
- import type { IndicatorScheduler } from '../../indicators/scheduler'
11
+ import type { IndicatorScheduler, MOMSchedulerConfig } from '../../indicators/scheduler'
12
+ import { createMomScaleRendererPlugin } from './scale/mom_scale'
10
13
 
11
14
  type LinePoint = { x: number; y: number }
12
15
 
@@ -303,6 +306,11 @@ export function getMOMTitleInfo(
303
306
  stateKey: createMOMStateKey,
304
307
  defaultPaneId: 'sub_MOM',
305
308
  paneIdField: 'momPaneId',
309
+ scaleRendererFactory: createMomScaleRendererPlugin,
310
+ updateConfig: (scheduler, params, paneId) => {
311
+ (scheduler as IndicatorScheduler).updateMOMConfig(params as Partial<MOMSchedulerConfig>, paneId)
312
+ },
313
+ visibleState: { compose: createPaddedSparseVisibleStateComposer('mom', EMPTY_MOM_STATE) },
306
314
  applyResult: (host, state, paneId) => {
307
315
  host.setSharedState(createMOMStateKey(paneId), state as any, 'indicator_scheduler')
308
316
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { OBVRenderState } from '../../indicators/obvState'
4
- import { createOBVStateKey } from '../../indicators/obvState'
4
+ import { createOBVStateKey, EMPTY_OBV_STATE } from '../../indicators/obvState'
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, OBVSchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const OBV_COLOR = '#16a34a'
10
11
 
@@ -114,6 +115,11 @@ export function createOBVRendererPlugin(options: { paneId?: string } = {}): Rend
114
115
  stateKey: createOBVStateKey,
115
116
  defaultPaneId: 'sub_OBV',
116
117
  paneIdField: 'obvPaneId',
118
+ visibleState: { compose: createSparseVisibleStateComposer('obv', EMPTY_OBV_STATE) },
119
+ scale: { indicatorKey: 'obv', label: 'OBV', decimals: 0 },
120
+ updateConfig: (scheduler, params, paneId) => {
121
+ (scheduler as IndicatorScheduler).updateOBVConfig(params as Partial<OBVSchedulerConfig>, paneId)
122
+ },
117
123
  applyResult: (host, state, paneId) => {
118
124
  host.setSharedState(createOBVStateKey(paneId), state as any, 'indicator_scheduler')
119
125
  },
@@ -2,9 +2,11 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { ParkinsonRenderState } from '../../indicators/parkinsonState'
4
4
  import { createParkinsonStateKey } from '../../indicators/parkinsonState'
5
+ import { EMPTY_PARKINSON_STATE } from '../../indicators/parkinsonState'
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, ParkinsonSchedulerConfig } from '../../indicators/scheduler'
8
10
 
9
11
  const PARKINSON_COLOR = '#0891b2'
10
12
 
@@ -115,6 +117,11 @@ export function createParkinsonRendererPlugin(options: { paneId?: string } = {})
115
117
  stateKey: createParkinsonStateKey,
116
118
  defaultPaneId: 'sub_Parkinson',
117
119
  paneIdField: 'parkinsonPaneId',
120
+ scale: { indicatorKey: 'parkinson', label: 'Parkinson', decimals: 2 },
121
+ updateConfig: (scheduler, params, paneId) => {
122
+ (scheduler as IndicatorScheduler).updateParkinsonConfig(params as Partial<ParkinsonSchedulerConfig>, paneId)
123
+ },
124
+ visibleState: { compose: createNonNegativeSparseVisibleStateComposer('parkinson', EMPTY_PARKINSON_STATE) },
118
125
  applyResult: (host, state, paneId) => {
119
126
  host.setSharedState(createParkinsonStateKey(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 { PivotRenderState } from '../../indicators/pivotState'
4
- import { createPivotStateKey } from '../../indicators/pivotState'
4
+ import { createPivotStateKey, EMPTY_PIVOT_STATE } from '../../indicators/pivotState'
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, PivotSchedulerConfig } from '../../indicators/scheduler'
8
+ import { createExactRangePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
 
9
10
  const PP_COLOR = '#94a3b8'
10
11
  const R_COLOR = '#dc2626'
@@ -122,6 +123,12 @@ function drawStep(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
122
123
  defaultPaneId: 'main',
123
124
  paneIdField: 'pivotPaneId',
124
125
  allowMainPane: true,
126
+ mainPane: { rendererName: 'pivot_main', toActiveConfig: (params, active) => ({ ...params, showPP: active, showR1: active, showR2: active, showR3: active, showS1: active, showS2: active, showS3: active }) },
127
+ scale: { indicatorKey: 'pivot', label: 'Pivot', decimals: 2 },
128
+ visibleState: { compose: createExactRangePointVisibleStateComposer('pivot', EMPTY_PIVOT_STATE, ['pp', 'r1', 'r2', 'r3', 's1', 's2', 's3']) },
129
+ updateConfig: (scheduler, params, paneId) => {
130
+ (scheduler as IndicatorScheduler).updatePivotConfig(params as Partial<PivotSchedulerConfig>, paneId)
131
+ },
125
132
  applyResult: (host, state, paneId) => {
126
133
  host.setSharedState(createPivotStateKey(paneId), state as any, 'indicator_scheduler')
127
134
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { PVTRenderState } from '../../indicators/pvtState'
4
- import { createPVTStateKey } from '../../indicators/pvtState'
4
+ import { createPVTStateKey, EMPTY_PVT_STATE } from '../../indicators/pvtState'
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, PVTSchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const PVT_COLOR = '#a855f7'
10
11
 
@@ -114,6 +115,11 @@ export function createPVTRendererPlugin(options: { paneId?: string } = {}): Rend
114
115
  stateKey: createPVTStateKey,
115
116
  defaultPaneId: 'sub_PVT',
116
117
  paneIdField: 'pvtPaneId',
118
+ visibleState: { compose: createSparseVisibleStateComposer('pvt', EMPTY_PVT_STATE) },
119
+ scale: { indicatorKey: 'pvt', label: 'PVT', decimals: 0 },
120
+ updateConfig: (scheduler, params, paneId) => {
121
+ (scheduler as IndicatorScheduler).updatePVTConfig(params as Partial<PVTSchedulerConfig>, paneId)
122
+ },
117
123
  applyResult: (host, state, paneId) => {
118
124
  host.setSharedState(createPVTStateKey(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 { ROCRenderState } from '../../indicators/rocState'
4
- import { createROCStateKey } from '../../indicators/rocState'
4
+ import { createROCStateKey, EMPTY_ROC_STATE } from '../../indicators/rocState'
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, ROCSchedulerConfig } from '../../indicators/scheduler'
8
9
 
9
10
  const ROC_COLOR = '#0ea5e9'
10
11
 
@@ -134,6 +135,11 @@ export function createROCRendererPlugin(options: ROCRendererOptions = {}): Rende
134
135
  stateKey: createROCStateKey,
135
136
  defaultPaneId: 'sub_ROC',
136
137
  paneIdField: 'rocPaneId',
138
+ visibleState: { compose: createSparseVisibleStateComposer('roc', EMPTY_ROC_STATE) },
139
+ scale: { indicatorKey: 'roc', label: 'ROC', decimals: 2 },
140
+ updateConfig: (scheduler, params, paneId) => {
141
+ (scheduler as IndicatorScheduler).updateROCConfig(params as Partial<ROCSchedulerConfig>, paneId)
142
+ },
137
143
  applyResult: (host, state, paneId) => {
138
144
  host.setSharedState(createROCStateKey(paneId), state as any, 'indicator_scheduler')
139
145
  },
@@ -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 { RSIRenderState } from '../../indicators/rsiState'
6
- import { createRSIStateKey } from '../../indicators/rsiState'
6
+ import { createRSIStateKey, EMPTY_RSI_STATE } from '../../indicators/rsiState'
7
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
+ import { createFixedRangeRecordVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
- import type { IndicatorScheduler } from '../../indicators/scheduler'
10
+ import type { IndicatorScheduler, RSISchedulerConfig } from '../../indicators/scheduler'
11
+ import { createRsiScaleRendererPlugin } from './scale/rsi_scale'
10
12
 
11
13
  type LinePoint = { x: number; y: number }
12
14
 
@@ -388,6 +390,11 @@ export function getRSITitleInfo(
388
390
  stateKey: createRSIStateKey,
389
391
  defaultPaneId: 'sub_RSI',
390
392
  paneIdField: 'rsiPaneId',
393
+ visibleState: { compose: createFixedRangeRecordVisibleStateComposer('rsi', EMPTY_RSI_STATE) },
394
+ scaleRendererFactory: createRsiScaleRendererPlugin,
395
+ updateConfig: (scheduler, params, paneId) => {
396
+ (scheduler as IndicatorScheduler).updateRSIConfig(params as Partial<RSISchedulerConfig>, paneId)
397
+ },
391
398
  applyResult: (host, state, paneId) => {
392
399
  host.setSharedState(createRSIStateKey(paneId), state as any, 'indicator_scheduler')
393
400
  },
@@ -1,10 +1,11 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { SARRenderState } from '../../indicators/sarState'
4
- import { createSARStateKey } from '../../indicators/sarState'
4
+ import { createSARStateKey, EMPTY_SAR_STATE } from '../../indicators/sarState'
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, SARSchedulerConfig } from '../../indicators/scheduler'
8
+ import { createValuePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
 
9
10
  const SAR_UP_COLOR = '#22c55e'
10
11
  const SAR_DOWN_COLOR = '#ef4444'
@@ -104,6 +105,12 @@ export function createSARRendererPlugin(options: SARRendererOptions = {}): Rende
104
105
  defaultPaneId: 'main',
105
106
  paneIdField: 'sarPaneId',
106
107
  allowMainPane: true,
108
+ mainPane: { rendererName: 'sar_main', toActiveConfig: (params, active) => ({ ...params, showSAR: active }) },
109
+ scale: { indicatorKey: 'sar', label: 'SAR', decimals: 4 },
110
+ visibleState: { compose: createValuePointVisibleStateComposer('sar', EMPTY_SAR_STATE, ['value']) },
111
+ updateConfig: (scheduler, params, paneId) => {
112
+ (scheduler as IndicatorScheduler).updateSARConfig(params as Partial<SARSchedulerConfig>, paneId)
113
+ },
107
114
  applyResult: (host, state, paneId) => {
108
115
  host.setSharedState(createSARStateKey(paneId), state as any, 'indicator_scheduler')
109
116
  },
@@ -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 { STOCHRenderState } from '../../indicators/stochState'
6
- import { createSTOCHStateKey } from '../../indicators/stochState'
6
+ import { createSTOCHStateKey, EMPTY_STOCH_STATE } from '../../indicators/stochState'
7
7
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
8
+ import { createFixedRangePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
8
9
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
9
- import type { IndicatorScheduler } from '../../indicators/scheduler'
10
+ import type { IndicatorScheduler, STOCHSchedulerConfig } from '../../indicators/scheduler'
11
+ import { createStochScaleRendererPlugin } from './scale/stoch_scale'
10
12
 
11
13
  type LinePoint = { x: number; y: number }
12
14
 
@@ -351,6 +353,11 @@ export function getSTOCHTitleInfo(
351
353
  stateKey: createSTOCHStateKey,
352
354
  defaultPaneId: 'sub_STOCH',
353
355
  paneIdField: 'stochPaneId',
356
+ visibleState: { compose: createFixedRangePointVisibleStateComposer('stoch', EMPTY_STOCH_STATE, ['k', 'd'] as const) },
357
+ scaleRendererFactory: createStochScaleRendererPlugin,
358
+ updateConfig: (scheduler, params, paneId) => {
359
+ (scheduler as IndicatorScheduler).updateSTOCHConfig(params as Partial<STOCHSchedulerConfig>, paneId)
360
+ },
354
361
  applyResult: (host, state, paneId) => {
355
362
  host.setSharedState(createSTOCHStateKey(paneId), state as any, 'indicator_scheduler')
356
363
  },