@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,118 @@
|
|
|
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 { createSignal } from '../../reactivity';
|
|
39
|
+
import { KLineChartError } from '../../errors';
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Factory
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
export function createCrosshairSync() {
|
|
44
|
+
const position = createSignal(null);
|
|
45
|
+
const paneCount = createSignal(0);
|
|
46
|
+
const panes = new Set();
|
|
47
|
+
let disposed = false;
|
|
48
|
+
function publishPaneCount() {
|
|
49
|
+
paneCount.set(panes.size);
|
|
50
|
+
}
|
|
51
|
+
function register(paneId) {
|
|
52
|
+
if (disposed)
|
|
53
|
+
return;
|
|
54
|
+
if (paneId === '' || typeof paneId !== 'string') {
|
|
55
|
+
throw new KLineChartError('INVALID_PARAM', `CrosshairSync.register: paneId must be a non-empty string`);
|
|
56
|
+
}
|
|
57
|
+
if (panes.has(paneId))
|
|
58
|
+
return;
|
|
59
|
+
panes.add(paneId);
|
|
60
|
+
publishPaneCount();
|
|
61
|
+
}
|
|
62
|
+
function unregister(paneId) {
|
|
63
|
+
if (disposed)
|
|
64
|
+
return;
|
|
65
|
+
if (!panes.has(paneId))
|
|
66
|
+
return;
|
|
67
|
+
panes.delete(paneId);
|
|
68
|
+
publishPaneCount();
|
|
69
|
+
const cur = position.peek();
|
|
70
|
+
if (cur !== null && cur.source === paneId) {
|
|
71
|
+
position.set(null);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function move(paneId, index) {
|
|
75
|
+
if (disposed)
|
|
76
|
+
return;
|
|
77
|
+
if (!panes.has(paneId)) {
|
|
78
|
+
throw new KLineChartError('NOT_REGISTERED', `CrosshairSync.move: pane ${JSON.stringify(paneId)} is not registered — call register(${JSON.stringify(paneId)}) before move()`);
|
|
79
|
+
}
|
|
80
|
+
if (!Number.isFinite(index)) {
|
|
81
|
+
throw new KLineChartError('INVALID_PARAM', `CrosshairSync.move: index must be finite, got ${index}`);
|
|
82
|
+
}
|
|
83
|
+
// Normalise to integer. Sub-bar precision lives in the per-pane
|
|
84
|
+
// pixel layer, not in the shared index broadcast.
|
|
85
|
+
const idx = Math.round(index);
|
|
86
|
+
const cur = position.peek();
|
|
87
|
+
// Coalesce identical updates so subscribers don't fire on no-ops.
|
|
88
|
+
if (cur !== null && cur.index === idx && cur.source === paneId)
|
|
89
|
+
return;
|
|
90
|
+
position.set({ index: idx, source: paneId });
|
|
91
|
+
}
|
|
92
|
+
function clear() {
|
|
93
|
+
if (disposed)
|
|
94
|
+
return;
|
|
95
|
+
if (position.peek() === null)
|
|
96
|
+
return;
|
|
97
|
+
position.set(null);
|
|
98
|
+
}
|
|
99
|
+
function reset() {
|
|
100
|
+
if (disposed)
|
|
101
|
+
return;
|
|
102
|
+
panes.clear();
|
|
103
|
+
publishPaneCount();
|
|
104
|
+
if (position.peek() !== null)
|
|
105
|
+
position.set(null);
|
|
106
|
+
}
|
|
107
|
+
function dispose() {
|
|
108
|
+
if (disposed)
|
|
109
|
+
return;
|
|
110
|
+
disposed = true;
|
|
111
|
+
panes.clear();
|
|
112
|
+
// No notify on dispose — subscribers should listen for their own
|
|
113
|
+
// host lifecycle. Setting paneCount/position now would notify
|
|
114
|
+
// dead subscribers in some host frameworks.
|
|
115
|
+
}
|
|
116
|
+
return { position, paneCount, register, unregister, move, clear, reset, dispose };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=createCrosshairSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createCrosshairSync.js","sourceRoot":"","sources":["../../../src/components/crosshairSync/createCrosshairSync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,YAAY,EAAe,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AA+D9C,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,UAAU,mBAAmB;IAC/B,MAAM,QAAQ,GAAG,YAAY,CAA2B,IAAI,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,YAAY,CAAS,CAAC,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAA;IAEpB,SAAS,gBAAgB;QACrB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,SAAS,QAAQ,CAAC,MAAc;QAC5B,IAAI,QAAQ;YAAE,OAAM;QACpB,IAAI,MAAM,KAAK,EAAE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,eAAe,CACrB,eAAe,EACf,2DAA2D,CAC9D,CAAA;QACL,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAM;QAC7B,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACjB,gBAAgB,EAAE,CAAA;IACtB,CAAC;IAED,SAAS,UAAU,CAAC,MAAc;QAC9B,IAAI,QAAQ;YAAE,OAAM;QACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAM;QAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACpB,gBAAgB,EAAE,CAAA;QAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACxC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACL,CAAC;IAED,SAAS,IAAI,CAAC,MAAc,EAAE,KAAa;QACvC,IAAI,QAAQ;YAAE,OAAM;QACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,eAAe,CACrB,gBAAgB,EAChB,4BAA4B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAClI,CAAA;QACL,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,eAAe,CACrB,eAAe,EACf,iDAAiD,KAAK,EAAE,CAC3D,CAAA;QACL,CAAC;QACD,gEAAgE;QAChE,kDAAkD;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC3B,kEAAkE;QAClE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;YAAE,OAAM;QACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,SAAS,KAAK;QACV,IAAI,QAAQ;YAAE,OAAM;QACpB,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI;YAAE,OAAM;QACpC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACtB,CAAC;IAED,SAAS,KAAK;QACV,IAAI,QAAQ;YAAE,OAAM;QACpB,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,gBAAgB,EAAE,CAAA;QAClB,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,SAAS,OAAO;QACZ,IAAI,QAAQ;YAAE,OAAM;QACpB,QAAQ,GAAG,IAAI,CAAA;QACf,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,iEAAiE;QACjE,8DAA8D;QAC9D,4CAA4C;IAChD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AACrF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/crosshairSync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACzB,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/crosshairSync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,GAGtB,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggressor classification — three heuristics for tagging a print as
|
|
3
|
+
* buyer-initiated ("buy", aggressor lifted the ASK) or seller-initiated
|
|
4
|
+
* ("sell", aggressor hit the BID).
|
|
5
|
+
*
|
|
6
|
+
* Future hook: Bulk Volume Classification (BVC) by Easley/Lopez de Prado/O'Hara
|
|
7
|
+
* 2012 is more robust in HFT-fragmented markets where the tick rule's serial
|
|
8
|
+
* correlation assumptions break. BVC is planned as a v2 classifier under the
|
|
9
|
+
* same `AggressorResult` interface.
|
|
10
|
+
*
|
|
11
|
+
* Each classifier exports the same `AggressorResult` shape so the controller
|
|
12
|
+
* can compose them in a fallback chain (explicit → heuristic) without
|
|
13
|
+
* branching on classifier identity.
|
|
14
|
+
*
|
|
15
|
+
* See `docs/ROADMAP.md` §3.3 for the rationale — order of preference is
|
|
16
|
+
* always explicit > Lee-Ready > tick rule.
|
|
17
|
+
*/
|
|
18
|
+
import type { AggressorSide, Trade, TradeWithFlag } from './types';
|
|
19
|
+
/**
|
|
20
|
+
* Output of every classifier.
|
|
21
|
+
*
|
|
22
|
+
* `side` is `'unknown'` only when there is genuinely no information to act
|
|
23
|
+
* on (e.g. the first trade in a tick-rule sequence). The controller should
|
|
24
|
+
* treat `'unknown'` as "drop this trade from the aggregate", NOT as a
|
|
25
|
+
* silent default to 'buy' or 'sell'.
|
|
26
|
+
*
|
|
27
|
+
* `inferred=false` means the side came from an exchange flag (zero error).
|
|
28
|
+
* `inferred=true` means it was estimated; downstream UI should mark such
|
|
29
|
+
* bars as approximate.
|
|
30
|
+
*/
|
|
31
|
+
export type { AggressorSide, Trade, TradeWithFlag };
|
|
32
|
+
export interface AggressorResult {
|
|
33
|
+
side: AggressorSide | 'unknown';
|
|
34
|
+
inferred: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read Binance-style `isBuyerMaker`. When the buyer is the maker (passive),
|
|
38
|
+
* the seller was the aggressor — so we report `'sell'`. When the buyer is
|
|
39
|
+
* NOT the maker, the buyer was the aggressor — `'buy'`.
|
|
40
|
+
*
|
|
41
|
+
* Returns `null` (not an `AggressorResult`) when the flag is missing so the
|
|
42
|
+
* caller can distinguish "no data" from "we classified it as unknown". This
|
|
43
|
+
* lets the controller fall back to the configured heuristic only when truly
|
|
44
|
+
* needed.
|
|
45
|
+
*/
|
|
46
|
+
export declare function classifyExplicit(trade: TradeWithFlag): AggressorResult | null;
|
|
47
|
+
/**
|
|
48
|
+
* State carried across consecutive trades for the tick rule. The classifier
|
|
49
|
+
* MUTATES this in place — callers should keep one instance per stream
|
|
50
|
+
* (per-symbol if multiplexing).
|
|
51
|
+
*/
|
|
52
|
+
export interface TickRuleState {
|
|
53
|
+
prevPrice: number | null;
|
|
54
|
+
prevSide: AggressorSide | null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Classic tick test (Lee & Ready 1991 §2):
|
|
58
|
+
*
|
|
59
|
+
* price > prevPrice → 'buy' (uptick)
|
|
60
|
+
* price < prevPrice → 'sell' (downtick)
|
|
61
|
+
* price == prevPrice → repeats prevSide (zero-tick)
|
|
62
|
+
* first trade (prevPrice null) → 'unknown'
|
|
63
|
+
*
|
|
64
|
+
* The state is MUTATED so subsequent calls inherit the running context.
|
|
65
|
+
*/
|
|
66
|
+
export declare function classifyTickRule(state: TickRuleState, trade: Trade): AggressorResult;
|
|
67
|
+
/**
|
|
68
|
+
* Lee-Ready uses the same carry-over fields as the tick rule — the two
|
|
69
|
+
* heuristics can share a single state record because Lee-Ready falls back
|
|
70
|
+
* to the tick rule on a quote-mid hit.
|
|
71
|
+
*/
|
|
72
|
+
export interface LeeReadyState extends TickRuleState {
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Lee-Ready (1991) quote test:
|
|
76
|
+
*
|
|
77
|
+
* If bid and ask are both finite:
|
|
78
|
+
* mid = (bid + ask) / 2
|
|
79
|
+
* price > mid → 'buy'
|
|
80
|
+
* price < mid → 'sell'
|
|
81
|
+
* price == mid → tick-rule fallback (zero spread or mid-cross)
|
|
82
|
+
* Else (bid/ask missing or non-finite) → tick-rule fallback.
|
|
83
|
+
*
|
|
84
|
+
* The state MUTATES exactly like `classifyTickRule` — when the quote test
|
|
85
|
+
* resolves, we still update `prevPrice`/`prevSide` so a subsequent
|
|
86
|
+
* tick-rule fallback has the latest context.
|
|
87
|
+
*/
|
|
88
|
+
export declare function classifyLeeReady(state: LeeReadyState, trade: Trade, bid: number, ask: number): AggressorResult;
|
|
89
|
+
//# sourceMappingURL=aggressor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggressor.d.ts","sourceRoot":"","sources":["../../../src/components/footprint/aggressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAElE;;;;;;;;;;;GAWG;AACH,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;AACnD,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,aAAa,GAAG,SAAS,CAAA;IAC/B,QAAQ,EAAE,OAAO,CAAA;CACpB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,GACrB,eAAe,GAAG,IAAI,CAMxB;AAMD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,KAAK,GACb,eAAe,CAsBjB;AAMD;;;;GAIG;AACH,MAAM,WAAW,aAAc,SAAQ,aAAa;CAAG;AAEvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACZ,eAAe,CAqBjB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggressor classification — three heuristics for tagging a print as
|
|
3
|
+
* buyer-initiated ("buy", aggressor lifted the ASK) or seller-initiated
|
|
4
|
+
* ("sell", aggressor hit the BID).
|
|
5
|
+
*
|
|
6
|
+
* Future hook: Bulk Volume Classification (BVC) by Easley/Lopez de Prado/O'Hara
|
|
7
|
+
* 2012 is more robust in HFT-fragmented markets where the tick rule's serial
|
|
8
|
+
* correlation assumptions break. BVC is planned as a v2 classifier under the
|
|
9
|
+
* same `AggressorResult` interface.
|
|
10
|
+
*
|
|
11
|
+
* Each classifier exports the same `AggressorResult` shape so the controller
|
|
12
|
+
* can compose them in a fallback chain (explicit → heuristic) without
|
|
13
|
+
* branching on classifier identity.
|
|
14
|
+
*
|
|
15
|
+
* See `docs/ROADMAP.md` §3.3 for the rationale — order of preference is
|
|
16
|
+
* always explicit > Lee-Ready > tick rule.
|
|
17
|
+
*/
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// 1. Explicit (exchange-provided flag)
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Read Binance-style `isBuyerMaker`. When the buyer is the maker (passive),
|
|
23
|
+
* the seller was the aggressor — so we report `'sell'`. When the buyer is
|
|
24
|
+
* NOT the maker, the buyer was the aggressor — `'buy'`.
|
|
25
|
+
*
|
|
26
|
+
* Returns `null` (not an `AggressorResult`) when the flag is missing so the
|
|
27
|
+
* caller can distinguish "no data" from "we classified it as unknown". This
|
|
28
|
+
* lets the controller fall back to the configured heuristic only when truly
|
|
29
|
+
* needed.
|
|
30
|
+
*/
|
|
31
|
+
export function classifyExplicit(trade) {
|
|
32
|
+
if (trade.isBuyerMaker === undefined)
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
side: trade.isBuyerMaker ? 'sell' : 'buy',
|
|
36
|
+
inferred: false,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Classic tick test (Lee & Ready 1991 §2):
|
|
41
|
+
*
|
|
42
|
+
* price > prevPrice → 'buy' (uptick)
|
|
43
|
+
* price < prevPrice → 'sell' (downtick)
|
|
44
|
+
* price == prevPrice → repeats prevSide (zero-tick)
|
|
45
|
+
* first trade (prevPrice null) → 'unknown'
|
|
46
|
+
*
|
|
47
|
+
* The state is MUTATED so subsequent calls inherit the running context.
|
|
48
|
+
*/
|
|
49
|
+
export function classifyTickRule(state, trade) {
|
|
50
|
+
const prev = state.prevPrice;
|
|
51
|
+
let side;
|
|
52
|
+
if (prev === null) {
|
|
53
|
+
side = 'unknown';
|
|
54
|
+
}
|
|
55
|
+
else if (trade.price > prev) {
|
|
56
|
+
side = 'buy';
|
|
57
|
+
}
|
|
58
|
+
else if (trade.price < prev) {
|
|
59
|
+
side = 'sell';
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// zero-tick: inherit previous decision; 'unknown' if no prior side.
|
|
63
|
+
side = state.prevSide ?? 'unknown';
|
|
64
|
+
}
|
|
65
|
+
// Update running state. We commit a known side; we deliberately do NOT
|
|
66
|
+
// overwrite `prevSide` with 'unknown', otherwise a single missing-price
|
|
67
|
+
// trade would poison the carry-over for the rest of the stream.
|
|
68
|
+
state.prevPrice = trade.price;
|
|
69
|
+
if (side === 'buy' || side === 'sell')
|
|
70
|
+
state.prevSide = side;
|
|
71
|
+
return { side, inferred: true };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Lee-Ready (1991) quote test:
|
|
75
|
+
*
|
|
76
|
+
* If bid and ask are both finite:
|
|
77
|
+
* mid = (bid + ask) / 2
|
|
78
|
+
* price > mid → 'buy'
|
|
79
|
+
* price < mid → 'sell'
|
|
80
|
+
* price == mid → tick-rule fallback (zero spread or mid-cross)
|
|
81
|
+
* Else (bid/ask missing or non-finite) → tick-rule fallback.
|
|
82
|
+
*
|
|
83
|
+
* The state MUTATES exactly like `classifyTickRule` — when the quote test
|
|
84
|
+
* resolves, we still update `prevPrice`/`prevSide` so a subsequent
|
|
85
|
+
* tick-rule fallback has the latest context.
|
|
86
|
+
*/
|
|
87
|
+
export function classifyLeeReady(state, trade, bid, ask) {
|
|
88
|
+
const quotesUsable = Number.isFinite(bid) && Number.isFinite(ask);
|
|
89
|
+
if (!quotesUsable) {
|
|
90
|
+
return classifyTickRule(state, trade);
|
|
91
|
+
}
|
|
92
|
+
const mid = (bid + ask) / 2;
|
|
93
|
+
if (trade.price > mid) {
|
|
94
|
+
state.prevPrice = trade.price;
|
|
95
|
+
state.prevSide = 'buy';
|
|
96
|
+
return { side: 'buy', inferred: true };
|
|
97
|
+
}
|
|
98
|
+
if (trade.price < mid) {
|
|
99
|
+
state.prevPrice = trade.price;
|
|
100
|
+
state.prevSide = 'sell';
|
|
101
|
+
return { side: 'sell', inferred: true };
|
|
102
|
+
}
|
|
103
|
+
// price == mid → fall back to tick rule (which updates state).
|
|
104
|
+
return classifyTickRule(state, trade);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=aggressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggressor.js","sourceRoot":"","sources":["../../../src/components/footprint/aggressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsBH,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAoB;IAEpB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACjD,OAAO;QACH,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;QACzC,QAAQ,EAAE,KAAK;KAClB,CAAA;AACL,CAAC;AAgBD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAoB,EACpB,KAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAA;IAC5B,IAAI,IAA+B,CAAA;IAEnC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,IAAI,GAAG,SAAS,CAAA;IACpB,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,KAAK,CAAA;IAChB,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;QAC5B,IAAI,GAAG,MAAM,CAAA;IACjB,CAAC;SAAM,CAAC;QACJ,oEAAoE;QACpE,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAA;IACtC,CAAC;IAED,uEAAuE;IACvE,wEAAwE;IACxE,gEAAgE;IAChE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;IAC7B,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM;QAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAA;IAE5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AACnC,CAAC;AAaD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAoB,EACpB,KAAY,EACZ,GAAW,EACX,GAAW;IAEX,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IAEjE,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;IAE3B,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACpB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;QAC7B,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAA;QACtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACpB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAA;QAC7B,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAA;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAC3C,CAAC;IACD,+DAA+D;IAC/D,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FootprintController — framework-agnostic, signal-based.
|
|
3
|
+
*
|
|
4
|
+
* Streams trades in, materialises a `FootprintBar[]` out. Composes:
|
|
5
|
+
*
|
|
6
|
+
* - `classifyExplicit` (try exchange flag first)
|
|
7
|
+
* - `classifyTickRule` / `classifyLeeReady` (fallback per config)
|
|
8
|
+
* - `computeDelta`, `computeDiagonalImbalances`, `computeCumulativeDelta`
|
|
9
|
+
*
|
|
10
|
+
* Internal storage is hot-path-friendly:
|
|
11
|
+
*
|
|
12
|
+
* buckets: Map<barIndex, Map<priceTickKey, { askVol, bidVol }>>
|
|
13
|
+
*
|
|
14
|
+
* Materialisation (sorting + array build) is deferred to `bars` / `cumulativeDelta`
|
|
15
|
+
* signal reads. A `dirty` flag invalidates the cache on every `ingestTrade`.
|
|
16
|
+
*
|
|
17
|
+
* Classifier state carry-over: the `TickRuleState` / `LeeReadyState` records
|
|
18
|
+
* are MAINTAINED ACROSS BAR BOUNDARIES — i.e. the last trade's price/side of
|
|
19
|
+
* bar N is used as the prior for the first trade of bar N+1. This is the
|
|
20
|
+
* documented choice (see ROADMAP §3.3): per-bar reset would flag every bar's
|
|
21
|
+
* first trade as `unknown`, which inflates dropped volume and breaks the
|
|
22
|
+
* Lee-Ready zero-tick fallback at every minute boundary. The tested behaviour
|
|
23
|
+
* relies on this carry-over.
|
|
24
|
+
*
|
|
25
|
+
* Dispose-guard pattern mirrors `createIndicatorSelectorController.ts`.
|
|
26
|
+
*/
|
|
27
|
+
import type { FootprintConfig, FootprintController } from './types';
|
|
28
|
+
export declare function createFootprintController(init: Partial<FootprintConfig>): FootprintController;
|
|
29
|
+
//# sourceMappingURL=createFootprintController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createFootprintController.d.ts","sourceRoot":"","sources":["../../../src/components/footprint/createFootprintController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAiBH,OAAO,KAAK,EAGR,eAAe,EACf,mBAAmB,EAGtB,MAAM,SAAS,CAAA;AAsChB,wBAAgB,yBAAyB,CACrC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,GAC/B,mBAAmB,CAwPrB"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FootprintController — framework-agnostic, signal-based.
|
|
3
|
+
*
|
|
4
|
+
* Streams trades in, materialises a `FootprintBar[]` out. Composes:
|
|
5
|
+
*
|
|
6
|
+
* - `classifyExplicit` (try exchange flag first)
|
|
7
|
+
* - `classifyTickRule` / `classifyLeeReady` (fallback per config)
|
|
8
|
+
* - `computeDelta`, `computeDiagonalImbalances`, `computeCumulativeDelta`
|
|
9
|
+
*
|
|
10
|
+
* Internal storage is hot-path-friendly:
|
|
11
|
+
*
|
|
12
|
+
* buckets: Map<barIndex, Map<priceTickKey, { askVol, bidVol }>>
|
|
13
|
+
*
|
|
14
|
+
* Materialisation (sorting + array build) is deferred to `bars` / `cumulativeDelta`
|
|
15
|
+
* signal reads. A `dirty` flag invalidates the cache on every `ingestTrade`.
|
|
16
|
+
*
|
|
17
|
+
* Classifier state carry-over: the `TickRuleState` / `LeeReadyState` records
|
|
18
|
+
* are MAINTAINED ACROSS BAR BOUNDARIES — i.e. the last trade's price/side of
|
|
19
|
+
* bar N is used as the prior for the first trade of bar N+1. This is the
|
|
20
|
+
* documented choice (see ROADMAP §3.3): per-bar reset would flag every bar's
|
|
21
|
+
* first trade as `unknown`, which inflates dropped volume and breaks the
|
|
22
|
+
* Lee-Ready zero-tick fallback at every minute boundary. The tested behaviour
|
|
23
|
+
* relies on this carry-over.
|
|
24
|
+
*
|
|
25
|
+
* Dispose-guard pattern mirrors `createIndicatorSelectorController.ts`.
|
|
26
|
+
*/
|
|
27
|
+
import { createSignal } from '../../reactivity';
|
|
28
|
+
import { KLineChartError } from '../../errors';
|
|
29
|
+
import { classifyExplicit, classifyLeeReady, classifyTickRule, } from './aggressor';
|
|
30
|
+
import { computeCumulativeDelta, computeDelta, computeDiagonalImbalances, } from './perBarStats';
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Defaults & validation
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
const DEFAULT_CONFIG = {
|
|
35
|
+
tickSize: 0.01,
|
|
36
|
+
barIntervalMs: 60_000,
|
|
37
|
+
imbalanceRatio: 3,
|
|
38
|
+
fallbackClassifier: 'tick-rule',
|
|
39
|
+
};
|
|
40
|
+
function validateConfig(c) {
|
|
41
|
+
if (!(c.tickSize > 0)) {
|
|
42
|
+
throw new KLineChartError('FOOTPRINT_TICKSIZE_INVALID', 'FootprintController: tickSize must be > 0');
|
|
43
|
+
}
|
|
44
|
+
if (!(c.barIntervalMs > 0) || !Number.isFinite(c.barIntervalMs)) {
|
|
45
|
+
throw new KLineChartError('FOOTPRINT_BAR_INTERVAL_INVALID', 'FootprintController: barIntervalMs must be > 0');
|
|
46
|
+
}
|
|
47
|
+
if (!(c.imbalanceRatio > 0)) {
|
|
48
|
+
throw new KLineChartError('FOOTPRINT_RATIO_INVALID', 'FootprintController: imbalanceRatio must be > 0');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Factory
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
export function createFootprintController(init) {
|
|
55
|
+
const initialConfig = { ...DEFAULT_CONFIG, ...init };
|
|
56
|
+
validateConfig(initialConfig);
|
|
57
|
+
const config = createSignal(initialConfig);
|
|
58
|
+
const bars = createSignal([]);
|
|
59
|
+
const cumulativeDelta = createSignal([]);
|
|
60
|
+
// ---- Internal state ------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* barIndex → (priceTickKey → mutable cell).
|
|
63
|
+
*
|
|
64
|
+
* We use Maps so insertion order is preserved per-bar (for debug-time
|
|
65
|
+
* inspection); the public materialisation sorts deterministically.
|
|
66
|
+
*/
|
|
67
|
+
let buckets = new Map();
|
|
68
|
+
/**
|
|
69
|
+
* Classifier carry-over. One record shared by tick rule and Lee-Ready —
|
|
70
|
+
* they have the same field surface. NEVER reset on bar boundary
|
|
71
|
+
* (see header comment).
|
|
72
|
+
*/
|
|
73
|
+
const tickState = {
|
|
74
|
+
prevPrice: null,
|
|
75
|
+
prevSide: null,
|
|
76
|
+
};
|
|
77
|
+
/** Set to true on every successful `ingestTrade`; cleared on materialise. */
|
|
78
|
+
let dirty = false;
|
|
79
|
+
/** Disposal guard. */
|
|
80
|
+
let disposed = false;
|
|
81
|
+
// ---- Helpers -------------------------------------------------------
|
|
82
|
+
function classify(trade, bid, ask) {
|
|
83
|
+
// 1. Try the explicit exchange flag first (zero error).
|
|
84
|
+
const explicit = classifyExplicit(trade);
|
|
85
|
+
if (explicit !== null) {
|
|
86
|
+
// Even when we don't consume the heuristic, advance the
|
|
87
|
+
// carry-over so a later fallback-classified trade still has a
|
|
88
|
+
// useful prevPrice/prevSide. We commit prevSide only for known
|
|
89
|
+
// explicit sides.
|
|
90
|
+
tickState.prevPrice = trade.price;
|
|
91
|
+
tickState.prevSide = explicit.side === 'unknown' ? null : explicit.side;
|
|
92
|
+
return explicit;
|
|
93
|
+
}
|
|
94
|
+
// 2. Fall back to the configured heuristic.
|
|
95
|
+
const mode = config.peek().fallbackClassifier;
|
|
96
|
+
if (mode === 'lee-ready') {
|
|
97
|
+
// If quotes are missing, classifyLeeReady will degrade to the
|
|
98
|
+
// tick rule itself — same state record.
|
|
99
|
+
const b = bid ?? Number.NaN;
|
|
100
|
+
const a = ask ?? Number.NaN;
|
|
101
|
+
return classifyLeeReady(tickState, trade, b, a);
|
|
102
|
+
}
|
|
103
|
+
return classifyTickRule(tickState, trade);
|
|
104
|
+
}
|
|
105
|
+
function bucketFor(barIndex) {
|
|
106
|
+
let bar = buckets.get(barIndex);
|
|
107
|
+
if (bar === undefined) {
|
|
108
|
+
bar = new Map();
|
|
109
|
+
buckets.set(barIndex, bar);
|
|
110
|
+
}
|
|
111
|
+
return bar;
|
|
112
|
+
}
|
|
113
|
+
function cellFor(bar, priceTickKey) {
|
|
114
|
+
let cell = bar.get(priceTickKey);
|
|
115
|
+
if (cell === undefined) {
|
|
116
|
+
cell = { askVol: 0, bidVol: 0 };
|
|
117
|
+
bar.set(priceTickKey, cell);
|
|
118
|
+
}
|
|
119
|
+
return cell;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Build the materialised view from `buckets`. Sorts bars ascending by
|
|
123
|
+
* barIndex; within each bar, sorts cells ascending by price.
|
|
124
|
+
*/
|
|
125
|
+
function materialise() {
|
|
126
|
+
const cfg = config.peek();
|
|
127
|
+
const sortedBarIndices = [...buckets.keys()].sort((a, b) => a - b);
|
|
128
|
+
const outBars = [];
|
|
129
|
+
const perBarDeltas = [];
|
|
130
|
+
for (const barIndex of sortedBarIndices) {
|
|
131
|
+
const internal = buckets.get(barIndex);
|
|
132
|
+
if (internal === undefined)
|
|
133
|
+
continue;
|
|
134
|
+
const sortedKeys = [...internal.keys()].sort((a, b) => a - b);
|
|
135
|
+
const cells = sortedKeys.map((k) => {
|
|
136
|
+
const c = internal.get(k);
|
|
137
|
+
return {
|
|
138
|
+
price: k * cfg.tickSize,
|
|
139
|
+
askVol: c.askVol,
|
|
140
|
+
bidVol: c.bidVol,
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
const delta = computeDelta(cells);
|
|
144
|
+
let totalVolume = 0;
|
|
145
|
+
for (let i = 0; i < cells.length; i++) {
|
|
146
|
+
const cell = cells[i];
|
|
147
|
+
if (cell === undefined)
|
|
148
|
+
continue;
|
|
149
|
+
totalVolume += cell.askVol + cell.bidVol;
|
|
150
|
+
}
|
|
151
|
+
const imbalances = computeDiagonalImbalances(cells, cfg.imbalanceRatio);
|
|
152
|
+
const startTime = barIndex * cfg.barIntervalMs;
|
|
153
|
+
const endTime = startTime + cfg.barIntervalMs - 1;
|
|
154
|
+
outBars.push({
|
|
155
|
+
barIndex,
|
|
156
|
+
startTime,
|
|
157
|
+
endTime,
|
|
158
|
+
cells,
|
|
159
|
+
delta,
|
|
160
|
+
totalVolume,
|
|
161
|
+
imbalances,
|
|
162
|
+
});
|
|
163
|
+
perBarDeltas.push(delta);
|
|
164
|
+
}
|
|
165
|
+
return { bars: outBars, cumulative: computeCumulativeDelta(perBarDeltas) };
|
|
166
|
+
}
|
|
167
|
+
function publishIfDirty() {
|
|
168
|
+
if (!dirty)
|
|
169
|
+
return;
|
|
170
|
+
const { bars: nextBars, cumulative } = materialise();
|
|
171
|
+
bars.set(nextBars);
|
|
172
|
+
cumulativeDelta.set(cumulative);
|
|
173
|
+
dirty = false;
|
|
174
|
+
}
|
|
175
|
+
// ---- Mutators ------------------------------------------------------
|
|
176
|
+
function ingestTrade(trade, bid, ask) {
|
|
177
|
+
if (disposed)
|
|
178
|
+
return;
|
|
179
|
+
// Defensive: reject malformed trades. We do not throw — a single bad
|
|
180
|
+
// print should not poison the live stream.
|
|
181
|
+
if (!Number.isFinite(trade.price) || !Number.isFinite(trade.size)) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (!Number.isFinite(trade.timestamp))
|
|
185
|
+
return;
|
|
186
|
+
if (trade.size <= 0)
|
|
187
|
+
return;
|
|
188
|
+
const result = classify(trade, bid, ask);
|
|
189
|
+
if (result.side === 'unknown') {
|
|
190
|
+
// Drop from the aggregate (the documented contract). We've still
|
|
191
|
+
// updated tickState inside `classify` so the next trade has
|
|
192
|
+
// context.
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const cfg = config.peek();
|
|
196
|
+
const barIndex = Math.floor(trade.timestamp / cfg.barIntervalMs);
|
|
197
|
+
const priceTickKey = Math.round(trade.price / cfg.tickSize);
|
|
198
|
+
const bar = bucketFor(barIndex);
|
|
199
|
+
const cell = cellFor(bar, priceTickKey);
|
|
200
|
+
if (result.side === 'buy') {
|
|
201
|
+
cell.askVol += trade.size;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
cell.bidVol += trade.size;
|
|
205
|
+
}
|
|
206
|
+
dirty = true;
|
|
207
|
+
publishIfDirty();
|
|
208
|
+
}
|
|
209
|
+
function setConfig(next) {
|
|
210
|
+
if (disposed)
|
|
211
|
+
return;
|
|
212
|
+
const cur = config.peek();
|
|
213
|
+
const merged = { ...cur, ...next };
|
|
214
|
+
validateConfig(merged);
|
|
215
|
+
// Changing tickSize or barIntervalMs invalidates the buckets — the
|
|
216
|
+
// priceTickKey and barIndex of every accumulated cell would be wrong
|
|
217
|
+
// under the new partitioning. Clear them and let the caller re-feed
|
|
218
|
+
// history if needed.
|
|
219
|
+
const partitionChanged = merged.tickSize !== cur.tickSize ||
|
|
220
|
+
merged.barIntervalMs !== cur.barIntervalMs;
|
|
221
|
+
if (partitionChanged) {
|
|
222
|
+
buckets = new Map();
|
|
223
|
+
// We do NOT reset tickState — the next trade's carry-over is
|
|
224
|
+
// still valid because the classifier only depends on price
|
|
225
|
+
// history, not on the bucket partitioning.
|
|
226
|
+
}
|
|
227
|
+
config.set(merged);
|
|
228
|
+
// Re-materialise. If partition changed, bars/cumulative now empty.
|
|
229
|
+
// If only imbalanceRatio changed, we still want to re-flag.
|
|
230
|
+
dirty = true;
|
|
231
|
+
publishIfDirty();
|
|
232
|
+
}
|
|
233
|
+
function reset() {
|
|
234
|
+
if (disposed)
|
|
235
|
+
return;
|
|
236
|
+
buckets = new Map();
|
|
237
|
+
tickState.prevPrice = null;
|
|
238
|
+
tickState.prevSide = null;
|
|
239
|
+
bars.set([]);
|
|
240
|
+
cumulativeDelta.set([]);
|
|
241
|
+
dirty = false;
|
|
242
|
+
}
|
|
243
|
+
function dispose() {
|
|
244
|
+
if (disposed)
|
|
245
|
+
return;
|
|
246
|
+
disposed = true;
|
|
247
|
+
// Mutators check `disposed` so no further writes will fire — existing
|
|
248
|
+
// subscribers receive no further notifications.
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
config,
|
|
252
|
+
bars,
|
|
253
|
+
cumulativeDelta,
|
|
254
|
+
// Canonical verb (API audit BLOCKER-001 harmonisation across
|
|
255
|
+
// VolumeProfile / OrderBookHeatmap / Footprint). Wired to the same
|
|
256
|
+
// implementation as `ingestTrade` so existing consumers keep working.
|
|
257
|
+
ingest: ingestTrade,
|
|
258
|
+
ingestTrade,
|
|
259
|
+
setConfig,
|
|
260
|
+
reset,
|
|
261
|
+
dispose,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=createFootprintController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createFootprintController.js","sourceRoot":"","sources":["../../../src/components/footprint/createFootprintController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { AggressorSide, Trade, TradeWithFlag, FootprintBar, FootprintConfig, FootprintController, } from './types';
|
|
2
|
+
export type { AggressorResult, TickRuleState, LeeReadyState } from './aggressor';
|
|
3
|
+
export { classifyExplicit, classifyTickRule, classifyLeeReady, } from './aggressor';
|
|
4
|
+
export type { FootprintBarCell, FootprintImbalance } from './perBarStats';
|
|
5
|
+
export { computeDelta, computeCumulativeDelta, computeDiagonalImbalances, } from './perBarStats';
|
|
6
|
+
export { createFootprintController } from './createFootprintController';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|