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