@363045841yyt/klinechart-core 0.7.12-alpha.1 → 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 (277) 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/indicator.worker.js +32 -4
  13. package/dist/engine/indicators/indicator.worker.js.map +1 -1
  14. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts +5 -3
  15. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  16. package/dist/engine/indicators/indicatorDefinitionRegistry.js +26 -1
  17. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  18. package/dist/engine/indicators/indicatorMetadata.d.ts +54 -1
  19. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  20. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  21. package/dist/engine/indicators/indicatorRuntime.d.ts +12 -117
  22. package/dist/engine/indicators/indicatorRuntime.d.ts.map +1 -1
  23. package/dist/engine/indicators/indicatorRuntime.js +124 -1308
  24. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  25. package/dist/engine/indicators/scheduler.d.ts +19 -143
  26. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  27. package/dist/engine/indicators/scheduler.js +81 -434
  28. package/dist/engine/indicators/scheduler.js.map +1 -1
  29. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  30. package/dist/engine/indicators/stateComposer.js +15 -47
  31. package/dist/engine/indicators/stateComposer.js.map +1 -1
  32. package/dist/engine/indicators/workerProtocol.d.ts +12 -36
  33. package/dist/engine/indicators/workerProtocol.d.ts.map +1 -1
  34. package/dist/engine/indicators/workerProtocol.js.map +1 -1
  35. package/dist/engine/renderers/Indicator/atr.d.ts +2 -1
  36. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  37. package/dist/engine/renderers/Indicator/atr.js +11 -9
  38. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  39. package/dist/engine/renderers/Indicator/boll.d.ts +4 -1
  40. package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
  41. package/dist/engine/renderers/Indicator/boll.js +24 -10
  42. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  43. package/dist/engine/renderers/Indicator/cci.d.ts +2 -1
  44. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  45. package/dist/engine/renderers/Indicator/cci.js +12 -10
  46. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  47. package/dist/engine/renderers/Indicator/chaikinVol.d.ts +4 -1
  48. package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
  49. package/dist/engine/renderers/Indicator/chaikinVol.js +21 -7
  50. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  51. package/dist/engine/renderers/Indicator/cmf.d.ts +4 -1
  52. package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
  53. package/dist/engine/renderers/Indicator/cmf.js +20 -7
  54. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  55. package/dist/engine/renderers/Indicator/dema.d.ts +2 -0
  56. package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
  57. package/dist/engine/renderers/Indicator/dema.js +19 -8
  58. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  59. package/dist/engine/renderers/Indicator/donchian.d.ts +4 -1
  60. package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
  61. package/dist/engine/renderers/Indicator/donchian.js +20 -8
  62. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  63. package/dist/engine/renderers/Indicator/ene.d.ts +12 -1
  64. package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
  65. package/dist/engine/renderers/Indicator/ene.js +25 -11
  66. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  67. package/dist/engine/renderers/Indicator/expma.d.ts +4 -1
  68. package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
  69. package/dist/engine/renderers/Indicator/expma.js +22 -9
  70. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  71. package/dist/engine/renderers/Indicator/fastk.d.ts +2 -1
  72. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  73. package/dist/engine/renderers/Indicator/fastk.js +12 -10
  74. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  75. package/dist/engine/renderers/Indicator/fib.d.ts +2 -0
  76. package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
  77. package/dist/engine/renderers/Indicator/fib.js +26 -8
  78. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  79. package/dist/engine/renderers/Indicator/hma.d.ts +2 -0
  80. package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
  81. package/dist/engine/renderers/Indicator/hma.js +19 -8
  82. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  83. package/dist/engine/renderers/Indicator/hv.d.ts +4 -1
  84. package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
  85. package/dist/engine/renderers/Indicator/hv.js +18 -8
  86. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  87. package/dist/engine/renderers/Indicator/ichimoku.d.ts +4 -1
  88. package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
  89. package/dist/engine/renderers/Indicator/ichimoku.js +27 -8
  90. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  91. package/dist/engine/renderers/Indicator/index.d.ts +27 -28
  92. package/dist/engine/renderers/Indicator/index.d.ts.map +1 -1
  93. package/dist/engine/renderers/Indicator/index.js +27 -28
  94. package/dist/engine/renderers/Indicator/index.js.map +1 -1
  95. package/dist/engine/renderers/Indicator/kama.d.ts +2 -0
  96. package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
  97. package/dist/engine/renderers/Indicator/kama.js +19 -8
  98. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  99. package/dist/engine/renderers/Indicator/keltner.d.ts +4 -1
  100. package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
  101. package/dist/engine/renderers/Indicator/keltner.js +20 -8
  102. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  103. package/dist/engine/renderers/Indicator/kst.d.ts +2 -1
  104. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  105. package/dist/engine/renderers/Indicator/kst.js +13 -11
  106. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  107. package/dist/engine/renderers/Indicator/ma.d.ts +4 -1
  108. package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
  109. package/dist/engine/renderers/Indicator/ma.js +36 -8
  110. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  111. package/dist/engine/renderers/Indicator/macd.d.ts +1 -1
  112. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  113. package/dist/engine/renderers/Indicator/macd.js +9 -10
  114. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  115. package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
  116. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +38 -136
  117. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  118. package/dist/engine/renderers/Indicator/mfi.d.ts +4 -1
  119. package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
  120. package/dist/engine/renderers/Indicator/mfi.js +20 -7
  121. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  122. package/dist/engine/renderers/Indicator/mom.d.ts +2 -1
  123. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  124. package/dist/engine/renderers/Indicator/mom.js +12 -10
  125. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  126. package/dist/engine/renderers/Indicator/obv.d.ts +4 -1
  127. package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
  128. package/dist/engine/renderers/Indicator/obv.js +19 -7
  129. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  130. package/dist/engine/renderers/Indicator/parkinson.d.ts +4 -1
  131. package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
  132. package/dist/engine/renderers/Indicator/parkinson.js +18 -8
  133. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  134. package/dist/engine/renderers/Indicator/pivot.d.ts +2 -0
  135. package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
  136. package/dist/engine/renderers/Indicator/pivot.js +43 -8
  137. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  138. package/dist/engine/renderers/Indicator/pvt.d.ts +4 -1
  139. package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
  140. package/dist/engine/renderers/Indicator/pvt.js +19 -7
  141. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  142. package/dist/engine/renderers/Indicator/roc.d.ts +4 -1
  143. package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
  144. package/dist/engine/renderers/Indicator/roc.js +20 -7
  145. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  146. package/dist/engine/renderers/Indicator/rsi.d.ts +2 -1
  147. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  148. package/dist/engine/renderers/Indicator/rsi.js +14 -11
  149. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  150. package/dist/engine/renderers/Indicator/sar.d.ts +4 -1
  151. package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
  152. package/dist/engine/renderers/Indicator/sar.js +18 -8
  153. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  154. package/dist/engine/renderers/Indicator/stoch.d.ts +2 -1
  155. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  156. package/dist/engine/renderers/Indicator/stoch.js +10 -11
  157. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  158. package/dist/engine/renderers/Indicator/structure.d.ts +4 -1
  159. package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
  160. package/dist/engine/renderers/Indicator/structure.js +21 -8
  161. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  162. package/dist/engine/renderers/Indicator/supertrend.d.ts +4 -1
  163. package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
  164. package/dist/engine/renderers/Indicator/supertrend.js +18 -8
  165. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  166. package/dist/engine/renderers/Indicator/tema.d.ts +2 -0
  167. package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
  168. package/dist/engine/renderers/Indicator/tema.js +19 -8
  169. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  170. package/dist/engine/renderers/Indicator/trix.d.ts +4 -1
  171. package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
  172. package/dist/engine/renderers/Indicator/trix.js +30 -8
  173. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  174. package/dist/engine/renderers/Indicator/vma.d.ts +4 -1
  175. package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
  176. package/dist/engine/renderers/Indicator/vma.js +20 -7
  177. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  178. package/dist/engine/renderers/Indicator/volumeProfile.d.ts +4 -1
  179. package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
  180. package/dist/engine/renderers/Indicator/volumeProfile.js +28 -8
  181. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  182. package/dist/engine/renderers/Indicator/vwap.d.ts +4 -1
  183. package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
  184. package/dist/engine/renderers/Indicator/vwap.js +19 -7
  185. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  186. package/dist/engine/renderers/Indicator/wma.d.ts +2 -0
  187. package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
  188. package/dist/engine/renderers/Indicator/wma.js +19 -8
  189. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  190. package/dist/engine/renderers/Indicator/wmsr.d.ts +2 -1
  191. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  192. package/dist/engine/renderers/Indicator/wmsr.js +12 -10
  193. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  194. package/dist/engine/renderers/Indicator/zones.d.ts +2 -0
  195. package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
  196. package/dist/engine/renderers/Indicator/zones.js +24 -8
  197. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  198. package/dist/engine/renderers/paneTitle.d.ts +4 -10
  199. package/dist/engine/renderers/paneTitle.d.ts.map +1 -1
  200. package/dist/engine/renderers/paneTitle.js +28 -6
  201. package/dist/engine/renderers/paneTitle.js.map +1 -1
  202. package/dist/engine/renderers/subVolume.js +0 -3
  203. package/dist/engine/renderers/subVolume.js.map +1 -1
  204. package/dist/version.d.ts +1 -1
  205. package/dist/version.d.ts.map +1 -1
  206. package/dist/version.js +1 -1
  207. package/dist/version.js.map +1 -1
  208. package/package.json +4 -4
  209. package/src/controllers/__tests__/indicatorSelector.test.ts +4 -3
  210. package/src/controllers/createIndicatorSelectorController.ts +4 -6
  211. package/src/controllers/index.ts +0 -4
  212. package/src/engine/chart.ts +30 -22
  213. package/src/engine/indicators/__tests__/registerBuiltins.test.ts +14 -23
  214. package/src/engine/indicators/__tests__/scheduler.test.ts +14 -14
  215. package/src/engine/indicators/__tests__/stateComposer.test.ts +7 -4
  216. package/src/engine/indicators/indicator.worker.ts +36 -4
  217. package/src/engine/indicators/indicatorDefinitionRegistry.ts +38 -3
  218. package/src/engine/indicators/indicatorMetadata.ts +66 -1
  219. package/src/engine/indicators/indicatorRuntime.ts +121 -1447
  220. package/src/engine/indicators/scheduler.ts +85 -489
  221. package/src/engine/indicators/stateComposer.ts +16 -60
  222. package/src/engine/indicators/workerProtocol.ts +14 -36
  223. package/src/engine/renderers/Indicator/atr.ts +14 -11
  224. package/src/engine/renderers/Indicator/boll.ts +33 -10
  225. package/src/engine/renderers/Indicator/cci.ts +15 -14
  226. package/src/engine/renderers/Indicator/chaikinVol.ts +29 -7
  227. package/src/engine/renderers/Indicator/cmf.ts +28 -7
  228. package/src/engine/renderers/Indicator/dema.ts +28 -9
  229. package/src/engine/renderers/Indicator/donchian.ts +28 -9
  230. package/src/engine/renderers/Indicator/ene.ts +34 -11
  231. package/src/engine/renderers/Indicator/expma.ts +31 -9
  232. package/src/engine/renderers/Indicator/fastk.ts +15 -14
  233. package/src/engine/renderers/Indicator/fib.ts +29 -9
  234. package/src/engine/renderers/Indicator/hma.ts +28 -9
  235. package/src/engine/renderers/Indicator/hv.ts +27 -8
  236. package/src/engine/renderers/Indicator/ichimoku.ts +31 -9
  237. package/src/engine/renderers/Indicator/index.ts +27 -28
  238. package/src/engine/renderers/Indicator/kama.ts +28 -9
  239. package/src/engine/renderers/Indicator/keltner.ts +28 -9
  240. package/src/engine/renderers/Indicator/kst.ts +16 -19
  241. package/src/engine/renderers/Indicator/ma.ts +44 -9
  242. package/src/engine/renderers/Indicator/macd.ts +31 -36
  243. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +43 -162
  244. package/src/engine/renderers/Indicator/mfi.ts +28 -7
  245. package/src/engine/renderers/Indicator/mom.ts +15 -14
  246. package/src/engine/renderers/Indicator/obv.ts +27 -7
  247. package/src/engine/renderers/Indicator/parkinson.ts +27 -8
  248. package/src/engine/renderers/Indicator/pivot.ts +47 -9
  249. package/src/engine/renderers/Indicator/pvt.ts +27 -7
  250. package/src/engine/renderers/Indicator/roc.ts +29 -7
  251. package/src/engine/renderers/Indicator/rsi.ts +14 -17
  252. package/src/engine/renderers/Indicator/sar.ts +26 -9
  253. package/src/engine/renderers/Indicator/stoch.ts +13 -16
  254. package/src/engine/renderers/Indicator/structure.ts +31 -8
  255. package/src/engine/renderers/Indicator/supertrend.ts +26 -9
  256. package/src/engine/renderers/Indicator/tema.ts +28 -9
  257. package/src/engine/renderers/Indicator/trix.ts +39 -8
  258. package/src/engine/renderers/Indicator/vma.ts +28 -7
  259. package/src/engine/renderers/Indicator/volumeProfile.ts +40 -8
  260. package/src/engine/renderers/Indicator/vwap.ts +27 -7
  261. package/src/engine/renderers/Indicator/wma.ts +28 -9
  262. package/src/engine/renderers/Indicator/wmsr.ts +15 -14
  263. package/src/engine/renderers/Indicator/zones.ts +29 -9
  264. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +142 -79
  265. package/src/engine/renderers/paneTitle.ts +43 -18
  266. package/src/engine/renderers/subVolume.ts +0 -2
  267. package/src/version.ts +1 -1
  268. package/dist/engine/renderers/Indicator/macdLegend.d.ts +0 -13
  269. package/dist/engine/renderers/Indicator/macdLegend.d.ts.map +0 -1
  270. package/dist/engine/renderers/Indicator/macdLegend.js +0 -116
  271. package/dist/engine/renderers/Indicator/macdLegend.js.map +0 -1
  272. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts +0 -16
  273. package/dist/engine/renderers/Indicator/subPaneConfig.d.ts.map +0 -1
  274. package/dist/engine/renderers/Indicator/subPaneConfig.js +0 -194
  275. package/dist/engine/renderers/Indicator/subPaneConfig.js.map +0 -1
  276. package/src/engine/renderers/Indicator/macdLegend.ts +0 -141
  277. package/src/engine/renderers/Indicator/subPaneConfig.ts +0 -265
