@363045841yyt/klinechart-core 0.7.12 → 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/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/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 +20 -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 +17 -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 +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 +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.js +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 +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/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 +30 -8
- package/src/engine/renderers/Indicator/supertrend.ts +25 -9
- 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 +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
|
@@ -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 { TRIXRenderState } from '../../indicators/trixState'
|
|
4
5
|
import { createTRIXStateKey } from '../../indicators/trixState'
|
|
5
6
|
import { EMPTY_TRIX_STATE } from '../../indicators/trixState'
|
|
@@ -8,6 +9,8 @@ import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
|
8
9
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
9
10
|
import type { IndicatorScheduler, TRIXSchedulerConfig } from '../../indicators/scheduler'
|
|
10
11
|
import { calcTRIXData } from '../../indicators/calculators'
|
|
12
|
+
import type { KLineData } from '../../../types/price'
|
|
13
|
+
import type { TitleInfo } from '../../indicators/indicatorMetadata'
|
|
11
14
|
|
|
12
15
|
const TRIX_COLOR = '#e11d48'
|
|
13
16
|
const SIGNAL_COLOR = '#f59e0b'
|
|
@@ -145,21 +148,48 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
|
|
|
145
148
|
ctx.stroke()
|
|
146
149
|
}
|
|
147
150
|
|
|
151
|
+
export function getTRIXTitleInfo(
|
|
152
|
+
_data: KLineData[],
|
|
153
|
+
index: number | null,
|
|
154
|
+
params: Record<string, number | boolean | string>,
|
|
155
|
+
pluginHost: PluginHost,
|
|
156
|
+
paneId: string,
|
|
157
|
+
): TitleInfo | null {
|
|
158
|
+
if (index === null) return null
|
|
159
|
+
const period = (params.period as number) ?? 15
|
|
160
|
+
const signalPeriod = (params.signalPeriod as number) ?? 9
|
|
161
|
+
const state = pluginHost.getSharedState<TRIXRenderState>(createTRIXStateKey(paneId))
|
|
162
|
+
if (!state) return null
|
|
163
|
+
|
|
164
|
+
const values: Array<{ label: string; value: number; color: string }> = []
|
|
165
|
+
|
|
166
|
+
if (state.params.showTRIX) {
|
|
167
|
+
const v = state.series[index]
|
|
168
|
+
if (v !== undefined) values.push({ label: 'TRIX', value: v, color: TRIX_COLOR })
|
|
169
|
+
}
|
|
170
|
+
if (state.params.showSignal) {
|
|
171
|
+
const v = state.signalSeries[index]
|
|
172
|
+
if (v !== undefined) values.push({ label: 'Signal', value: v, color: SIGNAL_COLOR })
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (values.length === 0) return null
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
name: 'TRIX',
|
|
179
|
+
params: [period, signalPeriod],
|
|
180
|
+
values,
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
148
184
|
@Indicator({
|
|
149
185
|
name: 'trix',
|
|
150
186
|
displayName: 'TRIX',
|
|
151
187
|
category: 'oscillator',
|
|
152
|
-
stateKey: createTRIXStateKey,
|
|
153
188
|
defaultPaneId: 'sub_TRIX',
|
|
154
189
|
scale: { indicatorKey: 'trix', label: 'TRIX', decimals: 6 },
|
|
155
|
-
updateConfig: (scheduler, params, paneId) => {
|
|
156
|
-
(scheduler as IndicatorScheduler).updateIndicatorConfig('trix', params, paneId)
|
|
157
|
-
},
|
|
158
190
|
visibleState: { compose: createDualSparseVisibleStateComposer('trix', EMPTY_TRIX_STATE) },
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
},
|
|
162
|
-
runtime: { configKey:'trix', defaultConfig:{period:15,signalPeriod:9,showTRIX:true,showSignal:true}, computeKey:'calcTRIXData', compute:(data,c)=>calcTRIXData(data,c.period,c.signalPeriod) },
|
|
191
|
+
getTitleInfo: getTRIXTitleInfo,
|
|
192
|
+
runtime: { defaultConfig:{period:15,signalPeriod:9,showTRIX:true,showSignal:true}, computeKey:'calcTRIXData', compute:(data,c)=>calcTRIXData(data,c.period,c.signalPeriod) },
|
|
163
193
|
})
|
|
164
194
|
class TRIXIndicatorDefinition {
|
|
165
195
|
static rendererFactory = createTRIXRendererPlugin
|
|
@@ -3,6 +3,8 @@ import { RENDERER_PRIORITY } from '../../../plugin'
|
|
|
3
3
|
import type { VMARenderState } from '../../indicators/vmaState'
|
|
4
4
|
import { createVMAStateKey } from '../../indicators/vmaState'
|
|
5
5
|
import { EMPTY_VMA_STATE } from '../../indicators/vmaState'
|
|
6
|
+
import type { TitleInfo } from '../../indicators/indicatorMetadata'
|
|
7
|
+
import type { KLineData } from '../../../types/price'
|
|
6
8
|
import { createNonNegativeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
7
9
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
8
10
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
@@ -111,22 +113,35 @@ export function createVMARendererPlugin(options: { paneId?: string } = {}): Rend
|
|
|
111
113
|
}
|
|
112
114
|
}
|
|
113
115
|
|
|
116
|
+
export function getVMATitleInfo(
|
|
117
|
+
_data: KLineData[],
|
|
118
|
+
index: number | null,
|
|
119
|
+
params: Record<string, number | boolean | string>,
|
|
120
|
+
host: PluginHost,
|
|
121
|
+
paneId: string,
|
|
122
|
+
): TitleInfo | null {
|
|
123
|
+
if (index === null) return null
|
|
124
|
+
const period = (params.period as number) ?? 5
|
|
125
|
+
const state = host.getSharedState<VMARenderState>(createVMAStateKey(paneId))
|
|
126
|
+
const value = state?.series[index]
|
|
127
|
+
if (value === undefined) return null
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
name: 'VMA',
|
|
131
|
+
params: [period],
|
|
132
|
+
values: [{ label: 'VMA', value, color: VMA_COLOR }],
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
114
136
|
@Indicator({
|
|
115
137
|
name: 'vma',
|
|
116
138
|
displayName: 'VMA',
|
|
117
139
|
category: 'volume',
|
|
118
|
-
stateKey: createVMAStateKey,
|
|
119
140
|
defaultPaneId: 'sub_VMA',
|
|
120
141
|
scale: { indicatorKey: 'vma', label: 'VMA', decimals: 0 },
|
|
121
|
-
|
|
122
|
-
(scheduler as IndicatorScheduler).updateIndicatorConfig('vma', params, paneId)
|
|
123
|
-
},
|
|
142
|
+
getTitleInfo: getVMATitleInfo,
|
|
124
143
|
visibleState: { compose: createNonNegativeSparseVisibleStateComposer('vma', EMPTY_VMA_STATE) },
|
|
125
|
-
applyResult: (host, state, paneId) => {
|
|
126
|
-
host.setSharedState(createVMAStateKey(paneId), state as any, 'indicator_scheduler')
|
|
127
|
-
},
|
|
128
144
|
runtime: {
|
|
129
|
-
configKey: 'vma',
|
|
130
145
|
defaultConfig: { period: 5, showVMA: true },
|
|
131
146
|
computeKey: 'calcVMAData',
|
|
132
147
|
compute: (data, c) => calcVMAData(data, c.period),
|
|
@@ -7,6 +7,9 @@ import { createVolumeProfileVisibleStateComposer } from '../../indicators/visibl
|
|
|
7
7
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
8
8
|
import type { IndicatorScheduler, VolumeProfileSchedulerConfig } from '../../indicators/scheduler'
|
|
9
9
|
import { calcVolumeProfileData } from '../../indicators/calculators'
|
|
10
|
+
import type { TitleInfo } from '../../indicators/indicatorMetadata'
|
|
11
|
+
import type { KLineData } from '../../../types/price'
|
|
12
|
+
import { resolveThemeColors } from '../../../tokens'
|
|
10
13
|
|
|
11
14
|
const BAR_FILL = 'rgba(99, 102, 241, 0.35)'
|
|
12
15
|
const POC_COLOR = '#f59e0b'
|
|
@@ -111,21 +114,49 @@ export function createVolumeProfileRendererPlugin(options: { paneId?: string } =
|
|
|
111
114
|
}
|
|
112
115
|
}
|
|
113
116
|
|
|
117
|
+
const VP_POC_COLOR = '#8b5cf6'
|
|
118
|
+
const VP_VAH_COLOR = '#6366f1'
|
|
119
|
+
const VP_VAL_COLOR = '#818cf8'
|
|
120
|
+
|
|
121
|
+
export function getVolumeProfileTitleInfo(
|
|
122
|
+
_data: KLineData[],
|
|
123
|
+
index: number | null,
|
|
124
|
+
params: Record<string, number | boolean | string>,
|
|
125
|
+
host: PluginHost,
|
|
126
|
+
paneId: string,
|
|
127
|
+
): TitleInfo | null {
|
|
128
|
+
if (index === null) return null
|
|
129
|
+
const bins = (params.bins as number) ?? 24
|
|
130
|
+
const state = host.getSharedState<VolumeProfileRenderState>(createVolumeProfileStateKey(paneId))
|
|
131
|
+
const vp = state?.series
|
|
132
|
+
|
|
133
|
+
const values: Array<{ label: string; value: number; color: string }> = []
|
|
134
|
+
if (vp && vp.bins.length > 0) {
|
|
135
|
+
if (state.params.showPOC) {
|
|
136
|
+
values.push({ label: 'POC', value: vp.poc, color: VP_POC_COLOR })
|
|
137
|
+
}
|
|
138
|
+
if (state.params.showValueArea) {
|
|
139
|
+
values.push({ label: 'VAH', value: vp.vah, color: VP_VAH_COLOR })
|
|
140
|
+
values.push({ label: 'VAL', value: vp.val, color: VP_VAL_COLOR })
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
name: 'VP',
|
|
146
|
+
params: [bins],
|
|
147
|
+
values,
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
114
151
|
@Indicator({
|
|
115
152
|
name: 'volumeProfile',
|
|
116
153
|
displayName: 'VP',
|
|
117
154
|
category: 'volume',
|
|
118
|
-
stateKey: createVolumeProfileStateKey,
|
|
119
155
|
defaultPaneId: 'sub_VolumeProfile',
|
|
120
156
|
scale: { indicatorKey: 'volumeProfile', label: 'VP', decimals: 0 },
|
|
157
|
+
getTitleInfo: getVolumeProfileTitleInfo,
|
|
121
158
|
visibleState: { compose: createVolumeProfileVisibleStateComposer('volumeProfile', EMPTY_VOLUME_PROFILE_STATE) },
|
|
122
|
-
|
|
123
|
-
(scheduler as IndicatorScheduler).updateIndicatorConfig('volumeProfile', params, paneId)
|
|
124
|
-
},
|
|
125
|
-
applyResult: (host, state, paneId) => {
|
|
126
|
-
host.setSharedState(createVolumeProfileStateKey(paneId), state as any, 'indicator_scheduler')
|
|
127
|
-
},
|
|
128
|
-
runtime: { configKey:'volumeProfile', defaultConfig:{bins:24,lookback:100,valueAreaPercent:70,showPOC:true,showValueArea:true}, computeKey:'calcVolumeProfileData', compute:(data,c)=>calcVolumeProfileData(data,c.bins,c.lookback,c.valueAreaPercent) },
|
|
159
|
+
runtime: { defaultConfig:{bins:24,lookback:100,valueAreaPercent:70,showPOC:true,showValueArea:true}, computeKey:'calcVolumeProfileData', compute:(data,c)=>calcVolumeProfileData(data,c.bins,c.lookback,c.valueAreaPercent) },
|
|
129
160
|
})
|
|
130
161
|
class VolumeProfileIndicatorDefinition {
|
|
131
162
|
static rendererFactory = createVolumeProfileRendererPlugin
|
|
@@ -7,6 +7,8 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
|
7
7
|
import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
8
|
import type { IndicatorScheduler, VWAPSchedulerConfig } from '../../indicators/scheduler'
|
|
9
9
|
import { calcVWAPData } from '../../indicators/calculators'
|
|
10
|
+
import type { TitleInfo } from '../../indicators/indicatorMetadata'
|
|
11
|
+
import type { KLineData } from '../../../types/price'
|
|
10
12
|
|
|
11
13
|
const VWAP_COLOR = '#ec4899'
|
|
12
14
|
|
|
@@ -109,22 +111,34 @@ export function createVWAPRendererPlugin(options: { paneId?: string } = {}): Ren
|
|
|
109
111
|
}
|
|
110
112
|
}
|
|
111
113
|
|
|
114
|
+
export function getVWAPTitleInfo(
|
|
115
|
+
_data: KLineData[],
|
|
116
|
+
index: number | null,
|
|
117
|
+
_params: Record<string, number | boolean | string>,
|
|
118
|
+
host: PluginHost,
|
|
119
|
+
paneId: string,
|
|
120
|
+
): TitleInfo | null {
|
|
121
|
+
if (index === null) return null
|
|
122
|
+
const state = host.getSharedState<VWAPRenderState>(createVWAPStateKey(paneId))
|
|
123
|
+
const value = state?.series[index]
|
|
124
|
+
if (value === undefined) return null
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
name: 'VWAP',
|
|
128
|
+
params: [],
|
|
129
|
+
values: [{ label: 'VWAP', value, color: VWAP_COLOR }],
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
112
133
|
@Indicator({
|
|
113
134
|
name: 'vwap',
|
|
114
135
|
displayName: 'VWAP',
|
|
115
136
|
category: 'volume',
|
|
116
|
-
stateKey: createVWAPStateKey,
|
|
117
137
|
defaultPaneId: 'sub_VWAP',
|
|
118
138
|
visibleState: { compose: createSparseVisibleStateComposer('vwap', EMPTY_VWAP_STATE) },
|
|
119
139
|
scale: { indicatorKey: 'vwap', label: 'VWAP', decimals: 2 },
|
|
120
|
-
|
|
121
|
-
(scheduler as IndicatorScheduler).updateIndicatorConfig('vwap', params, paneId)
|
|
122
|
-
},
|
|
123
|
-
applyResult: (host, state, paneId) => {
|
|
124
|
-
host.setSharedState(createVWAPStateKey(paneId), state as any, 'indicator_scheduler')
|
|
125
|
-
},
|
|
140
|
+
getTitleInfo: getVWAPTitleInfo,
|
|
126
141
|
runtime: {
|
|
127
|
-
configKey: 'vwap',
|
|
128
142
|
defaultConfig: { sessionResetGapMs: 0, showVWAP: true },
|
|
129
143
|
computeKey: 'calcVWAPData',
|
|
130
144
|
compute: (data, c) => calcVWAPData(data, c.sessionResetGapMs),
|
|
@@ -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 { WMARenderState } from '../../indicators/wmaState'
|
|
4
5
|
import { createWMAStateKey, EMPTY_WMA_STATE } from '../../indicators/wmaState'
|
|
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, WMASchedulerConfig } from '../../indicators/scheduler'
|
|
9
10
|
import { calcWMAData } from '../../indicators/calculators'
|
|
@@ -121,23 +122,40 @@ export function createWMARendererPlugin(options: WMARendererOptions = {}): Rende
|
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
export const getWMATitleInfo: 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 = createWMAStateKey(paneId)
|
|
135
|
+
const state = pluginHost?.getSharedState<WMARenderState>(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: 'WMA',
|
|
143
|
+
params: [state.params.period],
|
|
144
|
+
values: [{ label: 'WMA', value, color: '#10b981' }],
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
124
148
|
@Indicator({
|
|
125
149
|
name: 'wma',
|
|
126
150
|
displayName: 'WMA',
|
|
151
|
+
getTitleInfo: getWMATitleInfo,
|
|
127
152
|
category: 'main',
|
|
128
|
-
stateKey: createWMAStateKey,
|
|
129
153
|
defaultPaneId: 'main',
|
|
130
154
|
allowMainPane: true,
|
|
131
155
|
mainPane: { rendererName: 'wma_main', toActiveConfig: (params, active) => ({ ...params, showWMA: active }) },
|
|
132
156
|
visibleState: { compose: createSparseVisibleStateComposer('wma', EMPTY_WMA_STATE) },
|
|
133
157
|
scale: { indicatorKey: 'wma', label: 'WMA', decimals: 2 },
|
|
134
|
-
|
|
135
|
-
(scheduler as IndicatorScheduler).updateIndicatorConfig('wma', params, paneId)
|
|
136
|
-
},
|
|
137
|
-
applyResult: (host, state, paneId) => {
|
|
138
|
-
host.setSharedState(createWMAStateKey(paneId), state as any, 'indicator_scheduler')
|
|
139
|
-
},
|
|
140
|
-
runtime: { configKey:'wma', defaultConfig:{period:10,showWMA:true}, computeKey:'calcWMAData', compute:(data,c)=>calcWMAData(data,c.period) },
|
|
158
|
+
runtime: { defaultConfig:{period:10,showWMA:true}, computeKey:'calcWMAData', compute:(data,c)=>calcWMAData(data,c.period) },
|
|
141
159
|
})
|
|
142
160
|
class WMADefinition {
|
|
143
161
|
static rendererFactory = createWMARendererPlugin
|
|
@@ -10,6 +10,7 @@ import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
|
10
10
|
import type { IndicatorScheduler, WMSRSchedulerConfig } from '../../indicators/scheduler'
|
|
11
11
|
import { createWmsrScaleRendererPlugin } from './scale/wmsr_scale'
|
|
12
12
|
import { calcWMSRData } from '../../indicators/calculators'
|
|
13
|
+
import type { KLineData } from '../../../types/price'
|
|
13
14
|
|
|
14
15
|
type LinePoint = { x: number; y: number }
|
|
15
16
|
|
|
@@ -293,14 +294,15 @@ function drawWMSRLineWithCanvas2D(
|
|
|
293
294
|
* 获取 WMSR 标题信息(供 paneTitle 使用)
|
|
294
295
|
*/
|
|
295
296
|
export function getWMSRTitleInfo(
|
|
296
|
-
|
|
297
|
-
|
|
297
|
+
_data: KLineData[],
|
|
298
|
+
index: number | null,
|
|
299
|
+
params: Record<string, number | boolean | string>,
|
|
298
300
|
pluginHost: PluginHost,
|
|
299
|
-
paneId: string
|
|
300
|
-
theme: 'light' | 'dark' = 'light',
|
|
301
|
-
isAsiaMarket?: boolean
|
|
301
|
+
paneId: string,
|
|
302
302
|
): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
|
|
303
|
-
|
|
303
|
+
if (index === null) return null
|
|
304
|
+
const period = (params.period as number) ?? 14
|
|
305
|
+
const colors = resolveThemeColors('light')
|
|
304
306
|
const state = pluginHost.getSharedState<WMSRRenderState>(createWMSRStateKey(paneId))
|
|
305
307
|
if (!state) return null
|
|
306
308
|
|
|
@@ -320,18 +322,11 @@ export function getWMSRTitleInfo(
|
|
|
320
322
|
name: 'wmsr',
|
|
321
323
|
displayName: 'WMSR',
|
|
322
324
|
category: 'oscillator',
|
|
323
|
-
stateKey: createWMSRStateKey,
|
|
324
325
|
defaultPaneId: 'sub_WMSR',
|
|
325
326
|
visibleState: { compose: createFixedRangeSparseVisibleStateComposer('wmsr', EMPTY_WMSR_STATE) },
|
|
326
327
|
scaleRendererFactory: createWmsrScaleRendererPlugin,
|
|
327
|
-
|
|
328
|
-
(scheduler as IndicatorScheduler).updateIndicatorConfig('wmsr', params, paneId)
|
|
329
|
-
},
|
|
330
|
-
applyResult: (host, state, paneId) => {
|
|
331
|
-
host.setSharedState(createWMSRStateKey(paneId), state as any, 'indicator_scheduler')
|
|
332
|
-
},
|
|
328
|
+
getTitleInfo: getWMSRTitleInfo,
|
|
333
329
|
runtime: {
|
|
334
|
-
configKey: 'wmsr',
|
|
335
330
|
defaultConfig: { period: 14, showWMSR: true },
|
|
336
331
|
computeKey: 'calcWMSRData',
|
|
337
332
|
compute: (data, c) => calcWMSRData(data, c.period),
|
|
@@ -5,7 +5,7 @@ import type { ZonesRenderState } from '../../indicators/zonesState'
|
|
|
5
5
|
import { createZonesStateKey, EMPTY_ZONES_STATE } from '../../indicators/zonesState'
|
|
6
6
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
7
7
|
import { createFixedUnitVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
|
-
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
8
|
+
import { resolveStateKey, type TitleInfo, type TitleValueItem, type GetTitleInfoFn } from '../../indicators/indicatorMetadata'
|
|
9
9
|
import type { IndicatorScheduler, ZonesSchedulerConfig } from '../../indicators/scheduler'
|
|
10
10
|
import { calcZonesData } from '../../indicators/calculators'
|
|
11
11
|
|
|
@@ -90,23 +90,42 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
export const getZonesTitleInfo: GetTitleInfoFn = (_data, index, _params, host, paneId) => {
|
|
94
|
+
if (index === null) return null
|
|
95
|
+
|
|
96
|
+
const stateKey = createZonesStateKey(paneId)
|
|
97
|
+
const state = host?.getSharedState<ZonesRenderState>(stateKey)
|
|
98
|
+
if (!state) return null
|
|
99
|
+
|
|
100
|
+
const activeZones = state.series.filter(
|
|
101
|
+
z => z.startIndex <= index && (z.endIndex === undefined || z.endIndex >= index)
|
|
102
|
+
)
|
|
103
|
+
if (activeZones.length === 0) return null
|
|
104
|
+
|
|
105
|
+
const values: TitleValueItem[] = activeZones.slice(0, 5).map(z => ({
|
|
106
|
+
label: z.kind,
|
|
107
|
+
value: z.high,
|
|
108
|
+
color: z.kind.includes('Bull') ? '#22c55e' : '#ef4444',
|
|
109
|
+
}))
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
name: 'Zones',
|
|
113
|
+
params: [activeZones.length],
|
|
114
|
+
values,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
93
118
|
@Indicator({
|
|
94
119
|
name: 'zones',
|
|
95
120
|
displayName: 'Zones',
|
|
121
|
+
getTitleInfo: getZonesTitleInfo,
|
|
96
122
|
category: 'main',
|
|
97
|
-
stateKey: createZonesStateKey,
|
|
98
123
|
defaultPaneId: 'main',
|
|
99
124
|
allowMainPane: true,
|
|
100
125
|
mainPane: { rendererName: 'zones_main', toActiveConfig: (params, active) => ({ ...params, showFVG: active, showOB: active, showFilledZones: active }) },
|
|
101
126
|
scale: { indicatorKey: 'zones', label: 'Zones', decimals: 2 },
|
|
102
127
|
visibleState: { compose: createFixedUnitVisibleStateComposer('zones', EMPTY_ZONES_STATE) },
|
|
103
|
-
|
|
104
|
-
(scheduler as IndicatorScheduler).updateIndicatorConfig('zones', params, paneId)
|
|
105
|
-
},
|
|
106
|
-
applyResult: (host, state, paneId) => {
|
|
107
|
-
host.setSharedState(createZonesStateKey(paneId), state as any, 'indicator_scheduler')
|
|
108
|
-
},
|
|
109
|
-
runtime: { configKey:'zones', defaultConfig:{showFVG:true,showOB:true,showFilledZones:true,obLookback:20}, computeKey:'calcZonesData', compute:(data,c)=>calcZonesData(data,c.obLookback,5,2,'close') },
|
|
128
|
+
runtime: { defaultConfig:{showFVG:true,showOB:true,showFilledZones:true,obLookback:20}, computeKey:'calcZonesData', compute:(data,c)=>calcZonesData(data,c.obLookback,5,2,'close') },
|
|
110
129
|
})
|
|
111
130
|
class ZonesDefinition {
|
|
112
131
|
static rendererFactory = createZonesRendererPlugin
|