@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.
- 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 +0 -1
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +0 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/engine/chart.d.ts +6 -2
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +26 -23
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/indicators/indicator.worker.js +32 -4
- package/dist/engine/indicators/indicator.worker.js.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts +5 -3
- 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 +54 -1
- 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 +12 -117
- package/dist/engine/indicators/indicatorRuntime.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorRuntime.js +124 -1308
- package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
- package/dist/engine/indicators/scheduler.d.ts +19 -143
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +81 -434
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
- package/dist/engine/indicators/stateComposer.js +15 -47
- package/dist/engine/indicators/stateComposer.js.map +1 -1
- package/dist/engine/indicators/workerProtocol.d.ts +12 -36
- package/dist/engine/indicators/workerProtocol.d.ts.map +1 -1
- package/dist/engine/indicators/workerProtocol.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 +11 -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 +24 -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 +12 -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 +21 -7
- 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 +20 -7
- 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 +19 -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 +20 -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 +25 -11
- 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 +22 -9
- 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 +12 -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 +26 -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 +19 -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 +18 -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 +27 -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/kama.d.ts +2 -0
- package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kama.js +19 -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 +20 -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 +13 -11
- 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 +36 -8
- 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 +20 -7
- 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 +12 -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 +19 -7
- 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 +18 -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 +43 -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 +19 -7
- 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 +20 -7
- 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 +14 -11
- 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 +18 -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 +10 -11
- 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 -8
- 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 -8
- 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 +19 -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 +30 -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 +20 -7
- 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 +28 -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 +19 -7
- 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 +19 -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 +12 -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 +24 -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 +28 -6
- 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/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 +4 -4
- package/src/controllers/__tests__/indicatorSelector.test.ts +4 -3
- package/src/controllers/createIndicatorSelectorController.ts +4 -6
- package/src/controllers/index.ts +0 -4
- package/src/engine/chart.ts +30 -22
- package/src/engine/indicators/__tests__/registerBuiltins.test.ts +14 -23
- package/src/engine/indicators/__tests__/scheduler.test.ts +14 -14
- package/src/engine/indicators/__tests__/stateComposer.test.ts +7 -4
- package/src/engine/indicators/indicator.worker.ts +36 -4
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +38 -3
- package/src/engine/indicators/indicatorMetadata.ts +66 -1
- package/src/engine/indicators/indicatorRuntime.ts +121 -1447
- package/src/engine/indicators/scheduler.ts +85 -489
- package/src/engine/indicators/stateComposer.ts +16 -60
- package/src/engine/indicators/workerProtocol.ts +14 -36
- package/src/engine/renderers/Indicator/atr.ts +14 -11
- package/src/engine/renderers/Indicator/boll.ts +33 -10
- package/src/engine/renderers/Indicator/cci.ts +15 -14
- package/src/engine/renderers/Indicator/chaikinVol.ts +29 -7
- package/src/engine/renderers/Indicator/cmf.ts +28 -7
- package/src/engine/renderers/Indicator/dema.ts +28 -9
- package/src/engine/renderers/Indicator/donchian.ts +28 -9
- package/src/engine/renderers/Indicator/ene.ts +34 -11
- package/src/engine/renderers/Indicator/expma.ts +31 -9
- package/src/engine/renderers/Indicator/fastk.ts +15 -14
- package/src/engine/renderers/Indicator/fib.ts +29 -9
- package/src/engine/renderers/Indicator/hma.ts +28 -9
- package/src/engine/renderers/Indicator/hv.ts +27 -8
- package/src/engine/renderers/Indicator/ichimoku.ts +31 -9
- package/src/engine/renderers/Indicator/index.ts +27 -28
- package/src/engine/renderers/Indicator/kama.ts +28 -9
- package/src/engine/renderers/Indicator/keltner.ts +28 -9
- package/src/engine/renderers/Indicator/kst.ts +16 -19
- package/src/engine/renderers/Indicator/ma.ts +44 -9
- package/src/engine/renderers/Indicator/macd.ts +31 -36
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +43 -162
- package/src/engine/renderers/Indicator/mfi.ts +28 -7
- package/src/engine/renderers/Indicator/mom.ts +15 -14
- package/src/engine/renderers/Indicator/obv.ts +27 -7
- package/src/engine/renderers/Indicator/parkinson.ts +27 -8
- package/src/engine/renderers/Indicator/pivot.ts +47 -9
- package/src/engine/renderers/Indicator/pvt.ts +27 -7
- package/src/engine/renderers/Indicator/roc.ts +29 -7
- package/src/engine/renderers/Indicator/rsi.ts +14 -17
- package/src/engine/renderers/Indicator/sar.ts +26 -9
- package/src/engine/renderers/Indicator/stoch.ts +13 -16
- package/src/engine/renderers/Indicator/structure.ts +31 -8
- package/src/engine/renderers/Indicator/supertrend.ts +26 -9
- package/src/engine/renderers/Indicator/tema.ts +28 -9
- package/src/engine/renderers/Indicator/trix.ts +39 -8
- package/src/engine/renderers/Indicator/vma.ts +28 -7
- package/src/engine/renderers/Indicator/volumeProfile.ts +40 -8
- package/src/engine/renderers/Indicator/vwap.ts +27 -7
- package/src/engine/renderers/Indicator/wma.ts +28 -9
- package/src/engine/renderers/Indicator/wmsr.ts +15 -14
- package/src/engine/renderers/Indicator/zones.ts +29 -9
- package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +142 -79
- package/src/engine/renderers/paneTitle.ts +43 -18
- package/src/engine/renderers/subVolume.ts +0 -2
- package/src/version.ts +1 -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/macdLegend.ts +0 -141
- package/src/engine/renderers/Indicator/subPaneConfig.ts +0 -265
|
@@ -6,8 +6,9 @@ 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
|
+
import { calcENEData } from '../../indicators/calculators'
|
|
11
12
|
|
|
12
13
|
type LinePoint = { x: number; y: number }
|
|
13
14
|
|
|
@@ -93,7 +94,7 @@ function drawENEWithWebGL(
|
|
|
93
94
|
* 3. 配置变更通过外部 IndicatorScheduler 处理
|
|
94
95
|
* 4. 纯绘制函数,无副作用
|
|
95
96
|
*/
|
|
96
|
-
function getENEStateKey(host: PluginHost | null): string | null {
|
|
97
|
+
export function getENEStateKey(host: PluginHost | null): string | null {
|
|
97
98
|
const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
|
|
98
99
|
if (!scheduler) {
|
|
99
100
|
console.warn('[ENERenderer] Scheduler not available via service locator')
|
|
@@ -279,20 +280,46 @@ export function createENERendererPlugin(): RendererPluginWithHost {
|
|
|
279
280
|
* 设置配置(兼容性接口,无实际操作)
|
|
280
281
|
*
|
|
281
282
|
* 重要:本渲染器为无状态设计,不持有配置。
|
|
282
|
-
* 配置变更应通过外部控制器调用 IndicatorScheduler.
|
|
283
|
+
* 配置变更应通过外部控制器调用 IndicatorScheduler.updateIndicatorConfig() 完成。
|
|
283
284
|
*/
|
|
284
285
|
setConfig(_newConfig: Record<string, unknown>) {
|
|
285
286
|
// 无状态渲染器不存储配置
|
|
286
|
-
// 外部控制器应调用 chart.getIndicatorScheduler().
|
|
287
|
+
// 外部控制器应调用 chart.getIndicatorScheduler().updateIndicatorConfig()
|
|
287
288
|
},
|
|
288
289
|
}
|
|
289
290
|
}
|
|
290
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
|
+
|
|
291
319
|
@Indicator({
|
|
292
320
|
name: 'ene',
|
|
293
321
|
displayName: 'ENE',
|
|
294
322
|
category: 'main',
|
|
295
|
-
stateKey: ENE_STATE_KEY,
|
|
296
323
|
defaultPaneId: 'main',
|
|
297
324
|
mainPane: {
|
|
298
325
|
rendererName: 'ene',
|
|
@@ -300,9 +327,6 @@ export function createENERendererPlugin(): RendererPluginWithHost {
|
|
|
300
327
|
computePriceRange: computeENEPriceRange,
|
|
301
328
|
composeRenderState: composeENERenderState,
|
|
302
329
|
},
|
|
303
|
-
updateConfig: (scheduler, params) => {
|
|
304
|
-
(scheduler as IndicatorScheduler).updateENEConfig(params as Partial<ENESchedulerConfig>)
|
|
305
|
-
},
|
|
306
330
|
semantic: {
|
|
307
331
|
apply: (chart, indicator) => {
|
|
308
332
|
const params = (indicator as { params?: { period?: number; deviation?: number } }).params
|
|
@@ -312,9 +336,8 @@ export function createENERendererPlugin(): RendererPluginWithHost {
|
|
|
312
336
|
})
|
|
313
337
|
},
|
|
314
338
|
},
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
},
|
|
339
|
+
runtime: { defaultConfig:{period:10,deviation:11}, computeKey:'calcENEData', compute:(data,c)=>calcENEData(data,c.period,c.deviation) },
|
|
340
|
+
getTitleInfo: getENETitleInfo,
|
|
318
341
|
})
|
|
319
342
|
class ENEDefinition {
|
|
320
343
|
static rendererFactory = createENERendererPlugin
|
|
@@ -6,8 +6,9 @@ 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
|
+
import { calcEXPMAData } from '../../indicators/calculators'
|
|
11
12
|
|
|
12
13
|
type LinePoint = { x: number; y: number }
|
|
13
14
|
|
|
@@ -33,7 +34,7 @@ function buildEXPMACacheKey(
|
|
|
33
34
|
].join('|')
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
function getEXPMAStateKey(host: PluginHost | null): string | null {
|
|
37
|
+
export function getEXPMAStateKey(host: PluginHost | null): string | null {
|
|
37
38
|
const scheduler = host?.getService<IndicatorScheduler>('indicatorScheduler')
|
|
38
39
|
if (!scheduler) {
|
|
39
40
|
console.warn('[EXPMARenderer] Scheduler not available via service locator')
|
|
@@ -214,11 +215,36 @@ export function createEXPMARendererPlugin(): RendererPluginWithHost {
|
|
|
214
215
|
}
|
|
215
216
|
}
|
|
216
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
|
+
|
|
217
244
|
@Indicator({
|
|
218
245
|
name: 'expma',
|
|
219
246
|
displayName: 'EXPMA',
|
|
220
247
|
category: 'main',
|
|
221
|
-
stateKey: EXPMA_STATE_KEY,
|
|
222
248
|
defaultPaneId: 'main',
|
|
223
249
|
mainPane: {
|
|
224
250
|
rendererName: 'expma',
|
|
@@ -226,9 +252,6 @@ export function createEXPMARendererPlugin(): RendererPluginWithHost {
|
|
|
226
252
|
computePriceRange: computeEXPMAPriceRange,
|
|
227
253
|
composeRenderState: composeEXPMARenderState,
|
|
228
254
|
},
|
|
229
|
-
updateConfig: (scheduler, params) => {
|
|
230
|
-
(scheduler as IndicatorScheduler).updateEXPMAConfig(params as Partial<EXPMASchedulerConfig>)
|
|
231
|
-
},
|
|
232
255
|
semantic: {
|
|
233
256
|
apply: (chart, indicator) => {
|
|
234
257
|
const params = (indicator as { params?: { fastPeriod?: number; slowPeriod?: number } }).params
|
|
@@ -238,9 +261,8 @@ export function createEXPMARendererPlugin(): RendererPluginWithHost {
|
|
|
238
261
|
})
|
|
239
262
|
},
|
|
240
263
|
},
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
},
|
|
264
|
+
runtime: { defaultConfig:{fastPeriod:12,slowPeriod:50}, computeKey:'calcEXPMAData', compute:(data,c)=>calcEXPMAData(data,c.fastPeriod,c.slowPeriod) },
|
|
265
|
+
getTitleInfo: getEXPMATitleInfo,
|
|
244
266
|
})
|
|
245
267
|
class EXPMADefinition {
|
|
246
268
|
static rendererFactory = createEXPMARendererPlugin
|
|
@@ -9,6 +9,8 @@ import { createFixedRangeSparseVisibleStateComposer } from '../../indicators/vis
|
|
|
9
9
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
10
10
|
import type { IndicatorScheduler, FASTKSchedulerConfig } from '../../indicators/scheduler'
|
|
11
11
|
import { createFastkScaleRendererPlugin } from './scale/fastk_scale'
|
|
12
|
+
import { calcFASTKData } from '../../indicators/calculators'
|
|
13
|
+
import type { KLineData } from '../../../types/price'
|
|
12
14
|
|
|
13
15
|
type LinePoint = { x: number; y: number }
|
|
14
16
|
|
|
@@ -243,7 +245,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
|
|
|
243
245
|
},
|
|
244
246
|
|
|
245
247
|
setConfig() {
|
|
246
|
-
// no-op: 配置通过 scheduler.
|
|
248
|
+
// no-op: 配置通过 scheduler.updateIndicatorConfig() 更新
|
|
247
249
|
},
|
|
248
250
|
}
|
|
249
251
|
}
|
|
@@ -280,14 +282,15 @@ function drawFASTKLineWithCanvas2D(
|
|
|
280
282
|
* 获取 FASTK 标题信息(供 paneTitle 使用)
|
|
281
283
|
*/
|
|
282
284
|
export function getFASTKTitleInfo(
|
|
283
|
-
|
|
284
|
-
|
|
285
|
+
_data: KLineData[],
|
|
286
|
+
index: number | null,
|
|
287
|
+
params: Record<string, number | boolean | string>,
|
|
285
288
|
pluginHost: PluginHost,
|
|
286
|
-
paneId: string
|
|
287
|
-
theme: 'light' | 'dark' = 'light',
|
|
288
|
-
isAsiaMarket?: boolean
|
|
289
|
+
paneId: string,
|
|
289
290
|
): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
|
|
290
|
-
|
|
291
|
+
if (index === null) return null
|
|
292
|
+
const period = (params.period as number) ?? 9
|
|
293
|
+
const colors = resolveThemeColors('light')
|
|
291
294
|
const state = pluginHost.getSharedState<FASTKRenderState>(createFASTKStateKey(paneId))
|
|
292
295
|
if (!state) return null
|
|
293
296
|
|
|
@@ -307,16 +310,14 @@ export function getFASTKTitleInfo(
|
|
|
307
310
|
name: 'fastk',
|
|
308
311
|
displayName: 'FASTK',
|
|
309
312
|
category: 'oscillator',
|
|
310
|
-
stateKey: createFASTKStateKey,
|
|
311
313
|
defaultPaneId: 'sub_FASTK',
|
|
312
|
-
paneIdField: 'fastkPaneId',
|
|
313
314
|
visibleState: { compose: createFixedRangeSparseVisibleStateComposer('fastk', EMPTY_FASTK_STATE) },
|
|
314
315
|
scaleRendererFactory: createFastkScaleRendererPlugin,
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
316
|
+
getTitleInfo: getFASTKTitleInfo,
|
|
317
|
+
runtime: {
|
|
318
|
+
defaultConfig: { period: 9, showFASTK: true },
|
|
319
|
+
computeKey: 'calcFASTKData',
|
|
320
|
+
compute: (data, c) => calcFASTKData(data, c.period),
|
|
320
321
|
},
|
|
321
322
|
})
|
|
322
323
|
class FASTKIndicatorDefinition {
|
|
@@ -3,9 +3,10 @@ import { RENDERER_PRIORITY } from '../../../plugin'
|
|
|
3
3
|
import type { FibRenderState } from '../../indicators/fibState'
|
|
4
4
|
import { createFibStateKey, EMPTY_FIB_STATE } from '../../indicators/fibState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
|
-
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
6
|
+
import { resolveStateKey, type TitleInfo, type TitleValueItem, type GetTitleInfoFn } from '../../indicators/indicatorMetadata'
|
|
7
7
|
import type { IndicatorScheduler, FibSchedulerConfig } from '../../indicators/scheduler'
|
|
8
8
|
import { createExactRangePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
9
|
+
import { calcFibData } from '../../indicators/calculators'
|
|
9
10
|
|
|
10
11
|
const FIB_COLORS = {
|
|
11
12
|
high: '#94a3b8',
|
|
@@ -125,23 +126,42 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
|
|
|
125
126
|
ctx.stroke()
|
|
126
127
|
}
|
|
127
128
|
|
|
129
|
+
export const getFibTitleInfo: GetTitleInfoFn = (_data, index, _params, host, paneId) => {
|
|
130
|
+
if (index === null || index < 0) return null
|
|
131
|
+
|
|
132
|
+
const stateKey = createFibStateKey(paneId)
|
|
133
|
+
const state = host?.getSharedState<FibRenderState>(stateKey)
|
|
134
|
+
if (!state) return null
|
|
135
|
+
|
|
136
|
+
const p = state.series[index]
|
|
137
|
+
if (!p) return null
|
|
138
|
+
|
|
139
|
+
const values: TitleValueItem[] = [
|
|
140
|
+
{ label: '236', value: p.level236, color: FIB_COLORS.l236 },
|
|
141
|
+
{ label: '382', value: p.level382, color: FIB_COLORS.l382 },
|
|
142
|
+
{ label: '500', value: p.level500, color: FIB_COLORS.l500 },
|
|
143
|
+
{ label: '618', value: p.level618, color: FIB_COLORS.l618 },
|
|
144
|
+
{ label: '786', value: p.level786, color: FIB_COLORS.l786 },
|
|
145
|
+
]
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
name: 'Fib',
|
|
149
|
+
params: [state.params.period],
|
|
150
|
+
values,
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
128
154
|
@Indicator({
|
|
129
155
|
name: 'fib',
|
|
130
156
|
displayName: 'Fib',
|
|
157
|
+
getTitleInfo: getFibTitleInfo,
|
|
131
158
|
category: 'main',
|
|
132
|
-
stateKey: createFibStateKey,
|
|
133
159
|
defaultPaneId: 'main',
|
|
134
|
-
paneIdField: 'fibPaneId',
|
|
135
160
|
allowMainPane: true,
|
|
136
161
|
mainPane: { rendererName: 'fib_main', toActiveConfig: (params, active) => ({ ...params, showLevels: active }) },
|
|
137
162
|
scale: { indicatorKey: 'fib', label: 'Fib', decimals: 4 },
|
|
138
163
|
visibleState: { compose: createExactRangePointVisibleStateComposer('fib', EMPTY_FIB_STATE, ['low', 'high']) },
|
|
139
|
-
|
|
140
|
-
(scheduler as IndicatorScheduler).updateFibConfig(params as Partial<FibSchedulerConfig>, paneId)
|
|
141
|
-
},
|
|
142
|
-
applyResult: (host, state, paneId) => {
|
|
143
|
-
host.setSharedState(createFibStateKey(paneId), state as any, 'indicator_scheduler')
|
|
144
|
-
},
|
|
164
|
+
runtime: { defaultConfig:{period:50,showLevels:true}, computeKey:'calcFibData', compute:(data,c)=>calcFibData(data,c.period) },
|
|
145
165
|
})
|
|
146
166
|
class FibDefinition {
|
|
147
167
|
static rendererFactory = createFibRendererPlugin
|
|
@@ -1,11 +1,13 @@
|
|
|
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 { HMARenderState } from '../../indicators/hmaState'
|
|
4
5
|
import { createHMAStateKey, EMPTY_HMA_STATE } from '../../indicators/hmaState'
|
|
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, HMASchedulerConfig } from '../../indicators/scheduler'
|
|
10
|
+
import { calcHMAData } from '../../indicators/calculators'
|
|
9
11
|
|
|
10
12
|
const HMA_COLOR = '#f43f5e'
|
|
11
13
|
|
|
@@ -120,23 +122,40 @@ export function createHMARendererPlugin(options: HMARendererOptions = {}): Rende
|
|
|
120
122
|
}
|
|
121
123
|
}
|
|
122
124
|
|
|
125
|
+
export const getHMATitleInfo: 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 = createHMAStateKey(paneId)
|
|
135
|
+
const state = pluginHost?.getSharedState<HMARenderState>(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: 'HMA',
|
|
143
|
+
params: [state.params.period],
|
|
144
|
+
values: [{ label: 'HMA', value, color: '#f43f5e' }],
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
123
148
|
@Indicator({
|
|
124
149
|
name: 'hma',
|
|
125
150
|
displayName: 'HMA',
|
|
151
|
+
getTitleInfo: getHMATitleInfo,
|
|
126
152
|
category: 'main',
|
|
127
|
-
stateKey: createHMAStateKey,
|
|
128
153
|
defaultPaneId: 'main',
|
|
129
|
-
paneIdField: 'hmaPaneId',
|
|
130
154
|
allowMainPane: true,
|
|
131
155
|
mainPane: { rendererName: 'hma_main', toActiveConfig: (params, active) => ({ ...params, showHMA: active }) },
|
|
132
156
|
visibleState: { compose: createSparseVisibleStateComposer('hma', EMPTY_HMA_STATE) },
|
|
133
157
|
scale: { indicatorKey: 'hma', label: 'HMA', decimals: 2 },
|
|
134
|
-
|
|
135
|
-
(scheduler as IndicatorScheduler).updateHMAConfig(params as Partial<HMASchedulerConfig>, paneId)
|
|
136
|
-
},
|
|
137
|
-
applyResult: (host, state, paneId) => {
|
|
138
|
-
host.setSharedState(createHMAStateKey(paneId), state as any, 'indicator_scheduler')
|
|
139
|
-
},
|
|
158
|
+
runtime: { defaultConfig:{period:14,showHMA:true}, computeKey:'calcHMAData', compute:(data,c)=>calcHMAData(data,c.period) },
|
|
140
159
|
})
|
|
141
160
|
class HMADefinition {
|
|
142
161
|
static rendererFactory = createHMARendererPlugin
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
|
+
import { resolveThemeColors } from '../../../tokens'
|
|
3
4
|
import type { HVRenderState } from '../../indicators/hvState'
|
|
4
5
|
import { createHVStateKey } from '../../indicators/hvState'
|
|
5
6
|
import { EMPTY_HV_STATE } from '../../indicators/hvState'
|
|
@@ -7,6 +8,9 @@ import { createNonNegativeSparseVisibleStateComposer } from '../../indicators/vi
|
|
|
7
8
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
8
9
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
9
10
|
import type { IndicatorScheduler, HVSchedulerConfig } from '../../indicators/scheduler'
|
|
11
|
+
import { calcHVData } from '../../indicators/calculators'
|
|
12
|
+
import type { TitleInfo } from '../../indicators/indicatorMetadata'
|
|
13
|
+
import type { KLineData } from '../../../types/price'
|
|
10
14
|
|
|
11
15
|
const HV_COLOR = '#7c3aed'
|
|
12
16
|
|
|
@@ -110,21 +114,36 @@ export function createHVRendererPlugin(options: { paneId?: string } = {}): Rende
|
|
|
110
114
|
}
|
|
111
115
|
}
|
|
112
116
|
|
|
117
|
+
export function getHVTitleInfo(
|
|
118
|
+
_data: KLineData[],
|
|
119
|
+
index: number | null,
|
|
120
|
+
params: Record<string, number | boolean | string>,
|
|
121
|
+
host: PluginHost,
|
|
122
|
+
paneId: string,
|
|
123
|
+
): TitleInfo | null {
|
|
124
|
+
if (index === null) return null
|
|
125
|
+
const period = (params.period as number) ?? 20
|
|
126
|
+
const annualizationFactor = (params.annualizationFactor as number) ?? 252
|
|
127
|
+
const state = host.getSharedState<HVRenderState>(createHVStateKey(paneId))
|
|
128
|
+
const value = state?.series[index]
|
|
129
|
+
if (value === undefined) return null
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
name: 'HV',
|
|
133
|
+
params: [period, annualizationFactor],
|
|
134
|
+
values: [{ label: 'HV', value, color: HV_COLOR }],
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
113
138
|
@Indicator({
|
|
114
139
|
name: 'hv',
|
|
115
140
|
displayName: 'HV',
|
|
116
141
|
category: 'oscillator',
|
|
117
|
-
stateKey: createHVStateKey,
|
|
118
142
|
defaultPaneId: 'sub_HV',
|
|
119
|
-
paneIdField: 'hvPaneId',
|
|
120
143
|
scale: { indicatorKey: 'hv', label: 'HV', decimals: 2 },
|
|
121
|
-
|
|
122
|
-
(scheduler as IndicatorScheduler).updateHVConfig(params as Partial<HVSchedulerConfig>, paneId)
|
|
123
|
-
},
|
|
144
|
+
getTitleInfo: getHVTitleInfo,
|
|
124
145
|
visibleState: { compose: createNonNegativeSparseVisibleStateComposer('hv', EMPTY_HV_STATE) },
|
|
125
|
-
|
|
126
|
-
host.setSharedState(createHVStateKey(paneId), state as any, 'indicator_scheduler')
|
|
127
|
-
},
|
|
146
|
+
runtime: { defaultConfig:{period:20,annualizationFactor:252,showHV:true}, computeKey:'calcHVData', compute:(data,c)=>calcHVData(data,c.period,c.annualizationFactor) },
|
|
128
147
|
})
|
|
129
148
|
class HVIndicatorDefinition {
|
|
130
149
|
static rendererFactory = createHVRendererPlugin
|
|
@@ -1,10 +1,12 @@
|
|
|
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 { IchimokuRenderState } from '../../indicators/ichimokuState'
|
|
4
5
|
import { createIchimokuStateKey, EMPTY_ICHIMOKU_STATE } from '../../indicators/ichimokuState'
|
|
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 type { IndicatorScheduler, IchimokuSchedulerConfig } from '../../indicators/scheduler'
|
|
9
|
+
import { calcIchimokuData } from '../../indicators/calculators'
|
|
8
10
|
import { createValuePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
9
11
|
|
|
10
12
|
const TENKAN_COLOR = '#dc2626'
|
|
@@ -166,23 +168,43 @@ function fillCloud(
|
|
|
166
168
|
}
|
|
167
169
|
}
|
|
168
170
|
|
|
171
|
+
export function getIchimokuTitleInfo(
|
|
172
|
+
_data: KLineData[],
|
|
173
|
+
index: number | null,
|
|
174
|
+
params: Record<string, number | boolean | string>,
|
|
175
|
+
host: PluginHost,
|
|
176
|
+
paneId: string,
|
|
177
|
+
): TitleInfo | null {
|
|
178
|
+
if (index === null) return null
|
|
179
|
+
const state = host.getSharedState<IchimokuRenderState>(createIchimokuStateKey(paneId))
|
|
180
|
+
const p = state?.series[index]
|
|
181
|
+
if (!p) return null
|
|
182
|
+
|
|
183
|
+
const values: TitleValueItem[] = []
|
|
184
|
+
if (p.tenkan !== undefined) values.push({ label: 'Tenkan', value: p.tenkan, color: '#dc2626' })
|
|
185
|
+
if (p.kijun !== undefined) values.push({ label: 'Kijun', value: p.kijun, color: '#2563eb' })
|
|
186
|
+
if (p.spanA !== undefined) values.push({ label: 'SpanA', value: p.spanA, color: '#16a34a' })
|
|
187
|
+
if (p.spanB !== undefined) values.push({ label: 'SpanB', value: p.spanB, color: '#dc2626' })
|
|
188
|
+
if (p.chikou !== undefined) values.push({ label: 'Chikou', value: p.chikou, color: '#7c3aed' })
|
|
189
|
+
|
|
190
|
+
return {
|
|
191
|
+
name: 'Ichimoku',
|
|
192
|
+
params: [(params.tenkanPeriod as number) ?? 9, (params.kijunPeriod as number) ?? 26, (params.spanBPeriod as number) ?? 52, (params.displacement as number) ?? 26],
|
|
193
|
+
values,
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
169
197
|
@Indicator({
|
|
170
198
|
name: 'ichimoku',
|
|
171
199
|
displayName: 'Ichimoku',
|
|
200
|
+
getTitleInfo: getIchimokuTitleInfo,
|
|
172
201
|
category: 'main',
|
|
173
|
-
stateKey: createIchimokuStateKey,
|
|
174
202
|
defaultPaneId: 'main',
|
|
175
|
-
paneIdField: 'ichimokuPaneId',
|
|
176
203
|
allowMainPane: true,
|
|
177
204
|
mainPane: { rendererName: 'ichimoku_main', toActiveConfig: (params, active) => ({ ...params, showTenkan: active, showKijun: active, showSpanA: active, showSpanB: active, showChikou: active, showCloud: active }) },
|
|
178
205
|
scale: { indicatorKey: 'ichimoku', label: 'Ichimoku', decimals: 2 },
|
|
179
206
|
visibleState: { compose: createValuePointVisibleStateComposer('ichimoku', EMPTY_ICHIMOKU_STATE, ['tenkan', 'kijun', 'spanA', 'spanB', 'chikou']) },
|
|
180
|
-
|
|
181
|
-
(scheduler as IndicatorScheduler).updateIchimokuConfig(params as Partial<IchimokuSchedulerConfig>, paneId)
|
|
182
|
-
},
|
|
183
|
-
applyResult: (host, state, paneId) => {
|
|
184
|
-
host.setSharedState(createIchimokuStateKey(paneId), state as any, 'indicator_scheduler')
|
|
185
|
-
},
|
|
207
|
+
runtime: { defaultConfig:{tenkanPeriod:9,kijunPeriod:26,spanBPeriod:52,displacement:26,showTenkan:true,showKijun:true,showSpanA:true,showSpanB:true,showCloud:true,showChikou:true}, computeKey:'calcIchimokuData', compute:(data,c)=>calcIchimokuData(data,c.tenkanPeriod,c.kijunPeriod,c.spanBPeriod,c.displacement) },
|
|
186
208
|
})
|
|
187
209
|
class IchimokuDefinition {
|
|
188
210
|
static rendererFactory = createIchimokuRendererPlugin
|
|
@@ -6,7 +6,7 @@ import type { RendererPlugin } from '../../../plugin'
|
|
|
6
6
|
import type { IndicatorMetadata } from '../../indicators/indicatorMetadata'
|
|
7
7
|
|
|
8
8
|
// MA 均线
|
|
9
|
-
export { createMARendererPlugin, type MAFlags } from './ma'
|
|
9
|
+
export { createMARendererPlugin, type MAFlags, getMATitleInfo } from './ma'
|
|
10
10
|
|
|
11
11
|
// BOLL 布林带
|
|
12
12
|
export { createBOLLRendererPlugin } from './boll'
|
|
@@ -22,7 +22,6 @@ export { createMainIndicatorLegendRendererPlugin } from './mainIndicatorLegend'
|
|
|
22
22
|
|
|
23
23
|
// MACD
|
|
24
24
|
export { createMACDRendererPlugin, calcMACDAtIndex, type MACDConfig, type MACDRendererOptions, getMACDTitleInfo } from './macd'
|
|
25
|
-
export { createMACDLegendRendererPlugin, type MACDLegendOptions } from './macdLegend'
|
|
26
25
|
|
|
27
26
|
// RSI 相对强弱指标
|
|
28
27
|
export { createRSIRendererPlugin, type RSIRendererOptions, getRSITitleInfo } from './rsi'
|
|
@@ -49,57 +48,57 @@ export { createFASTKRendererPlugin, type FASTKRendererOptions, getFASTKTitleInfo
|
|
|
49
48
|
export { createATRRendererPlugin, type ATRRendererOptions, getATRTitleInfo } from './atr'
|
|
50
49
|
|
|
51
50
|
// WMA 加权移动平均
|
|
52
|
-
export { createWMARendererPlugin } from './wma'
|
|
51
|
+
export { createWMARendererPlugin, getWMATitleInfo } from './wma'
|
|
53
52
|
// DEMA 双指数移动平均
|
|
54
|
-
export { createDEMARendererPlugin } from './dema'
|
|
53
|
+
export { createDEMARendererPlugin, getDEMATitleInfo } from './dema'
|
|
55
54
|
// TEMA 三指数移动平均
|
|
56
|
-
export { createTEMARendererPlugin } from './tema'
|
|
55
|
+
export { createTEMARendererPlugin, getTEMATitleInfo } from './tema'
|
|
57
56
|
// HMA 赫尔移动平均
|
|
58
|
-
export { createHMARendererPlugin } from './hma'
|
|
57
|
+
export { createHMARendererPlugin, getHMATitleInfo } from './hma'
|
|
59
58
|
// KAMA 考夫曼自适应移动平均
|
|
60
|
-
export { createKAMARendererPlugin } from './kama'
|
|
59
|
+
export { createKAMARendererPlugin, getKAMATitleInfo } from './kama'
|
|
61
60
|
// SAR 抛物线转向
|
|
62
|
-
export { createSARRendererPlugin } from './sar'
|
|
61
|
+
export { createSARRendererPlugin, getSARTitleInfo } from './sar'
|
|
63
62
|
// SuperTrend 超级趋势
|
|
64
|
-
export { createSuperTrendRendererPlugin } from './supertrend'
|
|
63
|
+
export { createSuperTrendRendererPlugin, getSuperTrendTitleInfo } from './supertrend'
|
|
65
64
|
// Keltner 肯特纳通道
|
|
66
|
-
export { createKeltnerRendererPlugin } from './keltner'
|
|
65
|
+
export { createKeltnerRendererPlugin, getKeltnerTitleInfo } from './keltner'
|
|
67
66
|
// Donchian 唐奇安通道
|
|
68
|
-
export { createDonchianRendererPlugin } from './donchian'
|
|
67
|
+
export { createDonchianRendererPlugin, getDonchianTitleInfo } from './donchian'
|
|
69
68
|
// Ichimoku 一目均衡表
|
|
70
|
-
export { createIchimokuRendererPlugin } from './ichimoku'
|
|
69
|
+
export { createIchimokuRendererPlugin, getIchimokuTitleInfo } from './ichimoku'
|
|
71
70
|
// ROC 变化率
|
|
72
|
-
export { createROCRendererPlugin } from './roc'
|
|
71
|
+
export { createROCRendererPlugin, getROCTitleInfo } from './roc'
|
|
73
72
|
// TRIX 三重指数平滑平均
|
|
74
|
-
export { createTRIXRendererPlugin } from './trix'
|
|
73
|
+
export { createTRIXRendererPlugin, getTRIXTitleInfo } from './trix'
|
|
75
74
|
// HV 历史波动率
|
|
76
|
-
export { createHVRendererPlugin } from './hv'
|
|
75
|
+
export { createHVRendererPlugin, getHVTitleInfo } from './hv'
|
|
77
76
|
// Parkinson 帕金森波动率
|
|
78
|
-
export { createParkinsonRendererPlugin } from './parkinson'
|
|
77
|
+
export { createParkinsonRendererPlugin, getParkinsonTitleInfo } from './parkinson'
|
|
79
78
|
// Chaikin Vol 蔡金波动率
|
|
80
|
-
export { createChaikinVolRendererPlugin } from './chaikinVol'
|
|
79
|
+
export { createChaikinVolRendererPlugin, getChaikinVolTitleInfo } from './chaikinVol'
|
|
81
80
|
// VMA 成交量移动平均
|
|
82
|
-
export { createVMARendererPlugin } from './vma'
|
|
81
|
+
export { createVMARendererPlugin, getVMATitleInfo } from './vma'
|
|
83
82
|
// OBV 能量潮
|
|
84
|
-
export { createOBVRendererPlugin } from './obv'
|
|
83
|
+
export { createOBVRendererPlugin, getOBVTitleInfo } from './obv'
|
|
85
84
|
// PVT 价量趋势
|
|
86
|
-
export { createPVTRendererPlugin } from './pvt'
|
|
85
|
+
export { createPVTRendererPlugin, getPVTTitleInfo } from './pvt'
|
|
87
86
|
// VWAP 成交量加权均价
|
|
88
|
-
export { createVWAPRendererPlugin } from './vwap'
|
|
87
|
+
export { createVWAPRendererPlugin, getVWAPTitleInfo } from './vwap'
|
|
89
88
|
// CMF 蔡金资金流
|
|
90
|
-
export { createCMFRendererPlugin } from './cmf'
|
|
89
|
+
export { createCMFRendererPlugin, getCMFTitleInfo } from './cmf'
|
|
91
90
|
// MFI 资金流量指数
|
|
92
|
-
export { createMFIRendererPlugin } from './mfi'
|
|
91
|
+
export { createMFIRendererPlugin, getMFITitleInfo } from './mfi'
|
|
93
92
|
// Pivot Points 枢轴点
|
|
94
|
-
export { createPivotRendererPlugin } from './pivot'
|
|
93
|
+
export { createPivotRendererPlugin, getPivotTitleInfo } from './pivot'
|
|
95
94
|
// Fibonacci 斐波那契
|
|
96
|
-
export { createFibRendererPlugin } from './fib'
|
|
95
|
+
export { createFibRendererPlugin, getFibTitleInfo } from './fib'
|
|
97
96
|
// SMC Structure 结构
|
|
98
|
-
export { createStructureRendererPlugin } from './structure'
|
|
97
|
+
export { createStructureRendererPlugin, getStructureTitleInfo } from './structure'
|
|
99
98
|
// SMC Zones 区域
|
|
100
|
-
export { createZonesRendererPlugin } from './zones'
|
|
99
|
+
export { createZonesRendererPlugin, getZonesTitleInfo } from './zones'
|
|
101
100
|
// Volume Profile 成交量分布
|
|
102
|
-
export { createVolumeProfileRendererPlugin } from './volumeProfile'
|
|
101
|
+
export { createVolumeProfileRendererPlugin, getVolumeProfileTitleInfo } from './volumeProfile'
|
|
103
102
|
|
|
104
103
|
/**
|
|
105
104
|
* 副图指标类型
|
|
@@ -1,11 +1,13 @@
|
|
|
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 { KAMARenderState } from '../../indicators/kamaState'
|
|
4
5
|
import { createKAMAStateKey, EMPTY_KAMA_STATE } from '../../indicators/kamaState'
|
|
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, KAMASchedulerConfig } from '../../indicators/scheduler'
|
|
10
|
+
import { calcKAMAData } from '../../indicators/calculators'
|
|
9
11
|
|
|
10
12
|
const KAMA_COLOR = '#0ea5e9'
|
|
11
13
|
|
|
@@ -120,23 +122,40 @@ export function createKAMARendererPlugin(options: KAMARendererOptions = {}): Ren
|
|
|
120
122
|
}
|
|
121
123
|
}
|
|
122
124
|
|
|
125
|
+
export const getKAMATitleInfo: 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 = createKAMAStateKey(paneId)
|
|
135
|
+
const state = pluginHost?.getSharedState<KAMARenderState>(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: 'KAMA',
|
|
143
|
+
params: [state.params.period, state.params.fastPeriod, state.params.slowPeriod],
|
|
144
|
+
values: [{ label: 'KAMA', value, color: '#0ea5e9' }],
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
123
148
|
@Indicator({
|
|
124
149
|
name: 'kama',
|
|
125
150
|
displayName: 'KAMA',
|
|
151
|
+
getTitleInfo: getKAMATitleInfo,
|
|
126
152
|
category: 'main',
|
|
127
|
-
stateKey: createKAMAStateKey,
|
|
128
153
|
defaultPaneId: 'main',
|
|
129
|
-
paneIdField: 'kamaPaneId',
|
|
130
154
|
allowMainPane: true,
|
|
131
155
|
mainPane: { rendererName: 'kama_main', toActiveConfig: (params, active) => ({ ...params, showKAMA: active }) },
|
|
132
156
|
visibleState: { compose: createSparseVisibleStateComposer('kama', EMPTY_KAMA_STATE) },
|
|
133
157
|
scale: { indicatorKey: 'kama', label: 'KAMA', decimals: 2 },
|
|
134
|
-
|
|
135
|
-
(scheduler as IndicatorScheduler).updateKAMAConfig(params as Partial<KAMASchedulerConfig>, paneId)
|
|
136
|
-
},
|
|
137
|
-
applyResult: (host, state, paneId) => {
|
|
138
|
-
host.setSharedState(createKAMAStateKey(paneId), state as any, 'indicator_scheduler')
|
|
139
|
-
},
|
|
158
|
+
runtime: { defaultConfig:{period:10,fastPeriod:2,slowPeriod:30,showKAMA:true}, computeKey:'calcKAMAData', compute:(data,c)=>calcKAMAData(data,c.period,c.fastPeriod,c.slowPeriod) },
|
|
140
159
|
})
|
|
141
160
|
class KAMADefinition {
|
|
142
161
|
static rendererFactory = createKAMARendererPlugin
|