@363045841yyt/klinechart-core 0.8.11-alpha.1 → 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,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialisable alert rule schema.
|
|
3
|
+
*
|
|
4
|
+
* Why a schema separate from `AlertRule`:
|
|
5
|
+
* - `AlertRule` can contain `kind: 'custom'`, whose `evaluate` is an
|
|
6
|
+
* in-memory function. Functions cannot be JSON-encoded, and we
|
|
7
|
+
* deliberately refuse to do anything clever (e.g. `Function(string)`)
|
|
8
|
+
* to bring them back — that would let a malicious shared rule execute
|
|
9
|
+
* arbitrary code on a victim's browser the moment they imported it.
|
|
10
|
+
* - All other predicate kinds are plain data and round-trip cleanly.
|
|
11
|
+
*
|
|
12
|
+
* SECURITY:
|
|
13
|
+
* `deserializeRule` is strictly data-driven. It NEVER calls `eval`,
|
|
14
|
+
* `Function(...)`, dynamic `import`, or `vm` — even if a malicious payload
|
|
15
|
+
* claims `kind: 'custom'` with a `source` string, we throw. The output is
|
|
16
|
+
* always a structurally-validated `AlertRule` whose predicate is one of
|
|
17
|
+
* the known data-only kinds.
|
|
18
|
+
*
|
|
19
|
+
* The schema is *minimal* on purpose — we do field-by-field validation
|
|
20
|
+
* inline rather than pulling Zod into the core bundle. Core has a strict
|
|
21
|
+
* size budget (30 KB gzip per package.json size-limit) and these rules are
|
|
22
|
+
* small.
|
|
23
|
+
*/
|
|
24
|
+
import type { AlertRule } from './types';
|
|
25
|
+
export declare class AlertRuleSchemaError extends Error {
|
|
26
|
+
constructor(message: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Serialise a rule to a JSON string. Throws `AlertRuleSchemaError` if the
|
|
30
|
+
* rule contains a `custom` predicate — these are never serialisable, by
|
|
31
|
+
* security design.
|
|
32
|
+
*/
|
|
33
|
+
export declare function serializeRule(rule: AlertRule): string;
|
|
34
|
+
/**
|
|
35
|
+
* Parse a JSON string back into an `AlertRule`. Throws `AlertRuleSchemaError`
|
|
36
|
+
* for malformed JSON, unknown predicate kinds, or any field that fails type
|
|
37
|
+
* validation.
|
|
38
|
+
*
|
|
39
|
+
* Tolerates missing optional fields (`cooldownMs`, `metadata`).
|
|
40
|
+
*/
|
|
41
|
+
export declare function deserializeRule(json: string): AlertRule;
|
|
42
|
+
//# sourceMappingURL=ruleSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruleSchema.d.ts","sourceRoot":"","sources":["../../src/alerts/ruleSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAGR,SAAS,EAGZ,MAAM,SAAS,CAAA;AAMhB,qBAAa,oBAAqB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI9B;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAuBrD;AA2JD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAwCvD"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialisable alert rule schema.
|
|
3
|
+
*
|
|
4
|
+
* Why a schema separate from `AlertRule`:
|
|
5
|
+
* - `AlertRule` can contain `kind: 'custom'`, whose `evaluate` is an
|
|
6
|
+
* in-memory function. Functions cannot be JSON-encoded, and we
|
|
7
|
+
* deliberately refuse to do anything clever (e.g. `Function(string)`)
|
|
8
|
+
* to bring them back — that would let a malicious shared rule execute
|
|
9
|
+
* arbitrary code on a victim's browser the moment they imported it.
|
|
10
|
+
* - All other predicate kinds are plain data and round-trip cleanly.
|
|
11
|
+
*
|
|
12
|
+
* SECURITY:
|
|
13
|
+
* `deserializeRule` is strictly data-driven. It NEVER calls `eval`,
|
|
14
|
+
* `Function(...)`, dynamic `import`, or `vm` — even if a malicious payload
|
|
15
|
+
* claims `kind: 'custom'` with a `source` string, we throw. The output is
|
|
16
|
+
* always a structurally-validated `AlertRule` whose predicate is one of
|
|
17
|
+
* the known data-only kinds.
|
|
18
|
+
*
|
|
19
|
+
* The schema is *minimal* on purpose — we do field-by-field validation
|
|
20
|
+
* inline rather than pulling Zod into the core bundle. Core has a strict
|
|
21
|
+
* size budget (30 KB gzip per package.json size-limit) and these rules are
|
|
22
|
+
* small.
|
|
23
|
+
*/
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Error type — callers can catch and report cleanly.
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
export class AlertRuleSchemaError extends Error {
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = 'AlertRuleSchemaError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// serializeRule
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Serialise a rule to a JSON string. Throws `AlertRuleSchemaError` if the
|
|
38
|
+
* rule contains a `custom` predicate — these are never serialisable, by
|
|
39
|
+
* security design.
|
|
40
|
+
*/
|
|
41
|
+
export function serializeRule(rule) {
|
|
42
|
+
if (rule.predicate.kind === 'custom') {
|
|
43
|
+
throw new AlertRuleSchemaError("Cannot serialise rule with 'custom' predicate: custom predicates carry " +
|
|
44
|
+
'an in-memory function. Serialising them would force deserialise to ' +
|
|
45
|
+
'evaluate user-supplied code, which is a remote-code-execution vector. ' +
|
|
46
|
+
'Use a built-in predicate kind for shareable rules.');
|
|
47
|
+
}
|
|
48
|
+
// Everything else is plain data — JSON.stringify handles it directly.
|
|
49
|
+
// We omit `undefined` fields naturally via JSON.
|
|
50
|
+
const payload = {
|
|
51
|
+
id: rule.id,
|
|
52
|
+
name: rule.name,
|
|
53
|
+
predicate: rule.predicate,
|
|
54
|
+
enabled: rule.enabled,
|
|
55
|
+
oneShot: rule.oneShot,
|
|
56
|
+
...(rule.cooldownMs !== undefined ? { cooldownMs: rule.cooldownMs } : {}),
|
|
57
|
+
...(rule.metadata !== undefined ? { metadata: rule.metadata } : {}),
|
|
58
|
+
// Schema version pin — bumps if we make a breaking change.
|
|
59
|
+
schemaVersion: 1,
|
|
60
|
+
};
|
|
61
|
+
return JSON.stringify(payload);
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// deserializeRule
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
const SERIALISABLE_KINDS = new Set([
|
|
67
|
+
'price-cross',
|
|
68
|
+
'price-in-range',
|
|
69
|
+
'price-out-of-range',
|
|
70
|
+
'indicator-cross',
|
|
71
|
+
'indicator-cross-indicator',
|
|
72
|
+
'volume-spike',
|
|
73
|
+
'volume-profile-poc-touch',
|
|
74
|
+
'order-book-wall',
|
|
75
|
+
'footprint-imbalance',
|
|
76
|
+
]);
|
|
77
|
+
const CROSS_DIRECTIONS = new Set(['up', 'down', 'any']);
|
|
78
|
+
const PAIR_DIRECTIONS = new Set([
|
|
79
|
+
'a-above-b',
|
|
80
|
+
'a-below-b',
|
|
81
|
+
'any',
|
|
82
|
+
]);
|
|
83
|
+
function isObj(x) {
|
|
84
|
+
return typeof x === 'object' && x !== null && !Array.isArray(x);
|
|
85
|
+
}
|
|
86
|
+
function reqString(obj, key) {
|
|
87
|
+
const v = obj[key];
|
|
88
|
+
if (typeof v !== 'string' || v.length === 0) {
|
|
89
|
+
throw new AlertRuleSchemaError(`Field '${key}' must be a non-empty string`);
|
|
90
|
+
}
|
|
91
|
+
return v;
|
|
92
|
+
}
|
|
93
|
+
function reqBool(obj, key) {
|
|
94
|
+
const v = obj[key];
|
|
95
|
+
if (typeof v !== 'boolean') {
|
|
96
|
+
throw new AlertRuleSchemaError(`Field '${key}' must be a boolean`);
|
|
97
|
+
}
|
|
98
|
+
return v;
|
|
99
|
+
}
|
|
100
|
+
function reqFiniteNumber(obj, key) {
|
|
101
|
+
const v = obj[key];
|
|
102
|
+
if (typeof v !== 'number' || !Number.isFinite(v)) {
|
|
103
|
+
throw new AlertRuleSchemaError(`Field '${key}' must be a finite number`);
|
|
104
|
+
}
|
|
105
|
+
return v;
|
|
106
|
+
}
|
|
107
|
+
function optFiniteNumber(obj, key) {
|
|
108
|
+
const v = obj[key];
|
|
109
|
+
if (v === undefined)
|
|
110
|
+
return undefined;
|
|
111
|
+
if (typeof v !== 'number' || !Number.isFinite(v)) {
|
|
112
|
+
throw new AlertRuleSchemaError(`Field '${key}' must be a finite number when set`);
|
|
113
|
+
}
|
|
114
|
+
return v;
|
|
115
|
+
}
|
|
116
|
+
function reqEnum(obj, key, allowed) {
|
|
117
|
+
const v = obj[key];
|
|
118
|
+
if (typeof v !== 'string' || !allowed.has(v)) {
|
|
119
|
+
throw new AlertRuleSchemaError(`Field '${key}' must be one of: ${[...allowed].join(', ')}`);
|
|
120
|
+
}
|
|
121
|
+
return v;
|
|
122
|
+
}
|
|
123
|
+
function parsePredicate(raw) {
|
|
124
|
+
if (!isObj(raw))
|
|
125
|
+
throw new AlertRuleSchemaError('predicate must be an object');
|
|
126
|
+
const kind = raw.kind;
|
|
127
|
+
if (typeof kind !== 'string') {
|
|
128
|
+
throw new AlertRuleSchemaError("predicate.kind must be a string");
|
|
129
|
+
}
|
|
130
|
+
if (kind === 'custom') {
|
|
131
|
+
throw new AlertRuleSchemaError("Refusing to deserialise 'custom' predicate. Custom predicates are " +
|
|
132
|
+
'never serialised — accepting one here would mean evaluating user-' +
|
|
133
|
+
'supplied code (RCE). Custom predicates must be added in-process by ' +
|
|
134
|
+
'the application.');
|
|
135
|
+
}
|
|
136
|
+
if (!SERIALISABLE_KINDS.has(kind)) {
|
|
137
|
+
throw new AlertRuleSchemaError(`Unknown predicate.kind: ${kind}`);
|
|
138
|
+
}
|
|
139
|
+
switch (kind) {
|
|
140
|
+
case 'price-cross':
|
|
141
|
+
return {
|
|
142
|
+
kind: 'price-cross',
|
|
143
|
+
price: reqFiniteNumber(raw, 'price'),
|
|
144
|
+
direction: reqEnum(raw, 'direction', CROSS_DIRECTIONS),
|
|
145
|
+
};
|
|
146
|
+
case 'price-in-range':
|
|
147
|
+
return {
|
|
148
|
+
kind: 'price-in-range',
|
|
149
|
+
min: reqFiniteNumber(raw, 'min'),
|
|
150
|
+
max: reqFiniteNumber(raw, 'max'),
|
|
151
|
+
};
|
|
152
|
+
case 'price-out-of-range':
|
|
153
|
+
return {
|
|
154
|
+
kind: 'price-out-of-range',
|
|
155
|
+
min: reqFiniteNumber(raw, 'min'),
|
|
156
|
+
max: reqFiniteNumber(raw, 'max'),
|
|
157
|
+
};
|
|
158
|
+
case 'indicator-cross':
|
|
159
|
+
return {
|
|
160
|
+
kind: 'indicator-cross',
|
|
161
|
+
indicatorId: reqString(raw, 'indicatorId'),
|
|
162
|
+
threshold: reqFiniteNumber(raw, 'threshold'),
|
|
163
|
+
direction: reqEnum(raw, 'direction', CROSS_DIRECTIONS),
|
|
164
|
+
};
|
|
165
|
+
case 'indicator-cross-indicator':
|
|
166
|
+
return {
|
|
167
|
+
kind: 'indicator-cross-indicator',
|
|
168
|
+
aId: reqString(raw, 'aId'),
|
|
169
|
+
bId: reqString(raw, 'bId'),
|
|
170
|
+
direction: reqEnum(raw, 'direction', PAIR_DIRECTIONS),
|
|
171
|
+
};
|
|
172
|
+
case 'volume-spike':
|
|
173
|
+
return {
|
|
174
|
+
kind: 'volume-spike',
|
|
175
|
+
multipleOfAvg: reqFiniteNumber(raw, 'multipleOfAvg'),
|
|
176
|
+
lookbackBars: reqFiniteNumber(raw, 'lookbackBars'),
|
|
177
|
+
};
|
|
178
|
+
case 'volume-profile-poc-touch':
|
|
179
|
+
return {
|
|
180
|
+
kind: 'volume-profile-poc-touch',
|
|
181
|
+
bandPercent: reqFiniteNumber(raw, 'bandPercent'),
|
|
182
|
+
};
|
|
183
|
+
case 'order-book-wall':
|
|
184
|
+
return {
|
|
185
|
+
kind: 'order-book-wall',
|
|
186
|
+
sizeMultipleOfMedian: reqFiniteNumber(raw, 'sizeMultipleOfMedian'),
|
|
187
|
+
};
|
|
188
|
+
case 'footprint-imbalance':
|
|
189
|
+
return {
|
|
190
|
+
kind: 'footprint-imbalance',
|
|
191
|
+
minImbalanceRatio: reqFiniteNumber(raw, 'minImbalanceRatio'),
|
|
192
|
+
consecutivePriceLevels: reqFiniteNumber(raw, 'consecutivePriceLevels'),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Parse a JSON string back into an `AlertRule`. Throws `AlertRuleSchemaError`
|
|
198
|
+
* for malformed JSON, unknown predicate kinds, or any field that fails type
|
|
199
|
+
* validation.
|
|
200
|
+
*
|
|
201
|
+
* Tolerates missing optional fields (`cooldownMs`, `metadata`).
|
|
202
|
+
*/
|
|
203
|
+
export function deserializeRule(json) {
|
|
204
|
+
let raw;
|
|
205
|
+
try {
|
|
206
|
+
raw = JSON.parse(json);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
throw new AlertRuleSchemaError(`Malformed JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
210
|
+
}
|
|
211
|
+
if (!isObj(raw)) {
|
|
212
|
+
throw new AlertRuleSchemaError('Top-level payload must be an object');
|
|
213
|
+
}
|
|
214
|
+
const id = reqString(raw, 'id');
|
|
215
|
+
const name = reqString(raw, 'name');
|
|
216
|
+
const enabled = reqBool(raw, 'enabled');
|
|
217
|
+
const oneShot = reqBool(raw, 'oneShot');
|
|
218
|
+
const cooldownMs = optFiniteNumber(raw, 'cooldownMs');
|
|
219
|
+
const predicate = parsePredicate(raw.predicate);
|
|
220
|
+
// Metadata is a free-form object; we only check that it is an object if
|
|
221
|
+
// present, and we freeze it lazily by spreading the keys we got.
|
|
222
|
+
let metadata;
|
|
223
|
+
if (raw.metadata !== undefined) {
|
|
224
|
+
if (!isObj(raw.metadata)) {
|
|
225
|
+
throw new AlertRuleSchemaError('metadata must be an object when set');
|
|
226
|
+
}
|
|
227
|
+
metadata = { ...raw.metadata };
|
|
228
|
+
}
|
|
229
|
+
const rule = {
|
|
230
|
+
id,
|
|
231
|
+
name,
|
|
232
|
+
predicate,
|
|
233
|
+
enabled,
|
|
234
|
+
oneShot,
|
|
235
|
+
...(cooldownMs !== undefined ? { cooldownMs } : {}),
|
|
236
|
+
...(metadata !== undefined ? { metadata } : {}),
|
|
237
|
+
};
|
|
238
|
+
return rule;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=ruleSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruleSchema.js","sourceRoot":"","sources":["../../src/alerts/ruleSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert rule engine — public types.
|
|
3
|
+
*
|
|
4
|
+
* Why we build our own (vs. relying on TradingView's alert engine):
|
|
5
|
+
* - TV alerts are closed, server-side, capped (60 free + paid tiers).
|
|
6
|
+
* - TV alerts are limited to TV's built-in indicator outputs.
|
|
7
|
+
* - We need to alert on differentiating signals TV simply cannot see —
|
|
8
|
+
* Volume Profile POC touch, Order Book wall appearance, Footprint
|
|
9
|
+
* imbalance hit. These predicates are first-class here.
|
|
10
|
+
*
|
|
11
|
+
* Engine shape:
|
|
12
|
+
* - Predicate-based (discriminated union, schema-driven).
|
|
13
|
+
* - Rules are pure data and serialisable (see `ruleSchema.ts`) so they
|
|
14
|
+
* survive page reloads and can be shared between users/agents/servers.
|
|
15
|
+
* - The controller is a tiny state machine over rules + recent events;
|
|
16
|
+
* evaluation is O(rules) per call, O(1) per rule, safe to run in a
|
|
17
|
+
* per-frame loop.
|
|
18
|
+
*
|
|
19
|
+
* The `custom` predicate is an escape hatch for callers that need ad-hoc
|
|
20
|
+
* logic without forking the schema. It carries an in-memory function that
|
|
21
|
+
* is intentionally NOT serialisable — see `ruleSchema.ts` for the reasoning.
|
|
22
|
+
*/
|
|
23
|
+
import type { Signal } from '../reactivity/signal';
|
|
24
|
+
/**
|
|
25
|
+
* A snapshot of "the chart right now" that all predicates evaluate against.
|
|
26
|
+
*
|
|
27
|
+
* Callers are expected to populate as much as they have. A predicate that
|
|
28
|
+
* needs a sub-field absent from the snapshot must return `false` (no spurious
|
|
29
|
+
* fires from missing data).
|
|
30
|
+
*/
|
|
31
|
+
export interface MarketSnapshot {
|
|
32
|
+
/** Latest closed bar; `null` for an empty stream. */
|
|
33
|
+
bar: {
|
|
34
|
+
timestamp: number;
|
|
35
|
+
open: number;
|
|
36
|
+
high: number;
|
|
37
|
+
low: number;
|
|
38
|
+
close: number;
|
|
39
|
+
volume: number;
|
|
40
|
+
} | null;
|
|
41
|
+
/** Latest scalar value per indicator id (keyed by your indicator instance id). */
|
|
42
|
+
indicators: Readonly<Record<string, number>>;
|
|
43
|
+
/**
|
|
44
|
+
* Average volume across the last N bars, keyed by N. Required for the
|
|
45
|
+
* `volume-spike` predicate to be O(1) — the caller maintains the rolling
|
|
46
|
+
* mean elsewhere.
|
|
47
|
+
*/
|
|
48
|
+
rollingVolume: Readonly<Record<number, number>>;
|
|
49
|
+
/** Optional advanced components (filled only when those components are mounted). */
|
|
50
|
+
volumeProfile?: {
|
|
51
|
+
poc: number;
|
|
52
|
+
vah: number;
|
|
53
|
+
val: number;
|
|
54
|
+
};
|
|
55
|
+
orderBook?: {
|
|
56
|
+
medianBidSize: number;
|
|
57
|
+
medianAskSize: number;
|
|
58
|
+
maxBidSize: number;
|
|
59
|
+
maxAskSize: number;
|
|
60
|
+
};
|
|
61
|
+
footprint?: {
|
|
62
|
+
latestBarMaxImbalanceRatio: number;
|
|
63
|
+
latestBarImbalanceCount: number;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export type CrossDirection = 'up' | 'down' | 'any';
|
|
67
|
+
export type IndicatorCrossPairDirection = 'a-above-b' | 'a-below-b' | 'any';
|
|
68
|
+
/**
|
|
69
|
+
* Predicate kinds. Add new kinds by extending the union — the controller's
|
|
70
|
+
* switch in `predicates.ts` will give a TS exhaustiveness error if you forget
|
|
71
|
+
* to handle it.
|
|
72
|
+
*/
|
|
73
|
+
export type AlertPredicate = {
|
|
74
|
+
kind: 'price-cross';
|
|
75
|
+
price: number;
|
|
76
|
+
direction: CrossDirection;
|
|
77
|
+
} | {
|
|
78
|
+
kind: 'price-in-range';
|
|
79
|
+
min: number;
|
|
80
|
+
max: number;
|
|
81
|
+
} | {
|
|
82
|
+
kind: 'price-out-of-range';
|
|
83
|
+
min: number;
|
|
84
|
+
max: number;
|
|
85
|
+
} | {
|
|
86
|
+
kind: 'indicator-cross';
|
|
87
|
+
indicatorId: string;
|
|
88
|
+
threshold: number;
|
|
89
|
+
direction: CrossDirection;
|
|
90
|
+
} | {
|
|
91
|
+
kind: 'indicator-cross-indicator';
|
|
92
|
+
aId: string;
|
|
93
|
+
bId: string;
|
|
94
|
+
direction: IndicatorCrossPairDirection;
|
|
95
|
+
} | {
|
|
96
|
+
kind: 'volume-spike';
|
|
97
|
+
multipleOfAvg: number;
|
|
98
|
+
lookbackBars: number;
|
|
99
|
+
} | {
|
|
100
|
+
kind: 'volume-profile-poc-touch';
|
|
101
|
+
bandPercent: number;
|
|
102
|
+
} | {
|
|
103
|
+
kind: 'order-book-wall';
|
|
104
|
+
sizeMultipleOfMedian: number;
|
|
105
|
+
} | {
|
|
106
|
+
kind: 'footprint-imbalance';
|
|
107
|
+
minImbalanceRatio: number;
|
|
108
|
+
consecutivePriceLevels: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Escape hatch. The `evaluate` function runs INSIDE a try/catch in the
|
|
112
|
+
* controller — a throwing custom predicate must not crash the alert pass.
|
|
113
|
+
* Custom predicates CANNOT be serialised; see `ruleSchema.ts`.
|
|
114
|
+
*/
|
|
115
|
+
| {
|
|
116
|
+
kind: 'custom';
|
|
117
|
+
evaluate: (snapshot: MarketSnapshot) => boolean;
|
|
118
|
+
};
|
|
119
|
+
export type AlertPredicateKind = AlertPredicate['kind'];
|
|
120
|
+
export interface AlertRule {
|
|
121
|
+
id: string;
|
|
122
|
+
name: string;
|
|
123
|
+
predicate: AlertPredicate;
|
|
124
|
+
enabled: boolean;
|
|
125
|
+
/** Fire once and then auto-disable. */
|
|
126
|
+
oneShot: boolean;
|
|
127
|
+
/**
|
|
128
|
+
* For non-oneShot rules, suppress re-fires within this window (ms after
|
|
129
|
+
* the last fire). Undefined / 0 = no cooldown.
|
|
130
|
+
*/
|
|
131
|
+
cooldownMs?: number;
|
|
132
|
+
/** Free-form metadata propagated onto fired events. */
|
|
133
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
134
|
+
}
|
|
135
|
+
export interface AlertEvent {
|
|
136
|
+
ruleId: string;
|
|
137
|
+
ruleName: string;
|
|
138
|
+
/** ms since epoch, passed in by the caller as `now`. */
|
|
139
|
+
triggeredAt: number;
|
|
140
|
+
/** Snapshot of the bar that triggered the rule (copied, not referenced). */
|
|
141
|
+
snapshotBar: MarketSnapshot['bar'];
|
|
142
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
143
|
+
}
|
|
144
|
+
export interface AlertController {
|
|
145
|
+
/** Current rules, in insertion order. Reactive. */
|
|
146
|
+
readonly rules: Signal<ReadonlyArray<AlertRule>>;
|
|
147
|
+
/** Bounded ring of recent events, newest last. Reactive. */
|
|
148
|
+
readonly events: Signal<ReadonlyArray<AlertEvent>>;
|
|
149
|
+
/** Add a rule; returns false if a rule with the same id already exists. */
|
|
150
|
+
addRule(rule: AlertRule): boolean;
|
|
151
|
+
removeRule(id: string): boolean;
|
|
152
|
+
setRuleEnabled(id: string, enabled: boolean): boolean;
|
|
153
|
+
/** Patch any field except `id`. Returns false if the id is unknown. */
|
|
154
|
+
updateRule(id: string, patch: Partial<Omit<AlertRule, 'id'>>): boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Evaluate every enabled rule against the snapshot. Returns the events
|
|
157
|
+
* fired on this call (also appended to the `events` signal).
|
|
158
|
+
*/
|
|
159
|
+
evaluate(snapshot: MarketSnapshot, now: number): ReadonlyArray<AlertEvent>;
|
|
160
|
+
clearEvents(): void;
|
|
161
|
+
/** Per-fire listener; returns an unsubscribe. */
|
|
162
|
+
onEvent(listener: (event: AlertEvent) => void): () => void;
|
|
163
|
+
dispose(): void;
|
|
164
|
+
}
|
|
165
|
+
export interface AlertControllerOptions {
|
|
166
|
+
/** Maximum size of the `events` ring buffer. Default 100. */
|
|
167
|
+
maxEvents?: number;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/alerts/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert rule engine — public types.
|
|
3
|
+
*
|
|
4
|
+
* Why we build our own (vs. relying on TradingView's alert engine):
|
|
5
|
+
* - TV alerts are closed, server-side, capped (60 free + paid tiers).
|
|
6
|
+
* - TV alerts are limited to TV's built-in indicator outputs.
|
|
7
|
+
* - We need to alert on differentiating signals TV simply cannot see —
|
|
8
|
+
* Volume Profile POC touch, Order Book wall appearance, Footprint
|
|
9
|
+
* imbalance hit. These predicates are first-class here.
|
|
10
|
+
*
|
|
11
|
+
* Engine shape:
|
|
12
|
+
* - Predicate-based (discriminated union, schema-driven).
|
|
13
|
+
* - Rules are pure data and serialisable (see `ruleSchema.ts`) so they
|
|
14
|
+
* survive page reloads and can be shared between users/agents/servers.
|
|
15
|
+
* - The controller is a tiny state machine over rules + recent events;
|
|
16
|
+
* evaluation is O(rules) per call, O(1) per rule, safe to run in a
|
|
17
|
+
* per-frame loop.
|
|
18
|
+
*
|
|
19
|
+
* The `custom` predicate is an escape hatch for callers that need ad-hoc
|
|
20
|
+
* logic without forking the schema. It carries an in-memory function that
|
|
21
|
+
* is intentionally NOT serialisable — see `ruleSchema.ts` for the reasoning.
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/alerts/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heikin Ashi — "average bar" smoothing of an OHLCV series.
|
|
3
|
+
*
|
|
4
|
+
* Heikin Ashi (平均足) was popularised by Munehisa Homma; the modern formula
|
|
5
|
+
* is the one taught by Dan Valcu. It produces a one-to-one transform — each
|
|
6
|
+
* input bar yields exactly one output bar — but the values are smoothed so
|
|
7
|
+
* trends visually persist through noise.
|
|
8
|
+
*
|
|
9
|
+
* ## Formula
|
|
10
|
+
*
|
|
11
|
+
* HA_close[i] = (O[i] + H[i] + L[i] + C[i]) / 4
|
|
12
|
+
* HA_open[i] = (HA_open[i-1] + HA_close[i-1]) / 2 for i >= 1
|
|
13
|
+
* HA_open[0] = (O[0] + C[0]) / 2 (seed)
|
|
14
|
+
* HA_high[i] = max(H[i], HA_open[i], HA_close[i])
|
|
15
|
+
* HA_low[i] = min(L[i], HA_open[i], HA_close[i])
|
|
16
|
+
* HA_volume[i] = V[i] (unchanged)
|
|
17
|
+
*
|
|
18
|
+
* The seed for `HA_open[0]` is the standard convention used by all major
|
|
19
|
+
* charting platforms (TradingView, MetaTrader). An alternative seed of
|
|
20
|
+
* `O[0]` exists in some older books but produces a slightly different shape
|
|
21
|
+
* for the first bar; we follow the modern convention.
|
|
22
|
+
*
|
|
23
|
+
* ## Trade-offs
|
|
24
|
+
*
|
|
25
|
+
* - Volume is **not** smoothed. Smoothing volume distorts indicators that
|
|
26
|
+
* consume the derived series (OBV, VWAP, CMF), so we keep it raw. This
|
|
27
|
+
* matches TradingView's behaviour.
|
|
28
|
+
* - Output `timestamp` equals input `timestamp` — Heikin Ashi does not
|
|
29
|
+
* re-bucket time.
|
|
30
|
+
*
|
|
31
|
+
* ## Statefulness
|
|
32
|
+
*
|
|
33
|
+
* The transform carries `HA_open[i-1]` and `HA_close[i-1]` between calls so
|
|
34
|
+
* `appendBar` produces the same result as a batch `transform` over the same
|
|
35
|
+
* series. The `reset()` method clears that carry.
|
|
36
|
+
*/
|
|
37
|
+
import type { ChartTypeTransform } from './types';
|
|
38
|
+
/** Heikin Ashi has no configuration. The empty type makes the contract explicit. */
|
|
39
|
+
export type HeikinAshiConfig = Record<string, never>;
|
|
40
|
+
/**
|
|
41
|
+
* Build a Heikin Ashi transform. The returned object is stateful — `transform`
|
|
42
|
+
* resets state before running, `appendBar` mutates state, `reset` clears it.
|
|
43
|
+
*
|
|
44
|
+
* The factory pattern (rather than a singleton) matches the controller style
|
|
45
|
+
* elsewhere in this package — multiple panes can each hold their own
|
|
46
|
+
* independent transform without crossed state.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createHeikinAshi(): ChartTypeTransform<HeikinAshiConfig>;
|
|
49
|
+
//# sourceMappingURL=heikinAshi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heikinAshi.d.ts","sourceRoot":"","sources":["../../src/chartTypes/heikinAshi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,SAAS,CAAA;AAExE,oFAAoF;AACpF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAWpD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,CAwDvE"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heikin Ashi — "average bar" smoothing of an OHLCV series.
|
|
3
|
+
*
|
|
4
|
+
* Heikin Ashi (平均足) was popularised by Munehisa Homma; the modern formula
|
|
5
|
+
* is the one taught by Dan Valcu. It produces a one-to-one transform — each
|
|
6
|
+
* input bar yields exactly one output bar — but the values are smoothed so
|
|
7
|
+
* trends visually persist through noise.
|
|
8
|
+
*
|
|
9
|
+
* ## Formula
|
|
10
|
+
*
|
|
11
|
+
* HA_close[i] = (O[i] + H[i] + L[i] + C[i]) / 4
|
|
12
|
+
* HA_open[i] = (HA_open[i-1] + HA_close[i-1]) / 2 for i >= 1
|
|
13
|
+
* HA_open[0] = (O[0] + C[0]) / 2 (seed)
|
|
14
|
+
* HA_high[i] = max(H[i], HA_open[i], HA_close[i])
|
|
15
|
+
* HA_low[i] = min(L[i], HA_open[i], HA_close[i])
|
|
16
|
+
* HA_volume[i] = V[i] (unchanged)
|
|
17
|
+
*
|
|
18
|
+
* The seed for `HA_open[0]` is the standard convention used by all major
|
|
19
|
+
* charting platforms (TradingView, MetaTrader). An alternative seed of
|
|
20
|
+
* `O[0]` exists in some older books but produces a slightly different shape
|
|
21
|
+
* for the first bar; we follow the modern convention.
|
|
22
|
+
*
|
|
23
|
+
* ## Trade-offs
|
|
24
|
+
*
|
|
25
|
+
* - Volume is **not** smoothed. Smoothing volume distorts indicators that
|
|
26
|
+
* consume the derived series (OBV, VWAP, CMF), so we keep it raw. This
|
|
27
|
+
* matches TradingView's behaviour.
|
|
28
|
+
* - Output `timestamp` equals input `timestamp` — Heikin Ashi does not
|
|
29
|
+
* re-bucket time.
|
|
30
|
+
*
|
|
31
|
+
* ## Statefulness
|
|
32
|
+
*
|
|
33
|
+
* The transform carries `HA_open[i-1]` and `HA_close[i-1]` between calls so
|
|
34
|
+
* `appendBar` produces the same result as a batch `transform` over the same
|
|
35
|
+
* series. The `reset()` method clears that carry.
|
|
36
|
+
*/
|
|
37
|
+
/**
|
|
38
|
+
* Build a Heikin Ashi transform. The returned object is stateful — `transform`
|
|
39
|
+
* resets state before running, `appendBar` mutates state, `reset` clears it.
|
|
40
|
+
*
|
|
41
|
+
* The factory pattern (rather than a singleton) matches the controller style
|
|
42
|
+
* elsewhere in this package — multiple panes can each hold their own
|
|
43
|
+
* independent transform without crossed state.
|
|
44
|
+
*/
|
|
45
|
+
export function createHeikinAshi() {
|
|
46
|
+
let state = null;
|
|
47
|
+
/**
|
|
48
|
+
* Compute one HA bar. `prev` is `null` for the very first bar in a series,
|
|
49
|
+
* which triggers the seed `HA_open = (O + C) / 2`.
|
|
50
|
+
*/
|
|
51
|
+
const computeBar = (bar, prev, sourceIndex) => {
|
|
52
|
+
const haClose = (bar.open + bar.high + bar.low + bar.close) / 4;
|
|
53
|
+
const haOpen = prev === null ? (bar.open + bar.close) / 2 : (prev.prevOpen + prev.prevClose) / 2;
|
|
54
|
+
const haHigh = Math.max(bar.high, haOpen, haClose);
|
|
55
|
+
const haLow = Math.min(bar.low, haOpen, haClose);
|
|
56
|
+
return {
|
|
57
|
+
timestamp: bar.timestamp,
|
|
58
|
+
open: haOpen,
|
|
59
|
+
high: haHigh,
|
|
60
|
+
low: haLow,
|
|
61
|
+
close: haClose,
|
|
62
|
+
volume: bar.volume,
|
|
63
|
+
sourceBarIndexStart: sourceIndex,
|
|
64
|
+
sourceBarIndexEnd: sourceIndex,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
typeId: 'heikin-ashi',
|
|
69
|
+
transform(input) {
|
|
70
|
+
state = null;
|
|
71
|
+
const out = [];
|
|
72
|
+
for (let i = 0; i < input.length; i++) {
|
|
73
|
+
const bar = input[i];
|
|
74
|
+
if (!bar)
|
|
75
|
+
continue;
|
|
76
|
+
const ha = computeBar(bar, state === null ? null : { prevOpen: state.prevOpen, prevClose: state.prevClose }, i);
|
|
77
|
+
out.push(ha);
|
|
78
|
+
state = { prevOpen: ha.open, prevClose: ha.close, nextIndex: i + 1 };
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
},
|
|
82
|
+
appendBar(bar) {
|
|
83
|
+
const prev = state === null ? null : { prevOpen: state.prevOpen, prevClose: state.prevClose };
|
|
84
|
+
const nextIndex = state === null ? 0 : state.nextIndex;
|
|
85
|
+
const ha = computeBar(bar, prev, nextIndex);
|
|
86
|
+
state = { prevOpen: ha.open, prevClose: ha.close, nextIndex: nextIndex + 1 };
|
|
87
|
+
return [ha];
|
|
88
|
+
},
|
|
89
|
+
reset() {
|
|
90
|
+
state = null;
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=heikinAshi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heikinAshi.js","sourceRoot":"","sources":["../../src/chartTypes/heikinAshi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { OHLCV, TransformedBar, ChartTypeTransform } from './types';
|
|
2
|
+
export { createHeikinAshi } from './heikinAshi';
|
|
3
|
+
export { createRenko, type RenkoConfig } from './renko';
|
|
4
|
+
export { createPointAndFigure, type PointAndFigureConfig } from './pointAndFigure';
|
|
5
|
+
export { createRangeBars, type RangeBarsConfig } from './rangeBars';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|