@363045841yyt/klinechart-core 0.7.9 → 0.7.10
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/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +39 -229
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts +10 -3
- package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js +29 -2
- package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.d.ts +79 -2
- package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.d.ts +5 -0
- package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.js +49 -5
- package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
- package/dist/engine/indicators/registerBuiltins.d.ts +42 -0
- package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -0
- package/dist/engine/indicators/registerBuiltins.js +46 -0
- package/dist/engine/indicators/registerBuiltins.js.map +1 -0
- package/dist/engine/indicators/scheduler.d.ts +2 -2
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +41 -11
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/indicators/stateComposer.d.ts +6 -4
- package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
- package/dist/engine/indicators/stateComposer.js +80 -984
- package/dist/engine/indicators/stateComposer.js.map +1 -1
- package/dist/engine/indicators/visibleStateComposers.d.ts +145 -0
- package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -0
- package/dist/engine/indicators/visibleStateComposers.js +469 -0
- package/dist/engine/indicators/visibleStateComposers.js.map +1 -0
- package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/atr.js +8 -0
- package/dist/engine/renderers/Indicator/atr.js.map +1 -1
- package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/boll.js +47 -0
- package/dist/engine/renderers/Indicator/boll.js.map +1 -1
- package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/cci.js +8 -1
- package/dist/engine/renderers/Indicator/cci.js.map +1 -1
- package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/chaikinVol.js +7 -1
- package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
- package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/cmf.js +7 -1
- package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
- package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/dema.js +8 -1
- package/dist/engine/renderers/Indicator/dema.js.map +1 -1
- package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/donchian.js +8 -1
- package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
- package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ene.js +45 -0
- package/dist/engine/renderers/Indicator/ene.js.map +1 -1
- package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/expma.js +45 -0
- package/dist/engine/renderers/Indicator/expma.js.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.js +8 -1
- package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
- package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/fib.js +8 -1
- package/dist/engine/renderers/Indicator/fib.js.map +1 -1
- package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/hma.js +8 -1
- package/dist/engine/renderers/Indicator/hma.js.map +1 -1
- package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/hv.js +7 -0
- package/dist/engine/renderers/Indicator/hv.js.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.js +8 -1
- package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
- package/dist/engine/renderers/Indicator/index.d.ts +7 -2
- package/dist/engine/renderers/Indicator/index.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/index.js +2 -114
- package/dist/engine/renderers/Indicator/index.js.map +1 -1
- package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kama.js +8 -1
- package/dist/engine/renderers/Indicator/kama.js.map +1 -1
- package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/keltner.js +8 -1
- package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
- package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kst.js +8 -0
- package/dist/engine/renderers/Indicator/kst.js.map +1 -1
- package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ma.js +63 -0
- package/dist/engine/renderers/Indicator/ma.js.map +1 -1
- package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/macd.js +8 -1
- package/dist/engine/renderers/Indicator/macd.js.map +1 -1
- package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mfi.js +7 -1
- package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
- package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mom.js +8 -0
- package/dist/engine/renderers/Indicator/mom.js.map +1 -1
- package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/obv.js +7 -1
- package/dist/engine/renderers/Indicator/obv.js.map +1 -1
- package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/parkinson.js +7 -0
- package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
- package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/pivot.js +8 -1
- package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
- package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/pvt.js +7 -1
- package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
- package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/roc.js +7 -1
- package/dist/engine/renderers/Indicator/roc.js.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.js +8 -1
- package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
- package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/sar.js +8 -1
- package/dist/engine/renderers/Indicator/sar.js.map +1 -1
- package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/stoch.js +8 -1
- package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
- package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/structure.js +8 -1
- package/dist/engine/renderers/Indicator/structure.js.map +1 -1
- package/dist/engine/renderers/Indicator/subPaneConfig.d.ts +1 -1
- package/dist/engine/renderers/Indicator/subPaneConfig.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/subPaneConfig.js.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.js +8 -1
- package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
- package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/tema.js +8 -1
- package/dist/engine/renderers/Indicator/tema.js.map +1 -1
- package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/trix.js +7 -0
- package/dist/engine/renderers/Indicator/trix.js.map +1 -1
- package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/vma.js +7 -0
- package/dist/engine/renderers/Indicator/vma.js.map +1 -1
- package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/volumeProfile.js +7 -1
- package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
- package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/vwap.js +7 -1
- package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
- package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/wma.js +8 -1
- package/dist/engine/renderers/Indicator/wma.js.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.js +8 -1
- package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
- package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/zones.js +8 -1
- package/dist/engine/renderers/Indicator/zones.js.map +1 -1
- package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
- package/dist/engine/renderers/extremaMarkers.js +0 -22
- package/dist/engine/renderers/extremaMarkers.js.map +1 -1
- package/dist/engine/renderers/subVolume.d.ts.map +1 -1
- package/dist/engine/renderers/subVolume.js +3 -0
- package/dist/engine/renderers/subVolume.js.map +1 -1
- package/dist/engine/subPaneManager.d.ts +1 -0
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +30 -237
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/semantic/controller.d.ts +9 -4
- package/dist/semantic/controller.d.ts.map +1 -1
- package/dist/semantic/controller.js +57 -53
- package/dist/semantic/controller.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 +1 -1
- package/src/engine/chart.ts +49 -229
- package/src/engine/indicators/__tests__/indicatorDefinitionRegistry.test.ts +59 -0
- package/src/engine/indicators/__tests__/indicatorRegistry.test.ts +62 -0
- package/src/engine/indicators/__tests__/registerBuiltins.test.ts +380 -0
- package/src/engine/indicators/__tests__/scheduler.test.ts +62 -32
- package/src/engine/indicators/__tests__/stateComposer.test.ts +444 -0
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +49 -4
- package/src/engine/indicators/indicatorMetadata.ts +107 -2
- package/src/engine/indicators/indicatorRegistry.ts +54 -5
- package/src/engine/indicators/registerBuiltins.ts +47 -0
- package/src/engine/indicators/scheduler.ts +61 -13
- package/src/engine/indicators/stateComposer.ts +110 -1040
- package/src/engine/indicators/visibleStateComposers.ts +734 -0
- package/src/engine/renderers/Indicator/__tests__/createSubIndicatorRenderer.test.ts +61 -0
- package/src/engine/renderers/Indicator/atr.ts +9 -1
- package/src/engine/renderers/Indicator/boll.ts +53 -1
- package/src/engine/renderers/Indicator/cci.ts +9 -2
- package/src/engine/renderers/Indicator/chaikinVol.ts +8 -2
- package/src/engine/renderers/Indicator/cmf.ts +8 -2
- package/src/engine/renderers/Indicator/dema.ts +9 -2
- package/src/engine/renderers/Indicator/donchian.ts +9 -2
- package/src/engine/renderers/Indicator/ene.ts +51 -1
- package/src/engine/renderers/Indicator/expma.ts +51 -1
- package/src/engine/renderers/Indicator/fastk.ts +9 -2
- package/src/engine/renderers/Indicator/fib.ts +9 -2
- package/src/engine/renderers/Indicator/hma.ts +9 -2
- package/src/engine/renderers/Indicator/hv.ts +8 -1
- package/src/engine/renderers/Indicator/ichimoku.ts +9 -2
- package/src/engine/renderers/Indicator/index.ts +9 -121
- package/src/engine/renderers/Indicator/kama.ts +9 -2
- package/src/engine/renderers/Indicator/keltner.ts +9 -2
- package/src/engine/renderers/Indicator/kst.ts +9 -1
- package/src/engine/renderers/Indicator/ma.ts +69 -0
- package/src/engine/renderers/Indicator/macd.ts +9 -2
- package/src/engine/renderers/Indicator/mfi.ts +8 -2
- package/src/engine/renderers/Indicator/mom.ts +9 -1
- package/src/engine/renderers/Indicator/obv.ts +8 -2
- package/src/engine/renderers/Indicator/parkinson.ts +8 -1
- package/src/engine/renderers/Indicator/pivot.ts +9 -2
- package/src/engine/renderers/Indicator/pvt.ts +8 -2
- package/src/engine/renderers/Indicator/roc.ts +8 -2
- package/src/engine/renderers/Indicator/rsi.ts +9 -2
- package/src/engine/renderers/Indicator/sar.ts +9 -2
- package/src/engine/renderers/Indicator/stoch.ts +9 -2
- package/src/engine/renderers/Indicator/structure.ts +9 -2
- package/src/engine/renderers/Indicator/subPaneConfig.ts +1 -1
- package/src/engine/renderers/Indicator/supertrend.ts +9 -2
- package/src/engine/renderers/Indicator/tema.ts +9 -2
- package/src/engine/renderers/Indicator/trix.ts +8 -1
- package/src/engine/renderers/Indicator/vma.ts +8 -1
- package/src/engine/renderers/Indicator/volumeProfile.ts +8 -2
- package/src/engine/renderers/Indicator/vwap.ts +8 -2
- package/src/engine/renderers/Indicator/wma.ts +9 -2
- package/src/engine/renderers/Indicator/wmsr.ts +9 -2
- package/src/engine/renderers/Indicator/zones.ts +9 -2
- package/src/engine/renderers/extremaMarkers.ts +0 -24
- package/src/engine/renderers/subVolume.ts +3 -0
- package/src/engine/subPaneManager.ts +34 -274
- package/src/semantic/__tests__/controller.test.ts +84 -0
- package/src/semantic/controller.ts +69 -65
- package/src/version.ts +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import type { RendererPlugin } from '../../../plugin'
|
|
6
|
-
import {
|
|
6
|
+
import type { IndicatorMetadata } from '../../indicators/indicatorMetadata'
|
|
7
7
|
|
|
8
8
|
// MA 均线
|
|
9
9
|
export { createMARendererPlugin, type MAFlags } from './ma'
|
|
@@ -104,138 +104,26 @@ export { createVolumeProfileRendererPlugin } from './volumeProfile'
|
|
|
104
104
|
/**
|
|
105
105
|
* 副图指标类型
|
|
106
106
|
*/
|
|
107
|
-
export type SubIndicatorType =
|
|
108
|
-
| 'WMA' | 'DEMA' | 'TEMA' | 'HMA' | 'KAMA' | 'SAR' | 'SUPERTREND' | 'KELTNER' | 'DONCHIAN' | 'ICHIMOKU'
|
|
109
|
-
| 'ROC' | 'TRIX' | 'HV' | 'PARKINSON' | 'CHAIKIN_VOL' | 'VMA' | 'OBV' | 'PVT' | 'VWAP'
|
|
110
|
-
| 'CMF' | 'MFI' | 'PIVOT' | 'FIB' | 'STRUCTURE' | 'ZONES' | 'VOLUME_PROFILE'
|
|
107
|
+
export type SubIndicatorType = string
|
|
111
108
|
|
|
112
109
|
/**
|
|
113
110
|
* 渲染器工厂选项
|
|
114
111
|
*/
|
|
115
112
|
export interface IndicatorRendererOptions {
|
|
116
113
|
/** 指标类型 */
|
|
117
|
-
indicatorId:
|
|
114
|
+
indicatorId: string
|
|
118
115
|
/** 目标 pane ID */
|
|
119
116
|
paneId: string
|
|
117
|
+
/** 指标元数据 */
|
|
118
|
+
definition: IndicatorMetadata
|
|
119
|
+
/** 初始配置 */
|
|
120
|
+
params?: Record<string, unknown>
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
// 导入各个创建函数用于工厂函数
|
|
123
|
-
import { createMACDRendererPlugin } from './macd'
|
|
124
|
-
import { createRSIRendererPlugin } from './rsi'
|
|
125
|
-
import { createCCIRendererPlugin } from './cci'
|
|
126
|
-
import { createSTOCHRendererPlugin } from './stoch'
|
|
127
|
-
import { createMOMRendererPlugin } from './mom'
|
|
128
|
-
import { createWMSRRendererPlugin } from './wmsr'
|
|
129
|
-
import { createKSTRendererPlugin } from './kst'
|
|
130
|
-
import { createFASTKRendererPlugin } from './fastk'
|
|
131
|
-
import { createATRRendererPlugin } from './atr'
|
|
132
|
-
import { createWMARendererPlugin } from './wma'
|
|
133
|
-
import { createDEMARendererPlugin } from './dema'
|
|
134
|
-
import { createTEMARendererPlugin } from './tema'
|
|
135
|
-
import { createHMARendererPlugin } from './hma'
|
|
136
|
-
import { createKAMARendererPlugin } from './kama'
|
|
137
|
-
import { createSARRendererPlugin } from './sar'
|
|
138
|
-
import { createSuperTrendRendererPlugin } from './supertrend'
|
|
139
|
-
import { createKeltnerRendererPlugin } from './keltner'
|
|
140
|
-
import { createDonchianRendererPlugin } from './donchian'
|
|
141
|
-
import { createIchimokuRendererPlugin } from './ichimoku'
|
|
142
|
-
import { createROCRendererPlugin } from './roc'
|
|
143
|
-
import { createTRIXRendererPlugin } from './trix'
|
|
144
|
-
import { createHVRendererPlugin } from './hv'
|
|
145
|
-
import { createParkinsonRendererPlugin } from './parkinson'
|
|
146
|
-
import { createChaikinVolRendererPlugin } from './chaikinVol'
|
|
147
|
-
import { createVMARendererPlugin } from './vma'
|
|
148
|
-
import { createOBVRendererPlugin } from './obv'
|
|
149
|
-
import { createPVTRendererPlugin } from './pvt'
|
|
150
|
-
import { createVWAPRendererPlugin } from './vwap'
|
|
151
|
-
import { createCMFRendererPlugin } from './cmf'
|
|
152
|
-
import { createMFIRendererPlugin } from './mfi'
|
|
153
|
-
import { createPivotRendererPlugin } from './pivot'
|
|
154
|
-
import { createFibRendererPlugin } from './fib'
|
|
155
|
-
import { createStructureRendererPlugin } from './structure'
|
|
156
|
-
import { createZonesRendererPlugin } from './zones'
|
|
157
|
-
import { createVolumeProfileRendererPlugin } from './volumeProfile'
|
|
158
|
-
|
|
159
123
|
/**
|
|
160
124
|
* 创建副图指标渲染器(统一工厂函数)
|
|
161
125
|
*/
|
|
162
126
|
export function createSubIndicatorRenderer(options: IndicatorRendererOptions): RendererPlugin {
|
|
163
|
-
const { indicatorId, paneId } = options
|
|
164
|
-
|
|
165
|
-
switch (indicatorId) {
|
|
166
|
-
case 'VOLUME':
|
|
167
|
-
return createVolumeRendererPlugin({ paneId })
|
|
168
|
-
case 'MACD':
|
|
169
|
-
return createMACDRendererPlugin({ paneId })
|
|
170
|
-
case 'RSI':
|
|
171
|
-
return createRSIRendererPlugin({ paneId })
|
|
172
|
-
case 'CCI':
|
|
173
|
-
return createCCIRendererPlugin({ paneId })
|
|
174
|
-
case 'STOCH':
|
|
175
|
-
return createSTOCHRendererPlugin({ paneId })
|
|
176
|
-
case 'MOM':
|
|
177
|
-
return createMOMRendererPlugin({ paneId })
|
|
178
|
-
case 'WMSR':
|
|
179
|
-
return createWMSRRendererPlugin({ paneId })
|
|
180
|
-
case 'KST':
|
|
181
|
-
return createKSTRendererPlugin({ paneId })
|
|
182
|
-
case 'FASTK':
|
|
183
|
-
return createFASTKRendererPlugin({ paneId })
|
|
184
|
-
case 'ATR':
|
|
185
|
-
return createATRRendererPlugin({ paneId })
|
|
186
|
-
case 'WMA':
|
|
187
|
-
return createWMARendererPlugin({ paneId })
|
|
188
|
-
case 'DEMA':
|
|
189
|
-
return createDEMARendererPlugin({ paneId })
|
|
190
|
-
case 'TEMA':
|
|
191
|
-
return createTEMARendererPlugin({ paneId })
|
|
192
|
-
case 'HMA':
|
|
193
|
-
return createHMARendererPlugin({ paneId })
|
|
194
|
-
case 'KAMA':
|
|
195
|
-
return createKAMARendererPlugin({ paneId })
|
|
196
|
-
case 'SAR':
|
|
197
|
-
return createSARRendererPlugin({ paneId })
|
|
198
|
-
case 'SUPERTREND':
|
|
199
|
-
return createSuperTrendRendererPlugin({ paneId })
|
|
200
|
-
case 'KELTNER':
|
|
201
|
-
return createKeltnerRendererPlugin({ paneId })
|
|
202
|
-
case 'DONCHIAN':
|
|
203
|
-
return createDonchianRendererPlugin({ paneId })
|
|
204
|
-
case 'ICHIMOKU':
|
|
205
|
-
return createIchimokuRendererPlugin({ paneId })
|
|
206
|
-
case 'ROC':
|
|
207
|
-
return createROCRendererPlugin({ paneId })
|
|
208
|
-
case 'TRIX':
|
|
209
|
-
return createTRIXRendererPlugin({ paneId })
|
|
210
|
-
case 'HV':
|
|
211
|
-
return createHVRendererPlugin({ paneId })
|
|
212
|
-
case 'PARKINSON':
|
|
213
|
-
return createParkinsonRendererPlugin({ paneId })
|
|
214
|
-
case 'CHAIKIN_VOL':
|
|
215
|
-
return createChaikinVolRendererPlugin({ paneId })
|
|
216
|
-
case 'VMA':
|
|
217
|
-
return createVMARendererPlugin({ paneId })
|
|
218
|
-
case 'OBV':
|
|
219
|
-
return createOBVRendererPlugin({ paneId })
|
|
220
|
-
case 'PVT':
|
|
221
|
-
return createPVTRendererPlugin({ paneId })
|
|
222
|
-
case 'VWAP':
|
|
223
|
-
return createVWAPRendererPlugin({ paneId })
|
|
224
|
-
case 'CMF':
|
|
225
|
-
return createCMFRendererPlugin({ paneId })
|
|
226
|
-
case 'MFI':
|
|
227
|
-
return createMFIRendererPlugin({ paneId })
|
|
228
|
-
case 'PIVOT':
|
|
229
|
-
return createPivotRendererPlugin({ paneId })
|
|
230
|
-
case 'FIB':
|
|
231
|
-
return createFibRendererPlugin({ paneId })
|
|
232
|
-
case 'STRUCTURE':
|
|
233
|
-
return createStructureRendererPlugin({ paneId })
|
|
234
|
-
case 'ZONES':
|
|
235
|
-
return createZonesRendererPlugin({ paneId })
|
|
236
|
-
case 'VOLUME_PROFILE':
|
|
237
|
-
return createVolumeProfileRendererPlugin({ paneId })
|
|
238
|
-
default:
|
|
239
|
-
throw new Error(`Unknown indicator: ${indicatorId}`)
|
|
240
|
-
}
|
|
127
|
+
const { indicatorId, paneId, definition, params } = options
|
|
128
|
+
return definition.rendererFactory({ paneId, indicatorId, params })
|
|
241
129
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { KAMARenderState } from '../../indicators/kamaState'
|
|
4
|
-
import { createKAMAStateKey } from '../../indicators/kamaState'
|
|
4
|
+
import { createKAMAStateKey, EMPTY_KAMA_STATE } from '../../indicators/kamaState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
6
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import
|
|
7
|
+
import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
|
+
import type { IndicatorScheduler, KAMASchedulerConfig } from '../../indicators/scheduler'
|
|
8
9
|
|
|
9
10
|
const KAMA_COLOR = '#0ea5e9'
|
|
10
11
|
|
|
@@ -127,6 +128,12 @@ export function createKAMARendererPlugin(options: KAMARendererOptions = {}): Ren
|
|
|
127
128
|
defaultPaneId: 'main',
|
|
128
129
|
paneIdField: 'kamaPaneId',
|
|
129
130
|
allowMainPane: true,
|
|
131
|
+
mainPane: { rendererName: 'kama_main', toActiveConfig: (params, active) => ({ ...params, showKAMA: active }) },
|
|
132
|
+
visibleState: { compose: createSparseVisibleStateComposer('kama', EMPTY_KAMA_STATE) },
|
|
133
|
+
scale: { indicatorKey: 'kama', label: 'KAMA', decimals: 2 },
|
|
134
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
135
|
+
(scheduler as IndicatorScheduler).updateKAMAConfig(params as Partial<KAMASchedulerConfig>, paneId)
|
|
136
|
+
},
|
|
130
137
|
applyResult: (host, state, paneId) => {
|
|
131
138
|
host.setSharedState(createKAMAStateKey(paneId), state as any, 'indicator_scheduler')
|
|
132
139
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { KeltnerRenderState } from '../../indicators/keltnerState'
|
|
4
|
-
import { createKeltnerStateKey } from '../../indicators/keltnerState'
|
|
4
|
+
import { createKeltnerStateKey, EMPTY_KELTNER_STATE } from '../../indicators/keltnerState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
6
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
7
|
+
import type { IndicatorScheduler, KeltnerSchedulerConfig } from '../../indicators/scheduler'
|
|
8
|
+
import { createBandVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
9
|
|
|
9
10
|
const KELTNER_UPPER_COLOR = '#7c3aed'
|
|
10
11
|
const KELTNER_MIDDLE_COLOR = '#f59e0b'
|
|
@@ -129,6 +130,12 @@ function drawLine(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
|
|
|
129
130
|
defaultPaneId: 'main',
|
|
130
131
|
paneIdField: 'keltnerPaneId',
|
|
131
132
|
allowMainPane: true,
|
|
133
|
+
mainPane: { rendererName: 'keltner_main', toActiveConfig: (params, active) => ({ ...params, showUpper: active, showMiddle: active, showLower: active }) },
|
|
134
|
+
scale: { indicatorKey: 'keltner', label: 'Keltner', decimals: 2 },
|
|
135
|
+
visibleState: { compose: createBandVisibleStateComposer('keltner', EMPTY_KELTNER_STATE, 'lower', 'upper') },
|
|
136
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
137
|
+
(scheduler as IndicatorScheduler).updateKeltnerConfig(params as Partial<KeltnerSchedulerConfig>, paneId)
|
|
138
|
+
},
|
|
132
139
|
applyResult: (host, state, paneId) => {
|
|
133
140
|
host.setSharedState(createKeltnerStateKey(paneId), state as any, 'indicator_scheduler')
|
|
134
141
|
},
|
|
@@ -3,9 +3,12 @@ import { RENDERER_PRIORITY } from '../../../plugin'
|
|
|
3
3
|
import { resolveThemeColors } from '../../../tokens'
|
|
4
4
|
import type { KSTRenderState } from '../../indicators/kstState'
|
|
5
5
|
import { createKSTStateKey } from '../../indicators/kstState'
|
|
6
|
+
import { EMPTY_KST_STATE } from '../../indicators/kstState'
|
|
7
|
+
import { createPaddedPointVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
6
8
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
7
9
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
8
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
10
|
+
import type { IndicatorScheduler, KSTSchedulerConfig } from '../../indicators/scheduler'
|
|
11
|
+
import { createKstScaleRendererPlugin } from './scale/kst_scale'
|
|
9
12
|
|
|
10
13
|
type LinePoint = { x: number; y: number }
|
|
11
14
|
|
|
@@ -294,6 +297,11 @@ export function getKSTTitleInfo(
|
|
|
294
297
|
stateKey: createKSTStateKey,
|
|
295
298
|
defaultPaneId: 'sub_KST',
|
|
296
299
|
paneIdField: 'kstPaneId',
|
|
300
|
+
scaleRendererFactory: createKstScaleRendererPlugin,
|
|
301
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
302
|
+
(scheduler as IndicatorScheduler).updateKSTConfig(params as Partial<KSTSchedulerConfig>, paneId)
|
|
303
|
+
},
|
|
304
|
+
visibleState: { compose: createPaddedPointVisibleStateComposer('kst', EMPTY_KST_STATE, ['kst', 'signal'] as const) },
|
|
297
305
|
applyResult: (host, state, paneId) => {
|
|
298
306
|
host.setSharedState(createKSTStateKey(paneId), state as any, 'indicator_scheduler')
|
|
299
307
|
},
|
|
@@ -3,7 +3,9 @@ import { RENDERER_PRIORITY } from '../../../plugin'
|
|
|
3
3
|
import { MA_STATE_KEY, type MARenderState } from '../../indicators/maState'
|
|
4
4
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
5
5
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
6
|
+
import type { IndicatorPriceRangeComputer, IndicatorRenderStateComposer } from '../../indicators/indicatorMetadata'
|
|
6
7
|
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
8
|
+
import type { MAFlags } from '../../indicators/calculators'
|
|
7
9
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
8
10
|
import { resolveThemeColors } from '../../../tokens'
|
|
9
11
|
|
|
@@ -12,6 +14,47 @@ export type { MAFlags } from '../../indicators/calculators'
|
|
|
12
14
|
|
|
13
15
|
type LinePoint = { x: number; y: number }
|
|
14
16
|
|
|
17
|
+
const SEMANTIC_MA_PERIOD_FLAGS = new Map<number, keyof MAFlags>([
|
|
18
|
+
[5, 'ma5'],
|
|
19
|
+
[10, 'ma10'],
|
|
20
|
+
[20, 'ma20'],
|
|
21
|
+
[30, 'ma30'],
|
|
22
|
+
[60, 'ma60'],
|
|
23
|
+
])
|
|
24
|
+
|
|
25
|
+
const computeMAPriceRange: IndicatorPriceRangeComputer = (bundle, range) => {
|
|
26
|
+
const seriesList = Object.values(bundle.ma.series)
|
|
27
|
+
if (seriesList.length === 0 || range.start >= seriesList[0]!.length) {
|
|
28
|
+
return null
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
let min = Infinity
|
|
32
|
+
let max = -Infinity
|
|
33
|
+
for (const values of seriesList) {
|
|
34
|
+
const end = Math.min(range.end, values.length)
|
|
35
|
+
for (let i = range.start; i < end; i++) {
|
|
36
|
+
const v = values[i]
|
|
37
|
+
if (v !== undefined) {
|
|
38
|
+
min = Math.min(min, v)
|
|
39
|
+
max = Math.max(max, v)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return Number.isFinite(min) && Number.isFinite(max) ? { min, max } : null
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const composeMARenderState: IndicatorRenderStateComposer = (bundle, range, timestamp): MARenderState => {
|
|
48
|
+
const priceRange = computeMAPriceRange(bundle, range) ?? { min: Infinity, max: -Infinity }
|
|
49
|
+
return {
|
|
50
|
+
timestamp,
|
|
51
|
+
series: bundle.ma.series,
|
|
52
|
+
enabledPeriods: bundle.ma.enabledPeriods,
|
|
53
|
+
visibleMin: priceRange.min,
|
|
54
|
+
visibleMax: priceRange.max,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
15
58
|
function buildMACacheKey(
|
|
16
59
|
range: { start: number; end: number },
|
|
17
60
|
kLineCenters: number[],
|
|
@@ -56,6 +99,32 @@ function getMAStateKey(host: PluginHost | null): string | null {
|
|
|
56
99
|
category: 'main',
|
|
57
100
|
stateKey: MA_STATE_KEY,
|
|
58
101
|
defaultPaneId: 'main',
|
|
102
|
+
mainPane: {
|
|
103
|
+
rendererName: 'ma',
|
|
104
|
+
toActiveConfig: (_params, active) => ({
|
|
105
|
+
ma5: active,
|
|
106
|
+
ma10: active,
|
|
107
|
+
ma20: active,
|
|
108
|
+
ma30: active,
|
|
109
|
+
ma60: active,
|
|
110
|
+
}),
|
|
111
|
+
computePriceRange: computeMAPriceRange,
|
|
112
|
+
composeRenderState: composeMARenderState,
|
|
113
|
+
},
|
|
114
|
+
updateConfig: (scheduler, params) => {
|
|
115
|
+
(scheduler as IndicatorScheduler).updateMAConfig(params as MAFlags)
|
|
116
|
+
},
|
|
117
|
+
semantic: {
|
|
118
|
+
apply: (chart, indicator) => {
|
|
119
|
+
const periods = (indicator as { params?: { periods?: number[] } }).params?.periods ?? [5, 10, 20, 30, 60]
|
|
120
|
+
const maFlags: Partial<MAFlags> = {}
|
|
121
|
+
for (const period of periods) {
|
|
122
|
+
const flag = SEMANTIC_MA_PERIOD_FLAGS.get(period)
|
|
123
|
+
if (flag) maFlags[flag] = true
|
|
124
|
+
}
|
|
125
|
+
chart.updateRendererConfig('ma', maFlags)
|
|
126
|
+
},
|
|
127
|
+
},
|
|
59
128
|
applyResult: (host, state, _paneId) => {
|
|
60
129
|
host.setSharedState(MA_STATE_KEY, state as any, 'ma_scheduler')
|
|
61
130
|
},
|
|
@@ -4,12 +4,14 @@ import type { KLineData } from '../../../types/price'
|
|
|
4
4
|
import { resolveThemeColors } from '../../../tokens'
|
|
5
5
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
6
6
|
import type { MACDRenderState } from '../../indicators/macdState'
|
|
7
|
-
import { createMACDStateKey } from '../../indicators/macdState'
|
|
7
|
+
import { createMACDStateKey, EMPTY_MACD_STATE } from '../../indicators/macdState'
|
|
8
8
|
import type { MACDPoint } from '../../indicators/calculators'
|
|
9
9
|
import { calcMACDData } from '../../indicators/calculators'
|
|
10
10
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
11
|
+
import { createMACDVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
11
12
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
12
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
13
|
+
import type { IndicatorScheduler, MACDSchedulerConfig } from '../../indicators/scheduler'
|
|
14
|
+
import { createMacdScaleRendererPlugin } from './scale/macd_scale'
|
|
13
15
|
|
|
14
16
|
type LinePoint = { x: number; y: number }
|
|
15
17
|
|
|
@@ -470,6 +472,11 @@ export function getMACDTitleInfo(
|
|
|
470
472
|
stateKey: createMACDStateKey,
|
|
471
473
|
defaultPaneId: 'sub_MACD',
|
|
472
474
|
paneIdField: 'macdPaneId',
|
|
475
|
+
scaleRendererFactory: createMacdScaleRendererPlugin,
|
|
476
|
+
visibleState: { compose: createMACDVisibleStateComposer('macd', EMPTY_MACD_STATE) },
|
|
477
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
478
|
+
(scheduler as IndicatorScheduler).updateMACDConfig(params as Partial<MACDSchedulerConfig>, paneId)
|
|
479
|
+
},
|
|
473
480
|
applyResult: (host, state, paneId) => {
|
|
474
481
|
host.setSharedState(createMACDStateKey(paneId), state as any, 'indicator_scheduler')
|
|
475
482
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { MFIRenderState } from '../../indicators/mfiState'
|
|
4
|
-
import { createMFIStateKey } from '../../indicators/mfiState'
|
|
4
|
+
import { createMFIStateKey, EMPTY_MFI_STATE } from '../../indicators/mfiState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
|
+
import { createFixedRangeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
6
7
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
8
|
+
import type { IndicatorScheduler, MFISchedulerConfig } from '../../indicators/scheduler'
|
|
8
9
|
|
|
9
10
|
const MFI_COLOR = '#fb923c'
|
|
10
11
|
|
|
@@ -133,6 +134,11 @@ export function createMFIRendererPlugin(options: { paneId?: string } = {}): Rend
|
|
|
133
134
|
stateKey: createMFIStateKey,
|
|
134
135
|
defaultPaneId: 'sub_MFI',
|
|
135
136
|
paneIdField: 'mfiPaneId',
|
|
137
|
+
visibleState: { compose: createFixedRangeSparseVisibleStateComposer('mfi', EMPTY_MFI_STATE) },
|
|
138
|
+
scale: { indicatorKey: 'mfi', label: 'MFI', decimals: 2 },
|
|
139
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
140
|
+
(scheduler as IndicatorScheduler).updateMFIConfig(params as Partial<MFISchedulerConfig>, paneId)
|
|
141
|
+
},
|
|
136
142
|
applyResult: (host, state, paneId) => {
|
|
137
143
|
host.setSharedState(createMFIStateKey(paneId), state as any, 'indicator_scheduler')
|
|
138
144
|
},
|
|
@@ -4,9 +4,12 @@ import { resolveThemeColors } from '../../../tokens'
|
|
|
4
4
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
5
5
|
import type { MOMRenderState } from '../../indicators/momState'
|
|
6
6
|
import { createMOMStateKey } from '../../indicators/momState'
|
|
7
|
+
import { EMPTY_MOM_STATE } from '../../indicators/momState'
|
|
8
|
+
import { createPaddedSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
7
9
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
8
10
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
9
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
11
|
+
import type { IndicatorScheduler, MOMSchedulerConfig } from '../../indicators/scheduler'
|
|
12
|
+
import { createMomScaleRendererPlugin } from './scale/mom_scale'
|
|
10
13
|
|
|
11
14
|
type LinePoint = { x: number; y: number }
|
|
12
15
|
|
|
@@ -303,6 +306,11 @@ export function getMOMTitleInfo(
|
|
|
303
306
|
stateKey: createMOMStateKey,
|
|
304
307
|
defaultPaneId: 'sub_MOM',
|
|
305
308
|
paneIdField: 'momPaneId',
|
|
309
|
+
scaleRendererFactory: createMomScaleRendererPlugin,
|
|
310
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
311
|
+
(scheduler as IndicatorScheduler).updateMOMConfig(params as Partial<MOMSchedulerConfig>, paneId)
|
|
312
|
+
},
|
|
313
|
+
visibleState: { compose: createPaddedSparseVisibleStateComposer('mom', EMPTY_MOM_STATE) },
|
|
306
314
|
applyResult: (host, state, paneId) => {
|
|
307
315
|
host.setSharedState(createMOMStateKey(paneId), state as any, 'indicator_scheduler')
|
|
308
316
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { OBVRenderState } from '../../indicators/obvState'
|
|
4
|
-
import { createOBVStateKey } from '../../indicators/obvState'
|
|
4
|
+
import { createOBVStateKey, EMPTY_OBV_STATE } from '../../indicators/obvState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
6
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import
|
|
7
|
+
import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
|
+
import type { IndicatorScheduler, OBVSchedulerConfig } from '../../indicators/scheduler'
|
|
8
9
|
|
|
9
10
|
const OBV_COLOR = '#16a34a'
|
|
10
11
|
|
|
@@ -114,6 +115,11 @@ export function createOBVRendererPlugin(options: { paneId?: string } = {}): Rend
|
|
|
114
115
|
stateKey: createOBVStateKey,
|
|
115
116
|
defaultPaneId: 'sub_OBV',
|
|
116
117
|
paneIdField: 'obvPaneId',
|
|
118
|
+
visibleState: { compose: createSparseVisibleStateComposer('obv', EMPTY_OBV_STATE) },
|
|
119
|
+
scale: { indicatorKey: 'obv', label: 'OBV', decimals: 0 },
|
|
120
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
121
|
+
(scheduler as IndicatorScheduler).updateOBVConfig(params as Partial<OBVSchedulerConfig>, paneId)
|
|
122
|
+
},
|
|
117
123
|
applyResult: (host, state, paneId) => {
|
|
118
124
|
host.setSharedState(createOBVStateKey(paneId), state as any, 'indicator_scheduler')
|
|
119
125
|
},
|
|
@@ -2,9 +2,11 @@ import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../..
|
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { ParkinsonRenderState } from '../../indicators/parkinsonState'
|
|
4
4
|
import { createParkinsonStateKey } from '../../indicators/parkinsonState'
|
|
5
|
+
import { EMPTY_PARKINSON_STATE } from '../../indicators/parkinsonState'
|
|
6
|
+
import { createNonNegativeSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
5
7
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
8
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
9
|
+
import type { IndicatorScheduler, ParkinsonSchedulerConfig } from '../../indicators/scheduler'
|
|
8
10
|
|
|
9
11
|
const PARKINSON_COLOR = '#0891b2'
|
|
10
12
|
|
|
@@ -115,6 +117,11 @@ export function createParkinsonRendererPlugin(options: { paneId?: string } = {})
|
|
|
115
117
|
stateKey: createParkinsonStateKey,
|
|
116
118
|
defaultPaneId: 'sub_Parkinson',
|
|
117
119
|
paneIdField: 'parkinsonPaneId',
|
|
120
|
+
scale: { indicatorKey: 'parkinson', label: 'Parkinson', decimals: 2 },
|
|
121
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
122
|
+
(scheduler as IndicatorScheduler).updateParkinsonConfig(params as Partial<ParkinsonSchedulerConfig>, paneId)
|
|
123
|
+
},
|
|
124
|
+
visibleState: { compose: createNonNegativeSparseVisibleStateComposer('parkinson', EMPTY_PARKINSON_STATE) },
|
|
118
125
|
applyResult: (host, state, paneId) => {
|
|
119
126
|
host.setSharedState(createParkinsonStateKey(paneId), state as any, 'indicator_scheduler')
|
|
120
127
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { PivotRenderState } from '../../indicators/pivotState'
|
|
4
|
-
import { createPivotStateKey } from '../../indicators/pivotState'
|
|
4
|
+
import { createPivotStateKey, EMPTY_PIVOT_STATE } from '../../indicators/pivotState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
6
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
7
|
+
import type { IndicatorScheduler, PivotSchedulerConfig } from '../../indicators/scheduler'
|
|
8
|
+
import { createExactRangePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
9
|
|
|
9
10
|
const PP_COLOR = '#94a3b8'
|
|
10
11
|
const R_COLOR = '#dc2626'
|
|
@@ -122,6 +123,12 @@ function drawStep(ctx: CanvasRenderingContext2D, pts: Point[], color: string): v
|
|
|
122
123
|
defaultPaneId: 'main',
|
|
123
124
|
paneIdField: 'pivotPaneId',
|
|
124
125
|
allowMainPane: true,
|
|
126
|
+
mainPane: { rendererName: 'pivot_main', toActiveConfig: (params, active) => ({ ...params, showPP: active, showR1: active, showR2: active, showR3: active, showS1: active, showS2: active, showS3: active }) },
|
|
127
|
+
scale: { indicatorKey: 'pivot', label: 'Pivot', decimals: 2 },
|
|
128
|
+
visibleState: { compose: createExactRangePointVisibleStateComposer('pivot', EMPTY_PIVOT_STATE, ['pp', 'r1', 'r2', 'r3', 's1', 's2', 's3']) },
|
|
129
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
130
|
+
(scheduler as IndicatorScheduler).updatePivotConfig(params as Partial<PivotSchedulerConfig>, paneId)
|
|
131
|
+
},
|
|
125
132
|
applyResult: (host, state, paneId) => {
|
|
126
133
|
host.setSharedState(createPivotStateKey(paneId), state as any, 'indicator_scheduler')
|
|
127
134
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { PVTRenderState } from '../../indicators/pvtState'
|
|
4
|
-
import { createPVTStateKey } from '../../indicators/pvtState'
|
|
4
|
+
import { createPVTStateKey, EMPTY_PVT_STATE } from '../../indicators/pvtState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
6
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import
|
|
7
|
+
import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
|
+
import type { IndicatorScheduler, PVTSchedulerConfig } from '../../indicators/scheduler'
|
|
8
9
|
|
|
9
10
|
const PVT_COLOR = '#a855f7'
|
|
10
11
|
|
|
@@ -114,6 +115,11 @@ export function createPVTRendererPlugin(options: { paneId?: string } = {}): Rend
|
|
|
114
115
|
stateKey: createPVTStateKey,
|
|
115
116
|
defaultPaneId: 'sub_PVT',
|
|
116
117
|
paneIdField: 'pvtPaneId',
|
|
118
|
+
visibleState: { compose: createSparseVisibleStateComposer('pvt', EMPTY_PVT_STATE) },
|
|
119
|
+
scale: { indicatorKey: 'pvt', label: 'PVT', decimals: 0 },
|
|
120
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
121
|
+
(scheduler as IndicatorScheduler).updatePVTConfig(params as Partial<PVTSchedulerConfig>, paneId)
|
|
122
|
+
},
|
|
117
123
|
applyResult: (host, state, paneId) => {
|
|
118
124
|
host.setSharedState(createPVTStateKey(paneId), state as any, 'indicator_scheduler')
|
|
119
125
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { ROCRenderState } from '../../indicators/rocState'
|
|
4
|
-
import { createROCStateKey } from '../../indicators/rocState'
|
|
4
|
+
import { createROCStateKey, EMPTY_ROC_STATE } from '../../indicators/rocState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
6
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import
|
|
7
|
+
import { createSparseVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
|
+
import type { IndicatorScheduler, ROCSchedulerConfig } from '../../indicators/scheduler'
|
|
8
9
|
|
|
9
10
|
const ROC_COLOR = '#0ea5e9'
|
|
10
11
|
|
|
@@ -134,6 +135,11 @@ export function createROCRendererPlugin(options: ROCRendererOptions = {}): Rende
|
|
|
134
135
|
stateKey: createROCStateKey,
|
|
135
136
|
defaultPaneId: 'sub_ROC',
|
|
136
137
|
paneIdField: 'rocPaneId',
|
|
138
|
+
visibleState: { compose: createSparseVisibleStateComposer('roc', EMPTY_ROC_STATE) },
|
|
139
|
+
scale: { indicatorKey: 'roc', label: 'ROC', decimals: 2 },
|
|
140
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
141
|
+
(scheduler as IndicatorScheduler).updateROCConfig(params as Partial<ROCSchedulerConfig>, paneId)
|
|
142
|
+
},
|
|
137
143
|
applyResult: (host, state, paneId) => {
|
|
138
144
|
host.setSharedState(createROCStateKey(paneId), state as any, 'indicator_scheduler')
|
|
139
145
|
},
|
|
@@ -3,10 +3,12 @@ import { RENDERER_PRIORITY } from '../../../plugin'
|
|
|
3
3
|
import { resolveThemeColors } from '../../../tokens'
|
|
4
4
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
5
5
|
import type { RSIRenderState } from '../../indicators/rsiState'
|
|
6
|
-
import { createRSIStateKey } from '../../indicators/rsiState'
|
|
6
|
+
import { createRSIStateKey, EMPTY_RSI_STATE } from '../../indicators/rsiState'
|
|
7
7
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
8
|
+
import { createFixedRangeRecordVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
9
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
9
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
10
|
+
import type { IndicatorScheduler, RSISchedulerConfig } from '../../indicators/scheduler'
|
|
11
|
+
import { createRsiScaleRendererPlugin } from './scale/rsi_scale'
|
|
10
12
|
|
|
11
13
|
type LinePoint = { x: number; y: number }
|
|
12
14
|
|
|
@@ -388,6 +390,11 @@ export function getRSITitleInfo(
|
|
|
388
390
|
stateKey: createRSIStateKey,
|
|
389
391
|
defaultPaneId: 'sub_RSI',
|
|
390
392
|
paneIdField: 'rsiPaneId',
|
|
393
|
+
visibleState: { compose: createFixedRangeRecordVisibleStateComposer('rsi', EMPTY_RSI_STATE) },
|
|
394
|
+
scaleRendererFactory: createRsiScaleRendererPlugin,
|
|
395
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
396
|
+
(scheduler as IndicatorScheduler).updateRSIConfig(params as Partial<RSISchedulerConfig>, paneId)
|
|
397
|
+
},
|
|
391
398
|
applyResult: (host, state, paneId) => {
|
|
392
399
|
host.setSharedState(createRSIStateKey(paneId), state as any, 'indicator_scheduler')
|
|
393
400
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
3
|
import type { SARRenderState } from '../../indicators/sarState'
|
|
4
|
-
import { createSARStateKey } from '../../indicators/sarState'
|
|
4
|
+
import { createSARStateKey, EMPTY_SAR_STATE } from '../../indicators/sarState'
|
|
5
5
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
6
6
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
7
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
7
|
+
import type { IndicatorScheduler, SARSchedulerConfig } from '../../indicators/scheduler'
|
|
8
|
+
import { createValuePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
9
|
|
|
9
10
|
const SAR_UP_COLOR = '#22c55e'
|
|
10
11
|
const SAR_DOWN_COLOR = '#ef4444'
|
|
@@ -104,6 +105,12 @@ export function createSARRendererPlugin(options: SARRendererOptions = {}): Rende
|
|
|
104
105
|
defaultPaneId: 'main',
|
|
105
106
|
paneIdField: 'sarPaneId',
|
|
106
107
|
allowMainPane: true,
|
|
108
|
+
mainPane: { rendererName: 'sar_main', toActiveConfig: (params, active) => ({ ...params, showSAR: active }) },
|
|
109
|
+
scale: { indicatorKey: 'sar', label: 'SAR', decimals: 4 },
|
|
110
|
+
visibleState: { compose: createValuePointVisibleStateComposer('sar', EMPTY_SAR_STATE, ['value']) },
|
|
111
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
112
|
+
(scheduler as IndicatorScheduler).updateSARConfig(params as Partial<SARSchedulerConfig>, paneId)
|
|
113
|
+
},
|
|
107
114
|
applyResult: (host, state, paneId) => {
|
|
108
115
|
host.setSharedState(createSARStateKey(paneId), state as any, 'indicator_scheduler')
|
|
109
116
|
},
|
|
@@ -3,10 +3,12 @@ import { RENDERER_PRIORITY } from '../../../plugin'
|
|
|
3
3
|
import { resolveThemeColors } from '../../../tokens'
|
|
4
4
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
5
5
|
import type { STOCHRenderState } from '../../indicators/stochState'
|
|
6
|
-
import { createSTOCHStateKey } from '../../indicators/stochState'
|
|
6
|
+
import { createSTOCHStateKey, EMPTY_STOCH_STATE } from '../../indicators/stochState'
|
|
7
7
|
import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
|
|
8
|
+
import { createFixedRangePointVisibleStateComposer } from '../../indicators/visibleStateComposers'
|
|
8
9
|
import { resolveStateKey } from '../../indicators/indicatorMetadata'
|
|
9
|
-
import type { IndicatorScheduler } from '../../indicators/scheduler'
|
|
10
|
+
import type { IndicatorScheduler, STOCHSchedulerConfig } from '../../indicators/scheduler'
|
|
11
|
+
import { createStochScaleRendererPlugin } from './scale/stoch_scale'
|
|
10
12
|
|
|
11
13
|
type LinePoint = { x: number; y: number }
|
|
12
14
|
|
|
@@ -351,6 +353,11 @@ export function getSTOCHTitleInfo(
|
|
|
351
353
|
stateKey: createSTOCHStateKey,
|
|
352
354
|
defaultPaneId: 'sub_STOCH',
|
|
353
355
|
paneIdField: 'stochPaneId',
|
|
356
|
+
visibleState: { compose: createFixedRangePointVisibleStateComposer('stoch', EMPTY_STOCH_STATE, ['k', 'd'] as const) },
|
|
357
|
+
scaleRendererFactory: createStochScaleRendererPlugin,
|
|
358
|
+
updateConfig: (scheduler, params, paneId) => {
|
|
359
|
+
(scheduler as IndicatorScheduler).updateSTOCHConfig(params as Partial<STOCHSchedulerConfig>, paneId)
|
|
360
|
+
},
|
|
354
361
|
applyResult: (host, state, paneId) => {
|
|
355
362
|
host.setSharedState(createSTOCHStateKey(paneId), state as any, 'indicator_scheduler')
|
|
356
363
|
},
|