@@ -17,7 +17,6 @@ import { isWorkerResponse, PROTOCOL_VERSION } from './workerProtocol';
17
17
  import { composeRenderStates, composeVisibleSubIndicatorStates, computeMainIndicatorPriceRange } from './stateComposer';
18
18
  import { IndicatorRegistry } from './indicatorRegistry';
19
19
  import { resolveStateKey } from './indicatorMetadata';
20
- import IndicatorWorker from './indicator.worker.ts?worker';
21
20
  // Default constants for default config
22
21
  import { DEFAULT_ATR_PERIOD } from './atrState';
23
22
  import { DEFAULT_WMA_PERIOD } from './wmaState';
@@ -49,7 +48,7 @@ import { DEFAULT_VP_BINS, DEFAULT_VP_LOOKBACK, DEFAULT_VP_VALUE_AREA } from './v
49
48
  export class IndicatorScheduler {
50
49
  pluginHost = null;
51
50
  visibleRange = { start: 0, end: 0 };
52
- activeMainIndicators = new Set();
51
+ activeMainIndicators = new Map();
53
52
  // 版本控制
54
53
  dataVersion = 0;
55
54
  configVersion = 0;
@@ -58,6 +57,7 @@ export class IndicatorScheduler {
58
57
  // 当前数据和配置快照
59
58
  currentData = [];
60
59
  configSnapshot = this.getDefaultConfig();
60
+ paneIdOverrides = new Map();
61
61
  // Worker 相关
62
62
  worker = null;
63
63
  workerReady = false;
@@ -88,6 +88,21 @@ export class IndicatorScheduler {
88
88
  console.warn(`[IndicatorScheduler] '${meta.name}' already registered, overwriting`);
89
89
  }
90
90
  this.registry.register(meta);
91
+ if (meta.runtime && this.inlineRuntime) {
92
+ this.inlineRuntime.addDescriptor(meta.runtime);
93
+ }
94
+ if (meta.runtime && this.useWorker && this.worker && this.workerReady) {
95
+ const rt = meta.runtime;
96
+ this.worker.postMessage({
97
+ type: 'addDescriptor',
98
+ descriptor: {
99
+ configKey: rt.configKey ?? meta.name,
100
+ paneIdKey: rt.paneIdKey,
101
+ defaultConfig: typeof rt.defaultConfig === 'function' ? rt.defaultConfig() : rt.defaultConfig,
102
+ computeKey: rt.computeKey,
103
+ },
104
+ });
105
+ }
91
106
  this.configVersion++;
92
107
  this.triggerRecompute();
93
108
  console.log(`[IndicatorScheduler] Registered indicator '${meta.name}' (${meta.displayName})`);
@@ -280,41 +295,6 @@ export class IndicatorScheduler {
280
295
  showPOC: true,
281
296
  showValueArea: true,
282
297
  },
283
- rsiPaneId: 'sub_RSI',
284
- cciPaneId: 'sub_CCI',
285
- stochPaneId: 'sub_STOCH',
286
- momPaneId: 'sub_MOM',
287
- wmsrPaneId: 'sub_WMSR',
288
- kstPaneId: 'sub_KST',
289
- fastkPaneId: 'sub_FASTK',
290
- macdPaneId: 'sub_MACD',
291
- atrPaneId: 'sub_ATR',
292
- wmaPaneId: 'sub_WMA',
293
- demaPaneId: 'sub_DEMA',
294
- temaPaneId: 'sub_TEMA',
295
- hmaPaneId: 'sub_HMA',
296
- kamaPaneId: 'sub_KAMA',
297
- sarPaneId: 'sub_SAR',
298
- supertrendPaneId: 'sub_SuperTrend',
299
- keltnerPaneId: 'sub_Keltner',
300
- donchianPaneId: 'sub_Donchian',
301
- ichimokuPaneId: 'sub_Ichimoku',
302
- rocPaneId: 'sub_ROC',
303
- trixPaneId: 'sub_TRIX',
304
- hvPaneId: 'sub_HV',
305
- parkinsonPaneId: 'sub_Parkinson',
306
- chaikinVolPaneId: 'sub_ChaikinVol',
307
- vmaPaneId: 'sub_VMA',
308
- obvPaneId: 'sub_OBV',
309
- pvtPaneId: 'sub_PVT',
310
- vwapPaneId: 'sub_VWAP',
311
- cmfPaneId: 'sub_CMF',
312
- mfiPaneId: 'sub_MFI',
313
- pivotPaneId: 'sub_Pivot',
314
- fibPaneId: 'sub_Fib',
315
- structurePaneId: 'sub_Structure',
316
- zonesPaneId: 'sub_Zones',
317
- volumeProfilePaneId: 'sub_VolumeProfile',
318
298
  };
319
299
  }
