@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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AlertController — framework-agnostic, signal-based.
|
|
3
|
+
*
|
|
4
|
+
* Same dispose-guard pattern as the other core controllers (volume-profile,
|
|
5
|
+
* indicator-selector). Adapters (React/Vue/Angular) subscribe to the
|
|
6
|
+
* `rules` and `events` signals via their native reactivity.
|
|
7
|
+
*
|
|
8
|
+
* Per-rule prev-snapshot:
|
|
9
|
+
* Cross-style predicates compare prev vs. curr. Rather than asking the
|
|
10
|
+
* caller to thread that state, the controller stashes the previous
|
|
11
|
+
* evaluation snapshot per rule id and feeds it back into the predicate.
|
|
12
|
+
* When a rule is added or re-enabled, its prev is reset — that prevents
|
|
13
|
+
* a spurious fire on first evaluation (a newly-added "price-cross 100"
|
|
14
|
+
* rule should NOT fire just because the current close happens to be 105).
|
|
15
|
+
*
|
|
16
|
+
* Cooldown:
|
|
17
|
+
* For non-oneShot rules we record `lastFiredAt` and suppress re-fires
|
|
18
|
+
* within `cooldownMs`. oneShot ignores cooldown — it just flips
|
|
19
|
+
* `enabled` to false on first fire.
|
|
20
|
+
*
|
|
21
|
+
* Crash safety:
|
|
22
|
+
* `kind: 'custom'` predicates run inside try/catch. A throwing predicate
|
|
23
|
+
* is caught, marked internally, and skipped for this pass; the rest of
|
|
24
|
+
* the rules continue to evaluate. Errors are swallowed at the boundary
|
|
25
|
+
* (no console.* per coding-style.md) — observability hooks are a future
|
|
26
|
+
* addition (`onError` listener on the controller).
|
|
27
|
+
*/
|
|
28
|
+
import type { AlertController, AlertControllerOptions } from './types';
|
|
29
|
+
export declare function createAlertController(opts?: AlertControllerOptions): AlertController;
|
|
30
|
+
//# sourceMappingURL=createAlertController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAlertController.d.ts","sourceRoot":"","sources":["../../src/alerts/createAlertController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EACR,eAAe,EACf,sBAAsB,EAIzB,MAAM,SAAS,CAAA;AAWhB,wBAAgB,qBAAqB,CACjC,IAAI,CAAC,EAAE,sBAAsB,GAC9B,eAAe,CAsQjB"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AlertController — framework-agnostic, signal-based.
|
|
3
|
+
*
|
|
4
|
+
* Same dispose-guard pattern as the other core controllers (volume-profile,
|
|
5
|
+
* indicator-selector). Adapters (React/Vue/Angular) subscribe to the
|
|
6
|
+
* `rules` and `events` signals via their native reactivity.
|
|
7
|
+
*
|
|
8
|
+
* Per-rule prev-snapshot:
|
|
9
|
+
* Cross-style predicates compare prev vs. curr. Rather than asking the
|
|
10
|
+
* caller to thread that state, the controller stashes the previous
|
|
11
|
+
* evaluation snapshot per rule id and feeds it back into the predicate.
|
|
12
|
+
* When a rule is added or re-enabled, its prev is reset — that prevents
|
|
13
|
+
* a spurious fire on first evaluation (a newly-added "price-cross 100"
|
|
14
|
+
* rule should NOT fire just because the current close happens to be 105).
|
|
15
|
+
*
|
|
16
|
+
* Cooldown:
|
|
17
|
+
* For non-oneShot rules we record `lastFiredAt` and suppress re-fires
|
|
18
|
+
* within `cooldownMs`. oneShot ignores cooldown — it just flips
|
|
19
|
+
* `enabled` to false on first fire.
|
|
20
|
+
*
|
|
21
|
+
* Crash safety:
|
|
22
|
+
* `kind: 'custom'` predicates run inside try/catch. A throwing predicate
|
|
23
|
+
* is caught, marked internally, and skipped for this pass; the rest of
|
|
24
|
+
* the rules continue to evaluate. Errors are swallowed at the boundary
|
|
25
|
+
* (no console.* per coding-style.md) — observability hooks are a future
|
|
26
|
+
* addition (`onError` listener on the controller).
|
|
27
|
+
*/
|
|
28
|
+
import { createSignal } from '../reactivity/signal';
|
|
29
|
+
import { evaluatePredicate } from './predicates';
|
|
30
|
+
const DEFAULT_MAX_EVENTS = 100;
|
|
31
|
+
export function createAlertController(opts) {
|
|
32
|
+
const maxEvents = (() => {
|
|
33
|
+
const raw = opts?.maxEvents;
|
|
34
|
+
if (raw === undefined)
|
|
35
|
+
return DEFAULT_MAX_EVENTS;
|
|
36
|
+
if (!Number.isFinite(raw) || raw < 1)
|
|
37
|
+
return DEFAULT_MAX_EVENTS;
|
|
38
|
+
return Math.floor(raw);
|
|
39
|
+
})();
|
|
40
|
+
// -----------------------------------------------------------------------
|
|
41
|
+
// Signals — frozen arrays so React/Vue see new identity on every change.
|
|
42
|
+
// -----------------------------------------------------------------------
|
|
43
|
+
const rules = createSignal([]);
|
|
44
|
+
const events = createSignal([]);
|
|
45
|
+
// -----------------------------------------------------------------------
|
|
46
|
+
// Private state
|
|
47
|
+
// -----------------------------------------------------------------------
|
|
48
|
+
const runtime = new Map();
|
|
49
|
+
const listeners = new Set();
|
|
50
|
+
let disposed = false;
|
|
51
|
+
function findIndex(id) {
|
|
52
|
+
const arr = rules.peek();
|
|
53
|
+
for (let i = 0; i < arr.length; i++) {
|
|
54
|
+
if (arr[i].id === id)
|
|
55
|
+
return i;
|
|
56
|
+
}
|
|
57
|
+
return -1;
|
|
58
|
+
}
|
|
59
|
+
function replaceAt(arr, i, next) {
|
|
60
|
+
const copy = arr.slice();
|
|
61
|
+
copy[i] = next;
|
|
62
|
+
return copy;
|
|
63
|
+
}
|
|
64
|
+
// -----------------------------------------------------------------------
|
|
65
|
+
// addRule / removeRule / setRuleEnabled / updateRule
|
|
66
|
+
// -----------------------------------------------------------------------
|
|
67
|
+
function addRule(rule) {
|
|
68
|
+
if (findIndex(rule.id) >= 0)
|
|
69
|
+
return false;
|
|
70
|
+
// Defensive shallow copy so external mutation of the caller's object
|
|
71
|
+
// does not affect controller state.
|
|
72
|
+
const stored = {
|
|
73
|
+
...rule,
|
|
74
|
+
metadata: rule.metadata !== undefined ? { ...rule.metadata } : undefined,
|
|
75
|
+
};
|
|
76
|
+
rules.set([...rules.peek(), stored]);
|
|
77
|
+
runtime.set(rule.id, { prev: null, lastFiredAt: undefined });
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
function removeRule(id) {
|
|
81
|
+
const idx = findIndex(id);
|
|
82
|
+
if (idx < 0)
|
|
83
|
+
return false;
|
|
84
|
+
const copy = rules.peek().slice();
|
|
85
|
+
copy.splice(idx, 1);
|
|
86
|
+
rules.set(copy);
|
|
87
|
+
runtime.delete(id);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
function setRuleEnabled(id, enabled) {
|
|
91
|
+
const idx = findIndex(id);
|
|
92
|
+
if (idx < 0)
|
|
93
|
+
return false;
|
|
94
|
+
const cur = rules.peek()[idx];
|
|
95
|
+
if (cur.enabled === enabled)
|
|
96
|
+
return true; // no-op but reports success
|
|
97
|
+
const next = { ...cur, enabled };
|
|
98
|
+
rules.set(replaceAt(rules.peek(), idx, next));
|
|
99
|
+
// Re-enabling resets prev — a freshly enabled cross rule should not
|
|
100
|
+
// fire on the first eval just because the level is already broken.
|
|
101
|
+
if (enabled) {
|
|
102
|
+
runtime.set(id, { prev: null, lastFiredAt: undefined });
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
function updateRule(id, patch) {
|
|
107
|
+
const idx = findIndex(id);
|
|
108
|
+
if (idx < 0)
|
|
109
|
+
return false;
|
|
110
|
+
const cur = rules.peek()[idx];
|
|
111
|
+
const next = {
|
|
112
|
+
...cur,
|
|
113
|
+
...patch,
|
|
114
|
+
id: cur.id, // id is invariant
|
|
115
|
+
metadata: patch.metadata !== undefined
|
|
116
|
+
? { ...patch.metadata }
|
|
117
|
+
: cur.metadata,
|
|
118
|
+
};
|
|
119
|
+
rules.set(replaceAt(rules.peek(), idx, next));
|
|
120
|
+
// Changing the predicate invalidates prev — different predicates may
|
|
121
|
+
// need different prev fields, and a stale prev could cause a spurious
|
|
122
|
+
// fire on next eval.
|
|
123
|
+
if (patch.predicate !== undefined) {
|
|
124
|
+
runtime.set(id, { prev: null, lastFiredAt: undefined });
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
// -----------------------------------------------------------------------
|
|
129
|
+
// evaluate — the hot path. Safe to call every frame.
|
|
130
|
+
// -----------------------------------------------------------------------
|
|
131
|
+
function evaluate(snapshot, now) {
|
|
132
|
+
const fired = [];
|
|
133
|
+
const currentRules = rules.peek();
|
|
134
|
+
// We may need to flip oneShot rules off — collect indices and apply
|
|
135
|
+
// once at the end to avoid mutating `currentRules` mid-loop.
|
|
136
|
+
const toDisable = [];
|
|
137
|
+
for (let i = 0; i < currentRules.length; i++) {
|
|
138
|
+
const rule = currentRules[i];
|
|
139
|
+
if (!rule.enabled)
|
|
140
|
+
continue;
|
|
141
|
+
const rt = runtime.get(rule.id) ?? {
|
|
142
|
+
prev: null,
|
|
143
|
+
lastFiredAt: undefined,
|
|
144
|
+
};
|
|
145
|
+
// Cooldown gate (applies to non-oneShot rules; oneShot rules
|
|
146
|
+
// can only fire once anyway).
|
|
147
|
+
if (!rule.oneShot &&
|
|
148
|
+
rule.cooldownMs !== undefined &&
|
|
149
|
+
rule.cooldownMs > 0 &&
|
|
150
|
+
rt.lastFiredAt !== undefined &&
|
|
151
|
+
now - rt.lastFiredAt < rule.cooldownMs) {
|
|
152
|
+
// Still update prev so the next eval after cooldown has the
|
|
153
|
+
// right reference point for cross detection.
|
|
154
|
+
rt.prev = snapshot;
|
|
155
|
+
runtime.set(rule.id, rt);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
// Evaluate. Custom predicates can throw — wrap.
|
|
159
|
+
let hit = false;
|
|
160
|
+
try {
|
|
161
|
+
hit = evaluatePredicate(rule.predicate, snapshot, rt.prev);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Swallow per crash-safety contract. Do NOT fire. Continue.
|
|
165
|
+
hit = false;
|
|
166
|
+
}
|
|
167
|
+
if (hit) {
|
|
168
|
+
const event = {
|
|
169
|
+
ruleId: rule.id,
|
|
170
|
+
ruleName: rule.name,
|
|
171
|
+
triggeredAt: now,
|
|
172
|
+
snapshotBar: snapshot.bar !== null ? { ...snapshot.bar } : null,
|
|
173
|
+
metadata: rule.metadata,
|
|
174
|
+
};
|
|
175
|
+
fired.push(event);
|
|
176
|
+
rt.lastFiredAt = now;
|
|
177
|
+
if (rule.oneShot) {
|
|
178
|
+
toDisable.push(i);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
rt.prev = snapshot;
|
|
182
|
+
runtime.set(rule.id, rt);
|
|
183
|
+
}
|
|
184
|
+
if (fired.length > 0) {
|
|
185
|
+
// Append fired events to the ring, capped at maxEvents.
|
|
186
|
+
const prevEvents = events.peek();
|
|
187
|
+
const merged = prevEvents.concat(fired);
|
|
188
|
+
const trimmed = merged.length > maxEvents
|
|
189
|
+
? merged.slice(merged.length - maxEvents)
|
|
190
|
+
: merged;
|
|
191
|
+
events.set(trimmed);
|
|
192
|
+
// Notify per-event listeners. Copy first so a listener that
|
|
193
|
+
// unsubscribes during fire-out doesn't mutate the iteration.
|
|
194
|
+
const snapshotListeners = [...listeners];
|
|
195
|
+
for (const ev of fired) {
|
|
196
|
+
for (const l of snapshotListeners) {
|
|
197
|
+
try {
|
|
198
|
+
l(ev);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// listener errors are isolated — never leak across.
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (toDisable.length > 0) {
|
|
207
|
+
const copy = rules.peek().slice();
|
|
208
|
+
for (const i of toDisable) {
|
|
209
|
+
const r = copy[i];
|
|
210
|
+
if (r !== undefined)
|
|
211
|
+
copy[i] = { ...r, enabled: false };
|
|
212
|
+
}
|
|
213
|
+
rules.set(copy);
|
|
214
|
+
}
|
|
215
|
+
return fired;
|
|
216
|
+
}
|
|
217
|
+
// -----------------------------------------------------------------------
|
|
218
|
+
// events / listener management
|
|
219
|
+
// -----------------------------------------------------------------------
|
|
220
|
+
function clearEvents() {
|
|
221
|
+
if (events.peek().length === 0)
|
|
222
|
+
return;
|
|
223
|
+
events.set([]);
|
|
224
|
+
}
|
|
225
|
+
function onEvent(listener) {
|
|
226
|
+
listeners.add(listener);
|
|
227
|
+
return () => {
|
|
228
|
+
listeners.delete(listener);
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// -----------------------------------------------------------------------
|
|
232
|
+
// dispose
|
|
233
|
+
// -----------------------------------------------------------------------
|
|
234
|
+
function dispose() {
|
|
235
|
+
if (disposed)
|
|
236
|
+
return;
|
|
237
|
+
disposed = true;
|
|
238
|
+
listeners.clear();
|
|
239
|
+
runtime.clear();
|
|
240
|
+
}
|
|
241
|
+
function guard(fn, fallback) {
|
|
242
|
+
return ((...args) => {
|
|
243
|
+
if (disposed)
|
|
244
|
+
return fallback;
|
|
245
|
+
return fn(...args);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
rules,
|
|
250
|
+
events,
|
|
251
|
+
addRule: guard(addRule, false),
|
|
252
|
+
removeRule: guard(removeRule, false),
|
|
253
|
+
setRuleEnabled: guard(setRuleEnabled, false),
|
|
254
|
+
updateRule: guard(updateRule, false),
|
|
255
|
+
evaluate: guard(evaluate, []),
|
|
256
|
+
clearEvents: guard(clearEvents, undefined),
|
|
257
|
+
onEvent: guard(onEvent, (() => undefined)),
|
|
258
|
+
dispose,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=createAlertController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAlertController.js","sourceRoot":"","sources":["../../src/alerts/createAlertController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { AlertController, AlertControllerOptions, AlertEvent, AlertPredicate, AlertPredicateKind, AlertRule, CrossDirection, IndicatorCrossPairDirection, MarketSnapshot, } from './types';
|
|
2
|
+
export { createAlertController } from './createAlertController';
|
|
3
|
+
export { evaluatePredicate } from './predicates';
|
|
4
|
+
export { AlertRuleSchemaError, deserializeRule, serializeRule, } from './ruleSchema';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/alerts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,eAAe,EACf,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,2BAA2B,EAC3B,cAAc,GACjB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EACH,oBAAoB,EACpB,eAAe,EACf,aAAa,GAChB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/alerts/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EACH,oBAAoB,EACpB,eAAe,EACf,aAAa,GAChB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in predicate kit.
|
|
3
|
+
*
|
|
4
|
+
* Each predicate is a pure function over `(predicate, curr, prev)`:
|
|
5
|
+
* - `curr` is the snapshot at the current evaluation.
|
|
6
|
+
* - `prev` is the snapshot from the previous evaluation of the SAME rule
|
|
7
|
+
* (the controller threads it through). For cross-style predicates the
|
|
8
|
+
* prev value is what makes "just-crossed" detectable vs. "is above".
|
|
9
|
+
* - When `prev` is null (first evaluation), cross predicates must NOT fire —
|
|
10
|
+
* we cannot distinguish "already above" from "just crossed up" without a
|
|
11
|
+
* reference point.
|
|
12
|
+
*
|
|
13
|
+
* All predicates are O(1) — no scanning of history. The caller pre-computes
|
|
14
|
+
* any rolling state (e.g. `rollingVolume[N]`).
|
|
15
|
+
*
|
|
16
|
+
* Defensive: predicates return `false` for any required field that is null,
|
|
17
|
+
* undefined, or non-finite. We never throw — a bad snapshot must not crash
|
|
18
|
+
* an entire alert pass.
|
|
19
|
+
*/
|
|
20
|
+
import type { AlertPredicate, MarketSnapshot } from './types';
|
|
21
|
+
/**
|
|
22
|
+
* Returns `true` iff the predicate fires for this (prev, curr) pair.
|
|
23
|
+
*
|
|
24
|
+
* The controller wraps `kind: 'custom'` in its own try/catch — but we still
|
|
25
|
+
* defensively guard against the function being missing here.
|
|
26
|
+
*/
|
|
27
|
+
export declare function evaluatePredicate(predicate: AlertPredicate, curr: MarketSnapshot, prev: MarketSnapshot | null): boolean;
|
|
28
|
+
//# sourceMappingURL=predicates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicates.d.ts","sourceRoot":"","sources":["../../src/alerts/predicates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACR,cAAc,EAGd,cAAc,EACjB,MAAM,SAAS,CAAA;AAmEhB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,GAAG,IAAI,GAC5B,OAAO,CAgIT"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in predicate kit.
|
|
3
|
+
*
|
|
4
|
+
* Each predicate is a pure function over `(predicate, curr, prev)`:
|
|
5
|
+
* - `curr` is the snapshot at the current evaluation.
|
|
6
|
+
* - `prev` is the snapshot from the previous evaluation of the SAME rule
|
|
7
|
+
* (the controller threads it through). For cross-style predicates the
|
|
8
|
+
* prev value is what makes "just-crossed" detectable vs. "is above".
|
|
9
|
+
* - When `prev` is null (first evaluation), cross predicates must NOT fire —
|
|
10
|
+
* we cannot distinguish "already above" from "just crossed up" without a
|
|
11
|
+
* reference point.
|
|
12
|
+
*
|
|
13
|
+
* All predicates are O(1) — no scanning of history. The caller pre-computes
|
|
14
|
+
* any rolling state (e.g. `rollingVolume[N]`).
|
|
15
|
+
*
|
|
16
|
+
* Defensive: predicates return `false` for any required field that is null,
|
|
17
|
+
* undefined, or non-finite. We never throw — a bad snapshot must not crash
|
|
18
|
+
* an entire alert pass.
|
|
19
|
+
*/
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Helpers
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
function isFiniteNumber(x) {
|
|
24
|
+
return typeof x === 'number' && Number.isFinite(x);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generic numeric cross check.
|
|
28
|
+
* - up : prev < threshold && curr >= threshold
|
|
29
|
+
* - down : prev > threshold && curr <= threshold
|
|
30
|
+
* - any : either
|
|
31
|
+
*
|
|
32
|
+
* Returns false if either side is non-finite. The `>=` / `<=` on the curr side
|
|
33
|
+
* is intentional — a value landing exactly on the threshold counts as a cross
|
|
34
|
+
* the instant it arrives (matches trader intuition: "alert me when price hits
|
|
35
|
+
* 100" should fire at 100, not require 100.01).
|
|
36
|
+
*/
|
|
37
|
+
function crossed(prevValue, currValue, threshold, direction) {
|
|
38
|
+
if (prevValue === null || !isFiniteNumber(prevValue))
|
|
39
|
+
return false;
|
|
40
|
+
if (!isFiniteNumber(currValue) || !isFiniteNumber(threshold))
|
|
41
|
+
return false;
|
|
42
|
+
const up = prevValue < threshold && currValue >= threshold;
|
|
43
|
+
const down = prevValue > threshold && currValue <= threshold;
|
|
44
|
+
if (direction === 'up')
|
|
45
|
+
return up;
|
|
46
|
+
if (direction === 'down')
|
|
47
|
+
return down;
|
|
48
|
+
return up || down;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Cross of two series A vs B (indicator vs indicator). Direction:
|
|
52
|
+
* - a-above-b : A was <= B and is now > B (A crossed UP through B)
|
|
53
|
+
* - a-below-b : A was >= B and is now < B (A crossed DOWN through B)
|
|
54
|
+
* - any : either
|
|
55
|
+
*
|
|
56
|
+
* Note the asymmetric strictness vs. `crossed`: here we use strict inequality
|
|
57
|
+
* on the post side because equality of two floats is rare and ambiguous — we
|
|
58
|
+
* wait for the next tick of separation.
|
|
59
|
+
*/
|
|
60
|
+
function crossedPair(prevA, prevB, currA, currB, direction) {
|
|
61
|
+
if (prevA === null || prevB === null)
|
|
62
|
+
return false;
|
|
63
|
+
if (!isFiniteNumber(prevA) || !isFiniteNumber(prevB))
|
|
64
|
+
return false;
|
|
65
|
+
if (!isFiniteNumber(currA) || !isFiniteNumber(currB))
|
|
66
|
+
return false;
|
|
67
|
+
const aAboveB = prevA <= prevB && currA > currB;
|
|
68
|
+
const aBelowB = prevA >= prevB && currA < currB;
|
|
69
|
+
if (direction === 'a-above-b')
|
|
70
|
+
return aAboveB;
|
|
71
|
+
if (direction === 'a-below-b')
|
|
72
|
+
return aBelowB;
|
|
73
|
+
return aAboveB || aBelowB;
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// evaluatePredicate — the dispatch
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Returns `true` iff the predicate fires for this (prev, curr) pair.
|
|
80
|
+
*
|
|
81
|
+
* The controller wraps `kind: 'custom'` in its own try/catch — but we still
|
|
82
|
+
* defensively guard against the function being missing here.
|
|
83
|
+
*/
|
|
84
|
+
export function evaluatePredicate(predicate, curr, prev) {
|
|
85
|
+
switch (predicate.kind) {
|
|
86
|
+
case 'price-cross': {
|
|
87
|
+
const cBar = curr.bar;
|
|
88
|
+
const pBar = prev?.bar ?? null;
|
|
89
|
+
if (cBar === null || !isFiniteNumber(cBar.close))
|
|
90
|
+
return false;
|
|
91
|
+
const prevClose = pBar !== null && isFiniteNumber(pBar.close) ? pBar.close : null;
|
|
92
|
+
return crossed(prevClose, cBar.close, predicate.price, predicate.direction);
|
|
93
|
+
}
|
|
94
|
+
case 'price-in-range': {
|
|
95
|
+
const cBar = curr.bar;
|
|
96
|
+
if (cBar === null || !isFiniteNumber(cBar.close))
|
|
97
|
+
return false;
|
|
98
|
+
const { min, max } = predicate;
|
|
99
|
+
if (!isFiniteNumber(min) || !isFiniteNumber(max))
|
|
100
|
+
return false;
|
|
101
|
+
return cBar.close >= min && cBar.close <= max;
|
|
102
|
+
}
|
|
103
|
+
case 'price-out-of-range': {
|
|
104
|
+
const cBar = curr.bar;
|
|
105
|
+
if (cBar === null || !isFiniteNumber(cBar.close))
|
|
106
|
+
return false;
|
|
107
|
+
const { min, max } = predicate;
|
|
108
|
+
if (!isFiniteNumber(min) || !isFiniteNumber(max))
|
|
109
|
+
return false;
|
|
110
|
+
return cBar.close < min || cBar.close > max;
|
|
111
|
+
}
|
|
112
|
+
case 'indicator-cross': {
|
|
113
|
+
const id = predicate.indicatorId;
|
|
114
|
+
const cVal = curr.indicators[id];
|
|
115
|
+
if (cVal === undefined || !isFiniteNumber(cVal))
|
|
116
|
+
return false;
|
|
117
|
+
const pRaw = prev?.indicators[id];
|
|
118
|
+
const pVal = pRaw !== undefined && isFiniteNumber(pRaw) ? pRaw : null;
|
|
119
|
+
return crossed(pVal, cVal, predicate.threshold, predicate.direction);
|
|
120
|
+
}
|
|
121
|
+
case 'indicator-cross-indicator': {
|
|
122
|
+
const { aId, bId, direction } = predicate;
|
|
123
|
+
const cA = curr.indicators[aId];
|
|
124
|
+
const cB = curr.indicators[bId];
|
|
125
|
+
if (cA === undefined ||
|
|
126
|
+
cB === undefined ||
|
|
127
|
+
!isFiniteNumber(cA) ||
|
|
128
|
+
!isFiniteNumber(cB)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
const pARaw = prev?.indicators[aId];
|
|
132
|
+
const pBRaw = prev?.indicators[bId];
|
|
133
|
+
const pA = pARaw !== undefined && isFiniteNumber(pARaw) ? pARaw : null;
|
|
134
|
+
const pB = pBRaw !== undefined && isFiniteNumber(pBRaw) ? pBRaw : null;
|
|
135
|
+
return crossedPair(pA, pB, cA, cB, direction);
|
|
136
|
+
}
|
|
137
|
+
case 'volume-spike': {
|
|
138
|
+
const cBar = curr.bar;
|
|
139
|
+
if (cBar === null || !isFiniteNumber(cBar.volume))
|
|
140
|
+
return false;
|
|
141
|
+
const avg = curr.rollingVolume[predicate.lookbackBars];
|
|
142
|
+
// Missing avg or zero avg → no useful baseline; do not fire.
|
|
143
|
+
if (avg === undefined || !isFiniteNumber(avg) || avg <= 0)
|
|
144
|
+
return false;
|
|
145
|
+
if (!isFiniteNumber(predicate.multipleOfAvg))
|
|
146
|
+
return false;
|
|
147
|
+
return cBar.volume >= avg * predicate.multipleOfAvg;
|
|
148
|
+
}
|
|
149
|
+
case 'volume-profile-poc-touch': {
|
|
150
|
+
const cBar = curr.bar;
|
|
151
|
+
const vp = curr.volumeProfile;
|
|
152
|
+
if (cBar === null || !isFiniteNumber(cBar.close))
|
|
153
|
+
return false;
|
|
154
|
+
if (vp === undefined || !isFiniteNumber(vp.poc) || vp.poc === 0)
|
|
155
|
+
return false;
|
|
156
|
+
if (!isFiniteNumber(predicate.bandPercent))
|
|
157
|
+
return false;
|
|
158
|
+
const distance = Math.abs(cBar.close - vp.poc) / Math.abs(vp.poc);
|
|
159
|
+
return distance <= predicate.bandPercent;
|
|
160
|
+
}
|
|
161
|
+
case 'order-book-wall': {
|
|
162
|
+
const ob = curr.orderBook;
|
|
163
|
+
if (ob === undefined)
|
|
164
|
+
return false;
|
|
165
|
+
const { sizeMultipleOfMedian: k } = predicate;
|
|
166
|
+
if (!isFiniteNumber(k))
|
|
167
|
+
return false;
|
|
168
|
+
const bidHit = isFiniteNumber(ob.medianBidSize) &&
|
|
169
|
+
isFiniteNumber(ob.maxBidSize) &&
|
|
170
|
+
ob.medianBidSize > 0 &&
|
|
171
|
+
ob.maxBidSize >= ob.medianBidSize * k;
|
|
172
|
+
const askHit = isFiniteNumber(ob.medianAskSize) &&
|
|
173
|
+
isFiniteNumber(ob.maxAskSize) &&
|
|
174
|
+
ob.medianAskSize > 0 &&
|
|
175
|
+
ob.maxAskSize >= ob.medianAskSize * k;
|
|
176
|
+
return bidHit || askHit;
|
|
177
|
+
}
|
|
178
|
+
case 'footprint-imbalance': {
|
|
179
|
+
const fp = curr.footprint;
|
|
180
|
+
if (fp === undefined)
|
|
181
|
+
return false;
|
|
182
|
+
if (!isFiniteNumber(fp.latestBarMaxImbalanceRatio) ||
|
|
183
|
+
!isFiniteNumber(fp.latestBarImbalanceCount)) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
return (fp.latestBarMaxImbalanceRatio >= predicate.minImbalanceRatio &&
|
|
187
|
+
fp.latestBarImbalanceCount >= predicate.consecutivePriceLevels);
|
|
188
|
+
}
|
|
189
|
+
case 'custom': {
|
|
190
|
+
if (typeof predicate.evaluate !== 'function')
|
|
191
|
+
return false;
|
|
192
|
+
// The controller also wraps this call in try/catch; the inner
|
|
193
|
+
// guard here protects callers that invoke predicates directly
|
|
194
|
+
// (e.g. tests or third-party tooling).
|
|
195
|
+
try {
|
|
196
|
+
return predicate.evaluate(curr) === true;
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
default: {
|
|
203
|
+
// Exhaustiveness check — adding a new kind without a case here
|
|
204
|
+
// will surface as a TS error on this line.
|
|
205
|
+
const _exhaustive = predicate;
|
|
206
|
+
void _exhaustive;
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/alerts/predicates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MarketSnapshot } from './types';
|
|
2
|
+
export declare class RollingVolumeCalculator {
|
|
3
|
+
readonly size: number;
|
|
4
|
+
private buffer;
|
|
5
|
+
private sum;
|
|
6
|
+
private cursor;
|
|
7
|
+
private filled;
|
|
8
|
+
constructor(size: number);
|
|
9
|
+
push(volume: number): number;
|
|
10
|
+
get mean(): number;
|
|
11
|
+
}
|
|
12
|
+
export type VolumeLookbacks = Map<number, RollingVolumeCalculator>;
|
|
13
|
+
export declare function createVolumeLookbacks(sizes: number[]): VolumeLookbacks;
|
|
14
|
+
export declare function pushToVolumeLookbacks(lookbacks: VolumeLookbacks, volume: number): MarketSnapshot['rollingVolume'];
|
|
15
|
+
//# sourceMappingURL=rollingVolume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollingVolume.d.ts","sourceRoot":"","sources":["../../src/alerts/rollingVolume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,qBAAa,uBAAuB;aAMN,IAAI,EAAE,MAAM;IALxC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,GAAG,CAAI;IACf,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,MAAM,CAAQ;gBAEM,IAAI,EAAE,MAAM;IAIxC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAa5B,IAAI,IAAI,IAAI,MAAM,CAGjB;CACF;AAED,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;AAElE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,CAMtE;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,eAAe,CAAC,CAMjC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export class RollingVolumeCalculator {
|
|
2
|
+
size;
|
|
3
|
+
buffer;
|
|
4
|
+
sum = 0;
|
|
5
|
+
cursor = 0;
|
|
6
|
+
filled = false;
|
|
7
|
+
constructor(size) {
|
|
8
|
+
this.size = size;
|
|
9
|
+
this.buffer = new Array(size);
|
|
10
|
+
}
|
|
11
|
+
push(volume) {
|
|
12
|
+
if (this.filled) {
|
|
13
|
+
this.sum -= this.buffer[this.cursor];
|
|
14
|
+
}
|
|
15
|
+
this.buffer[this.cursor] = volume;
|
|
16
|
+
this.sum += volume;
|
|
17
|
+
this.cursor = (this.cursor + 1) % this.size;
|
|
18
|
+
if (!this.filled && this.cursor === 0) {
|
|
19
|
+
this.filled = true;
|
|
20
|
+
}
|
|
21
|
+
return this.mean;
|
|
22
|
+
}
|
|
23
|
+
get mean() {
|
|
24
|
+
const count = this.filled ? this.size : this.cursor;
|
|
25
|
+
return count > 0 ? this.sum / count : 0;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function createVolumeLookbacks(sizes) {
|
|
29
|
+
const map = new Map();
|
|
30
|
+
for (const size of sizes) {
|
|
31
|
+
map.set(size, new RollingVolumeCalculator(size));
|
|
32
|
+
}
|
|
33
|
+
return map;
|
|
34
|
+
}
|
|
35
|
+
export function pushToVolumeLookbacks(lookbacks, volume) {
|
|
36
|
+
const result = {};
|
|
37
|
+
for (const [size, calc] of lookbacks) {
|
|
38
|
+
result[size] = calc.push(volume);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=rollingVolume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollingVolume.js","sourceRoot":"","sources":["../../src/alerts/rollingVolume.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAMN;IALpB,MAAM,CAAU;IAChB,GAAG,GAAG,CAAC,CAAA;IACP,MAAM,GAAG,CAAC,CAAA;IACV,MAAM,GAAG,KAAK,CAAA;IAEtB,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAE,CAAA;QACvC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;QACjC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACpB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,IAAI,IAAI;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QACnD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACzC,CAAC;CACF;AAID,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmC,CAAA;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAA0B,EAC1B,MAAc;IAEd,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|