@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
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anchored VWAP controller — framework-agnostic, signal-based, multi-anchor.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the dispose-guard pattern from
|
|
5
|
+
* `createIndicatorSelectorController` and `createVolumeProfileController` so
|
|
6
|
+
* React/Vue/Angular adapters bridge identically. The controller is pure
|
|
7
|
+
* data — no DOM, no rendering, no canvas.
|
|
8
|
+
*
|
|
9
|
+
* Why multi-anchor with per-anchor running sums:
|
|
10
|
+
* TradingView's lower tiers cap the number of simultaneous anchors at
|
|
11
|
+
* 3 because each AVWAP is recomputed from scratch on every new bar. By
|
|
12
|
+
* keeping per-anchor `sumVwp` / `sumVol` / `sumSqDev` totals we drop
|
|
13
|
+
* `appendBar` from O(bars-since-anchor) to O(1) per anchor — anchors
|
|
14
|
+
* become cheap enough to keep many open at once.
|
|
15
|
+
*
|
|
16
|
+
* Equivalence guarantee:
|
|
17
|
+
* The point produced by `appendBar` is bit-for-bit identical (to
|
|
18
|
+
* floating-point precision) to the point that `computeAnchoredVwap`
|
|
19
|
+
* would produce on the same bar at the same anchor — same operands
|
|
20
|
+
* added in the same order. The controller test
|
|
21
|
+
* `appendBar incrementally matches full recompute` pins this.
|
|
22
|
+
*/
|
|
23
|
+
import { createSignal } from '../../reactivity';
|
|
24
|
+
import { computeAnchoredVwap } from './computeAnchoredVwap';
|
|
25
|
+
export function createAnchoredVwapController(opts) {
|
|
26
|
+
// -------------------------------------------------------------------
|
|
27
|
+
// Internal mutable state — never exposed directly.
|
|
28
|
+
// -------------------------------------------------------------------
|
|
29
|
+
// Defensive copy: the caller may reuse the array they pass us. We
|
|
30
|
+
// capture a snapshot so `appendBar` can extend it without surprising
|
|
31
|
+
// the caller.
|
|
32
|
+
let bars = opts?.initialBars
|
|
33
|
+
? opts.initialBars.slice()
|
|
34
|
+
: [];
|
|
35
|
+
const anchorStates = new Map();
|
|
36
|
+
// -------------------------------------------------------------------
|
|
37
|
+
// Public signal — re-emitted on every structural change.
|
|
38
|
+
// -------------------------------------------------------------------
|
|
39
|
+
const anchors = createSignal([]);
|
|
40
|
+
/**
|
|
41
|
+
* Rebuild the public signal value from the current `anchorStates`. We
|
|
42
|
+
* pass a fresh array reference each time so `Object.is` in
|
|
43
|
+
* `signal.set` triggers a notify.
|
|
44
|
+
*/
|
|
45
|
+
function publish() {
|
|
46
|
+
const next = [];
|
|
47
|
+
for (const a of anchorStates.values()) {
|
|
48
|
+
next.push({
|
|
49
|
+
definition: a.definition,
|
|
50
|
+
// Snapshot the series so consumers see an immutable
|
|
51
|
+
// view; future `appendBar` mutations on `a.series` will
|
|
52
|
+
// only be observed by the next `publish`.
|
|
53
|
+
series: a.series.slice(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
anchors.set(next);
|
|
57
|
+
}
|
|
58
|
+
// -------------------------------------------------------------------
|
|
59
|
+
// Math helpers — share one definition of the per-bar arithmetic so
|
|
60
|
+
// `appendBar` and `recomputeAnchor` cannot drift.
|
|
61
|
+
// -------------------------------------------------------------------
|
|
62
|
+
/**
|
|
63
|
+
* Recompute an anchor's series from scratch by walking the bars from
|
|
64
|
+
* `definition.barIndex`. Also resets the running sums so subsequent
|
|
65
|
+
* `appendBar` calls extend the same totals.
|
|
66
|
+
*
|
|
67
|
+
* `null` is a sentinel meaning "anchor is out of range for the
|
|
68
|
+
* current bars" — the caller drops a point-free entry.
|
|
69
|
+
*/
|
|
70
|
+
function recomputeAnchor(state) {
|
|
71
|
+
const def = state.definition;
|
|
72
|
+
// Out-of-range anchor: leave the running sums at zero and emit an
|
|
73
|
+
// empty series. We deliberately do NOT throw — callers might be
|
|
74
|
+
// mid-stream and an out-of-range anchor is a valid transient
|
|
75
|
+
// state (e.g. user dragged the anchor past the loaded window).
|
|
76
|
+
if (bars.length === 0 ||
|
|
77
|
+
def.barIndex < 0 ||
|
|
78
|
+
def.barIndex >= bars.length) {
|
|
79
|
+
state.sumVwp = 0;
|
|
80
|
+
state.sumVol = 0;
|
|
81
|
+
state.sumSqDev = 0;
|
|
82
|
+
state.series = [];
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Use the shared pure function so behaviour stays identical.
|
|
86
|
+
const series = computeAnchoredVwap(bars, def.barIndex, def.includeBands);
|
|
87
|
+
// Reconstruct the running sums by replaying the same arithmetic
|
|
88
|
+
// — we need them for the next `appendBar`. This is the only
|
|
89
|
+
// place where the controller duplicates the math; the cost is
|
|
90
|
+
// unavoidable because `computeAnchoredVwap` does not expose its
|
|
91
|
+
// internal sums.
|
|
92
|
+
let sumVwp = 0;
|
|
93
|
+
let sumVol = 0;
|
|
94
|
+
let sumSqDev = 0;
|
|
95
|
+
for (let i = def.barIndex; i < bars.length; i++) {
|
|
96
|
+
const bar = bars[i];
|
|
97
|
+
if (bar === undefined)
|
|
98
|
+
continue;
|
|
99
|
+
const v = bar.volume;
|
|
100
|
+
if (v > 0) {
|
|
101
|
+
const tp = (bar.high + bar.low + bar.close) / 3;
|
|
102
|
+
sumVwp += tp * v;
|
|
103
|
+
sumVol += v;
|
|
104
|
+
// Prevailing AVWAP at this bar — same operands as the
|
|
105
|
+
// pure function, same addition order.
|
|
106
|
+
if (def.includeBands && sumVol > 0) {
|
|
107
|
+
const vwap = sumVwp / sumVol;
|
|
108
|
+
const diff = tp - vwap;
|
|
109
|
+
sumSqDev += diff * diff * v;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
state.sumVwp = sumVwp;
|
|
114
|
+
state.sumVol = sumVol;
|
|
115
|
+
state.sumSqDev = sumSqDev;
|
|
116
|
+
state.series = series.slice();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Extend an anchor's series by one bar incrementally — O(1) per call.
|
|
120
|
+
* The new bar's absolute index in `bars` is the caller's
|
|
121
|
+
* responsibility to compute; we take it as a parameter so
|
|
122
|
+
* `appendBar` can be straight-line.
|
|
123
|
+
*/
|
|
124
|
+
function extendAnchorByOne(state, bar, absIndex) {
|
|
125
|
+
const def = state.definition;
|
|
126
|
+
// Skip anchors that haven't started yet (anchor is in the future
|
|
127
|
+
// relative to this new bar).
|
|
128
|
+
if (absIndex < def.barIndex)
|
|
129
|
+
return;
|
|
130
|
+
// Skip anchors with no anchor inside the loaded window.
|
|
131
|
+
if (def.barIndex < 0)
|
|
132
|
+
return;
|
|
133
|
+
const v = bar.volume;
|
|
134
|
+
const tp = (bar.high + bar.low + bar.close) / 3;
|
|
135
|
+
if (v > 0) {
|
|
136
|
+
state.sumVwp += tp * v;
|
|
137
|
+
state.sumVol += v;
|
|
138
|
+
}
|
|
139
|
+
let vwap = Number.NaN;
|
|
140
|
+
if (state.sumVol > 0) {
|
|
141
|
+
vwap = state.sumVwp / state.sumVol;
|
|
142
|
+
}
|
|
143
|
+
// Bands: prevailing AVWAP at this bar — same arithmetic as
|
|
144
|
+
// `recomputeAnchor` and `computeAnchoredVwap`.
|
|
145
|
+
if (def.includeBands &&
|
|
146
|
+
v > 0 &&
|
|
147
|
+
state.sumVol > 0 &&
|
|
148
|
+
Number.isFinite(vwap)) {
|
|
149
|
+
const diff = tp - vwap;
|
|
150
|
+
state.sumSqDev += diff * diff * v;
|
|
151
|
+
}
|
|
152
|
+
let upper1 = vwap;
|
|
153
|
+
let lower1 = vwap;
|
|
154
|
+
let upper2 = vwap;
|
|
155
|
+
let lower2 = vwap;
|
|
156
|
+
if (def.includeBands &&
|
|
157
|
+
state.sumVol > 0 &&
|
|
158
|
+
Number.isFinite(vwap)) {
|
|
159
|
+
const variance = state.sumSqDev / state.sumVol;
|
|
160
|
+
const stdDev = Math.sqrt(variance > 0 ? variance : 0);
|
|
161
|
+
upper1 = vwap + stdDev;
|
|
162
|
+
lower1 = vwap - stdDev;
|
|
163
|
+
upper2 = vwap + 2 * stdDev;
|
|
164
|
+
lower2 = vwap - 2 * stdDev;
|
|
165
|
+
}
|
|
166
|
+
state.series.push({
|
|
167
|
+
barIndex: absIndex,
|
|
168
|
+
vwap,
|
|
169
|
+
upper1,
|
|
170
|
+
lower1,
|
|
171
|
+
upper2,
|
|
172
|
+
lower2,
|
|
173
|
+
cumulativeVolume: state.sumVol,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
// -------------------------------------------------------------------
|
|
177
|
+
// Lifecycle — kick off any initial anchors (none today, but reserved).
|
|
178
|
+
// -------------------------------------------------------------------
|
|
179
|
+
if (bars.length > 0) {
|
|
180
|
+
// No anchors yet — publish empty so subscribers see a defined
|
|
181
|
+
// starting value.
|
|
182
|
+
publish();
|
|
183
|
+
}
|
|
184
|
+
// -------------------------------------------------------------------
|
|
185
|
+
// Public mutators
|
|
186
|
+
// -------------------------------------------------------------------
|
|
187
|
+
function setBars(nextBars) {
|
|
188
|
+
bars = nextBars.slice();
|
|
189
|
+
for (const state of anchorStates.values()) {
|
|
190
|
+
recomputeAnchor(state);
|
|
191
|
+
}
|
|
192
|
+
publish();
|
|
193
|
+
}
|
|
194
|
+
function addAnchor(def) {
|
|
195
|
+
// Replace-in-place on id collision. The brief allows either
|
|
196
|
+
// semantics; we choose replace because UIs that drag an anchor
|
|
197
|
+
// onto an existing one expect the existing one to update, not
|
|
198
|
+
// to throw.
|
|
199
|
+
const state = {
|
|
200
|
+
definition: { ...def },
|
|
201
|
+
sumVwp: 0,
|
|
202
|
+
sumVol: 0,
|
|
203
|
+
sumSqDev: 0,
|
|
204
|
+
series: [],
|
|
205
|
+
};
|
|
206
|
+
recomputeAnchor(state);
|
|
207
|
+
anchorStates.set(def.id, state);
|
|
208
|
+
publish();
|
|
209
|
+
return def.id;
|
|
210
|
+
}
|
|
211
|
+
function removeAnchor(id) {
|
|
212
|
+
const existed = anchorStates.delete(id);
|
|
213
|
+
if (existed)
|
|
214
|
+
publish();
|
|
215
|
+
return existed;
|
|
216
|
+
}
|
|
217
|
+
function updateAnchor(id, patch) {
|
|
218
|
+
const state = anchorStates.get(id);
|
|
219
|
+
if (state === undefined)
|
|
220
|
+
return false;
|
|
221
|
+
const prev = state.definition;
|
|
222
|
+
// Merge into a fresh definition object — never mutate the
|
|
223
|
+
// existing one (immutability convention).
|
|
224
|
+
const nextDef = {
|
|
225
|
+
...prev,
|
|
226
|
+
...patch,
|
|
227
|
+
id: prev.id,
|
|
228
|
+
};
|
|
229
|
+
state.definition = nextDef;
|
|
230
|
+
// Recompute only when the math-affecting fields change.
|
|
231
|
+
const mathDirty = (patch.barIndex !== undefined &&
|
|
232
|
+
patch.barIndex !== prev.barIndex) ||
|
|
233
|
+
(patch.includeBands !== undefined &&
|
|
234
|
+
patch.includeBands !== prev.includeBands);
|
|
235
|
+
if (mathDirty) {
|
|
236
|
+
recomputeAnchor(state);
|
|
237
|
+
}
|
|
238
|
+
publish();
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
function appendBar(bar) {
|
|
242
|
+
const absIndex = bars.length;
|
|
243
|
+
bars.push(bar);
|
|
244
|
+
for (const state of anchorStates.values()) {
|
|
245
|
+
extendAnchorByOne(state, bar, absIndex);
|
|
246
|
+
}
|
|
247
|
+
publish();
|
|
248
|
+
}
|
|
249
|
+
// -------------------------------------------------------------------
|
|
250
|
+
// Dispose — silence mutators (same pattern as the rest of the codebase)
|
|
251
|
+
// -------------------------------------------------------------------
|
|
252
|
+
let disposed = false;
|
|
253
|
+
function dispose() {
|
|
254
|
+
if (disposed)
|
|
255
|
+
return;
|
|
256
|
+
disposed = true;
|
|
257
|
+
}
|
|
258
|
+
function guard(fn, fallback) {
|
|
259
|
+
return ((...args) => {
|
|
260
|
+
if (disposed)
|
|
261
|
+
return fallback;
|
|
262
|
+
return fn(...args);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
const guardedSetBars = guard(setBars, undefined);
|
|
266
|
+
const guardedAppendBar = guard(appendBar, undefined);
|
|
267
|
+
return {
|
|
268
|
+
anchors,
|
|
269
|
+
// Canonical verbs (API audit BLOCKER-001 harmonisation): `setData`
|
|
270
|
+
// for full replacement + `append` for single-item extension. Old
|
|
271
|
+
// names preserved as aliases for the deprecation window.
|
|
272
|
+
setData: guardedSetBars,
|
|
273
|
+
append: guardedAppendBar,
|
|
274
|
+
setBars: guardedSetBars,
|
|
275
|
+
addAnchor: guard(addAnchor, null),
|
|
276
|
+
removeAnchor: guard(removeAnchor, false),
|
|
277
|
+
updateAnchor: guard(updateAnchor, false),
|
|
278
|
+
appendBar: guardedAppendBar,
|
|
279
|
+
dispose,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=createAnchoredVwapController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAnchoredVwapController.js","sourceRoot":"","sources":["../../../src/components/anchoredVwap/createAnchoredVwapController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of the Anchored VWAP module.
|
|
3
|
+
*
|
|
4
|
+
* Consumers should import from this barrel. The barrel is re-exported from
|
|
5
|
+
* `packages/core/src/index.ts` so the public package surface stays a single
|
|
6
|
+
* import line.
|
|
7
|
+
*/
|
|
8
|
+
export { computeAnchoredVwap } from './computeAnchoredVwap';
|
|
9
|
+
export { createAnchoredVwapController } from './createAnchoredVwapController';
|
|
10
|
+
export type { ActiveAnchor, AnchorDefinition, AnchoredVwapController, AVWAPBar, AVWAPPoint, } from './types';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/anchoredVwap/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA;AAC7E,YAAY,EACR,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,QAAQ,EACR,UAAU,GACb,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of the Anchored VWAP module.
|
|
3
|
+
*
|
|
4
|
+
* Consumers should import from this barrel. The barrel is re-exported from
|
|
5
|
+
* `packages/core/src/index.ts` so the public package surface stays a single
|
|
6
|
+
* import line.
|
|
7
|
+
*/
|
|
8
|
+
export { computeAnchoredVwap } from './computeAnchoredVwap';
|
|
9
|
+
export { createAnchoredVwapController } from './createAnchoredVwapController';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/anchoredVwap/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anchored VWAP — public type contract.
|
|
3
|
+
*
|
|
4
|
+
* Anchored VWAP (AVWAP) is a volume-weighted average price calculation that
|
|
5
|
+
* starts from a specific, user-chosen anchor bar rather than rolling over a
|
|
6
|
+
* fixed window. Institutional traders anchor to earnings prints, swing
|
|
7
|
+
* highs/lows, session opens, or macro events and read the resulting line as
|
|
8
|
+
* a "fair price" reference from that moment forward. The ±1σ / ±2σ bands
|
|
9
|
+
* around the AVWAP form a volume-weighted standard-deviation envelope that
|
|
10
|
+
* is widely used for mean-reversion entries and exits.
|
|
11
|
+
*
|
|
12
|
+
* TradingView restricts the **number** of simultaneous AVWAP anchors on
|
|
13
|
+
* lower tiers; this controller is multi-anchor by design — every anchor
|
|
14
|
+
* tracks its own cumulative sums so incremental `appendBar` is O(1) per
|
|
15
|
+
* anchor per bar.
|
|
16
|
+
*
|
|
17
|
+
* This module owns the **data model + math only**. Rendering belongs to the
|
|
18
|
+
* `@klinechart-quant/core` Renderer/Scene layer (or a Vue/React adapter).
|
|
19
|
+
*
|
|
20
|
+
* See `docs/ROADMAP.md` §3 for the broader controller layering this fits
|
|
21
|
+
* into. The dispose-guard pattern follows
|
|
22
|
+
* `createIndicatorSelectorController.ts`.
|
|
23
|
+
*/
|
|
24
|
+
import type { Signal } from '../../reactivity';
|
|
25
|
+
/**
|
|
26
|
+
* Minimum bar shape consumed by `computeAnchoredVwap`. Matches the
|
|
27
|
+
* cross-renderer KLineData subset used elsewhere in core. We intentionally
|
|
28
|
+
* do NOT require `open` or `timestamp` so callers can stream from any
|
|
29
|
+
* source.
|
|
30
|
+
*/
|
|
31
|
+
export interface AVWAPBar {
|
|
32
|
+
high: number;
|
|
33
|
+
low: number;
|
|
34
|
+
close: number;
|
|
35
|
+
volume: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A single point of an Anchored VWAP series — one entry per bar from the
|
|
39
|
+
* anchor index (inclusive) through the end of the input.
|
|
40
|
+
*
|
|
41
|
+
* `barIndex` is the absolute bar index in the original input array (NOT a
|
|
42
|
+
* series-relative offset). Renderers map it directly onto their X-axis.
|
|
43
|
+
*
|
|
44
|
+
* When bands are disabled (`includeBands: false`) the four band fields are
|
|
45
|
+
* set equal to `vwap` so consumers do not need a `null` check.
|
|
46
|
+
*
|
|
47
|
+
* When a bar contributes no volume and there is no prior AVWAP (i.e. the
|
|
48
|
+
* anchor bar itself has `volume === 0`), every numeric field of the
|
|
49
|
+
* resulting point is `NaN`. See `computeAnchoredVwap.ts` for the
|
|
50
|
+
* carry-forward rules.
|
|
51
|
+
*/
|
|
52
|
+
export interface AVWAPPoint {
|
|
53
|
+
/** Absolute bar index in the input series. */
|
|
54
|
+
barIndex: number;
|
|
55
|
+
/** Volume-weighted average price from anchor up to this bar. */
|
|
56
|
+
vwap: number;
|
|
57
|
+
/** vwap + 1σ. Equals vwap when bands are disabled. */
|
|
58
|
+
upper1: number;
|
|
59
|
+
/** vwap − 1σ. Equals vwap when bands are disabled. */
|
|
60
|
+
lower1: number;
|
|
61
|
+
/** vwap + 2σ. Equals vwap when bands are disabled. */
|
|
62
|
+
upper2: number;
|
|
63
|
+
/** vwap − 2σ. Equals vwap when bands are disabled. */
|
|
64
|
+
lower2: number;
|
|
65
|
+
/** Running sum of volume from the anchor to this bar. Useful for
|
|
66
|
+
* diagnostics, exhaustion checks, and adapter overlays. */
|
|
67
|
+
cumulativeVolume: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Definition of an anchor instance. Multiple anchors can be active at the
|
|
71
|
+
* same time (e.g. one per session, one per earnings, one per swing low).
|
|
72
|
+
*
|
|
73
|
+
* `id` must be unique within the controller; the controller treats a
|
|
74
|
+
* collision on `addAnchor` as a replace-in-place to keep the API
|
|
75
|
+
* idempotent.
|
|
76
|
+
*/
|
|
77
|
+
export interface AnchorDefinition {
|
|
78
|
+
/** Stable id. Caller-supplied; treat as opaque. */
|
|
79
|
+
id: string;
|
|
80
|
+
/** Human-readable label (e.g. "Earnings Beat 2024-Q1"). */
|
|
81
|
+
label: string;
|
|
82
|
+
/** Anchor position as an index into the controller's bar series. */
|
|
83
|
+
barIndex: number;
|
|
84
|
+
/** Optional colour hint for the adapter — not used by the math. */
|
|
85
|
+
color?: string;
|
|
86
|
+
/** Whether to compute the ±1σ / ±2σ bands for this anchor. */
|
|
87
|
+
includeBands: boolean;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* An anchor together with its computed AVWAP series. The series is a
|
|
91
|
+
* snapshot — calling `setBars`, `appendBar`, or `updateAnchor` produces a
|
|
92
|
+
* fresh array (immutability convention).
|
|
93
|
+
*/
|
|
94
|
+
export interface ActiveAnchor {
|
|
95
|
+
definition: AnchorDefinition;
|
|
96
|
+
series: ReadonlyArray<AVWAPPoint>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Framework-agnostic controller — mirrors the shape of
|
|
100
|
+
* `VolumeProfileController` and `IndicatorSelectorController` (signals for
|
|
101
|
+
* state, plain functions for mutations, idempotent `dispose`).
|
|
102
|
+
*
|
|
103
|
+
* Why this design:
|
|
104
|
+
* - Multi-anchor: every anchor tracks its own running sums so
|
|
105
|
+
* `appendBar` is O(anchors) per tick, not O(anchors × bars).
|
|
106
|
+
* - Signal-based: any adapter (React `useSyncExternalStore`, Vue effect,
|
|
107
|
+
* Angular `toSignal`) can bridge without coupling to a framework.
|
|
108
|
+
* - Dispose-guard: mutators become silent no-ops after `dispose`, so a
|
|
109
|
+
* component that unmounts mid-stream cannot leak updates into a stale
|
|
110
|
+
* listener.
|
|
111
|
+
*/
|
|
112
|
+
export interface AnchoredVwapController {
|
|
113
|
+
/** All currently active anchors with their up-to-date series. */
|
|
114
|
+
readonly anchors: Signal<ReadonlyArray<ActiveAnchor>>;
|
|
115
|
+
/**
|
|
116
|
+
* Replace the underlying bar series and recompute every active anchor
|
|
117
|
+
* from scratch — canonical method, aligned with the cross-controller
|
|
118
|
+
* `setData()` convention (MtfController). Closes API audit BLOCKER-001
|
|
119
|
+
* (5-verb intake proliferation).
|
|
120
|
+
*/
|
|
121
|
+
setData(bars: ReadonlyArray<AVWAPBar>): void;
|
|
122
|
+
/**
|
|
123
|
+
* @deprecated since 0.1.0-alpha.1 — use {@link AnchoredVwapController.setData}.
|
|
124
|
+
* Preserved as a non-removing alias for at least 6 months.
|
|
125
|
+
*/
|
|
126
|
+
setBars(bars: ReadonlyArray<AVWAPBar>): void;
|
|
127
|
+
/**
|
|
128
|
+
* Add an anchor and compute its series immediately. Returns the
|
|
129
|
+
* anchor's id (the same one passed in `def.id`). If an anchor with the
|
|
130
|
+
* same id already exists it is **replaced** — that keeps the API
|
|
131
|
+
* idempotent and matches what UIs expect when the user drags an anchor
|
|
132
|
+
* onto an existing one.
|
|
133
|
+
*
|
|
134
|
+
* Returns `null` after dispose.
|
|
135
|
+
*/
|
|
136
|
+
addAnchor(def: AnchorDefinition): string | null;
|
|
137
|
+
/**
|
|
138
|
+
* Remove an anchor by id. Returns `true` when an anchor was actually
|
|
139
|
+
* removed, `false` when the id was unknown (or after dispose).
|
|
140
|
+
*/
|
|
141
|
+
removeAnchor(id: string): boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Patch an anchor in place. Any of `label`, `barIndex`, `color`, and
|
|
144
|
+
* `includeBands` may change; the series is recomputed whenever
|
|
145
|
+
* `barIndex` or `includeBands` changes (a pure label change is a
|
|
146
|
+
* lightweight metadata swap).
|
|
147
|
+
*
|
|
148
|
+
* Returns `false` when the id is unknown (or after dispose).
|
|
149
|
+
*/
|
|
150
|
+
updateAnchor(id: string, patch: Partial<Omit<AnchorDefinition, 'id'>>): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Append a single new bar — canonical method, aligned with the
|
|
153
|
+
* cross-controller `append()` convention (MtfController). Each anchor's
|
|
154
|
+
* series is extended **incrementally** by one point — the running
|
|
155
|
+
* cumulative sums make this O(1) per anchor per call. A full
|
|
156
|
+
* `computeAnchoredVwap` after N appends produces the same result; see
|
|
157
|
+
* the controller test that pins this equivalence.
|
|
158
|
+
*/
|
|
159
|
+
append(bar: AVWAPBar): void;
|
|
160
|
+
/**
|
|
161
|
+
* @deprecated since 0.1.0-alpha.1 — use {@link AnchoredVwapController.append}.
|
|
162
|
+
* Preserved as a non-removing alias for at least 6 months.
|
|
163
|
+
*/
|
|
164
|
+
appendBar(bar: AVWAPBar): void;
|
|
165
|
+
/**
|
|
166
|
+
* Stop emitting. Subsequent mutator calls are silent no-ops; previously
|
|
167
|
+
* attached subscribers receive no further notifications. Idempotent.
|
|
168
|
+
*/
|
|
169
|
+
dispose(): void;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/anchoredVwap/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,UAAU;IACvB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAA;IACd,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAA;IACd,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAA;IACd,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAA;IACd;gEAC4D;IAC5D,gBAAgB,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC7B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,YAAY,EAAE,OAAO,CAAA;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CACpC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,sBAAsB;IACnC,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAA;IAErD;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;IAE5C;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;IAE5C;;;;;;;;OAQG;IACH,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAAA;IAE/C;;;OAGG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;IAEjC;;;;;;;OAOG;IACH,YAAY,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,GAC7C,OAAO,CAAA;IAEV;;;;;;;OAOG;IACH,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAA;IAE3B;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAA;IAE9B;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAA;CAClB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anchored VWAP — public type contract.
|
|
3
|
+
*
|
|
4
|
+
* Anchored VWAP (AVWAP) is a volume-weighted average price calculation that
|
|
5
|
+
* starts from a specific, user-chosen anchor bar rather than rolling over a
|
|
6
|
+
* fixed window. Institutional traders anchor to earnings prints, swing
|
|
7
|
+
* highs/lows, session opens, or macro events and read the resulting line as
|
|
8
|
+
* a "fair price" reference from that moment forward. The ±1σ / ±2σ bands
|
|
9
|
+
* around the AVWAP form a volume-weighted standard-deviation envelope that
|
|
10
|
+
* is widely used for mean-reversion entries and exits.
|
|
11
|
+
*
|
|
12
|
+
* TradingView restricts the **number** of simultaneous AVWAP anchors on
|
|
13
|
+
* lower tiers; this controller is multi-anchor by design — every anchor
|
|
14
|
+
* tracks its own cumulative sums so incremental `appendBar` is O(1) per
|
|
15
|
+
* anchor per bar.
|
|
16
|
+
*
|
|
17
|
+
* This module owns the **data model + math only**. Rendering belongs to the
|
|
18
|
+
* `@klinechart-quant/core` Renderer/Scene layer (or a Vue/React adapter).
|
|
19
|
+
*
|
|
20
|
+
* See `docs/ROADMAP.md` §3 for the broader controller layering this fits
|
|
21
|
+
* into. The dispose-guard pattern follows
|
|
22
|
+
* `createIndicatorSelectorController.ts`.
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/anchoredVwap/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crosshair sync — broadcasts crosshair position across multiple
|
|
3
|
+
* chart panes so a hover in one pane lights up the same time index
|
|
4
|
+
* in every other pane.
|
|
5
|
+
*
|
|
6
|
+
* Why this is the controller, not just a callback:
|
|
7
|
+
*
|
|
8
|
+
* - Multi-pane layouts (price + volume + 1+ indicator panes) are
|
|
9
|
+
* standard for finance charts. TradingView's multi-pane crosshair
|
|
10
|
+
* is one of its iconic UX features.
|
|
11
|
+
* - Each pane has its own scale/transform. The universal coordinate
|
|
12
|
+
* they share is the **time index** — the integer-valued position
|
|
13
|
+
* within the bar array. Sync on index, not pixel; the rendering
|
|
14
|
+
* pane converts back to its own x coordinate.
|
|
15
|
+
* - Loop prevention: a pane that consumed a sync event must not
|
|
16
|
+
* re-emit it. We track the source identifier so the pane that
|
|
17
|
+
* drove the update doesn't recurse.
|
|
18
|
+
*
|
|
19
|
+
* Pure data, signal-based, framework-agnostic — same shape as the
|
|
20
|
+
* rest of `@klinechart-quant/core`.
|
|
21
|
+
*
|
|
22
|
+
* const sync = createCrosshairSync()
|
|
23
|
+
* sync.register('price')
|
|
24
|
+
* sync.register('volume')
|
|
25
|
+
* sync.register('rsi')
|
|
26
|
+
*
|
|
27
|
+
* priceContainer.addEventListener('pointermove', e => {
|
|
28
|
+
* const idx = timeScale.xToBarIndex(e.offsetX)
|
|
29
|
+
* sync.move('price', idx)
|
|
30
|
+
* })
|
|
31
|
+
*
|
|
32
|
+
* sync.position.subscribe(() => {
|
|
33
|
+
* const p = sync.position.peek()
|
|
34
|
+
* if (p === null) hideCrosshair()
|
|
35
|
+
* else if (p.source !== 'volume') drawCrosshairInVolume(p.index)
|
|
36
|
+
* })
|
|
37
|
+
*/
|
|
38
|
+
import { type Signal } from '../../reactivity';
|
|
39
|
+
/**
|
|
40
|
+
* Current crosshair position broadcast across registered panes.
|
|
41
|
+
* `null` means no pane has the crosshair active (host left every chart
|
|
42
|
+
* or `clear()` was called).
|
|
43
|
+
*/
|
|
44
|
+
export interface CrosshairPosition {
|
|
45
|
+
/** Integer index into the canonical bar array. */
|
|
46
|
+
readonly index: number;
|
|
47
|
+
/**
|
|
48
|
+
* Pane id of the pane that produced this update. Consumers MUST
|
|
49
|
+
* compare to skip handling their own emissions (loop prevention).
|
|
50
|
+
*/
|
|
51
|
+
readonly source: string;
|
|
52
|
+
}
|
|
53
|
+
export interface CrosshairSync {
|
|
54
|
+
/**
|
|
55
|
+
* Current position. `null` when no crosshair is active.
|
|
56
|
+
*
|
|
57
|
+
* NOTE: this is a `Signal<...>` — reading `position()` inside an
|
|
58
|
+
* `effect` tracks the subscription; reading `position.peek()` does
|
|
59
|
+
* not. Manual `subscribe` returns an unsubscribe function.
|
|
60
|
+
*/
|
|
61
|
+
readonly position: Signal<CrosshairPosition | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Number of currently registered panes. Helpful for the
|
|
64
|
+
* "single-pane no-op" branch in adapters.
|
|
65
|
+
*/
|
|
66
|
+
readonly paneCount: Signal<number>;
|
|
67
|
+
/**
|
|
68
|
+
* Register a pane that participates in the sync. Idempotent —
|
|
69
|
+
* re-registering the same id is a no-op.
|
|
70
|
+
*/
|
|
71
|
+
register(paneId: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* Unregister a pane. If the unregistered pane is the source of the
|
|
74
|
+
* current position, the position is cleared (the producer is gone).
|
|
75
|
+
*/
|
|
76
|
+
unregister(paneId: string): void;
|
|
77
|
+
/**
|
|
78
|
+
* Producer-side update — pane `paneId` is reporting that its
|
|
79
|
+
* crosshair is on bar `index`. Subscribers receive the new
|
|
80
|
+
* position; `paneId` is recorded as `source` for loop prevention.
|
|
81
|
+
*
|
|
82
|
+
* Calling `move` from a pane that has not been registered throws
|
|
83
|
+
* `KLineChartError('NOT_REGISTERED')` — the wiring contract is
|
|
84
|
+
* easy to mess up and silent ignores would mask bugs.
|
|
85
|
+
*/
|
|
86
|
+
move(paneId: string, index: number): void;
|
|
87
|
+
/** Clears the position. All panes see `position = null`. */
|
|
88
|
+
clear(): void;
|
|
89
|
+
/** Reset to empty registry + null position. */
|
|
90
|
+
reset(): void;
|
|
91
|
+
dispose(): void;
|
|
92
|
+
}
|
|
93
|
+
export declare function createCrosshairSync(): CrosshairSync;
|
|
94
|
+
//# sourceMappingURL=createCrosshairSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createCrosshairSync.d.ts","sourceRoot":"","sources":["../../../src/components/crosshairSync/createCrosshairSync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAO5D;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC1B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IACnD;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAElC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC;;;;;;;;OAQG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,4DAA4D;IAC5D,KAAK,IAAI,IAAI,CAAA;IACb,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,IAAI,IAAI,CAAA;CAClB;AAMD,wBAAgB,mBAAmB,IAAI,aAAa,CAgFnD"}
|