320
300
  initBackend() {
@@ -331,16 +311,15 @@ export class IndicatorScheduler {
331
311
  return false;
332
312
  }
333
313
  try {
334
- // Vite 模块 Worker(使用 ?worker 导入确保输出为 .js)
335
- console.log('[IndicatorScheduler] Creating worker from IndicatorWorker');
336
- this.worker = new IndicatorWorker();
314
+ const workerUrl = new URL('./indicator.worker.js', import.meta.url);
315
+ console.log('[IndicatorScheduler] Creating worker from:', workerUrl.href);
316
+ this.worker = new Worker(workerUrl, { type: 'module' });
337
317
  console.log('[IndicatorScheduler] Worker created, waiting for ready...');
338
318
  this.worker.onmessage = (e) => this.handleWorkerMessage(e.data);
339
319
  this.worker.onerror = (err) => {
340
320
  console.error('[IndicatorScheduler] Worker error:', err);
341
321
  this.fallbackToInline();
342
322
  };
343
- // 发送 init
344
323
  this.worker.postMessage({
345
324
  type: 'init',
346
325
  protocolVersion: PROTOCOL_VERSION,
@@ -354,7 +333,10 @@ export class IndicatorScheduler {
354
333
  }
355
334
  initInlineRuntime() {
356
335
  console.log('[IndicatorScheduler] Using INLINE runtime (fallback)');
357
- this.inlineRuntime = new IndicatorRuntime();
336
+ const runtimeDescs = this.registry.getAll()
337
+ .filter(m => m.runtime)
338
+ .map(m => m.runtime);
339
+ this.inlineRuntime = new IndicatorRuntime(runtimeDescs);
358
340
  this.useWorker = false;
359
341
  this.workerReady = true;
360
342
  }
@@ -388,7 +370,20 @@ export class IndicatorScheduler {
388
370
  this.workerReady = true;
389
371
  this.useWorker = true;
390
372
  console.log('[IndicatorScheduler] Worker READY - using Worker backend');
391
- // Worker 就绪后补算一次,但仅在有数据时(避免空数据产出 Infinity 极值)
373
+ for (const meta of this.registry.getAll()) {
374
+ if (!meta.runtime)
375
+ continue;
376
+ const rt = meta.runtime;
377
+ this.worker.postMessage({
378
+ type: 'addDescriptor',
379
+ descriptor: {
380
+ configKey: rt.configKey ?? meta.name,
381
+ paneIdKey: rt.paneIdKey,
382
+ defaultConfig: typeof rt.defaultConfig === 'function' ? rt.defaultConfig() : rt.defaultConfig,
383
+ computeKey: rt.computeKey,
384
+ },
385
+ });
386
+ }
392
387
  if (this.currentData.length > 0) {
393
388
  this.triggerRecompute();
394
389
  }
@@ -455,9 +450,7 @@ export class IndicatorScheduler {
455
450
  if (!state)
456
451
  continue;
457
452
  this.checkVisibleExtremes(state, meta.displayName);
458
- const paneId = meta.paneIdField
459
- ? this.configSnapshot[meta.paneIdField]
460
- : meta.defaultPaneId;
453
+ const paneId = this.paneIdOverrides.get(meta.name) ?? meta.defaultPaneId;
461
454
  meta.applyResult(this.pluginHost, state, paneId);
462
455
  }
463
456
  }
@@ -475,9 +468,7 @@ export class IndicatorScheduler {
475
468
  continue;
476
469
  let state;
477
470
  if (meta.category === 'main') {
478
- const paneId = meta.paneIdField
479
- ? this.configSnapshot[meta.paneIdField]
480
- : meta.defaultPaneId;
471
+ const paneId = this.paneIdOverrides.get(meta.name) ?? meta.defaultPaneId;
481
472
  const current = this.pluginHost.getSharedState(resolveStateKey(meta.stateKey, paneId));
482
473
  const currentValid = current &&
483
474
  Number.isFinite(current.visibleMin) &&
@@ -494,9 +485,7 @@ export class IndicatorScheduler {
494
485
  if (state === undefined)
495
486
  continue;
496
487
  this.checkVisibleExtremes(state, meta.displayName);
497
- const paneId = meta.paneIdField
498
- ? this.configSnapshot[meta.paneIdField]
499
- : meta.defaultPaneId;
488
+ const paneId = this.paneIdOverrides.get(meta.name) ?? meta.defaultPaneId;
500
489
  meta.applyResult(this.pluginHost, state, paneId);
501
490
  if (meta.category === 'main') {
502
491
  mainStateUpdated = true;
@@ -509,9 +498,7 @@ export class IndicatorScheduler {
509
498
  const activeIds = this.getActiveSubPaneIds?.() ?? [];
510
499
  const mask = {};
511
500
  for (const meta of this.registry.getAll()) {
512
- if (!meta.paneIdField)
513
- continue;
514
- const paneId = this.configSnapshot[meta.paneIdField] ?? meta.defaultPaneId;
501
+ const paneId = this.paneIdOverrides.get(meta.name) ?? meta.defaultPaneId;
515
502
  mask[meta.name] = activeIds.includes(paneId) || !!(meta.allowMainPane && paneId === 'main');
516
503
  }
517
504
  return mask;
@@ -523,9 +510,7 @@ export class IndicatorScheduler {
523
510
  return { ...this.configSnapshot };
524
511
  const cfg = { ...this.configSnapshot };
525
512
  for (const meta of this.registry.getAll()) {
526
- if (!meta.paneIdField)
527
- continue;
528
- const paneId = cfg[meta.paneIdField];
513
+ const paneId = this.paneIdOverrides.get(meta.name) ?? meta.defaultPaneId;
529
514
  if (!activeIds.includes(paneId) && paneId !== 'main') {
530
515
  const subCfg = { ...cfg[meta.name] };
531
516
  for (const k of Object.keys(subCfg)) {
@@ -569,402 +554,61 @@ export class IndicatorScheduler {
569
554
  }
570
555
  }
571
556
  /**
572
- * MA 配置变更
573
- */
574
- updateMAConfig(config) {
575
- this.configSnapshot.ma = { ...config };
576
- this.configVersion++;
577
- this.triggerRecompute();
578
- }
579
- /**
580
- * BOLL 配置变更
581
- */
582
- updateBOLLConfig(config) {
583
- this.configSnapshot.boll = { ...this.configSnapshot.boll, ...config };
584
- this.configVersion++;
585
- this.triggerRecompute();
586
- }
587
- /**
588
- * EXPMA 配置变更
589
- */
590
- updateEXPMAConfig(config) {
591
- this.configSnapshot.expma = { ...this.configSnapshot.expma, ...config };
592
- this.configVersion++;
593
- this.triggerRecompute();
594
- }
595
- /**
596
- * ENE 配置变更
597
- */
598
- updateENEConfig(config) {
599
- this.configSnapshot.ene = { ...this.configSnapshot.ene, ...config };
600
- this.configVersion++;
601
- this.triggerRecompute();
602
- }
603
- /**
604
- * RSI 配置变更
605
- */
606
- updateRSIConfig(config, paneId) {
607
- if (paneId !== undefined) {
608
- this.configSnapshot.rsiPaneId = paneId;
609
- }
610
- this.configSnapshot.rsi = { ...this.configSnapshot.rsi, ...config };
611
- this.configVersion++;
612
- this.triggerRecompute();
613
- }
614
- /**
615
- * CCI 配置变更
616
- */
617
- updateCCIConfig(config, paneId) {
618
- if (paneId !== undefined) {
619
- this.configSnapshot.cciPaneId = paneId;
620
- }
621
- this.configSnapshot.cci = { ...this.configSnapshot.cci, ...config };
622
- this.configVersion++;
623
- this.triggerRecompute();
624
- }
625
- /**
626
- * STOCH 配置变更
627
- */
628
- updateSTOCHConfig(config, paneId) {
629
- if (paneId !== undefined) {
630
- this.configSnapshot.stochPaneId = paneId;
631
- }
632
- this.configSnapshot.stoch = { ...this.configSnapshot.stoch, ...config };
633
- this.configVersion++;
634
- this.triggerRecompute();
635
- }
636
- /**
637
- * MOM 配置变更
638
- */
639
- updateMOMConfig(config, paneId) {
640
- if (paneId !== undefined) {
641
- this.configSnapshot.momPaneId = paneId;
642
- }
643
- this.configSnapshot.mom = { ...this.configSnapshot.mom, ...config };
644
- this.configVersion++;
645
- this.triggerRecompute();
646
- }
647
- /**
648
- * WMSR 配置变更
557
+ * 通用指标配置变更入口
649
558
  */
650
- updateWMSRConfig(config, paneId) {
651
- if (paneId !== undefined) {
652
- this.configSnapshot.wmsrPaneId = paneId;
653
- }
654
- this.configSnapshot.wmsr = { ...this.configSnapshot.wmsr, ...config };
655
- this.configVersion++;
656
- this.triggerRecompute();
657
- }
658
- /**
659
- * KST 配置变更
660
- */
661
- updateKSTConfig(config, paneId) {
662
- if (paneId !== undefined) {
663
- this.configSnapshot.kstPaneId = paneId;
664
- }
665
- this.configSnapshot.kst = { ...this.configSnapshot.kst, ...config };
666
- this.configVersion++;
667
- this.triggerRecompute();
668
- }
669
- /**
670
- * FASTK 配置变更
671
- */
672
- updateFASTKConfig(config, paneId) {
673
- if (paneId !== undefined) {
674
- this.configSnapshot.fastkPaneId = paneId;
675
- }
676
- this.configSnapshot.fastk = { ...this.configSnapshot.fastk, ...config };
677
- this.configVersion++;
678
- this.triggerRecompute();
679
- }
680
- /**
681
- * MACD 配置变更
682
- */
683
- updateMACDConfig(config, paneId) {
684
- if (paneId !== undefined) {
685
- this.configSnapshot.macdPaneId = paneId;
686
- }
687
- this.configSnapshot.macd = { ...this.configSnapshot.macd, ...config };
688
- this.configVersion++;
689
- this.triggerRecompute();
690
- }
691
- /**
692
- * ATR 配置变更
693
- */
694
- updateATRConfig(config, paneId) {
695
- if (paneId !== undefined) {
696
- this.configSnapshot.atrPaneId = paneId;
697
- }
698
- this.configSnapshot.atr = { ...this.configSnapshot.atr, ...config };
699
- this.configVersion++;
700
- this.triggerRecompute();
701
- }
702
- /**
703
- * WMA 配置变更
704
- */
705
- updateWMAConfig(config, paneId) {
706
- if (paneId !== undefined) {
707
- this.configSnapshot.wmaPaneId = paneId;
708
- }
709
- this.configSnapshot.wma = { ...this.configSnapshot.wma, ...config };
710
- this.configVersion++;
711
- this.triggerRecompute();
712
- }
713
- /**
714
- * DEMA 配置变更
715
- */
716
- updateDEMAConfig(config, paneId) {
717
- if (paneId !== undefined) {
718
- this.configSnapshot.demaPaneId = paneId;
719
- }
720
- this.configSnapshot.dema = { ...this.configSnapshot.dema, ...config };
721
- this.configVersion++;
722
- this.triggerRecompute();
723
- }
724
- /**
725
- * TEMA 配置变更
726
- */
727
- updateTEMAConfig(config, paneId) {
728
- if (paneId !== undefined) {
729
- this.configSnapshot.temaPaneId = paneId;
730
- }
731
- this.configSnapshot.tema = { ...this.configSnapshot.tema, ...config };
732
- this.configVersion++;
733
- this.triggerRecompute();
734
- }
735
- /**
736
- * HMA 配置变更
737
- */
738
- updateHMAConfig(config, paneId) {
739
- if (paneId !== undefined) {
740
- this.configSnapshot.hmaPaneId = paneId;
559
+ updateIndicatorConfig(indicatorId, config, paneId) {
560
+ const meta = this.registry.get(indicatorId);
561
+ if (!meta?.runtime) {
562
+ console.warn(`[IndicatorScheduler] Unknown or unregistered indicator: ${indicatorId}`);
563
+ return;
741
564
  }
742
- this.configSnapshot.hma = { ...this.configSnapshot.hma, ...config };
743
- this.configVersion++;
744
- this.triggerRecompute();
745
- }
746
- /**
747
- * KAMA 配置变更
748
- */
749
- updateKAMAConfig(config, paneId) {
565
+ const rt = meta.runtime;
566
+ const configKey = rt.configKey ?? indicatorId;
567
+ // Update paneId if provided
750
568
  if (paneId !== undefined) {
751
- this.configSnapshot.kamaPaneId = paneId;
569
+ this.paneIdOverrides.set(indicatorId, paneId);
752
570
  }
753
- this.configSnapshot.kama = { ...this.configSnapshot.kama, ...config };
754
- this.configVersion++;
755
- this.triggerRecompute();
756
- }
757
- /**
758
- * SAR 配置变更
759
- */
760
- updateSARConfig(config, paneId) {
761
- if (paneId !== undefined) {
762
- this.configSnapshot.sarPaneId = paneId;
763
- }
764
- this.configSnapshot.sar = { ...this.configSnapshot.sar, ...config };
765
- this.configVersion++;
766
- this.triggerRecompute();
767
- }
768
- /**
769
- * SuperTrend 配置变更
770
- */
771
- updateSuperTrendConfig(config, paneId) {
772
- if (paneId !== undefined)
773
- this.configSnapshot.supertrendPaneId = paneId;
774
- this.configSnapshot.supertrend = { ...this.configSnapshot.supertrend, ...config };
775
- this.configVersion++;
776
- this.triggerRecompute();
777
- }
778
- /**
779
- * Keltner 配置变更
780
- */
781
- updateKeltnerConfig(config, paneId) {
782
- if (paneId !== undefined)
783
- this.configSnapshot.keltnerPaneId = paneId;
784
- this.configSnapshot.keltner = { ...this.configSnapshot.keltner, ...config };
785
- this.configVersion++;
786
- this.triggerRecompute();
787
- }
788
- /**
789
- * Donchian 配置变更
790
- */
791
- updateDonchianConfig(config, paneId) {
792
- if (paneId !== undefined)
793
- this.configSnapshot.donchianPaneId = paneId;
794
- this.configSnapshot.donchian = { ...this.configSnapshot.donchian, ...config };
795
- this.configVersion++;
796
- this.triggerRecompute();
797
- }
798
- /**
799
- * Ichimoku 配置变更
800
- */
801
- updateIchimokuConfig(config, paneId) {
802
- if (paneId !== undefined)
803
- this.configSnapshot.ichimokuPaneId = paneId;
804
- this.configSnapshot.ichimoku = { ...this.configSnapshot.ichimoku, ...config };
805
- this.configVersion++;
806
- this.triggerRecompute();
807
- }
808
- /**
809
- * ROC 配置变更
810
- */
811
- updateROCConfig(config, paneId) {
812
- if (paneId !== undefined)
813
- this.configSnapshot.rocPaneId = paneId;
814
- this.configSnapshot.roc = { ...this.configSnapshot.roc, ...config };
815
- this.configVersion++;
816
- this.triggerRecompute();
817
- }
818
- /**
819
- * TRIX 配置变更
820
- */
821
- updateTRIXConfig(config, paneId) {
822
- if (paneId !== undefined)
823
- this.configSnapshot.trixPaneId = paneId;
824
- this.configSnapshot.trix = { ...this.configSnapshot.trix, ...config };
825
- this.configVersion++;
826
- this.triggerRecompute();
827
- }
828
- /**
829
- * HV 配置变更
830
- */
831
- updateHVConfig(config, paneId) {
832
- if (paneId !== undefined)
833
- this.configSnapshot.hvPaneId = paneId;
834
- this.configSnapshot.hv = { ...this.configSnapshot.hv, ...config };
835
- this.configVersion++;
836
- this.triggerRecompute();
837
- }
838
- /**
839
- * Parkinson 配置变更
840
- */
841
- updateParkinsonConfig(config, paneId) {
842
- if (paneId !== undefined)
843
- this.configSnapshot.parkinsonPaneId = paneId;
844
- this.configSnapshot.parkinson = { ...this.configSnapshot.parkinson, ...config };
845
- this.configVersion++;
846
- this.triggerRecompute();
847
- }
848
- /**
849
- * ChaikinVol 配置变更
850
- */
851
- updateChaikinVolConfig(config, paneId) {
852
- if (paneId !== undefined)
853
- this.configSnapshot.chaikinVolPaneId = paneId;
854
- this.configSnapshot.chaikinVol = { ...this.configSnapshot.chaikinVol, ...config };
855
- this.configVersion++;
856
- this.triggerRecompute();
857
- }
858
- /**
859
- * VMA 配置变更
860
- */
861
- updateVMAConfig(config, paneId) {
862
- if (paneId !== undefined)
863
- this.configSnapshot.vmaPaneId = paneId;
864
- this.configSnapshot.vma = { ...this.configSnapshot.vma, ...config };
571
+ // Merge config
572
+ ;
573
+ this.configSnapshot[configKey] = {
574
+ ...(this.configSnapshot[configKey] ?? {}),
575
+ ...config,
576
+ };
865
577
  this.configVersion++;
866
578
  this.triggerRecompute();
867
579
  }
868
580
  /**
869
- * OBV 配置变更
581
+ * 设置当前激活的主图指标
870
582
  */
871
- updateOBVConfig(config, paneId) {
872
- if (paneId !== undefined)
873
- this.configSnapshot.obvPaneId = paneId;
874
- this.configSnapshot.obv = { ...this.configSnapshot.obv, ...config };
875
- this.configVersion++;
876
- this.triggerRecompute();
583
+ setActiveMainIndicators(indicators) {
584
+ this.activeMainIndicators = new Map(indicators.map(i => [i.id.toLowerCase(), i.params]));
877
585
  }
878
586
  /**
879
- * PVT 配置变更
587
+ * 获取主图指标价格范围
880
588
  */
881
- updatePVTConfig(config, paneId) {
882
- if (paneId !== undefined)
883
- this.configSnapshot.pvtPaneId = paneId;
884
- this.configSnapshot.pvt = { ...this.configSnapshot.pvt, ...config };
885
- this.configVersion++;
886
- this.triggerRecompute();
589
+ getMainIndicatorPriceRange() {
590
+ if (!this.latestResult)
591
+ return null;
592
+ const result = computeMainIndicatorPriceRange(this.latestResult, this.visibleRange, new Set(this.activeMainIndicators.keys()), (indicatorId) => this.registry.get(indicatorId));
593
+ return result;
887
594
  }
888
595
  /**
889
- * VWAP 配置变更
596
+ * 获取所有已注册的主图指标
890
597
  */
891
- updateVWAPConfig(config, paneId) {
892
- if (paneId !== undefined)
893
- this.configSnapshot.vwapPaneId = paneId;
894
- this.configSnapshot.vwap = { ...this.configSnapshot.vwap, ...config };
895
- this.configVersion++;
896
- this.triggerRecompute();
897
- }
898
- /** CMF 配置变更 */
899
- updateCMFConfig(config, paneId) {
900
- if (paneId !== undefined)
901
- this.configSnapshot.cmfPaneId = paneId;
902
- this.configSnapshot.cmf = { ...this.configSnapshot.cmf, ...config };
903
- this.configVersion++;
904
- this.triggerRecompute();
905
- }
906
- /** MFI 配置变更 */
907
- updateMFIConfig(config, paneId) {
908
- if (paneId !== undefined)
909
- this.configSnapshot.mfiPaneId = paneId;
910
- this.configSnapshot.mfi = { ...this.configSnapshot.mfi, ...config };
911
- this.configVersion++;
912
- this.triggerRecompute();
913
- }
914
- /** Pivot 配置变更 */
915
- updatePivotConfig(config, paneId) {
916
- if (paneId !== undefined)
917
- this.configSnapshot.pivotPaneId = paneId;
918
- this.configSnapshot.pivot = { ...this.configSnapshot.pivot, ...config };
919
- this.configVersion++;
920
- this.triggerRecompute();
921
- }
922
- /** Fib 配置变更 */
923
- updateFibConfig(config, paneId) {
924
- if (paneId !== undefined)
925
- this.configSnapshot.fibPaneId = paneId;
926
- this.configSnapshot.fib = { ...this.configSnapshot.fib, ...config };
927
- this.configVersion++;
928
- this.triggerRecompute();
929
- }
930
- /** Structure 配置变更 */
931
- updateStructureConfig(config, paneId) {
932
- if (paneId !== undefined)
933
- this.configSnapshot.structurePaneId = paneId;
934
- this.configSnapshot.structure = { ...this.configSnapshot.structure, ...config };
935
- this.configVersion++;
936
- this.triggerRecompute();
937
- }
938
- /** Zones 配置变更 */
939
- updateZonesConfig(config, paneId) {
940
- if (paneId !== undefined)
941
- this.configSnapshot.zonesPaneId = paneId;
942
- this.configSnapshot.zones = { ...this.configSnapshot.zones, ...config };
943
- this.configVersion++;
944
- this.triggerRecompute();
945
- }
946
- /** Volume Profile 配置变更 */
947
- updateVolumeProfileConfig(config, paneId) {
948
- if (paneId !== undefined)
949
- this.configSnapshot.volumeProfilePaneId = paneId;
950
- this.configSnapshot.volumeProfile = { ...this.configSnapshot.volumeProfile, ...config };
951
- this.configVersion++;
952
- this.triggerRecompute();
598
+ getMainIndicators() {
599
+ return this.registry.getMainIndicators();
953
600
  }
954
601
  /**
955
- * 设置当前激活的主图指标
602
+ * 检查主图指标是否激活
956
603
  */
957
- setActiveMainIndicators(indicators) {
958
- this.activeMainIndicators = new Set(indicators.map(i => i.toLowerCase()));
604
+ isMainIndicatorActive(indicatorId) {
605
+ return this.activeMainIndicators.has(indicatorId.toLowerCase());
959
606
  }
960
607
  /**
961
- * 获取主图指标价格范围
608
+ * 获取主图指标当前参数
962
609
  */
963
- getMainIndicatorPriceRange() {
964
- if (!this.latestResult)
965
- return null;
966
- const result = computeMainIndicatorPriceRange(this.latestResult, this.visibleRange, this.activeMainIndicators, (indicatorId) => this.registry.get(indicatorId));
967
- return result;
610
+ getMainIndicatorParams(indicatorId) {
611
+ return this.activeMainIndicators.get(indicatorId.toLowerCase()) ?? {};
968
612
  }
969
613
  /**
970
614
  * 强制全部重算
@@ -1024,7 +668,10 @@ export class IndicatorScheduler {
1024
668
  }
1025
669
  computeWithInline() {
1026
670
  if (!this.inlineRuntime) {
1027
- this.inlineRuntime = new IndicatorRuntime();
671
+ const runtimeDescs = this.registry.getAll()
672
+ .filter(m => m.runtime)
673
+ .map(m => m.runtime);
674
+ this.inlineRuntime = new IndicatorRuntime(runtimeDescs);
1028
675
  }
1029
676
  console.log(`[IndicatorScheduler] >> INLINE compute: dataV=${this.dataVersion} configV=${this.configVersion}`);
1030
677
  // 设置数据和配置(仅活跃副图)