@363045841yyt/klinechart-core 0.8.11-alpha.0 → 0.8.12
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/alerts/createAlertController.d.ts +30 -0
- package/dist/alerts/createAlertController.d.ts.map +1 -0
- package/dist/alerts/createAlertController.js +261 -0
- package/dist/alerts/createAlertController.js.map +1 -0
- package/dist/alerts/index.d.ts +5 -0
- package/dist/alerts/index.d.ts.map +1 -0
- package/dist/alerts/index.js +4 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/predicates.d.ts +28 -0
- package/dist/alerts/predicates.d.ts.map +1 -0
- package/dist/alerts/predicates.js +211 -0
- package/dist/alerts/predicates.js.map +1 -0
- package/dist/alerts/rollingVolume.d.ts +15 -0
- package/dist/alerts/rollingVolume.d.ts.map +1 -0
- package/dist/alerts/rollingVolume.js +42 -0
- package/dist/alerts/rollingVolume.js.map +1 -0
- package/dist/alerts/ruleSchema.d.ts +42 -0
- package/dist/alerts/ruleSchema.d.ts.map +1 -0
- package/dist/alerts/ruleSchema.js +240 -0
- package/dist/alerts/ruleSchema.js.map +1 -0
- package/dist/alerts/types.d.ts +169 -0
- package/dist/alerts/types.d.ts.map +1 -0
- package/dist/alerts/types.js +24 -0
- package/dist/alerts/types.js.map +1 -0
- package/dist/chartTypes/heikinAshi.d.ts +49 -0
- package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
- package/dist/chartTypes/heikinAshi.js +94 -0
- package/dist/chartTypes/heikinAshi.js.map +1 -0
- package/dist/chartTypes/index.d.ts +6 -0
- package/dist/chartTypes/index.d.ts.map +1 -0
- package/dist/chartTypes/index.js +5 -0
- package/dist/chartTypes/index.js.map +1 -0
- package/dist/chartTypes/pointAndFigure.d.ts +83 -0
- package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
- package/dist/chartTypes/pointAndFigure.js +159 -0
- package/dist/chartTypes/pointAndFigure.js.map +1 -0
- package/dist/chartTypes/rangeBars.d.ts +61 -0
- package/dist/chartTypes/rangeBars.d.ts.map +1 -0
- package/dist/chartTypes/rangeBars.js +181 -0
- package/dist/chartTypes/rangeBars.js.map +1 -0
- package/dist/chartTypes/renko.d.ts +94 -0
- package/dist/chartTypes/renko.d.ts.map +1 -0
- package/dist/chartTypes/renko.js +207 -0
- package/dist/chartTypes/renko.js.map +1 -0
- package/dist/chartTypes/types.d.ts +97 -0
- package/dist/chartTypes/types.d.ts.map +1 -0
- package/dist/chartTypes/types.js +39 -0
- package/dist/chartTypes/types.js.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
- package/dist/components/anchoredVwap/index.d.ts +11 -0
- package/dist/components/anchoredVwap/index.d.ts.map +1 -0
- package/dist/components/anchoredVwap/index.js +10 -0
- package/dist/components/anchoredVwap/index.js.map +1 -0
- package/dist/components/anchoredVwap/types.d.ts +171 -0
- package/dist/components/anchoredVwap/types.d.ts.map +1 -0
- package/dist/components/anchoredVwap/types.js +25 -0
- package/dist/components/anchoredVwap/types.js.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
- package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
- package/dist/components/crosshairSync/index.d.ts +2 -0
- package/dist/components/crosshairSync/index.d.ts.map +1 -0
- package/dist/components/crosshairSync/index.js +2 -0
- package/dist/components/crosshairSync/index.js.map +1 -0
- package/dist/components/footprint/aggressor.d.ts +89 -0
- package/dist/components/footprint/aggressor.d.ts.map +1 -0
- package/dist/components/footprint/aggressor.js +106 -0
- package/dist/components/footprint/aggressor.js.map +1 -0
- package/dist/components/footprint/createFootprintController.d.ts +29 -0
- package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
- package/dist/components/footprint/createFootprintController.js +264 -0
- package/dist/components/footprint/createFootprintController.js.map +1 -0
- package/dist/components/footprint/index.d.ts +7 -0
- package/dist/components/footprint/index.d.ts.map +1 -0
- package/dist/components/footprint/index.js +4 -0
- package/dist/components/footprint/index.js.map +1 -0
- package/dist/components/footprint/perBarStats.d.ts +63 -0
- package/dist/components/footprint/perBarStats.d.ts.map +1 -0
- package/dist/components/footprint/perBarStats.js +123 -0
- package/dist/components/footprint/perBarStats.js.map +1 -0
- package/dist/components/footprint/types.d.ts +197 -0
- package/dist/components/footprint/types.d.ts.map +1 -0
- package/dist/components/footprint/types.js +23 -0
- package/dist/components/footprint/types.js.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.js +134 -0
- package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
- package/dist/components/mtfOverlay/index.d.ts +19 -0
- package/dist/components/mtfOverlay/index.d.ts.map +1 -0
- package/dist/components/mtfOverlay/index.js +18 -0
- package/dist/components/mtfOverlay/index.js.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.js +93 -0
- package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
- package/dist/components/mtfOverlay/types.d.ts +132 -0
- package/dist/components/mtfOverlay/types.d.ts.map +1 -0
- package/dist/components/mtfOverlay/types.js +22 -0
- package/dist/components/mtfOverlay/types.js.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
- package/dist/components/orderBookHeatmap/index.d.ts +13 -0
- package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/index.js +12 -0
- package/dist/components/orderBookHeatmap/index.js.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
- package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
- package/dist/components/orderBookHeatmap/types.d.ts +128 -0
- package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/types.js +16 -0
- package/dist/components/orderBookHeatmap/types.js.map +1 -0
- package/dist/components/volumeProfile/binning.d.ts +54 -0
- package/dist/components/volumeProfile/binning.d.ts.map +1 -0
- package/dist/components/volumeProfile/binning.js +123 -0
- package/dist/components/volumeProfile/binning.js.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
- package/dist/components/volumeProfile/index.d.ts +6 -0
- package/dist/components/volumeProfile/index.d.ts.map +1 -0
- package/dist/components/volumeProfile/index.js +5 -0
- package/dist/components/volumeProfile/index.js.map +1 -0
- package/dist/components/volumeProfile/poc.d.ts +35 -0
- package/dist/components/volumeProfile/poc.d.ts.map +1 -0
- package/dist/components/volumeProfile/poc.js +51 -0
- package/dist/components/volumeProfile/poc.js.map +1 -0
- package/dist/components/volumeProfile/types.d.ts +138 -0
- package/dist/components/volumeProfile/types.d.ts.map +1 -0
- package/dist/components/volumeProfile/types.js +19 -0
- package/dist/components/volumeProfile/types.js.map +1 -0
- package/dist/components/volumeProfile/valueArea.d.ts +58 -0
- package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
- package/dist/components/volumeProfile/valueArea.js +172 -0
- package/dist/components/volumeProfile/valueArea.js.map +1 -0
- package/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +22 -11
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +3 -1
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +2 -1
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.js +2 -1
- package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
- package/dist/data-fetchers/gotdx.js +4 -3
- package/dist/data-fetchers/gotdx.js.map +1 -1
- package/dist/data-fetchers/router.d.ts.map +1 -1
- package/dist/data-fetchers/router.js +4 -3
- package/dist/data-fetchers/router.js.map +1 -1
- package/dist/data-fetchers/tradingview.js +3 -2
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/engine/chart.d.ts +13 -0
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +109 -0
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/data/chartDataManager.d.ts +1 -0
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +27 -4
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
- package/dist/engine/drawing/toolConfig.js +2 -1
- package/dist/engine/drawing/toolConfig.js.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.js +2 -1
- package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.js +2 -1
- package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.js +6 -5
- package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
- package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
- package/dist/engine/indicators/registerBuiltins.js +2 -1
- package/dist/engine/indicators/registerBuiltins.js.map +1 -1
- package/dist/engine/indicators/scheduler.d.ts +6 -0
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +12 -0
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/indicators/soa.d.ts.map +1 -1
- package/dist/engine/indicators/soa.js +2 -1
- package/dist/engine/indicators/soa.js.map +1 -1
- package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
- package/dist/engine/indicators/stateComposer.js +2 -1
- package/dist/engine/indicators/stateComposer.js.map +1 -1
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +2 -1
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/engine/utils/chartZoomController.d.ts +2 -0
- package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
- package/dist/engine/utils/chartZoomController.js +5 -1
- package/dist/engine/utils/chartZoomController.js.map +1 -1
- package/dist/errors-help.d.ts +72 -0
- package/dist/errors-help.d.ts.map +1 -0
- package/dist/errors-help.js +149 -0
- package/dist/errors-help.js.map +1 -0
- package/dist/errors.d.ts +64 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/indicators/alma.d.ts +27 -0
- package/dist/indicators/alma.d.ts.map +1 -0
- package/dist/indicators/alma.js +36 -0
- package/dist/indicators/alma.js.map +1 -0
- package/dist/indicators/awesomeOscillator.d.ts +19 -0
- package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
- package/dist/indicators/awesomeOscillator.js +36 -0
- package/dist/indicators/awesomeOscillator.js.map +1 -0
- package/dist/indicators/dpo.d.ts +17 -0
- package/dist/indicators/dpo.d.ts.map +1 -0
- package/dist/indicators/dpo.js +24 -0
- package/dist/indicators/dpo.js.map +1 -0
- package/dist/indicators/fisherTransform.d.ts +26 -0
- package/dist/indicators/fisherTransform.d.ts.map +1 -0
- package/dist/indicators/fisherTransform.js +44 -0
- package/dist/indicators/fisherTransform.js.map +1 -0
- package/dist/indicators/frama.d.ts +25 -0
- package/dist/indicators/frama.d.ts.map +1 -0
- package/dist/indicators/frama.js +61 -0
- package/dist/indicators/frama.js.map +1 -0
- package/dist/indicators/index.d.ts +24 -0
- package/dist/indicators/index.d.ts.map +1 -0
- package/dist/indicators/index.js +26 -0
- package/dist/indicators/index.js.map +1 -0
- package/dist/indicators/lsma.d.ts +21 -0
- package/dist/indicators/lsma.d.ts.map +1 -0
- package/dist/indicators/lsma.js +37 -0
- package/dist/indicators/lsma.js.map +1 -0
- package/dist/indicators/schaffTrendCycle.d.ts +24 -0
- package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
- package/dist/indicators/schaffTrendCycle.js +70 -0
- package/dist/indicators/schaffTrendCycle.js.map +1 -0
- package/dist/indicators/stochRSI.d.ts +24 -0
- package/dist/indicators/stochRSI.d.ts.map +1 -0
- package/dist/indicators/stochRSI.js +86 -0
- package/dist/indicators/stochRSI.js.map +1 -0
- package/dist/indicators/t3.d.ts +31 -0
- package/dist/indicators/t3.d.ts.map +1 -0
- package/dist/indicators/t3.js +63 -0
- package/dist/indicators/t3.js.map +1 -0
- package/dist/indicators/ultimateOscillator.d.ts +26 -0
- package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
- package/dist/indicators/ultimateOscillator.js +59 -0
- package/dist/indicators/ultimateOscillator.js.map +1 -0
- package/dist/indicators/vidya.d.ts +24 -0
- package/dist/indicators/vidya.d.ts.map +1 -0
- package/dist/indicators/vidya.js +54 -0
- package/dist/indicators/vidya.js.map +1 -0
- package/dist/indicators/zlema.d.ts +16 -0
- package/dist/indicators/zlema.d.ts.map +1 -0
- package/dist/indicators/zlema.js +26 -0
- package/dist/indicators/zlema.js.map +1 -0
- package/dist/input/gesture.d.ts +125 -0
- package/dist/input/gesture.d.ts.map +1 -0
- package/dist/input/gesture.js +249 -0
- package/dist/input/gesture.js.map +1 -0
- package/dist/input/index.d.ts +9 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +9 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/keyboard.d.ts +140 -0
- package/dist/input/keyboard.d.ts.map +1 -0
- package/dist/input/keyboard.js +260 -0
- package/dist/input/keyboard.js.map +1 -0
- package/dist/mcp/chartBridge.d.ts +2 -2
- package/dist/mcp/chartBridge.d.ts.map +1 -1
- package/dist/mcp/chartBridge.js +27 -21
- package/dist/mcp/chartBridge.js.map +1 -1
- package/dist/plugin/PluginHost.d.ts +0 -3
- package/dist/plugin/PluginHost.d.ts.map +1 -1
- package/dist/plugin/PluginHost.js +7 -3
- package/dist/plugin/PluginHost.js.map +1 -1
- package/dist/plugin/PluginRegistry.d.ts +0 -3
- package/dist/plugin/PluginRegistry.d.ts.map +1 -1
- package/dist/plugin/PluginRegistry.js +5 -1
- package/dist/plugin/PluginRegistry.js.map +1 -1
- package/dist/render/Renderer.d.ts +116 -0
- package/dist/render/Renderer.d.ts.map +1 -0
- package/dist/render/Renderer.js +31 -0
- package/dist/render/Renderer.js.map +1 -0
- package/dist/render/SurfaceBackend.d.ts +83 -0
- package/dist/render/SurfaceBackend.d.ts.map +1 -0
- package/dist/render/SurfaceBackend.js +27 -0
- package/dist/render/SurfaceBackend.js.map +1 -0
- package/dist/render/index.d.ts +12 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
- package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
- package/dist/renderer-tier/detectRendererTier.js +143 -0
- package/dist/renderer-tier/detectRendererTier.js.map +1 -0
- package/dist/renderer-tier/index.d.ts +12 -0
- package/dist/renderer-tier/index.d.ts.map +1 -0
- package/dist/renderer-tier/index.js +12 -0
- package/dist/renderer-tier/index.js.map +1 -0
- package/dist/renderer-tier/selectBackend.d.ts +106 -0
- package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
- package/dist/renderer-tier/selectBackend.js +113 -0
- package/dist/renderer-tier/selectBackend.js.map +1 -0
- package/dist/renderer-tier/types.d.ts +50 -0
- package/dist/renderer-tier/types.d.ts.map +1 -0
- package/dist/renderer-tier/types.js +24 -0
- package/dist/renderer-tier/types.js.map +1 -0
- package/dist/replay/createReplayController.d.ts +3 -0
- package/dist/replay/createReplayController.d.ts.map +1 -0
- package/dist/replay/createReplayController.js +251 -0
- package/dist/replay/createReplayController.js.map +1 -0
- package/dist/replay/index.d.ts +5 -0
- package/dist/replay/index.d.ts.map +1 -0
- package/dist/replay/index.js +3 -0
- package/dist/replay/index.js.map +1 -0
- package/dist/replay/timeline.d.ts +50 -0
- package/dist/replay/timeline.d.ts.map +1 -0
- package/dist/replay/timeline.js +104 -0
- package/dist/replay/timeline.js.map +1 -0
- package/dist/replay/types.d.ts +94 -0
- package/dist/replay/types.d.ts.map +1 -0
- package/dist/replay/types.js +21 -0
- package/dist/replay/types.js.map +1 -0
- package/dist/scale/anchoredZoom.d.ts +64 -0
- package/dist/scale/anchoredZoom.d.ts.map +1 -0
- package/dist/scale/anchoredZoom.js +67 -0
- package/dist/scale/anchoredZoom.js.map +1 -0
- package/dist/scale/createPriceScale.d.ts +49 -0
- package/dist/scale/createPriceScale.d.ts.map +1 -0
- package/dist/scale/createPriceScale.js +175 -0
- package/dist/scale/createPriceScale.js.map +1 -0
- package/dist/scale/createTimeScale.d.ts +27 -0
- package/dist/scale/createTimeScale.d.ts.map +1 -0
- package/dist/scale/createTimeScale.js +139 -0
- package/dist/scale/createTimeScale.js.map +1 -0
- package/dist/scale/index.d.ts +6 -0
- package/dist/scale/index.d.ts.map +1 -0
- package/dist/scale/index.js +5 -0
- package/dist/scale/index.js.map +1 -0
- package/dist/scale/originShift.d.ts +69 -0
- package/dist/scale/originShift.d.ts.map +1 -0
- package/dist/scale/originShift.js +41 -0
- package/dist/scale/originShift.js.map +1 -0
- package/dist/scale/types.d.ts +90 -0
- package/dist/scale/types.d.ts.map +1 -0
- package/dist/scale/types.js +17 -0
- package/dist/scale/types.js.map +1 -0
- package/dist/scene/createScene.d.ts +22 -0
- package/dist/scene/createScene.d.ts.map +1 -0
- package/dist/scene/createScene.js +114 -0
- package/dist/scene/createScene.js.map +1 -0
- package/dist/scene/index.d.ts +13 -0
- package/dist/scene/index.d.ts.map +1 -0
- package/dist/scene/index.js +11 -0
- package/dist/scene/index.js.map +1 -0
- package/dist/scene/layerRegistry.d.ts +83 -0
- package/dist/scene/layerRegistry.d.ts.map +1 -0
- package/dist/scene/layerRegistry.js +43 -0
- package/dist/scene/layerRegistry.js.map +1 -0
- package/dist/scene/types.d.ts +128 -0
- package/dist/scene/types.d.ts.map +1 -0
- package/dist/scene/types.js +21 -0
- package/dist/scene/types.js.map +1 -0
- package/dist/scheduler/createFrameBudget.d.ts +91 -0
- package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
- package/dist/scheduler/createFrameBudget.js +232 -0
- package/dist/scheduler/createFrameBudget.js.map +1 -0
- package/dist/scheduler/index.d.ts +2 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/tokens/themeToCssVars.d.ts.map +1 -1
- package/dist/tokens/themeToCssVars.js +2 -28
- package/dist/tokens/themeToCssVars.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/__bench__/indicators.bench.ts +215 -0
- package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
- package/src/__bench__/scale.bench.ts +80 -0
- package/src/__bench__/signal.bench.ts +41 -0
- package/src/__bench__/volumeProfile.bench.ts +66 -0
- package/src/__tests__/errors-help.test.ts +184 -0
- package/src/__tests__/errors.test.ts +187 -0
- package/src/alerts/__tests__/controller.test.ts +231 -0
- package/src/alerts/__tests__/predicates.test.ts +374 -0
- package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
- package/src/alerts/createAlertController.ts +312 -0
- package/src/alerts/index.ts +18 -0
- package/src/alerts/predicates.ts +231 -0
- package/src/alerts/rollingVolume.ts +51 -0
- package/src/alerts/ruleSchema.ts +278 -0
- package/src/alerts/types.ts +177 -0
- package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
- package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
- package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
- package/src/chartTypes/__tests__/renko.test.ts +160 -0
- package/src/chartTypes/heikinAshi.ts +116 -0
- package/src/chartTypes/index.ts +5 -0
- package/src/chartTypes/pointAndFigure.ts +278 -0
- package/src/chartTypes/rangeBars.ts +303 -0
- package/src/chartTypes/renko.ts +311 -0
- package/src/chartTypes/types.ts +99 -0
- package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
- package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
- package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
- package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
- package/src/components/anchoredVwap/index.ts +17 -0
- package/src/components/anchoredVwap/types.ts +187 -0
- package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
- package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
- package/src/components/crosshairSync/index.ts +5 -0
- package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
- package/src/components/footprint/__tests__/controller.test.ts +130 -0
- package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
- package/src/components/footprint/aggressor.ts +165 -0
- package/src/components/footprint/createFootprintController.ts +338 -0
- package/src/components/footprint/index.ts +21 -0
- package/src/components/footprint/perBarStats.ts +137 -0
- package/src/components/footprint/types.ts +232 -0
- package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
- package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
- package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
- package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
- package/src/components/mtfOverlay/createMtfController.ts +180 -0
- package/src/components/mtfOverlay/index.ts +26 -0
- package/src/components/mtfOverlay/resampleBars.ts +134 -0
- package/src/components/mtfOverlay/types.ts +148 -0
- package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
- package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
- package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
- package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
- package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
- package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
- package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
- package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
- package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
- package/src/components/orderBookHeatmap/index.ts +25 -0
- package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
- package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
- package/src/components/orderBookHeatmap/types.ts +168 -0
- package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
- package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
- package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
- package/src/components/volumeProfile/binning.ts +133 -0
- package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
- package/src/components/volumeProfile/index.ts +12 -0
- package/src/components/volumeProfile/poc.ts +53 -0
- package/src/components/volumeProfile/types.ts +148 -0
- package/src/components/volumeProfile/valueArea.ts +187 -0
- package/src/controllers/createChartController.ts +23 -10
- package/src/controllers/types.ts +5 -1
- package/src/data-fetchers/baostock.ts +2 -1
- package/src/data-fetchers/dataBuffer.effects.ts +3 -1
- package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
- package/src/data-fetchers/gotdx.ts +4 -3
- package/src/data-fetchers/router.ts +6 -3
- package/src/data-fetchers/tradingview.ts +3 -2
- package/src/engine/chart.ts +126 -3
- package/src/engine/data/chartDataManager.ts +26 -4
- package/src/engine/drawing/toolConfig.ts +2 -1
- package/src/engine/indicators/chartIndicatorManager.ts +2 -1
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
- package/src/engine/indicators/indicatorMetadata.ts +2 -1
- package/src/engine/indicators/indicatorRegistry.ts +6 -5
- package/src/engine/indicators/registerBuiltins.ts +2 -1
- package/src/engine/indicators/scheduler.ts +15 -0
- package/src/engine/indicators/soa.ts +2 -1
- package/src/engine/indicators/stateComposer.ts +2 -1
- package/src/engine/subPaneManager.ts +2 -1
- package/src/engine/utils/chartZoomController.ts +7 -1
- package/src/errors-help.ts +218 -0
- package/src/errors.ts +128 -0
- package/src/index.ts +37 -0
- package/src/indicators/__tests__/maFamily.test.ts +159 -0
- package/src/indicators/__tests__/oscillators.test.ts +150 -0
- package/src/indicators/alma.ts +61 -0
- package/src/indicators/awesomeOscillator.ts +54 -0
- package/src/indicators/dpo.ts +37 -0
- package/src/indicators/fisherTransform.ts +63 -0
- package/src/indicators/frama.ts +87 -0
- package/src/indicators/index.ts +39 -0
- package/src/indicators/lsma.ts +58 -0
- package/src/indicators/schaffTrendCycle.ts +92 -0
- package/src/indicators/stochRSI.ts +108 -0
- package/src/indicators/t3.ts +96 -0
- package/src/indicators/ultimateOscillator.ts +83 -0
- package/src/indicators/vidya.ts +80 -0
- package/src/indicators/zlema.ts +41 -0
- package/src/input/__tests__/gesture.test.ts +271 -0
- package/src/input/__tests__/keyboard.test.ts +317 -0
- package/src/input/gesture.ts +357 -0
- package/src/input/index.ts +26 -0
- package/src/input/keyboard.ts +373 -0
- package/src/mcp/chartBridge.ts +98 -72
- package/src/plugin/PluginHost.ts +4 -3
- package/src/plugin/PluginRegistry.ts +2 -1
- package/src/render/Renderer.ts +127 -0
- package/src/render/SurfaceBackend.ts +94 -0
- package/src/render/__tests__/contract.test.ts +176 -0
- package/src/render/index.ts +27 -0
- package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
- package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
- package/src/renderer-tier/detectRendererTier.ts +168 -0
- package/src/renderer-tier/index.ts +30 -0
- package/src/renderer-tier/selectBackend.ts +201 -0
- package/src/renderer-tier/types.ts +59 -0
- package/src/replay/__tests__/controller.test.ts +309 -0
- package/src/replay/__tests__/timeline.test.ts +99 -0
- package/src/replay/createReplayController.ts +302 -0
- package/src/replay/index.ts +15 -0
- package/src/replay/timeline.ts +106 -0
- package/src/replay/types.ts +107 -0
- package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
- package/src/scale/__tests__/originShift.test.ts +97 -0
- package/src/scale/__tests__/priceScale.test.ts +219 -0
- package/src/scale/__tests__/timeScale.test.ts +119 -0
- package/src/scale/anchoredZoom.ts +104 -0
- package/src/scale/createPriceScale.ts +226 -0
- package/src/scale/createTimeScale.ts +150 -0
- package/src/scale/index.ts +9 -0
- package/src/scale/originShift.ts +111 -0
- package/src/scale/types.ts +100 -0
- package/src/scene/__tests__/layerRegistry.test.ts +207 -0
- package/src/scene/__tests__/scene.test.ts +411 -0
- package/src/scene/createScene.ts +117 -0
- package/src/scene/index.ts +29 -0
- package/src/scene/layerRegistry.ts +117 -0
- package/src/scene/types.ts +143 -0
- package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
- package/src/scheduler/createFrameBudget.ts +316 -0
- package/src/scheduler/index.ts +7 -0
- package/src/tokens/themeToCssVars.ts +3 -1
- package/src/version.ts +1 -1
- package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
- package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
- package/dist/data-fetchers/gotdx/gotdx.js +0 -7
- package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
- package/src/data-fetchers/gotdx/gotdx.ts +0 -6
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* - Tear down DOM + listeners on dispose().
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
import { KLineChartError } from '../errors'
|
|
15
16
|
import { createSignal, type Signal } from '../reactivity'
|
|
16
17
|
import type {
|
|
17
18
|
ChartController,
|
|
@@ -223,7 +224,7 @@ function mapInteractionSnapshot(snapshot: LegacyInteractionSnapshot): Interactio
|
|
|
223
224
|
function buildDom(container: HTMLElement): MountedDom {
|
|
224
225
|
const ownerDoc = container.ownerDocument
|
|
225
226
|
if (!ownerDoc) {
|
|
226
|
-
throw new
|
|
227
|
+
throw new KLineChartError('CONTROLLER_CONFIG_INVALID',
|
|
227
228
|
'[createChartController] container has no ownerDocument; cannot build DOM scaffold',
|
|
228
229
|
)
|
|
229
230
|
}
|
|
@@ -236,11 +237,11 @@ function buildDom(container: HTMLElement): MountedDom {
|
|
|
236
237
|
chartContainer = ownerDoc.createElement('div')
|
|
237
238
|
chartContainer.style.width = '100%'
|
|
238
239
|
chartContainer.style.height = '100%'
|
|
239
|
-
chartContainer.style.position = 'relative'
|
|
240
|
-
chartContainer.style.overflow = 'auto'
|
|
241
240
|
container.appendChild(chartContainer)
|
|
242
241
|
containerCreatedByUs = true
|
|
243
242
|
}
|
|
243
|
+
chartContainer.style.position = 'relative'
|
|
244
|
+
chartContainer.style.overflow = 'auto'
|
|
244
245
|
|
|
245
246
|
const scrollContent = ownerDoc.createElement('div')
|
|
246
247
|
scrollContent.className = 'klc-scroll-content'
|
|
@@ -296,10 +297,10 @@ function buildDom(container: HTMLElement): MountedDom {
|
|
|
296
297
|
|
|
297
298
|
export async function createChartController(opts: ChartMountOptions): Promise<ChartController> {
|
|
298
299
|
if (!opts) {
|
|
299
|
-
throw new
|
|
300
|
+
throw new KLineChartError('CONTROLLER_CONFIG_INVALID', '[createChartController] opts is required')
|
|
300
301
|
}
|
|
301
302
|
if (!opts.container) {
|
|
302
|
-
throw new
|
|
303
|
+
throw new KLineChartError('CONTROLLER_CONFIG_INVALID', '[createChartController] opts.container must be a non-null HTMLElement')
|
|
303
304
|
}
|
|
304
305
|
|
|
305
306
|
await loadBuiltinIndicators()
|
|
@@ -317,6 +318,15 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
317
318
|
}
|
|
318
319
|
: buildDom(opts.container)
|
|
319
320
|
|
|
321
|
+
// ── Fix 0×0 sizing for buildDom()-created right axis host ──
|
|
322
|
+
if (!hasExistingDom && mounted.rightAxisLayer) {
|
|
323
|
+
const hostWidth =
|
|
324
|
+
(opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth) +
|
|
325
|
+
(opts.priceLabelWidth ?? DEFAULT_OPTS.priceLabelWidth)
|
|
326
|
+
mounted.rightAxisLayer.style.bottom = '0'
|
|
327
|
+
mounted.rightAxisLayer.style.width = hostWidth + 'px'
|
|
328
|
+
}
|
|
329
|
+
|
|
320
330
|
const initialZoomLevel = opts.initialZoomLevel ?? DEFAULT_OPTS.initialZoomLevel
|
|
321
331
|
const zoomLevelCount = opts.zoomLevels ?? DEFAULT_OPTS.zoomLevels
|
|
322
332
|
|
|
@@ -372,7 +382,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
372
382
|
kGap: currentKGap,
|
|
373
383
|
})
|
|
374
384
|
|
|
375
|
-
const data: Signal<ReadonlyArray<KLineData>> = createSignal(opts.data)
|
|
385
|
+
const data: Signal<ReadonlyArray<KLineData>> = createSignal(opts.data ?? [])
|
|
376
386
|
const dataLoading: Signal<boolean> = createSignal(false)
|
|
377
387
|
|
|
378
388
|
const symbols: Signal<ReadonlyArray<SymbolSpec>> = chart.symbols
|
|
@@ -402,10 +412,12 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
402
412
|
/* tolerate jsdom */
|
|
403
413
|
}
|
|
404
414
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
415
|
+
if (opts.data) {
|
|
416
|
+
try {
|
|
417
|
+
chart.setData([...opts.data])
|
|
418
|
+
} catch {
|
|
419
|
+
/* tolerate first-paint racing */
|
|
420
|
+
}
|
|
409
421
|
}
|
|
410
422
|
|
|
411
423
|
// Apply initial DataFetcher
|
|
@@ -906,6 +918,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
906
918
|
comparisonColors,
|
|
907
919
|
comparisonLoading,
|
|
908
920
|
catalog: DEFAULT_INDICATOR_CATALOG,
|
|
921
|
+
alertController: chart.alertController,
|
|
909
922
|
setSymbols,
|
|
910
923
|
addComparisonSymbol,
|
|
911
924
|
removeComparisonSymbol,
|
package/src/controllers/types.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type { Signal } from '../reactivity'
|
|
|
12
12
|
import type { CustomMarkerEntity } from '../engine/marker/registry'
|
|
13
13
|
import type { PaneSpec } from '../engine/chartTypes'
|
|
14
14
|
import type { InteractionSnapshot } from '../engine/chart'
|
|
15
|
+
import type { AlertController } from '../alerts/types'
|
|
15
16
|
|
|
16
17
|
// Controller-owned public surface. Legacy engine types may mirror these
|
|
17
18
|
// shapes internally, but adapters depend only on core-defined contracts.
|
|
@@ -215,7 +216,7 @@ export interface DrawingControllerCallbacks {
|
|
|
215
216
|
|
|
216
217
|
export interface ChartMountOptions {
|
|
217
218
|
container: HTMLElement
|
|
218
|
-
data
|
|
219
|
+
data?: ReadonlyArray<KLineData>
|
|
219
220
|
symbols?: ReadonlyArray<SymbolSpec>
|
|
220
221
|
dataFetcher?: DataFetcher
|
|
221
222
|
initialZoomLevel?: number
|
|
@@ -267,6 +268,9 @@ export interface ChartController extends DrawingChartAdapter {
|
|
|
267
268
|
// indicator catalog (static — adapters use for picker UI)
|
|
268
269
|
readonly catalog: ReadonlyArray<IndicatorDefinition>
|
|
269
270
|
|
|
271
|
+
// ---- Alerts ----
|
|
272
|
+
readonly alertController: AlertController
|
|
273
|
+
|
|
270
274
|
// ---- Data ----
|
|
271
275
|
setSymbols(next: ReadonlyArray<SymbolSpec>): void
|
|
272
276
|
addComparisonSymbol(spec: SymbolSpec): void
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors'
|
|
1
2
|
import type { KLineData } from '../controllers/types'
|
|
2
3
|
import { DataFetcher } from './fetcherDefinitionRegistry'
|
|
3
4
|
import type { FetchConfig } from './types'
|
|
@@ -27,7 +28,7 @@ async function fetchBaoStock(
|
|
|
27
28
|
try {
|
|
28
29
|
const res = await fetch(url)
|
|
29
30
|
if (!res.ok) {
|
|
30
|
-
throw new
|
|
31
|
+
throw new KLineChartError('FETCH_FAILED', `[baostock] fetch failed: ${res.status} ${res.statusText}`)
|
|
31
32
|
}
|
|
32
33
|
const json = await res.json()
|
|
33
34
|
return (json.data ?? json).map(
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Context, Effect, pipe, Schedule } from 'effect'
|
|
2
2
|
import type { Effect as EffectType } from 'effect/Effect'
|
|
3
|
+
import { KLineChartError } from '../errors'
|
|
3
4
|
import type { KLineData, SymbolSpec } from '../controllers/types'
|
|
4
5
|
import type { TimeShareData } from '../types/price'
|
|
5
6
|
|
|
@@ -83,7 +84,8 @@ export const fetchKLine = (
|
|
|
83
84
|
)
|
|
84
85
|
if (data.length === 0) {
|
|
85
86
|
return yield* Effect.fail(
|
|
86
|
-
new
|
|
87
|
+
new KLineChartError(
|
|
88
|
+
'FETCH_FAILED',
|
|
87
89
|
`[DataBuffer] empty data for ${spec.symbol} ${formatDate(startTs)}~${formatDate(endTs)}`,
|
|
88
90
|
),
|
|
89
91
|
)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors'
|
|
1
2
|
import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn, TimeShareFetcherFn } from './types'
|
|
2
3
|
|
|
3
4
|
type DataFetcherClass = {
|
|
@@ -12,7 +13,7 @@ export function DataFetcher(config: DataFetcherDefinitionConfig) {
|
|
|
12
13
|
return function <T extends DataFetcherClass>(value: T, context: ClassDecoratorContext<T>): T {
|
|
13
14
|
context.addInitializer(function (this: T) {
|
|
14
15
|
if (typeof this.fetcher !== 'function') {
|
|
15
|
-
throw new
|
|
16
|
+
throw new KLineChartError('NOT_REGISTERED',
|
|
16
17
|
`[DataFetcher] '${config.name}' definition must expose static fetcher`,
|
|
17
18
|
)
|
|
18
19
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { KLineData, TimeShareData } from '../controllers/types'
|
|
2
|
+
import { KLineChartError } from '../errors'
|
|
2
3
|
import { DataFetcher } from './fetcherDefinitionRegistry'
|
|
3
4
|
import type { FetchConfig, TimeShareFetchConfig } from './types'
|
|
4
5
|
|
|
@@ -60,7 +61,7 @@ async function fetchGotdxHistoryTick(
|
|
|
60
61
|
headers: { 'Content-Type': 'application/json' },
|
|
61
62
|
body: JSON.stringify(body),
|
|
62
63
|
})
|
|
63
|
-
if (!res.ok) throw new
|
|
64
|
+
if (!res.ok) throw new KLineChartError('FETCH_FAILED', `[gotdx] history-tick failed: ${res.status} ${res.statusText}`)
|
|
64
65
|
const list: Array<{ timestamp: string; Price: number; Avg: number; Vol: number }> = await res.json()
|
|
65
66
|
return list.map((item) => ({
|
|
66
67
|
timestamp: new Date(item.timestamp).getTime(),
|
|
@@ -157,7 +158,7 @@ async function fetchGotdx(
|
|
|
157
158
|
headers: { 'Content-Type': 'application/json' },
|
|
158
159
|
body: JSON.stringify(body),
|
|
159
160
|
})
|
|
160
|
-
if (!res.ok) throw new
|
|
161
|
+
if (!res.ok) throw new KLineChartError('FETCH_FAILED', `[gotdx] ex/kline-by-date failed: ${res.status} ${res.statusText}`)
|
|
161
162
|
const list: ExKLineItem[] = await res.json()
|
|
162
163
|
return list.map((item) => mapExItem(item, config.symbol))
|
|
163
164
|
}
|
|
@@ -179,7 +180,7 @@ async function fetchGotdx(
|
|
|
179
180
|
headers: { 'Content-Type': 'application/json' },
|
|
180
181
|
body: JSON.stringify(body),
|
|
181
182
|
})
|
|
182
|
-
if (!res.ok) throw new
|
|
183
|
+
if (!res.ok) throw new KLineChartError('FETCH_FAILED', `[gotdx] stock/kline-by-date failed: ${res.status} ${res.statusText}`)
|
|
183
184
|
const list: SecurityBar[] = await res.json()
|
|
184
185
|
return list.map((item) => mapBar(item, config.symbol))
|
|
185
186
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DataFetcher } from '../controllers/types'
|
|
2
2
|
import type { TimeShareFetcherFn } from './types'
|
|
3
|
+
import { KLineChartError } from '../errors'
|
|
3
4
|
import { getRegisteredFetcher, fetcherSupportsPeriod, getTimeShareFetcher } from './fetcherDefinitionRegistry'
|
|
4
5
|
|
|
5
6
|
const FALLBACK_SOURCE = 'baostock'
|
|
@@ -13,7 +14,8 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
|
|
|
13
14
|
const fallback = getRegisteredFetcher(FALLBACK_SOURCE)
|
|
14
15
|
if (!fallback) {
|
|
15
16
|
return Promise.reject(
|
|
16
|
-
new
|
|
17
|
+
new KLineChartError(
|
|
18
|
+
'FETCH_FAILED',
|
|
17
19
|
`[DataFetcher] no fetcher registered for "${source}" and no fallback available`,
|
|
18
20
|
),
|
|
19
21
|
)
|
|
@@ -23,7 +25,8 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
|
|
|
23
25
|
|
|
24
26
|
if (!fetcherSupportsPeriod(source, config.period)) {
|
|
25
27
|
return Promise.reject(
|
|
26
|
-
new
|
|
28
|
+
new KLineChartError(
|
|
29
|
+
'FETCH_FAILED',
|
|
27
30
|
`[DataFetcher] "${source}" does not support period "${config.period}". Supported: ${def.capabilities?.join(', ') ?? 'none'}`,
|
|
28
31
|
),
|
|
29
32
|
)
|
|
@@ -36,7 +39,7 @@ export const routerTimeShareFetcher: TimeShareFetcherFn = (source, config) => {
|
|
|
36
39
|
const fetcher = getTimeShareFetcher(source)
|
|
37
40
|
if (!fetcher) {
|
|
38
41
|
return Promise.reject(
|
|
39
|
-
new
|
|
42
|
+
new KLineChartError('FETCH_FAILED', `[DataFetcher] "${source}" does not support timeshare data fetching`),
|
|
40
43
|
)
|
|
41
44
|
}
|
|
42
45
|
return fetcher(source, config)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors'
|
|
1
2
|
import type { KLineData } from '../controllers/types'
|
|
2
3
|
import { DataFetcher } from './fetcherDefinitionRegistry'
|
|
3
4
|
import type { FetchConfig } from './types'
|
|
@@ -34,11 +35,11 @@ async function fetchTradingview(
|
|
|
34
35
|
try {
|
|
35
36
|
const res = await fetch(url)
|
|
36
37
|
if (!res.ok) {
|
|
37
|
-
throw new
|
|
38
|
+
throw new KLineChartError('FETCH_FAILED', `[tradingview] fetch failed: ${res.status} ${res.statusText}`)
|
|
38
39
|
}
|
|
39
40
|
const json = await res.json()
|
|
40
41
|
if (!json.success) {
|
|
41
|
-
throw new
|
|
42
|
+
throw new KLineChartError('FETCH_FAILED', `[tradingview] API error: ${json.error_msg}`)
|
|
42
43
|
}
|
|
43
44
|
if (json.warning) {
|
|
44
45
|
console.warn(`[tradingview] ${json.warning}`)
|
package/src/engine/chart.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { createSignal, type Signal, type Computed } from '../reactivity/signal'
|
|
|
4
4
|
import type { SymbolSpec, CustomDataSource } from '../controllers/types'
|
|
5
5
|
import { ChartDataManager } from './data/chartDataManager'
|
|
6
6
|
import { ChartPaneLayout } from './layout/chartPaneLayout'
|
|
7
|
-
import { UpdateLevel } from './layout/pane'
|
|
7
|
+
import { UpdateLevel, type VisibleRange } from './layout/pane'
|
|
8
8
|
import type { ScaleType } from './utils/tickPosition'
|
|
9
9
|
import { InteractionController, type InteractionSnapshot } from './controller/interaction'
|
|
10
10
|
export type { InteractionSnapshot }
|
|
@@ -32,6 +32,15 @@ import {
|
|
|
32
32
|
wrapPaneInfo,
|
|
33
33
|
} from '../plugin'
|
|
34
34
|
import type { SubIndicatorType } from './renderers/Indicator'
|
|
35
|
+
import type { AlertController, MarketSnapshot } from '../alerts/types'
|
|
36
|
+
import { createAlertController } from '../alerts'
|
|
37
|
+
import {
|
|
38
|
+
createVolumeLookbacks,
|
|
39
|
+
pushToVolumeLookbacks,
|
|
40
|
+
type VolumeLookbacks,
|
|
41
|
+
} from '../alerts/rollingVolume'
|
|
42
|
+
import { resolveStateKey } from './indicators/indicatorMetadata'
|
|
43
|
+
import type { IndicatorMetadata } from './indicators/indicatorMetadata'
|
|
35
44
|
|
|
36
45
|
|
|
37
46
|
// 重新导出以保持向后兼容
|
|
@@ -83,8 +92,17 @@ export class Chart {
|
|
|
83
92
|
private _modeSavedKGap = 0
|
|
84
93
|
private _modeSavedZoomLevel = 0
|
|
85
94
|
|
|
86
|
-
|
|
87
|
-
|
|
95
|
+
/** 分时模式激活前的 pane Y 轴刻度类型(退出分时时恢复) */
|
|
96
|
+
private _savedScaleTypes: Map<string, ScaleType> | undefined
|
|
97
|
+
|
|
98
|
+
/** 上次预警评估的最新 K 线时间戳(用于去重) */
|
|
99
|
+
private _lastAlertTimestamp: number | null = null
|
|
100
|
+
|
|
101
|
+
/** 预警控制器 */
|
|
102
|
+
readonly alertController: AlertController
|
|
103
|
+
|
|
104
|
+
/** 滚动成交量窗口(惰性初始化) */
|
|
105
|
+
private _volumeLookbacks: VolumeLookbacks | null = null
|
|
88
106
|
|
|
89
107
|
/**
|
|
90
108
|
* 启用主图指标
|
|
@@ -189,6 +207,8 @@ export class Chart {
|
|
|
189
207
|
},
|
|
190
208
|
})
|
|
191
209
|
|
|
210
|
+
this.alertController = createAlertController()
|
|
211
|
+
|
|
192
212
|
this.dataManager = new ChartDataManager({
|
|
193
213
|
getOption: () => this.opt,
|
|
194
214
|
getEffectiveDpr: () => this.viewportManager.getEffectiveDpr(),
|
|
@@ -217,12 +237,15 @@ export class Chart {
|
|
|
217
237
|
}
|
|
218
238
|
}
|
|
219
239
|
},
|
|
240
|
+
onDataProcessed: (data, range) => this.evaluateAlerts(data, range), // Alert 管线绑定
|
|
220
241
|
})
|
|
221
242
|
|
|
222
243
|
this.zoomController = new ChartZoomController({
|
|
223
244
|
getLogicalScrollLeft: () => this.viewportManager.getLogicalScrollLeft(),
|
|
224
245
|
getCurrentDpr: () => this.viewportManager.getEffectiveDpr(),
|
|
225
246
|
getLeftLoadBufferWidth: () => this.dataManager.getLeftLoadBufferWidth(),
|
|
247
|
+
getContentWidth: () => this.dataManager.getContentWidth(),
|
|
248
|
+
getClientWidth: () => this.viewportManager.getViewport()?.viewWidth ?? this.dom.container?.clientWidth ?? 0,
|
|
226
249
|
setScrollLeft: (v) => { this.viewportManager.setScrollLeft(v) },
|
|
227
250
|
onZoomCommitted: (result) => {
|
|
228
251
|
this.opt = { ...this.opt, kWidth: result.kWidth, kGap: result.kGap }
|
|
@@ -264,6 +287,12 @@ export class Chart {
|
|
|
264
287
|
setPendingIndicatorDataUpdate: (v) => { this.dataManager.pendingIndicatorDataUpdate = v },
|
|
265
288
|
})
|
|
266
289
|
|
|
290
|
+
// Worker 异步结果就绪后串联 Alert 管线
|
|
291
|
+
this.indicatorManager.indicatorSchedulerAccessor.setOnResultsApplied(() => {
|
|
292
|
+
const data = this.dataManager.getInternalData()
|
|
293
|
+
this.evaluateAlerts(data, this.dataManager.lastVisibleRange)
|
|
294
|
+
})
|
|
295
|
+
|
|
267
296
|
// 初始化渲染器
|
|
268
297
|
this.renderer = new ChartRenderer({
|
|
269
298
|
getDom: () => this.dom,
|
|
@@ -687,6 +716,97 @@ export class Chart {
|
|
|
687
716
|
return this.indicatorManager.indicatorSchedulerAccessor
|
|
688
717
|
}
|
|
689
718
|
|
|
719
|
+
/** 获取预警控制器 */
|
|
720
|
+
getAlertController(): AlertController {
|
|
721
|
+
return this.alertController
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/** 数据就绪时触发预警评估 */
|
|
725
|
+
private evaluateAlerts(data: KLineData[], range: VisibleRange): void {
|
|
726
|
+
const latest = data[data.length - 1]
|
|
727
|
+
if (!latest) return
|
|
728
|
+
// 去重:同一根 K 线只评估一次(增量加载/Worker 重复回调时跳过)
|
|
729
|
+
if (latest.timestamp === this._lastAlertTimestamp) return
|
|
730
|
+
this._lastAlertTimestamp = latest.timestamp
|
|
731
|
+
|
|
732
|
+
// 推进滚动量滑窗(仅在新 K 线到达时)
|
|
733
|
+
let lookbacks = this._volumeLookbacks
|
|
734
|
+
if (!lookbacks) {
|
|
735
|
+
lookbacks = createVolumeLookbacks([5, 10, 20, 60])
|
|
736
|
+
this._volumeLookbacks = lookbacks
|
|
737
|
+
}
|
|
738
|
+
pushToVolumeLookbacks(lookbacks, latest.volume ?? 0)
|
|
739
|
+
|
|
740
|
+
const snapshot = this.buildMarketSnapshot(data)
|
|
741
|
+
if (!snapshot) return
|
|
742
|
+
const events = this.alertController.evaluate(snapshot, Date.now())
|
|
743
|
+
if (events.length > 0) {
|
|
744
|
+
console.log('[Alerts] fired:', events)
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/** 构建预警引擎所需的当前市场快照 */
|
|
749
|
+
private buildMarketSnapshot(data: KLineData[]): MarketSnapshot | null {
|
|
750
|
+
const latest = data[data.length - 1]
|
|
751
|
+
if (!latest) return null
|
|
752
|
+
|
|
753
|
+
if (latest.volume === undefined) return null
|
|
754
|
+
|
|
755
|
+
const bar = {
|
|
756
|
+
timestamp: latest.timestamp,
|
|
757
|
+
open: latest.open,
|
|
758
|
+
high: latest.high,
|
|
759
|
+
low: latest.low,
|
|
760
|
+
close: latest.close,
|
|
761
|
+
volume: latest.volume,
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
const indicators: Record<string, number> = {}
|
|
765
|
+
const scheduler = this.getIndicatorScheduler()
|
|
766
|
+
for (const meta of scheduler.getAllIndicators()) {
|
|
767
|
+
const paneId = meta.defaultPaneId === 'main' ? 'main' : meta.defaultPaneId
|
|
768
|
+
const stateKey = resolveStateKey(meta.stateKey, paneId)
|
|
769
|
+
const state = this.pluginHost.getSharedState<any>(stateKey)
|
|
770
|
+
if (!state?.series) continue
|
|
771
|
+
const series = state.series
|
|
772
|
+
if (Array.isArray(series)) {
|
|
773
|
+
const val = series[series.length - 1]
|
|
774
|
+
if (typeof val === 'number' && Number.isFinite(val)) {
|
|
775
|
+
indicators[meta.name] = val
|
|
776
|
+
}
|
|
777
|
+
} else if (typeof series === 'object') {
|
|
778
|
+
const keys = Object.keys(series)
|
|
779
|
+
if (keys.length > 0) {
|
|
780
|
+
const lastKey = keys[keys.length - 1]!
|
|
781
|
+
const arr = series[lastKey]
|
|
782
|
+
if (Array.isArray(arr)) {
|
|
783
|
+
const val = arr[arr.length - 1]
|
|
784
|
+
if (typeof val === 'number' && Number.isFinite(val)) {
|
|
785
|
+
indicators[meta.name] = val
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// 只读滚动量(由 evaluateAlerts 推进滑窗)
|
|
793
|
+
const rollingVolume: Record<number, number> = {}
|
|
794
|
+
if (this._volumeLookbacks) {
|
|
795
|
+
for (const [size, calc] of this._volumeLookbacks) {
|
|
796
|
+
rollingVolume[size] = calc.mean
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
return {
|
|
801
|
+
bar,
|
|
802
|
+
indicators,
|
|
803
|
+
rollingVolume,
|
|
804
|
+
volumeProfile: undefined,
|
|
805
|
+
orderBook: undefined,
|
|
806
|
+
footprint: undefined,
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
690
810
|
getLogicalSlotCount(): number {
|
|
691
811
|
return this.dataManager.getLogicalSlotCount()
|
|
692
812
|
}
|
|
@@ -772,6 +892,7 @@ export class Chart {
|
|
|
772
892
|
this.layoutManager.destroy()
|
|
773
893
|
this.sharedWebGLSurface.destroy()
|
|
774
894
|
this.indicatorManager.destroy()
|
|
895
|
+
this.alertController.dispose()
|
|
775
896
|
await this.pluginHost.destroy()
|
|
776
897
|
}
|
|
777
898
|
|
|
@@ -896,6 +1017,8 @@ export class Chart {
|
|
|
896
1017
|
}
|
|
897
1018
|
|
|
898
1019
|
setSymbols(specs: ReadonlyArray<SymbolSpec>): void {
|
|
1020
|
+
// 品种/周期切换时重置最新 K 线时间戳,确保新数据触发预警
|
|
1021
|
+
this._lastAlertTimestamp = null
|
|
899
1022
|
const primaryPeriod = specs[0]?.period
|
|
900
1023
|
if (primaryPeriod) {
|
|
901
1024
|
this.setActiveMode(primaryPeriod === 'timeshare' ? this._timeShareMode : this._kLineMode)
|
|
@@ -31,6 +31,7 @@ export interface DataDependencies {
|
|
|
31
31
|
setPendingIndicatorDataUpdate: (v: boolean) => void
|
|
32
32
|
isPointerDown: () => boolean
|
|
33
33
|
onTimeShareDataReady: (dataLength: number) => void
|
|
34
|
+
onDataProcessed?: (data: KLineData[], range: VisibleRange) => void
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
const BUF_PRIMARY = 'main'
|
|
@@ -184,7 +185,19 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
|
|
|
184
185
|
this.pendingPrependedCount = 0
|
|
185
186
|
|
|
186
187
|
if (prependedCount === 0 && this.deps.getCachedScrollLeft() < this.getLeftLoadBufferWidth()) {
|
|
187
|
-
this.deps.
|
|
188
|
+
const scrollLeft = this.deps.getCachedScrollLeft()
|
|
189
|
+
if (scrollLeft <= 0) {
|
|
190
|
+
this.deps.setScrollLeft(this.getLeftLoadBufferWidth())
|
|
191
|
+
} else {
|
|
192
|
+
const dpr = this.deps.getEffectiveDpr()
|
|
193
|
+
const opt = this.deps.getOption()
|
|
194
|
+
const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
|
|
195
|
+
const totalDataWidth = (startXPx + bufferData.length * unitPx) / dpr
|
|
196
|
+
const leftBuffer = this.getLeftLoadBufferWidth()
|
|
197
|
+
if (scrollLeft >= leftBuffer + totalDataWidth) {
|
|
198
|
+
this.deps.setScrollLeft(leftBuffer)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
188
201
|
}
|
|
189
202
|
|
|
190
203
|
if ((prevDataLength ?? this._dataSignal.peek().length) === 0 && bufferData.length > 0) {
|
|
@@ -216,6 +229,8 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
|
|
|
216
229
|
if (indicatorsReady) {
|
|
217
230
|
this.pendingIndicatorDataUpdate = false
|
|
218
231
|
this.deps.scheduleDraw()
|
|
232
|
+
// Alert 管线入口:Chart 构造时绑定 → evaluateAlerts()
|
|
233
|
+
this.deps.onDataProcessed?.(bufferData, this.lastVisibleRange)
|
|
219
234
|
} else {
|
|
220
235
|
this.pendingIndicatorDataUpdate = true
|
|
221
236
|
}
|
|
@@ -899,16 +914,23 @@ private _symbolsSignal = createSignal<ReadonlyArray<SymbolSpec>>([])
|
|
|
899
914
|
const dpr = this.deps.getEffectiveDpr()
|
|
900
915
|
const opt = this.deps.getOption()
|
|
901
916
|
const { unitPx, startXPx } = getPhysicalKLineConfig(opt.kWidth, opt.kGap, dpr)
|
|
902
|
-
const lastKLineEndPx = (startXPx +
|
|
917
|
+
const lastKLineEndPx = (startXPx + dataLength * unitPx) / dpr
|
|
903
918
|
const viewport = this.deps.getViewport()
|
|
904
919
|
const clientWidth = viewport?.viewWidth
|
|
905
920
|
?? (this.deps.getObservedSize().width > 0 ? this.deps.getObservedSize().width : undefined)
|
|
906
921
|
?? Math.round(this.deps.getDom().container?.clientWidth ?? 0)
|
|
907
922
|
if (clientWidth <= 0) return
|
|
908
|
-
const
|
|
923
|
+
const leftBuffer = this.getLeftLoadBufferWidth()
|
|
924
|
+
let target: number
|
|
925
|
+
if (lastKLineEndPx <= clientWidth) {
|
|
926
|
+
// 数据不足以填满一屏 → 右对齐:最后一根 K 线固定在右侧
|
|
927
|
+
target = leftBuffer - (clientWidth - lastKLineEndPx)
|
|
928
|
+
} else {
|
|
929
|
+
target = leftBuffer + (lastKLineEndPx - clientWidth)
|
|
930
|
+
}
|
|
909
931
|
const contentWidth = this.getContentWidth()
|
|
910
932
|
const maxScroll = Math.max(0, contentWidth - clientWidth)
|
|
911
|
-
const scrollLeft = Math.round(Math.min(target, maxScroll) * dpr) / dpr
|
|
933
|
+
const scrollLeft = Math.round(Math.max(0, Math.min(target, maxScroll)) * dpr) / dpr
|
|
912
934
|
this.deps.setScrollLeft(scrollLeft)
|
|
913
935
|
this.deps.scheduleDraw()
|
|
914
936
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../../errors'
|
|
1
2
|
import type { DrawingKind } from '../../plugin'
|
|
2
3
|
|
|
3
4
|
// ---- Tool ID type ----
|
|
@@ -63,7 +64,7 @@ export function getAnchorCountForTool(toolId: DrawingToolId): 1 | 2 | 3 | null {
|
|
|
63
64
|
export function getDrawingKind(toolId: DrawingToolId): DrawingKind {
|
|
64
65
|
switch (toolId) {
|
|
65
66
|
case 'cursor':
|
|
66
|
-
throw new
|
|
67
|
+
throw new KLineChartError('INVALID_PARAM', 'cursor is not a drawing kind')
|
|
67
68
|
case 'h-line':
|
|
68
69
|
return 'horizontal-line'
|
|
69
70
|
case 'h-ray':
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../../errors'
|
|
1
2
|
import type { KLineData } from '../../types/price'
|
|
2
3
|
import { createSignal, computed, type Signal, type Computed } from '../../reactivity/signal'
|
|
3
4
|
import type { IndicatorInstance, SubPaneInfo, PaneSpec, ChartOptions } from '../chartTypes'
|
|
@@ -375,7 +376,7 @@ export class ChartIndicatorManager {
|
|
|
375
376
|
|
|
376
377
|
const definition = this.indicatorScheduler.getIndicatorMetadata(indicatorId)
|
|
377
378
|
if (!definition) {
|
|
378
|
-
throw new
|
|
379
|
+
throw new KLineChartError('NOT_REGISTERED', `[Chart] Unknown indicator: ${indicatorId}`)
|
|
379
380
|
}
|
|
380
381
|
const renderer = createSubIndicatorRenderer({ indicatorId, paneId, definition, params })
|
|
381
382
|
const rendererName = renderer.name
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../../errors'
|
|
1
2
|
import type {
|
|
2
3
|
IndicatorMetadata,
|
|
3
4
|
IndicatorCategory,
|
|
@@ -73,7 +74,7 @@ export function Indicator(config: IndicatorDefinitionConfig) {
|
|
|
73
74
|
context.addInitializer(function (this: T) {
|
|
74
75
|
const rendererFactory = this.rendererFactory
|
|
75
76
|
if (typeof rendererFactory !== 'function') {
|
|
76
|
-
throw new
|
|
77
|
+
throw new KLineChartError('INVALID_PARAM', `[Indicator] '${config.name}' definition must expose static rendererFactory`)
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
const normalizedName = normalizeIndicatorId(config.name)
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* 每个指标通过 metadata 描述其状态 key、渲染器工厂等元信息
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { KLineChartError } from '../../errors'
|
|
8
9
|
import type { PluginHost, RendererPluginWithHost } from '../../plugin'
|
|
9
10
|
import type { IndicatorConfigSnapshot, IndicatorSeriesBundle } from './workerProtocol'
|
|
10
11
|
import type { KLineData } from '../../types/price'
|
|
@@ -272,7 +273,7 @@ export interface IndicatorMetadata<T = unknown> {
|
|
|
272
273
|
export function resolveStateKey(stateKey: StateKey, paneId?: string): string {
|
|
273
274
|
if (typeof stateKey === 'function') {
|
|
274
275
|
if (!paneId) {
|
|
275
|
-
throw new
|
|
276
|
+
throw new KLineChartError('INVALID_PARAM', '[IndicatorMetadata] Pane ID required for dynamic state key')
|
|
276
277
|
}
|
|
277
278
|
return stateKey(paneId)
|
|
278
279
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../../errors'
|
|
1
2
|
import type { IndicatorMetadata } from './indicatorMetadata'
|
|
2
3
|
import { getRegisteredIndicatorDefinitions } from './indicatorDefinitionRegistry'
|
|
3
4
|
|
|
@@ -52,20 +53,20 @@ export class IndicatorRegistry {
|
|
|
52
53
|
register<T>(meta: IndicatorMetadata<T>): void {
|
|
53
54
|
// 验证必填字段
|
|
54
55
|
if (!meta.name || typeof meta.name !== 'string') {
|
|
55
|
-
throw new
|
|
56
|
+
throw new KLineChartError('INVALID_PARAM', '[IndicatorRegistry] Indicator name is required')
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
if (!meta.displayName) {
|
|
59
|
-
throw new
|
|
60
|
+
throw new KLineChartError('INVALID_PARAM', `[IndicatorRegistry] displayName is required for indicator '${meta.name}'`)
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
if (!meta.rendererFactory || typeof meta.rendererFactory !== 'function') {
|
|
63
|
-
throw new
|
|
64
|
+
throw new KLineChartError('INVALID_PARAM', `[IndicatorRegistry] rendererFactory is required for indicator '${meta.name}'`)
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
const normalizedName = this.normalize(meta.name)
|
|
67
68
|
if (!normalizedName) {
|
|
68
|
-
throw new
|
|
69
|
+
throw new KLineChartError('INVALID_PARAM', '[IndicatorRegistry] Indicator name is required')
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
// 检查重复注册
|
|
@@ -112,7 +113,7 @@ export class IndicatorRegistry {
|
|
|
112
113
|
getRequired(name: string): IndicatorMetadata {
|
|
113
114
|
const meta = this.get(name)
|
|
114
115
|
if (!meta) {
|
|
115
|
-
throw new
|
|
116
|
+
throw new KLineChartError('NOT_REGISTERED', `[IndicatorRegistry] Unknown indicator '${name}'`)
|
|
116
117
|
}
|
|
117
118
|
return meta
|
|
118
119
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KLineChartError } from '../../errors'
|
|
1
2
|
import { getRegisteredIndicatorDefinitions } from './indicatorDefinitionRegistry'
|
|
2
3
|
|
|
3
4
|
let loaded = false
|
|
@@ -52,7 +53,7 @@ export async function loadBuiltinIndicators(): Promise<void> {
|
|
|
52
53
|
|
|
53
54
|
export function getBuiltinIndicatorDefinitions() {
|
|
54
55
|
if (!loaded) {
|
|
55
|
-
throw new
|
|
56
|
+
throw new KLineChartError('INVALID_STATE',
|
|
56
57
|
'Builtin indicators not loaded yet. Call await loadBuiltinIndicators() first.',
|
|
57
58
|
)
|
|
58
59
|
}
|