@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,134 @@
|
|
|
1
|
+
import { KLineChartError } from '../../errors';
|
|
2
|
+
/**
|
|
3
|
+
* Multi-Timeframe overlay controller.
|
|
4
|
+
*
|
|
5
|
+
* Composes `resampleBars` + `alignToBaseIndex` + a user-supplied `compute`
|
|
6
|
+
* function per series. Holds the base bar buffer + base interval + a Map of
|
|
7
|
+
* active series, exposes a single reactive `series` signal.
|
|
8
|
+
*
|
|
9
|
+
* v1 implementation: full re-resample + full compute on every mutation. The
|
|
10
|
+
* incremental "only re-do the last bucket on `appendBaseBar`" optimization
|
|
11
|
+
* is documented as a follow-up — landing it does not change observable
|
|
12
|
+
* behavior, only frame-time cost. Tests pin the observable shape.
|
|
13
|
+
*/
|
|
14
|
+
import { createSignal } from '../../reactivity';
|
|
15
|
+
import { resampleBars } from './resampleBars';
|
|
16
|
+
import { alignToBaseIndex } from './alignToBaseIndex';
|
|
17
|
+
export function createMtfController(init = {}) {
|
|
18
|
+
let disposed = false;
|
|
19
|
+
let baseBars = init.initialBars ?? [];
|
|
20
|
+
let baseIntervalMs = init.baseIntervalMs ?? null;
|
|
21
|
+
const definitions = new Map();
|
|
22
|
+
const seriesSignal = createSignal([]);
|
|
23
|
+
const computeOne = (def) => {
|
|
24
|
+
// No bars or no base interval set → empty aligned values (length 0,
|
|
25
|
+
// matching the empty base buffer).
|
|
26
|
+
if (baseBars.length === 0 || baseIntervalMs === null) {
|
|
27
|
+
return { definition: def, alignedValues: [] };
|
|
28
|
+
}
|
|
29
|
+
const resampled = resampleBars(baseBars, baseIntervalMs, def.targetIntervalMs);
|
|
30
|
+
const values = def.compute(resampled);
|
|
31
|
+
if (values.length !== resampled.length) {
|
|
32
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', `MtfController: compute fn for series "${def.id}" returned ` +
|
|
33
|
+
`${values.length} values for ${resampled.length} resampled bars; ` +
|
|
34
|
+
`length must match`);
|
|
35
|
+
}
|
|
36
|
+
const aligned = alignToBaseIndex(baseBars, resampled, values, def.targetIntervalMs);
|
|
37
|
+
return { definition: def, alignedValues: aligned };
|
|
38
|
+
};
|
|
39
|
+
const recomputeAll = () => {
|
|
40
|
+
const all = [];
|
|
41
|
+
for (const def of definitions.values()) {
|
|
42
|
+
all.push(computeOne(def));
|
|
43
|
+
}
|
|
44
|
+
seriesSignal.set(all);
|
|
45
|
+
};
|
|
46
|
+
const guard = () => !disposed;
|
|
47
|
+
const validateInterval = (targetMs) => {
|
|
48
|
+
if (!Number.isFinite(targetMs) || targetMs <= 0) {
|
|
49
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', 'MtfController: targetIntervalMs must be > 0');
|
|
50
|
+
}
|
|
51
|
+
if (baseIntervalMs !== null && targetMs % baseIntervalMs !== 0) {
|
|
52
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', `MtfController: targetIntervalMs (${targetMs}) must be an ` +
|
|
53
|
+
`integer multiple of baseIntervalMs (${baseIntervalMs})`);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const inner = {
|
|
57
|
+
series: seriesSignal,
|
|
58
|
+
setBaseBars(bars, intervalMs) {
|
|
59
|
+
if (!guard())
|
|
60
|
+
return;
|
|
61
|
+
if (!Number.isFinite(intervalMs) || intervalMs <= 0) {
|
|
62
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', 'MtfController.setBaseBars: baseIntervalMs must be > 0');
|
|
63
|
+
}
|
|
64
|
+
// If any series has a target that no longer cleanly divides, throw
|
|
65
|
+
// up front rather than letting resampleBars throw later.
|
|
66
|
+
for (const def of definitions.values()) {
|
|
67
|
+
if (def.targetIntervalMs % intervalMs !== 0) {
|
|
68
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', `MtfController.setBaseBars: existing series "${def.id}" ` +
|
|
69
|
+
`targetIntervalMs (${def.targetIntervalMs}) does not cleanly ` +
|
|
70
|
+
`divide new baseIntervalMs (${intervalMs})`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
baseBars = bars;
|
|
74
|
+
baseIntervalMs = intervalMs;
|
|
75
|
+
recomputeAll();
|
|
76
|
+
},
|
|
77
|
+
addSeries(def) {
|
|
78
|
+
if (!guard())
|
|
79
|
+
return def.id;
|
|
80
|
+
if (definitions.has(def.id)) {
|
|
81
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', `MtfController.addSeries: id "${def.id}" already in use`);
|
|
82
|
+
}
|
|
83
|
+
validateInterval(def.targetIntervalMs);
|
|
84
|
+
definitions.set(def.id, def);
|
|
85
|
+
recomputeAll();
|
|
86
|
+
return def.id;
|
|
87
|
+
},
|
|
88
|
+
removeSeries(id) {
|
|
89
|
+
if (!guard())
|
|
90
|
+
return false;
|
|
91
|
+
const had = definitions.delete(id);
|
|
92
|
+
if (had)
|
|
93
|
+
recomputeAll();
|
|
94
|
+
return had;
|
|
95
|
+
},
|
|
96
|
+
updateSeries(id, patch) {
|
|
97
|
+
if (!guard())
|
|
98
|
+
return false;
|
|
99
|
+
const existing = definitions.get(id);
|
|
100
|
+
if (existing === undefined)
|
|
101
|
+
return false;
|
|
102
|
+
const next = {
|
|
103
|
+
...existing,
|
|
104
|
+
...patch,
|
|
105
|
+
id: existing.id, // protect against accidental id mutation
|
|
106
|
+
};
|
|
107
|
+
if (patch.targetIntervalMs !== undefined) {
|
|
108
|
+
validateInterval(patch.targetIntervalMs);
|
|
109
|
+
}
|
|
110
|
+
definitions.set(id, next);
|
|
111
|
+
recomputeAll();
|
|
112
|
+
return true;
|
|
113
|
+
},
|
|
114
|
+
appendBaseBar(bar) {
|
|
115
|
+
if (!guard())
|
|
116
|
+
return;
|
|
117
|
+
baseBars = [...baseBars, bar];
|
|
118
|
+
recomputeAll();
|
|
119
|
+
},
|
|
120
|
+
dispose() {
|
|
121
|
+
disposed = true;
|
|
122
|
+
definitions.clear();
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
// Canonical verbs (API audit BLOCKER-001): `setData` for full
|
|
126
|
+
// replacement, `append` for single-item extension. Old names
|
|
127
|
+
// preserved as aliases on the inner object for the deprecation window.
|
|
128
|
+
return {
|
|
129
|
+
...inner,
|
|
130
|
+
setData: inner.setBaseBars,
|
|
131
|
+
append: inner.appendBaseBar,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=createMtfController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createMtfController.js","sourceRoot":"","sources":["../../../src/components/mtfOverlay/createMtfController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Timeframe (MTF) overlay barrel.
|
|
3
|
+
*
|
|
4
|
+
* Public surface:
|
|
5
|
+
* - `resampleBars`: aggregate base-tf bars into higher-tf buckets
|
|
6
|
+
* - `alignToBaseIndex`: forward-fill higher-tf values onto base-bar indices
|
|
7
|
+
* (no-lookahead semantics, see file docstring)
|
|
8
|
+
* - `createMtfController`: composes the above + a user-supplied `compute`
|
|
9
|
+
* into a reactive multi-series controller
|
|
10
|
+
*
|
|
11
|
+
* The controller is intentionally indicator-agnostic — any indicator (EMA,
|
|
12
|
+
* RSI, custom) can be lifted to MTF by passing a `compute` fn that takes
|
|
13
|
+
* resampled bars and returns one number per bar.
|
|
14
|
+
*/
|
|
15
|
+
export type { BaseBar, ResampledBar, MtfSeriesDefinition, ActiveMtfSeries, MtfController, } from './types';
|
|
16
|
+
export { resampleBars } from './resampleBars';
|
|
17
|
+
export { alignToBaseIndex } from './alignToBaseIndex';
|
|
18
|
+
export { createMtfController, type CreateMtfControllerInit } from './createMtfController';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/mtfOverlay/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,YAAY,EACR,OAAO,EACP,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,aAAa,GAChB,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Timeframe (MTF) overlay barrel.
|
|
3
|
+
*
|
|
4
|
+
* Public surface:
|
|
5
|
+
* - `resampleBars`: aggregate base-tf bars into higher-tf buckets
|
|
6
|
+
* - `alignToBaseIndex`: forward-fill higher-tf values onto base-bar indices
|
|
7
|
+
* (no-lookahead semantics, see file docstring)
|
|
8
|
+
* - `createMtfController`: composes the above + a user-supplied `compute`
|
|
9
|
+
* into a reactive multi-series controller
|
|
10
|
+
*
|
|
11
|
+
* The controller is intentionally indicator-agnostic — any indicator (EMA,
|
|
12
|
+
* RSI, custom) can be lifted to MTF by passing a `compute` fn that takes
|
|
13
|
+
* resampled bars and returns one number per bar.
|
|
14
|
+
*/
|
|
15
|
+
export { resampleBars } from './resampleBars';
|
|
16
|
+
export { alignToBaseIndex } from './alignToBaseIndex';
|
|
17
|
+
export { createMtfController } from './createMtfController';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/mtfOverlay/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAgC,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resample a base-timeframe bar series to a higher timeframe.
|
|
3
|
+
*
|
|
4
|
+
* Two design choices worth pinning:
|
|
5
|
+
*
|
|
6
|
+
* 1. We bucket by **floor(timestamp / targetIntervalMs) * targetIntervalMs**,
|
|
7
|
+
* not by counting base bars. This is robust to gaps in the input — a
|
|
8
|
+
* 1-minute series that skips 09:33 (the bar simply isn't there) will still
|
|
9
|
+
* correctly group 09:30..09:34 into one 5m bucket and produce no synthetic
|
|
10
|
+
* bar for 09:33.
|
|
11
|
+
*
|
|
12
|
+
* 2. The final bucket is allowed to be **partial** (contain fewer base bars
|
|
13
|
+
* than `targetIntervalMs / baseIntervalMs`). This is the right default for
|
|
14
|
+
* live charts: the forming bar must appear in the output so its EMA / RSI
|
|
15
|
+
* can be plotted. Callers that want "closed bars only" should drop the
|
|
16
|
+
* last element if `bucketEnd > lastBucketStart + targetIntervalMs - baseIntervalMs`
|
|
17
|
+
* (or equivalently, if `sourceEnd - sourceStart + 1 < bucketSize`).
|
|
18
|
+
*
|
|
19
|
+
* Aggregation rules:
|
|
20
|
+
* - timestamp = floor(firstBar.timestamp / targetIntervalMs) * targetIntervalMs
|
|
21
|
+
* - open = firstBar.open
|
|
22
|
+
* - close = lastBar.close
|
|
23
|
+
* - high = max over [start, end]
|
|
24
|
+
* - low = min over [start, end]
|
|
25
|
+
* - volume = sum over [start, end]
|
|
26
|
+
* - sourceStart, sourceEnd = inclusive base-index range
|
|
27
|
+
*/
|
|
28
|
+
import type { BaseBar, ResampledBar } from './types';
|
|
29
|
+
/**
|
|
30
|
+
* @internal — building block used by `createMtfController`. Reachable today
|
|
31
|
+
* via the top-level `@klinechart-quant/core` barrel but **NOT
|
|
32
|
+
* part of the supported public API**. typedoc / api-extractor
|
|
33
|
+
* hide it from generated docs. Prefer the controller factory
|
|
34
|
+
* for stable user code. Closes API audit BLOCKER-002.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resampleBars(bars: ReadonlyArray<BaseBar>, baseIntervalMs: number, targetIntervalMs: number): ReadonlyArray<ResampledBar>;
|
|
37
|
+
//# sourceMappingURL=resampleBars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resampleBars.d.ts","sourceRoot":"","sources":["../../../src/components/mtfOverlay/resampleBars.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEpD;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAC5B,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,GACzB,aAAa,CAAC,YAAY,CAAC,CA2F7B"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { KLineChartError } from '../../errors';
|
|
2
|
+
/**
|
|
3
|
+
* @internal — building block used by `createMtfController`. Reachable today
|
|
4
|
+
* via the top-level `@klinechart-quant/core` barrel but **NOT
|
|
5
|
+
* part of the supported public API**. typedoc / api-extractor
|
|
6
|
+
* hide it from generated docs. Prefer the controller factory
|
|
7
|
+
* for stable user code. Closes API audit BLOCKER-002.
|
|
8
|
+
*/
|
|
9
|
+
export function resampleBars(bars, baseIntervalMs, targetIntervalMs) {
|
|
10
|
+
if (!Number.isFinite(baseIntervalMs) || baseIntervalMs <= 0) {
|
|
11
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', 'resampleBars: baseIntervalMs must be a positive finite number');
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isFinite(targetIntervalMs) || targetIntervalMs <= 0) {
|
|
14
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', 'resampleBars: targetIntervalMs must be a positive finite number');
|
|
15
|
+
}
|
|
16
|
+
if (targetIntervalMs % baseIntervalMs !== 0) {
|
|
17
|
+
throw new KLineChartError('MTF_CONFIG_INVALID', `resampleBars: targetIntervalMs (${targetIntervalMs}) must be an integer ` +
|
|
18
|
+
`multiple of baseIntervalMs (${baseIntervalMs}); got remainder ` +
|
|
19
|
+
`${targetIntervalMs % baseIntervalMs}`);
|
|
20
|
+
}
|
|
21
|
+
if (bars.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
// Fast path: no aggregation required. Caller may still want shape parity
|
|
24
|
+
// (each base bar gets sourceStart === sourceEnd === its own index), so we
|
|
25
|
+
// wrap each base bar as a 1-source-bar `ResampledBar`.
|
|
26
|
+
if (targetIntervalMs === baseIntervalMs) {
|
|
27
|
+
const out = new Array(bars.length);
|
|
28
|
+
for (let i = 0; i < bars.length; i++) {
|
|
29
|
+
const b = bars[i];
|
|
30
|
+
out[i] = {
|
|
31
|
+
timestamp: b.timestamp,
|
|
32
|
+
open: b.open,
|
|
33
|
+
high: b.high,
|
|
34
|
+
low: b.low,
|
|
35
|
+
close: b.close,
|
|
36
|
+
volume: b.volume,
|
|
37
|
+
sourceStart: i,
|
|
38
|
+
sourceEnd: i,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
const out = [];
|
|
44
|
+
let bucketStart = -1; // inclusive index in `bars`
|
|
45
|
+
let bucketTs = 0;
|
|
46
|
+
let open = 0;
|
|
47
|
+
let high = -Infinity;
|
|
48
|
+
let low = Infinity;
|
|
49
|
+
let close = 0;
|
|
50
|
+
let volume = 0;
|
|
51
|
+
const flush = (endIdx) => {
|
|
52
|
+
if (bucketStart < 0)
|
|
53
|
+
return;
|
|
54
|
+
out.push({
|
|
55
|
+
timestamp: bucketTs,
|
|
56
|
+
open,
|
|
57
|
+
high,
|
|
58
|
+
low,
|
|
59
|
+
close,
|
|
60
|
+
volume,
|
|
61
|
+
sourceStart: bucketStart,
|
|
62
|
+
sourceEnd: endIdx,
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
for (let i = 0; i < bars.length; i++) {
|
|
66
|
+
const bar = bars[i];
|
|
67
|
+
const ts = Math.floor(bar.timestamp / targetIntervalMs) * targetIntervalMs;
|
|
68
|
+
if (bucketStart < 0 || ts !== bucketTs) {
|
|
69
|
+
// Boundary crossed (or first iteration). Flush the previous bucket.
|
|
70
|
+
if (bucketStart >= 0)
|
|
71
|
+
flush(i - 1);
|
|
72
|
+
bucketStart = i;
|
|
73
|
+
bucketTs = ts;
|
|
74
|
+
open = bar.open;
|
|
75
|
+
high = bar.high;
|
|
76
|
+
low = bar.low;
|
|
77
|
+
close = bar.close;
|
|
78
|
+
volume = bar.volume;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Same bucket: fold this bar in.
|
|
82
|
+
if (bar.high > high)
|
|
83
|
+
high = bar.high;
|
|
84
|
+
if (bar.low < low)
|
|
85
|
+
low = bar.low;
|
|
86
|
+
close = bar.close;
|
|
87
|
+
volume += bar.volume;
|
|
88
|
+
}
|
|
89
|
+
// Final bucket — may be partial (fewer than targetIntervalMs/baseIntervalMs bars).
|
|
90
|
+
flush(bars.length - 1);
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=resampleBars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resampleBars.js","sourceRoot":"","sources":["../../../src/components/mtfOverlay/resampleBars.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for the Multi-Timeframe (MTF) overlay module.
|
|
3
|
+
*
|
|
4
|
+
* Naming: "base" = the chart's primary timeframe (e.g. 5m), "higher tf" =
|
|
5
|
+
* the resampled timeframe an MTF series lives on (e.g. 1h). The module never
|
|
6
|
+
* downscales — you can only lift values from a coarser tf onto a finer one.
|
|
7
|
+
*
|
|
8
|
+
* Time semantics:
|
|
9
|
+
* - Every `timestamp` is in milliseconds since the Unix epoch.
|
|
10
|
+
* - A base bar's `timestamp` is the OPEN of that bar's interval (aligned
|
|
11
|
+
* to `baseIntervalMs` boundary, implicitly).
|
|
12
|
+
* - A resampled (higher-tf) bar's `timestamp` is the OPEN of its bucket,
|
|
13
|
+
* computed as `floor(firstBaseBar.timestamp / targetIntervalMs) * targetIntervalMs`.
|
|
14
|
+
* - A higher-tf bar's interval is `[timestamp, timestamp + targetIntervalMs)`.
|
|
15
|
+
*
|
|
16
|
+
* The MTF controller does NOT bring its own indicator math. The caller
|
|
17
|
+
* supplies a `compute` function that takes resampled bars and returns one
|
|
18
|
+
* number per resampled bar. Any indicator (EMA, RSI, custom) can be lifted
|
|
19
|
+
* to MTF by writing such a compute fn.
|
|
20
|
+
*/
|
|
21
|
+
import type { Signal } from '../../reactivity';
|
|
22
|
+
/**
|
|
23
|
+
* One bar of the BASE timeframe (the chart's primary candle stream).
|
|
24
|
+
*
|
|
25
|
+
* `timestamp` is the bar's OPEN, expected to be aligned to `baseIntervalMs`.
|
|
26
|
+
* The module does not enforce alignment — it trusts the caller's stream.
|
|
27
|
+
*/
|
|
28
|
+
export interface BaseBar {
|
|
29
|
+
timestamp: number;
|
|
30
|
+
open: number;
|
|
31
|
+
high: number;
|
|
32
|
+
low: number;
|
|
33
|
+
close: number;
|
|
34
|
+
volume: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A bar produced by aggregating `[sourceStart, sourceEnd]` (inclusive
|
|
38
|
+
* indices into the input base-bar array) up to a higher timeframe.
|
|
39
|
+
*
|
|
40
|
+
* `sourceEnd === sourceStart` is allowed (single-base-bar bucket) — see
|
|
41
|
+
* the "partial last bucket" semantics in `resampleBars`.
|
|
42
|
+
*/
|
|
43
|
+
export interface ResampledBar extends BaseBar {
|
|
44
|
+
/** First base-bar index aggregated into this bucket (inclusive). */
|
|
45
|
+
sourceStart: number;
|
|
46
|
+
/** Last base-bar index aggregated into this bucket (inclusive). */
|
|
47
|
+
sourceEnd: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Definition of one MTF series. The controller owns the resampling and the
|
|
51
|
+
* alignment; the caller owns the indicator math (`compute`).
|
|
52
|
+
*/
|
|
53
|
+
export interface MtfSeriesDefinition {
|
|
54
|
+
/** Stable user-facing identifier. Re-using an existing id is rejected. */
|
|
55
|
+
id: string;
|
|
56
|
+
/** Display label, e.g. `"EMA(20) 1h"`. The controller never reads this. */
|
|
57
|
+
label: string;
|
|
58
|
+
/** Higher-tf bucket size in ms. Must be a positive multiple of base tf. */
|
|
59
|
+
targetIntervalMs: number;
|
|
60
|
+
/**
|
|
61
|
+
* Pure function: resampled bars → per-bar value array of the same length.
|
|
62
|
+
* Called once per `setBaseBars`, `addSeries`, `updateSeries`, and once per
|
|
63
|
+
* `appendBaseBar`. MUST NOT mutate the input.
|
|
64
|
+
*/
|
|
65
|
+
compute: (resampledBars: ReadonlyArray<ResampledBar>) => ReadonlyArray<number>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* One active MTF series in the controller's snapshot.
|
|
69
|
+
*
|
|
70
|
+
* `alignedValues.length === baseBars.length` always holds after any state
|
|
71
|
+
* transition. Leading entries are `null` for base bars that fall before the
|
|
72
|
+
* first higher-tf bucket opens.
|
|
73
|
+
*/
|
|
74
|
+
export interface ActiveMtfSeries {
|
|
75
|
+
definition: MtfSeriesDefinition;
|
|
76
|
+
/**
|
|
77
|
+
* Forward-filled values aligned to the base bar index. Same length as the
|
|
78
|
+
* controller's base-bar buffer. `null` only where no higher-tf bar covers
|
|
79
|
+
* the base bar's timestamp (i.e. before the first bucket opens).
|
|
80
|
+
*/
|
|
81
|
+
alignedValues: ReadonlyArray<number | null>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Reactive MTF controller. The `series` signal updates synchronously on every
|
|
85
|
+
* state-mutating call (`setBaseBars`, `addSeries`, `removeSeries`,
|
|
86
|
+
* `updateSeries`, `appendBaseBar`). After `dispose()`, mutation calls become
|
|
87
|
+
* no-ops and the signal stops firing.
|
|
88
|
+
*/
|
|
89
|
+
export interface MtfController {
|
|
90
|
+
/** Current snapshot of every series with aligned values. */
|
|
91
|
+
readonly series: Signal<ReadonlyArray<ActiveMtfSeries>>;
|
|
92
|
+
/**
|
|
93
|
+
* Replace the base bar buffer in one shot and recompute every series —
|
|
94
|
+
* canonical method, aligned with the cross-controller `setData()`
|
|
95
|
+
* convention (AnchoredVwapController). Closes API audit BLOCKER-001.
|
|
96
|
+
* `baseIntervalMs` must evenly divide every series' `targetIntervalMs`.
|
|
97
|
+
*/
|
|
98
|
+
setData(bars: ReadonlyArray<BaseBar>, baseIntervalMs: number): void;
|
|
99
|
+
/**
|
|
100
|
+
* @deprecated since 0.1.0-alpha.1 — use {@link MtfController.setData}.
|
|
101
|
+
* Preserved as a non-removing alias for at least 6 months.
|
|
102
|
+
*/
|
|
103
|
+
setBaseBars(bars: ReadonlyArray<BaseBar>, baseIntervalMs: number): void;
|
|
104
|
+
/**
|
|
105
|
+
* Register a new series. Returns the series id.
|
|
106
|
+
* Throws if `def.id` is already in use or `targetIntervalMs` is not a
|
|
107
|
+
* positive multiple of the current `baseIntervalMs` (when bars are set).
|
|
108
|
+
*/
|
|
109
|
+
addSeries(def: MtfSeriesDefinition): string;
|
|
110
|
+
/** Remove a series by id. Returns true if removed, false if not found. */
|
|
111
|
+
removeSeries(id: string): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Patch a series in place. Returns true if found.
|
|
114
|
+
* Re-runs `compute` whenever `targetIntervalMs` or `compute` changes.
|
|
115
|
+
*/
|
|
116
|
+
updateSeries(id: string, patch: Partial<Omit<MtfSeriesDefinition, 'id'>>): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Append one base bar at the tail — canonical method, aligned with the
|
|
119
|
+
* cross-controller `append()` convention (AnchoredVwapController).
|
|
120
|
+
* Triggers a single per-series compute over the updated resampled
|
|
121
|
+
* bars — NOT a from-scratch recompute over the whole base buffer.
|
|
122
|
+
*/
|
|
123
|
+
append(bar: BaseBar): void;
|
|
124
|
+
/**
|
|
125
|
+
* @deprecated since 0.1.0-alpha.1 — use {@link MtfController.append}.
|
|
126
|
+
* Preserved as a non-removing alias for at least 6 months.
|
|
127
|
+
*/
|
|
128
|
+
appendBaseBar(bar: BaseBar): void;
|
|
129
|
+
/** Tear down. After this, all mutators are no-ops; the signal stops. */
|
|
130
|
+
dispose(): void;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/mtfOverlay/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAa,SAAQ,OAAO;IACzC,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAA;IACV,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAA;IACb,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,OAAO,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,CAAA;CACjF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC5B,UAAU,EAAE,mBAAmB,CAAA;IAC/B;;;;OAIG;IACH,aAAa,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CAC9C;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAA;IAEvD;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAEnE;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAEvE;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAAA;IAE3C,0EAA0E;IAC1E,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;IAEjC;;;OAGG;IACH,YAAY,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,GAChD,OAAO,CAAA;IAEV;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;IAE1B;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;IAEjC,wEAAwE;IACxE,OAAO,IAAI,IAAI,CAAA;CAClB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for the Multi-Timeframe (MTF) overlay module.
|
|
3
|
+
*
|
|
4
|
+
* Naming: "base" = the chart's primary timeframe (e.g. 5m), "higher tf" =
|
|
5
|
+
* the resampled timeframe an MTF series lives on (e.g. 1h). The module never
|
|
6
|
+
* downscales — you can only lift values from a coarser tf onto a finer one.
|
|
7
|
+
*
|
|
8
|
+
* Time semantics:
|
|
9
|
+
* - Every `timestamp` is in milliseconds since the Unix epoch.
|
|
10
|
+
* - A base bar's `timestamp` is the OPEN of that bar's interval (aligned
|
|
11
|
+
* to `baseIntervalMs` boundary, implicitly).
|
|
12
|
+
* - A resampled (higher-tf) bar's `timestamp` is the OPEN of its bucket,
|
|
13
|
+
* computed as `floor(firstBaseBar.timestamp / targetIntervalMs) * targetIntervalMs`.
|
|
14
|
+
* - A higher-tf bar's interval is `[timestamp, timestamp + targetIntervalMs)`.
|
|
15
|
+
*
|
|
16
|
+
* The MTF controller does NOT bring its own indicator math. The caller
|
|
17
|
+
* supplies a `compute` function that takes resampled bars and returns one
|
|
18
|
+
* number per resampled bar. Any indicator (EMA, RSI, custom) can be lifted
|
|
19
|
+
* to MTF by writing such a compute fn.
|
|
20
|
+
*/
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/mtfOverlay/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeatmapController — composes the order-book accumulator, snapshot ring,
|
|
3
|
+
* and delta archive into a single reactive surface.
|
|
4
|
+
*
|
|
5
|
+
* Timing (this is load-bearing): we do **not** schedule snapshots via
|
|
6
|
+
* `setInterval`. The controller treats incoming delta timestamps as the
|
|
7
|
+
* wall clock. When `ingestDelta` sees a delta whose timestamp is more than
|
|
8
|
+
* `snapshotIntervalMs` after the previous snapshot, it pushes a snapshot
|
|
9
|
+
* before applying the new delta. Two upsides:
|
|
10
|
+
*
|
|
11
|
+
* 1. Deterministic tests — no fake timers required.
|
|
12
|
+
* 2. Correct under bursty traffic — snapshot cadence follows market time,
|
|
13
|
+
* not real time, so replay and live observation see the same grid.
|
|
14
|
+
*
|
|
15
|
+
* The `state` signal updates once per delta ingested. It exposes the
|
|
16
|
+
* **latest** snapshot (for read-time convenience) plus the cumulative
|
|
17
|
+
* snapshot / delta counts so adapters can use it as a render trigger.
|
|
18
|
+
*/
|
|
19
|
+
import type { HeatmapController, HeatmapControllerConfig } from './types';
|
|
20
|
+
export declare function createHeatmapController(init?: Partial<HeatmapControllerConfig>): HeatmapController;
|
|
21
|
+
//# sourceMappingURL=createHeatmapController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createHeatmapController.d.ts","sourceRoot":"","sources":["../../../src/components/orderBookHeatmap/createHeatmapController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,KAAK,EAGR,iBAAiB,EACjB,uBAAuB,EAM1B,MAAM,SAAS,CAAA;AAUhB,wBAAgB,uBAAuB,CACnC,IAAI,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GACxC,iBAAiB,CA8MnB"}
|