@363045841yyt/klinechart-core 0.7.3 → 0.7.5-alpha.2
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/README.md +201 -201
- package/README.zh-CN.md +201 -201
- package/dist/engine/renderers/webgl/candleSurface.js +47 -47
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -2
- package/dist/version.js.map +1 -1
- package/package.json +129 -122
- package/src/__tests__/signal.test.ts +124 -124
- package/src/config/chartSettings.ts +66 -66
- package/src/controllers/__tests__/drawing.test.ts +214 -214
- package/src/controllers/__tests__/indicatorSelector.test.ts +481 -481
- package/src/controllers/__tests__/toolbar.test.ts +225 -225
- package/src/controllers/createChartController.ts +665 -665
- package/src/controllers/createDrawingController.ts +96 -96
- package/src/controllers/createIndicatorSelectorController.ts +307 -307
- package/src/controllers/createToolbarController.ts +146 -146
- package/src/controllers/index.ts +19 -19
- package/src/controllers/types.ts +284 -284
- package/src/engine/__tests__/chart.dpr.test.ts +401 -401
- package/src/engine/__tests__/paneRenderer.resize.test.ts +92 -92
- package/src/engine/chart-store.ts +121 -121
- package/src/engine/chart.d.ts +617 -617
- package/src/engine/chart.ts +2815 -2815
- package/src/engine/controller/__tests__/interaction.dpr.test.ts +259 -259
- package/src/engine/controller/interaction.ts +722 -722
- package/src/engine/controller/markerInteraction.ts +130 -130
- package/src/engine/controller/pinchTracker.ts +82 -82
- package/src/engine/controller/tooltipPosition.ts +48 -48
- package/src/engine/draw/__tests__/pixelAlign.spec.ts +176 -176
- package/src/engine/draw/pixelAlign.ts +259 -259
- package/src/engine/drawing/index.ts +655 -655
- package/src/engine/drawing/interaction.ts +842 -842
- package/src/engine/drawing/plugin.ts +343 -343
- package/src/engine/indicators/__tests__/__fixtures__/golden/atr.json +38 -38
- package/src/engine/indicators/__tests__/__fixtures__/golden/dema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/hma.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +55 -55
- package/src/engine/indicators/__tests__/__fixtures__/golden/kama.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/tema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/wma.json +40 -40
- package/src/engine/indicators/__tests__/__fixtures__/synthetic.ts +65 -65
- package/src/engine/indicators/__tests__/_propertyAssertions.ts +76 -76
- package/src/engine/indicators/__tests__/atr.test.ts +153 -153
- package/src/engine/indicators/__tests__/calculators.test.ts +614 -614
- package/src/engine/indicators/__tests__/cmf-mfi.test.ts +100 -100
- package/src/engine/indicators/__tests__/dema.test.ts +73 -73
- package/src/engine/indicators/__tests__/donchian.test.ts +70 -70
- package/src/engine/indicators/__tests__/hma.test.ts +73 -73
- package/src/engine/indicators/__tests__/ichimoku.test.ts +105 -105
- package/src/engine/indicators/__tests__/kama.test.ts +80 -80
- package/src/engine/indicators/__tests__/keltner.test.ts +65 -65
- package/src/engine/indicators/__tests__/pivot-fib.test.ts +110 -110
- package/src/engine/indicators/__tests__/roc.test.ts +68 -68
- package/src/engine/indicators/__tests__/sar.test.ts +86 -86
- package/src/engine/indicators/__tests__/scheduler.test.ts +831 -831
- package/src/engine/indicators/__tests__/soa.test.ts +533 -533
- package/src/engine/indicators/__tests__/structure.test.ts +110 -110
- package/src/engine/indicators/__tests__/supertrend.test.ts +65 -65
- package/src/engine/indicators/__tests__/tema.test.ts +68 -68
- package/src/engine/indicators/__tests__/trix.test.ts +70 -70
- package/src/engine/indicators/__tests__/volatility.test.ts +117 -117
- package/src/engine/indicators/__tests__/volume.test.ts +115 -115
- package/src/engine/indicators/__tests__/volumeProfile.test.ts +74 -74
- package/src/engine/indicators/__tests__/vwap.test.ts +69 -69
- package/src/engine/indicators/__tests__/wma.test.ts +112 -112
- package/src/engine/indicators/__tests__/zones.test.ts +95 -95
- package/src/engine/indicators/atrState.ts +27 -27
- package/src/engine/indicators/bollState.ts +51 -51
- package/src/engine/indicators/calculators.ts +2593 -2593
- package/src/engine/indicators/cciState.ts +25 -25
- package/src/engine/indicators/chaikinVolState.ts +32 -32
- package/src/engine/indicators/cmfState.ts +27 -27
- package/src/engine/indicators/demaState.ts +27 -27
- package/src/engine/indicators/donchianState.ts +43 -43
- package/src/engine/indicators/eneState.ts +43 -43
- package/src/engine/indicators/expmaState.ts +43 -43
- package/src/engine/indicators/fastkState.ts +25 -25
- package/src/engine/indicators/fibState.ts +41 -41
- package/src/engine/indicators/hmaState.ts +27 -27
- package/src/engine/indicators/hvState.ts +28 -28
- package/src/engine/indicators/ichimokuState.ts +70 -70
- package/src/engine/indicators/indicator.worker.ts +169 -169
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +62 -62
- package/src/engine/indicators/indicatorMetadata.ts +110 -110
- package/src/engine/indicators/indicatorRegistry.ts +106 -106
- package/src/engine/indicators/indicatorRuntime.ts +1548 -1548
- package/src/engine/indicators/kamaState.ts +34 -34
- package/src/engine/indicators/keltnerState.ts +49 -49
- package/src/engine/indicators/kstState.ts +42 -42
- package/src/engine/indicators/maState.ts +36 -36
- package/src/engine/indicators/macdState.ts +76 -76
- package/src/engine/indicators/mfiState.ts +27 -27
- package/src/engine/indicators/momState.ts +25 -25
- package/src/engine/indicators/obvState.ts +25 -25
- package/src/engine/indicators/parkinsonState.ts +28 -28
- package/src/engine/indicators/pivotState.ts +51 -51
- package/src/engine/indicators/pvtState.ts +25 -25
- package/src/engine/indicators/rocState.ts +27 -27
- package/src/engine/indicators/rsiState.ts +65 -65
- package/src/engine/indicators/sarState.ts +41 -41
- package/src/engine/indicators/scheduler.ts +1205 -1205
- package/src/engine/indicators/soa.ts +352 -352
- package/src/engine/indicators/stateComposer.ts +1262 -1262
- package/src/engine/indicators/stochState.ts +26 -26
- package/src/engine/indicators/structureState.ts +69 -69
- package/src/engine/indicators/supertrendState.ts +37 -37
- package/src/engine/indicators/temaState.ts +27 -27
- package/src/engine/indicators/trixState.ts +35 -35
- package/src/engine/indicators/vmaState.ts +27 -27
- package/src/engine/indicators/volumeProfileState.ts +63 -63
- package/src/engine/indicators/vwapState.ts +29 -29
- package/src/engine/indicators/wmaState.ts +27 -27
- package/src/engine/indicators/wmsrState.ts +25 -25
- package/src/engine/indicators/workerProtocol.ts +613 -613
- package/src/engine/indicators/zonesState.ts +47 -47
- package/src/engine/layout/pane.ts +161 -161
- package/src/engine/marker/registry.ts +265 -265
- package/src/engine/paneRenderer.ts +169 -169
- package/src/engine/renderers/Indicator/atr.ts +237 -237
- package/src/engine/renderers/Indicator/boll.ts +317 -317
- package/src/engine/renderers/Indicator/cci.ts +275 -275
- package/src/engine/renderers/Indicator/chaikinVol.ts +138 -138
- package/src/engine/renderers/Indicator/cmf.ts +137 -137
- package/src/engine/renderers/Indicator/dema.ts +136 -136
- package/src/engine/renderers/Indicator/donchian.ts +137 -137
- package/src/engine/renderers/Indicator/ene.ts +271 -271
- package/src/engine/renderers/Indicator/expma.ts +197 -197
- package/src/engine/renderers/Indicator/fastk.ts +316 -316
- package/src/engine/renderers/Indicator/fib.ts +141 -141
- package/src/engine/renderers/Indicator/hma.ts +136 -136
- package/src/engine/renderers/Indicator/hv.ts +124 -124
- package/src/engine/renderers/Indicator/ichimoku.ts +181 -181
- package/src/engine/renderers/Indicator/index.ts +241 -241
- package/src/engine/renderers/Indicator/indicatorData.ts +650 -650
- package/src/engine/renderers/Indicator/kama.ts +136 -136
- package/src/engine/renderers/Indicator/keltner.ts +137 -137
- package/src/engine/renderers/Indicator/kst.ts +302 -302
- package/src/engine/renderers/Indicator/ma.ts +200 -200
- package/src/engine/renderers/Indicator/macd.ts +477 -477
- package/src/engine/renderers/Indicator/macdLegend.ts +141 -141
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +272 -272
- package/src/engine/renderers/Indicator/mfi.ts +142 -142
- package/src/engine/renderers/Indicator/mom.ts +311 -311
- package/src/engine/renderers/Indicator/obv.ts +123 -123
- package/src/engine/renderers/Indicator/parkinson.ts +124 -124
- package/src/engine/renderers/Indicator/pivot.ts +131 -131
- package/src/engine/renderers/Indicator/pvt.ts +123 -123
- package/src/engine/renderers/Indicator/roc.ts +143 -143
- package/src/engine/renderers/Indicator/rsi.ts +390 -390
- package/src/engine/renderers/Indicator/sar.ts +113 -113
- package/src/engine/renderers/Indicator/scale/atr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/cci_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/fastk_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/indicator_scale.ts +204 -204
- package/src/engine/renderers/Indicator/scale/kst_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/macd_scale.ts +22 -22
- package/src/engine/renderers/Indicator/scale/mom_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/rsi_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/stoch_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/volume_scale.ts +26 -26
- package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/stoch.ts +359 -359
- package/src/engine/renderers/Indicator/structure.ts +126 -126
- package/src/engine/renderers/Indicator/subPaneConfig.ts +265 -265
- package/src/engine/renderers/Indicator/supertrend.ts +115 -115
- package/src/engine/renderers/Indicator/tema.ts +136 -136
- package/src/engine/renderers/Indicator/trix.ts +158 -158
- package/src/engine/renderers/Indicator/vma.ts +124 -124
- package/src/engine/renderers/Indicator/volumeProfile.ts +125 -125
- package/src/engine/renderers/Indicator/vwap.ts +123 -123
- package/src/engine/renderers/Indicator/wma.ts +136 -136
- package/src/engine/renderers/Indicator/wmsr.ts +328 -328
- package/src/engine/renderers/Indicator/zones.ts +104 -104
- package/src/engine/renderers/__tests__/boll.renderer.test.ts +314 -314
- package/src/engine/renderers/__tests__/ene.renderer.test.ts +305 -305
- package/src/engine/renderers/__tests__/expma.renderer.test.ts +279 -279
- package/src/engine/renderers/__tests__/ma.renderer.test.ts +426 -426
- package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +502 -502
- package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +173 -173
- package/src/engine/renderers/candle.ts +459 -459
- package/src/engine/renderers/crosshair.ts +69 -69
- package/src/engine/renderers/customMarkers.ts +162 -162
- package/src/engine/renderers/extremaMarkers.ts +246 -246
- package/src/engine/renderers/gridLines.ts +90 -90
- package/src/engine/renderers/lastPrice.ts +97 -97
- package/src/engine/renderers/paneTitle.ts +136 -136
- package/src/engine/renderers/subVolume.ts +236 -236
- package/src/engine/renderers/timeAxis.ts +121 -121
- package/src/engine/renderers/webgl/candleSurface.ts +955 -955
- package/src/engine/renderers/webgl/sharedWebGLSurface.ts +146 -146
- package/src/engine/renderers/yAxis.ts +105 -105
- package/src/engine/scale/__tests__/logFormula.spec.ts +148 -148
- package/src/engine/scale/logFormula.ts +130 -130
- package/src/engine/scale/price.ts +39 -39
- package/src/engine/scale/priceScale.ts +264 -264
- package/src/engine/subPaneManager.ts +427 -427
- package/src/engine/theme/colors.ts +642 -642
- package/src/engine/theme/fonts.ts +20 -20
- package/src/engine/utils/klineConfig.ts +49 -49
- package/src/engine/utils/tickCount.ts +11 -11
- package/src/engine/utils/tickPosition.ts +214 -214
- package/src/engine/utils/zoom.ts +83 -83
- package/src/engine/viewport/viewport.ts +67 -67
- package/src/index.ts +3 -3
- package/src/plugin/ConfigManager.ts +93 -93
- package/src/plugin/EventBus.ts +77 -77
- package/src/plugin/HookSystem.ts +106 -106
- package/src/plugin/PluginHost.ts +243 -243
- package/src/plugin/PluginRegistry.ts +92 -92
- package/src/plugin/StateStore.ts +73 -73
- package/src/plugin/index.ts +19 -19
- package/src/plugin/rendererPluginManager.ts +368 -368
- package/src/plugin/stateKeys.ts +8 -8
- package/src/plugin/types.ts +526 -526
- package/src/reactivity/index.ts +2 -2
- package/src/reactivity/signal.ts +119 -119
- package/src/semantic/controller.ts +251 -251
- package/src/semantic/drawShape.ts +260 -260
- package/src/semantic/index.ts +28 -28
- package/src/semantic/schema.json +256 -256
- package/src/semantic/types.ts +251 -251
- package/src/semantic/validator.ts +349 -349
- package/src/types/kLine.ts +13 -13
- package/src/types/price.ts +56 -56
- package/src/types/volumePrice.ts +33 -33
- package/src/utils/dateFormat.ts +208 -208
- package/src/utils/kLineDraw/axis.ts +562 -562
- package/src/utils/priceToY.ts +34 -34
- package/src/utils/volumePrice.ts +202 -202
- package/src/version.ts +1 -1
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import type { BaseIndicatorState } from '../../plugin'
|
|
2
|
-
import { createIndicatorStateKey } from '../../plugin/stateKeys'
|
|
3
|
-
|
|
4
|
-
export interface HMARenderState extends BaseIndicatorState {
|
|
5
|
-
timestamp: number
|
|
6
|
-
series: (number | undefined)[]
|
|
7
|
-
params: { period: number; showHMA: boolean }
|
|
8
|
-
valueMin: number
|
|
9
|
-
valueMax: number
|
|
10
|
-
visibleMin: number
|
|
11
|
-
visibleMax: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const createHMAStateKey = (paneId: string) =>
|
|
15
|
-
createIndicatorStateKey('hma', paneId)
|
|
16
|
-
|
|
17
|
-
export const DEFAULT_HMA_PERIOD = 9
|
|
18
|
-
|
|
19
|
-
export const EMPTY_HMA_STATE: HMARenderState = {
|
|
20
|
-
timestamp: 0,
|
|
21
|
-
series: [],
|
|
22
|
-
params: { period: DEFAULT_HMA_PERIOD, showHMA: true },
|
|
23
|
-
valueMin: 0,
|
|
24
|
-
valueMax: 1,
|
|
25
|
-
visibleMin: Infinity,
|
|
26
|
-
visibleMax: -Infinity,
|
|
27
|
-
}
|
|
1
|
+
import type { BaseIndicatorState } from '../../plugin'
|
|
2
|
+
import { createIndicatorStateKey } from '../../plugin/stateKeys'
|
|
3
|
+
|
|
4
|
+
export interface HMARenderState extends BaseIndicatorState {
|
|
5
|
+
timestamp: number
|
|
6
|
+
series: (number | undefined)[]
|
|
7
|
+
params: { period: number; showHMA: boolean }
|
|
8
|
+
valueMin: number
|
|
9
|
+
valueMax: number
|
|
10
|
+
visibleMin: number
|
|
11
|
+
visibleMax: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const createHMAStateKey = (paneId: string) =>
|
|
15
|
+
createIndicatorStateKey('hma', paneId)
|
|
16
|
+
|
|
17
|
+
export const DEFAULT_HMA_PERIOD = 9
|
|
18
|
+
|
|
19
|
+
export const EMPTY_HMA_STATE: HMARenderState = {
|
|
20
|
+
timestamp: 0,
|
|
21
|
+
series: [],
|
|
22
|
+
params: { period: DEFAULT_HMA_PERIOD, showHMA: true },
|
|
23
|
+
valueMin: 0,
|
|
24
|
+
valueMax: 1,
|
|
25
|
+
visibleMin: Infinity,
|
|
26
|
+
visibleMax: -Infinity,
|
|
27
|
+
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import type { BaseIndicatorState } from '../../plugin'
|
|
2
|
-
import { createIndicatorStateKey } from '../../plugin/stateKeys'
|
|
3
|
-
|
|
4
|
-
export interface HVRenderState extends BaseIndicatorState {
|
|
5
|
-
timestamp: number
|
|
6
|
-
series: (number | undefined)[]
|
|
7
|
-
params: { period: number; annualizationFactor: number; showHV: boolean }
|
|
8
|
-
valueMin: number
|
|
9
|
-
valueMax: number
|
|
10
|
-
visibleMin: number
|
|
11
|
-
visibleMax: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const createHVStateKey = (paneId: string) =>
|
|
15
|
-
createIndicatorStateKey('hv', paneId)
|
|
16
|
-
|
|
17
|
-
export const DEFAULT_HV_PERIOD = 20
|
|
18
|
-
export const DEFAULT_HV_ANNUALIZATION = 252
|
|
19
|
-
|
|
20
|
-
export const EMPTY_HV_STATE: HVRenderState = {
|
|
21
|
-
timestamp: 0,
|
|
22
|
-
series: [],
|
|
23
|
-
params: { period: DEFAULT_HV_PERIOD, annualizationFactor: DEFAULT_HV_ANNUALIZATION, showHV: true },
|
|
24
|
-
valueMin: 0,
|
|
25
|
-
valueMax: 1,
|
|
26
|
-
visibleMin: Infinity,
|
|
27
|
-
visibleMax: -Infinity,
|
|
28
|
-
}
|
|
1
|
+
import type { BaseIndicatorState } from '../../plugin'
|
|
2
|
+
import { createIndicatorStateKey } from '../../plugin/stateKeys'
|
|
3
|
+
|
|
4
|
+
export interface HVRenderState extends BaseIndicatorState {
|
|
5
|
+
timestamp: number
|
|
6
|
+
series: (number | undefined)[]
|
|
7
|
+
params: { period: number; annualizationFactor: number; showHV: boolean }
|
|
8
|
+
valueMin: number
|
|
9
|
+
valueMax: number
|
|
10
|
+
visibleMin: number
|
|
11
|
+
visibleMax: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const createHVStateKey = (paneId: string) =>
|
|
15
|
+
createIndicatorStateKey('hv', paneId)
|
|
16
|
+
|
|
17
|
+
export const DEFAULT_HV_PERIOD = 20
|
|
18
|
+
export const DEFAULT_HV_ANNUALIZATION = 252
|
|
19
|
+
|
|
20
|
+
export const EMPTY_HV_STATE: HVRenderState = {
|
|
21
|
+
timestamp: 0,
|
|
22
|
+
series: [],
|
|
23
|
+
params: { period: DEFAULT_HV_PERIOD, annualizationFactor: DEFAULT_HV_ANNUALIZATION, showHV: true },
|
|
24
|
+
valueMin: 0,
|
|
25
|
+
valueMax: 1,
|
|
26
|
+
visibleMin: Infinity,
|
|
27
|
+
visibleMax: -Infinity,
|
|
28
|
+
}
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
import type { BaseIndicatorState } from '../../plugin'
|
|
2
|
-
import { createIndicatorStateKey } from '../../plugin/stateKeys'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* 一目均衡表数据点:5 条线在同一根 K 线槽位
|
|
6
|
-
* - tenkan (转换线) = (HH9 + LL9) / 2,当根 K 线计算
|
|
7
|
-
* - kijun (基准线) = (HH26 + LL26) / 2,当根 K 线计算
|
|
8
|
-
* - spanA (先行带 A) = (tenkan[t-displacement] + kijun[t-displacement]) / 2,前置位移
|
|
9
|
-
* - spanB (先行带 B) = (HH52[t-displacement] + LL52[t-displacement]) / 2,前置位移
|
|
10
|
-
* - chikou (迟行线) = close[t+displacement],后置位移
|
|
11
|
-
*
|
|
12
|
-
* 任一字段都可能 undefined(数据不足或位移外)。
|
|
13
|
-
*/
|
|
14
|
-
export interface IchimokuPoint {
|
|
15
|
-
tenkan?: number
|
|
16
|
-
kijun?: number
|
|
17
|
-
spanA?: number
|
|
18
|
-
spanB?: number
|
|
19
|
-
chikou?: number
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface IchimokuRenderState extends BaseIndicatorState {
|
|
23
|
-
timestamp: number
|
|
24
|
-
series: (IchimokuPoint | undefined)[]
|
|
25
|
-
params: {
|
|
26
|
-
tenkanPeriod: number
|
|
27
|
-
kijunPeriod: number
|
|
28
|
-
spanBPeriod: number
|
|
29
|
-
displacement: number
|
|
30
|
-
showTenkan: boolean
|
|
31
|
-
showKijun: boolean
|
|
32
|
-
showSpanA: boolean
|
|
33
|
-
showSpanB: boolean
|
|
34
|
-
showCloud: boolean
|
|
35
|
-
showChikou: boolean
|
|
36
|
-
}
|
|
37
|
-
valueMin: number
|
|
38
|
-
valueMax: number
|
|
39
|
-
visibleMin: number
|
|
40
|
-
visibleMax: number
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export const createIchimokuStateKey = (paneId: string) =>
|
|
44
|
-
createIndicatorStateKey('ichimoku', paneId)
|
|
45
|
-
|
|
46
|
-
export const DEFAULT_ICHIMOKU_TENKAN = 9
|
|
47
|
-
export const DEFAULT_ICHIMOKU_KIJUN = 26
|
|
48
|
-
export const DEFAULT_ICHIMOKU_SPAN_B = 52
|
|
49
|
-
export const DEFAULT_ICHIMOKU_DISPLACEMENT = 26
|
|
50
|
-
|
|
51
|
-
export const EMPTY_ICHIMOKU_STATE: IchimokuRenderState = {
|
|
52
|
-
timestamp: 0,
|
|
53
|
-
series: [],
|
|
54
|
-
params: {
|
|
55
|
-
tenkanPeriod: DEFAULT_ICHIMOKU_TENKAN,
|
|
56
|
-
kijunPeriod: DEFAULT_ICHIMOKU_KIJUN,
|
|
57
|
-
spanBPeriod: DEFAULT_ICHIMOKU_SPAN_B,
|
|
58
|
-
displacement: DEFAULT_ICHIMOKU_DISPLACEMENT,
|
|
59
|
-
showTenkan: true,
|
|
60
|
-
showKijun: true,
|
|
61
|
-
showSpanA: true,
|
|
62
|
-
showSpanB: true,
|
|
63
|
-
showCloud: true,
|
|
64
|
-
showChikou: true,
|
|
65
|
-
},
|
|
66
|
-
valueMin: 0,
|
|
67
|
-
valueMax: 1,
|
|
68
|
-
visibleMin: Infinity,
|
|
69
|
-
visibleMax: -Infinity,
|
|
70
|
-
}
|
|
1
|
+
import type { BaseIndicatorState } from '../../plugin'
|
|
2
|
+
import { createIndicatorStateKey } from '../../plugin/stateKeys'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 一目均衡表数据点:5 条线在同一根 K 线槽位
|
|
6
|
+
* - tenkan (转换线) = (HH9 + LL9) / 2,当根 K 线计算
|
|
7
|
+
* - kijun (基准线) = (HH26 + LL26) / 2,当根 K 线计算
|
|
8
|
+
* - spanA (先行带 A) = (tenkan[t-displacement] + kijun[t-displacement]) / 2,前置位移
|
|
9
|
+
* - spanB (先行带 B) = (HH52[t-displacement] + LL52[t-displacement]) / 2,前置位移
|
|
10
|
+
* - chikou (迟行线) = close[t+displacement],后置位移
|
|
11
|
+
*
|
|
12
|
+
* 任一字段都可能 undefined(数据不足或位移外)。
|
|
13
|
+
*/
|
|
14
|
+
export interface IchimokuPoint {
|
|
15
|
+
tenkan?: number
|
|
16
|
+
kijun?: number
|
|
17
|
+
spanA?: number
|
|
18
|
+
spanB?: number
|
|
19
|
+
chikou?: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface IchimokuRenderState extends BaseIndicatorState {
|
|
23
|
+
timestamp: number
|
|
24
|
+
series: (IchimokuPoint | undefined)[]
|
|
25
|
+
params: {
|
|
26
|
+
tenkanPeriod: number
|
|
27
|
+
kijunPeriod: number
|
|
28
|
+
spanBPeriod: number
|
|
29
|
+
displacement: number
|
|
30
|
+
showTenkan: boolean
|
|
31
|
+
showKijun: boolean
|
|
32
|
+
showSpanA: boolean
|
|
33
|
+
showSpanB: boolean
|
|
34
|
+
showCloud: boolean
|
|
35
|
+
showChikou: boolean
|
|
36
|
+
}
|
|
37
|
+
valueMin: number
|
|
38
|
+
valueMax: number
|
|
39
|
+
visibleMin: number
|
|
40
|
+
visibleMax: number
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const createIchimokuStateKey = (paneId: string) =>
|
|
44
|
+
createIndicatorStateKey('ichimoku', paneId)
|
|
45
|
+
|
|
46
|
+
export const DEFAULT_ICHIMOKU_TENKAN = 9
|
|
47
|
+
export const DEFAULT_ICHIMOKU_KIJUN = 26
|
|
48
|
+
export const DEFAULT_ICHIMOKU_SPAN_B = 52
|
|
49
|
+
export const DEFAULT_ICHIMOKU_DISPLACEMENT = 26
|
|
50
|
+
|
|
51
|
+
export const EMPTY_ICHIMOKU_STATE: IchimokuRenderState = {
|
|
52
|
+
timestamp: 0,
|
|
53
|
+
series: [],
|
|
54
|
+
params: {
|
|
55
|
+
tenkanPeriod: DEFAULT_ICHIMOKU_TENKAN,
|
|
56
|
+
kijunPeriod: DEFAULT_ICHIMOKU_KIJUN,
|
|
57
|
+
spanBPeriod: DEFAULT_ICHIMOKU_SPAN_B,
|
|
58
|
+
displacement: DEFAULT_ICHIMOKU_DISPLACEMENT,
|
|
59
|
+
showTenkan: true,
|
|
60
|
+
showKijun: true,
|
|
61
|
+
showSpanA: true,
|
|
62
|
+
showSpanB: true,
|
|
63
|
+
showCloud: true,
|
|
64
|
+
showChikou: true,
|
|
65
|
+
},
|
|
66
|
+
valueMin: 0,
|
|
67
|
+
valueMax: 1,
|
|
68
|
+
visibleMin: Infinity,
|
|
69
|
+
visibleMax: -Infinity,
|
|
70
|
+
}
|
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Indicator Worker 入口
|
|
3
|
-
* 运行在独立线程,负责指标计算
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
IndicatorWorkerRequest,
|
|
8
|
-
IndicatorWorkerResponse,
|
|
9
|
-
IndicatorConfigSnapshot,
|
|
10
|
-
} from './workerProtocol'
|
|
11
|
-
import { PROTOCOL_VERSION } from './workerProtocol'
|
|
12
|
-
import type { KLineData } from '../../types/price'
|
|
13
|
-
import { IndicatorRuntime } from './indicatorRuntime'
|
|
14
|
-
|
|
15
|
-
// Worker 全局作用域
|
|
16
|
-
const ctx = self as unknown as Worker
|
|
17
|
-
|
|
18
|
-
// 运行时实例
|
|
19
|
-
let runtime: IndicatorRuntime | null = null
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* 发送响应到主线程
|
|
23
|
-
*/
|
|
24
|
-
function postResponse(response: IndicatorWorkerResponse): void {
|
|
25
|
-
ctx.postMessage(response)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* 处理初始化
|
|
30
|
-
*/
|
|
31
|
-
function handleInit(): void {
|
|
32
|
-
runtime = new IndicatorRuntime()
|
|
33
|
-
postResponse({
|
|
34
|
-
type: 'ready',
|
|
35
|
-
protocolVersion: PROTOCOL_VERSION,
|
|
36
|
-
})
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* 处理设置数据
|
|
41
|
-
*/
|
|
42
|
-
function handleSetData(data: KLineData[], version: number): void {
|
|
43
|
-
if (!runtime) {
|
|
44
|
-
postResponse({
|
|
45
|
-
type: 'error',
|
|
46
|
-
stage: 'setData',
|
|
47
|
-
message: 'Runtime not initialized',
|
|
48
|
-
})
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
runtime.setData(data, version)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* 处理设置配置
|
|
56
|
-
*/
|
|
57
|
-
function handleSetConfig(config: Partial<IndicatorConfigSnapshot>, version: number): void {
|
|
58
|
-
if (!runtime) {
|
|
59
|
-
postResponse({
|
|
60
|
-
type: 'error',
|
|
61
|
-
stage: 'setConfig',
|
|
62
|
-
message: 'Runtime not initialized',
|
|
63
|
-
})
|
|
64
|
-
return
|
|
65
|
-
}
|
|
66
|
-
runtime.setConfig(config, version)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* 处理计算 series
|
|
71
|
-
*/
|
|
72
|
-
function handleComputeSeries(requestId: number, dataVersion: number, configVersion: number): void {
|
|
73
|
-
if (!runtime) {
|
|
74
|
-
postResponse({
|
|
75
|
-
type: 'error',
|
|
76
|
-
requestId,
|
|
77
|
-
stage: 'computeSeries',
|
|
78
|
-
message: 'Runtime not initialized',
|
|
79
|
-
})
|
|
80
|
-
return
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const startTime = performance.now()
|
|
84
|
-
|
|
85
|
-
try {
|
|
86
|
-
console.log(`[IndicatorWorker] computeSeries START reqId=${requestId}`)
|
|
87
|
-
const results = runtime.computeSeries()
|
|
88
|
-
const computeMs = performance.now() - startTime
|
|
89
|
-
console.log(`[IndicatorWorker] computeSeries DONE in ${computeMs.toFixed(1)}ms, changed=[${results._changed.join(',')}]`)
|
|
90
|
-
|
|
91
|
-
postResponse({
|
|
92
|
-
type: 'seriesResult',
|
|
93
|
-
requestId,
|
|
94
|
-
dataVersion,
|
|
95
|
-
configVersion,
|
|
96
|
-
results,
|
|
97
|
-
metrics: {
|
|
98
|
-
computeMs,
|
|
99
|
-
dataLength: 0, // 由调用方填充
|
|
100
|
-
},
|
|
101
|
-
})
|
|
102
|
-
} catch (err) {
|
|
103
|
-
const message = err instanceof Error ? err.message : String(err)
|
|
104
|
-
postResponse({
|
|
105
|
-
type: 'error',
|
|
106
|
-
requestId,
|
|
107
|
-
stage: 'computeSeries',
|
|
108
|
-
message,
|
|
109
|
-
})
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* 处理销毁
|
|
115
|
-
*/
|
|
116
|
-
function handleDispose(): void {
|
|
117
|
-
runtime = null
|
|
118
|
-
// Worker 会被主线程 terminate,这里做清理即可
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* 消息处理器
|
|
123
|
-
*/
|
|
124
|
-
ctx.onmessage = (event: MessageEvent<IndicatorWorkerRequest>) => {
|
|
125
|
-
const msg = event.data
|
|
126
|
-
|
|
127
|
-
if (!msg || typeof msg !== 'object') {
|
|
128
|
-
postResponse({
|
|
129
|
-
type: 'error',
|
|
130
|
-
stage: 'init',
|
|
131
|
-
message: 'Invalid message format',
|
|
132
|
-
})
|
|
133
|
-
return
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
switch (msg.type) {
|
|
137
|
-
case 'init':
|
|
138
|
-
handleInit()
|
|
139
|
-
break
|
|
140
|
-
|
|
141
|
-
case 'setData':
|
|
142
|
-
handleSetData(msg.data, msg.dataVersion)
|
|
143
|
-
break
|
|
144
|
-
|
|
145
|
-
case 'setConfig':
|
|
146
|
-
handleSetConfig(msg.configs, msg.configVersion)
|
|
147
|
-
break
|
|
148
|
-
|
|
149
|
-
case 'computeSeries':
|
|
150
|
-
handleComputeSeries(msg.requestId, msg.dataVersion, msg.configVersion)
|
|
151
|
-
break
|
|
152
|
-
|
|
153
|
-
case 'dispose':
|
|
154
|
-
handleDispose()
|
|
155
|
-
break
|
|
156
|
-
|
|
157
|
-
default: {
|
|
158
|
-
const _exhaustiveCheck: never = msg
|
|
159
|
-
postResponse({
|
|
160
|
-
type: 'error',
|
|
161
|
-
stage: 'init',
|
|
162
|
-
message: `Unknown message type: ${(_exhaustiveCheck as unknown as { type: string }).type}`,
|
|
163
|
-
})
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// 通知主线程 worker 已加载(可选,主要用于调试)
|
|
169
|
-
// console.log('[IndicatorWorker] Loaded')
|
|
1
|
+
/**
|
|
2
|
+
* Indicator Worker 入口
|
|
3
|
+
* 运行在独立线程,负责指标计算
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
IndicatorWorkerRequest,
|
|
8
|
+
IndicatorWorkerResponse,
|
|
9
|
+
IndicatorConfigSnapshot,
|
|
10
|
+
} from './workerProtocol'
|
|
11
|
+
import { PROTOCOL_VERSION } from './workerProtocol'
|
|
12
|
+
import type { KLineData } from '../../types/price'
|
|
13
|
+
import { IndicatorRuntime } from './indicatorRuntime'
|
|
14
|
+
|
|
15
|
+
// Worker 全局作用域
|
|
16
|
+
const ctx = self as unknown as Worker
|
|
17
|
+
|
|
18
|
+
// 运行时实例
|
|
19
|
+
let runtime: IndicatorRuntime | null = null
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 发送响应到主线程
|
|
23
|
+
*/
|
|
24
|
+
function postResponse(response: IndicatorWorkerResponse): void {
|
|
25
|
+
ctx.postMessage(response)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 处理初始化
|
|
30
|
+
*/
|
|
31
|
+
function handleInit(): void {
|
|
32
|
+
runtime = new IndicatorRuntime()
|
|
33
|
+
postResponse({
|
|
34
|
+
type: 'ready',
|
|
35
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 处理设置数据
|
|
41
|
+
*/
|
|
42
|
+
function handleSetData(data: KLineData[], version: number): void {
|
|
43
|
+
if (!runtime) {
|
|
44
|
+
postResponse({
|
|
45
|
+
type: 'error',
|
|
46
|
+
stage: 'setData',
|
|
47
|
+
message: 'Runtime not initialized',
|
|
48
|
+
})
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
runtime.setData(data, version)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 处理设置配置
|
|
56
|
+
*/
|
|
57
|
+
function handleSetConfig(config: Partial<IndicatorConfigSnapshot>, version: number): void {
|
|
58
|
+
if (!runtime) {
|
|
59
|
+
postResponse({
|
|
60
|
+
type: 'error',
|
|
61
|
+
stage: 'setConfig',
|
|
62
|
+
message: 'Runtime not initialized',
|
|
63
|
+
})
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
runtime.setConfig(config, version)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 处理计算 series
|
|
71
|
+
*/
|
|
72
|
+
function handleComputeSeries(requestId: number, dataVersion: number, configVersion: number): void {
|
|
73
|
+
if (!runtime) {
|
|
74
|
+
postResponse({
|
|
75
|
+
type: 'error',
|
|
76
|
+
requestId,
|
|
77
|
+
stage: 'computeSeries',
|
|
78
|
+
message: 'Runtime not initialized',
|
|
79
|
+
})
|
|
80
|
+
return
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const startTime = performance.now()
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
console.log(`[IndicatorWorker] computeSeries START reqId=${requestId}`)
|
|
87
|
+
const results = runtime.computeSeries()
|
|
88
|
+
const computeMs = performance.now() - startTime
|
|
89
|
+
console.log(`[IndicatorWorker] computeSeries DONE in ${computeMs.toFixed(1)}ms, changed=[${results._changed.join(',')}]`)
|
|
90
|
+
|
|
91
|
+
postResponse({
|
|
92
|
+
type: 'seriesResult',
|
|
93
|
+
requestId,
|
|
94
|
+
dataVersion,
|
|
95
|
+
configVersion,
|
|
96
|
+
results,
|
|
97
|
+
metrics: {
|
|
98
|
+
computeMs,
|
|
99
|
+
dataLength: 0, // 由调用方填充
|
|
100
|
+
},
|
|
101
|
+
})
|
|
102
|
+
} catch (err) {
|
|
103
|
+
const message = err instanceof Error ? err.message : String(err)
|
|
104
|
+
postResponse({
|
|
105
|
+
type: 'error',
|
|
106
|
+
requestId,
|
|
107
|
+
stage: 'computeSeries',
|
|
108
|
+
message,
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 处理销毁
|
|
115
|
+
*/
|
|
116
|
+
function handleDispose(): void {
|
|
117
|
+
runtime = null
|
|
118
|
+
// Worker 会被主线程 terminate,这里做清理即可
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 消息处理器
|
|
123
|
+
*/
|
|
124
|
+
ctx.onmessage = (event: MessageEvent<IndicatorWorkerRequest>) => {
|
|
125
|
+
const msg = event.data
|
|
126
|
+
|
|
127
|
+
if (!msg || typeof msg !== 'object') {
|
|
128
|
+
postResponse({
|
|
129
|
+
type: 'error',
|
|
130
|
+
stage: 'init',
|
|
131
|
+
message: 'Invalid message format',
|
|
132
|
+
})
|
|
133
|
+
return
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
switch (msg.type) {
|
|
137
|
+
case 'init':
|
|
138
|
+
handleInit()
|
|
139
|
+
break
|
|
140
|
+
|
|
141
|
+
case 'setData':
|
|
142
|
+
handleSetData(msg.data, msg.dataVersion)
|
|
143
|
+
break
|
|
144
|
+
|
|
145
|
+
case 'setConfig':
|
|
146
|
+
handleSetConfig(msg.configs, msg.configVersion)
|
|
147
|
+
break
|
|
148
|
+
|
|
149
|
+
case 'computeSeries':
|
|
150
|
+
handleComputeSeries(msg.requestId, msg.dataVersion, msg.configVersion)
|
|
151
|
+
break
|
|
152
|
+
|
|
153
|
+
case 'dispose':
|
|
154
|
+
handleDispose()
|
|
155
|
+
break
|
|
156
|
+
|
|
157
|
+
default: {
|
|
158
|
+
const _exhaustiveCheck: never = msg
|
|
159
|
+
postResponse({
|
|
160
|
+
type: 'error',
|
|
161
|
+
stage: 'init',
|
|
162
|
+
message: `Unknown message type: ${(_exhaustiveCheck as unknown as { type: string }).type}`,
|
|
163
|
+
})
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 通知主线程 worker 已加载(可选,主要用于调试)
|
|
169
|
+
// console.log('[IndicatorWorker] Loaded')
|