@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,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for `computeAnchoredVwap` — pure math for Anchored VWAP + bands.
|
|
3
|
+
*
|
|
4
|
+
* The math the implementation is being held to:
|
|
5
|
+
*
|
|
6
|
+
* typicalPrice(j) = (H[j] + L[j] + C[j]) / 3
|
|
7
|
+
* sumVwp(i) = Σ_{j=a..i} typicalPrice(j) * V[j]
|
|
8
|
+
* sumVol(i) = Σ_{j=a..i} V[j]
|
|
9
|
+
* AVWAP(i) = sumVwp(i) / sumVol(i)
|
|
10
|
+
* sqDev(j) = (typicalPrice(j) - AVWAP(j))^2 * V[j] ← prevailing
|
|
11
|
+
* variance(i) = Σ_{j=a..i} sqDev(j) / sumVol(i)
|
|
12
|
+
* stdDev(i) = sqrt(variance(i))
|
|
13
|
+
* bands = AVWAP ± k * stdDev, k ∈ {1, 2}
|
|
14
|
+
*
|
|
15
|
+
* The "prevailing AVWAP at j" subtlety is explicitly pinned by the test
|
|
16
|
+
* `bands use prevailing AVWAP at j, not final AVWAP(i)` — that test would
|
|
17
|
+
* fail with a naive implementation that uses the final AVWAP instead.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { describe, it, expect } from 'vitest'
|
|
21
|
+
|
|
22
|
+
import { computeAnchoredVwap } from '../computeAnchoredVwap'
|
|
23
|
+
import { isKLineChartError } from '../../../errors'
|
|
24
|
+
import type { AVWAPBar } from '../types'
|
|
25
|
+
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Fixture helpers
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
/** Single-line bar constructor — keeps the fixtures readable. */
|
|
31
|
+
function bar(
|
|
32
|
+
high: number,
|
|
33
|
+
low: number,
|
|
34
|
+
close: number,
|
|
35
|
+
volume: number,
|
|
36
|
+
): AVWAPBar {
|
|
37
|
+
return { high, low, close, volume }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** typical price = (H + L + C) / 3 — used by the manual-formula tests. */
|
|
41
|
+
function tp(b: AVWAPBar): number {
|
|
42
|
+
return (b.high + b.low + b.close) / 3
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Edge cases
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
describe('computeAnchoredVwap — edge cases', () => {
|
|
50
|
+
it('returns [] when bars is empty', () => {
|
|
51
|
+
// The "no data, no work" convention used by sibling controllers.
|
|
52
|
+
// An out-of-range anchor on an empty array must NOT throw.
|
|
53
|
+
expect(computeAnchoredVwap([], 0, true)).toEqual([])
|
|
54
|
+
expect(computeAnchoredVwap([], -5, false)).toEqual([])
|
|
55
|
+
expect(computeAnchoredVwap([], 999, true)).toEqual([])
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
// Post-BLOCKER-005: out-of-range throws are KLineChartError with code
|
|
59
|
+
// `AVWAP_ANCHOR_OUT_OF_RANGE` (stronger contract than the previous
|
|
60
|
+
// built-in RangeError — instanceof KLineChartError + code narrowing).
|
|
61
|
+
it('throws KLineChartError(AVWAP_ANCHOR_OUT_OF_RANGE) when anchorIndex is negative', () => {
|
|
62
|
+
const bars = [bar(100, 90, 95, 1000)]
|
|
63
|
+
try {
|
|
64
|
+
computeAnchoredVwap(bars, -1, true)
|
|
65
|
+
throw new Error('expected throw')
|
|
66
|
+
} catch (e) {
|
|
67
|
+
expect(isKLineChartError(e, 'AVWAP_ANCHOR_OUT_OF_RANGE')).toBe(true)
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('throws KLineChartError(AVWAP_ANCHOR_OUT_OF_RANGE) when anchorIndex >= bars.length', () => {
|
|
72
|
+
const bars = [bar(100, 90, 95, 1000), bar(101, 91, 96, 1100)]
|
|
73
|
+
for (const idx of [2, 10]) {
|
|
74
|
+
try {
|
|
75
|
+
computeAnchoredVwap(bars, idx, idx === 2)
|
|
76
|
+
throw new Error('expected throw')
|
|
77
|
+
} catch (e) {
|
|
78
|
+
expect(isKLineChartError(e, 'AVWAP_ANCHOR_OUT_OF_RANGE')).toBe(true)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Core AVWAP math
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
|
|
88
|
+
describe('computeAnchoredVwap — core AVWAP math', () => {
|
|
89
|
+
it('single-bar anchor: AVWAP equals that bar typical price; stdDev = 0', () => {
|
|
90
|
+
const b0 = bar(100, 90, 95, 1000) // tp = 95
|
|
91
|
+
const series = computeAnchoredVwap([b0], 0, true)
|
|
92
|
+
expect(series).toHaveLength(1)
|
|
93
|
+
const p0 = series[0]!
|
|
94
|
+
expect(p0.barIndex).toBe(0)
|
|
95
|
+
expect(p0.vwap).toBeCloseTo(95, 12)
|
|
96
|
+
// stdDev is zero at the anchor when bands are requested → all four
|
|
97
|
+
// bands equal the AVWAP exactly.
|
|
98
|
+
expect(p0.upper1).toBeCloseTo(95, 12)
|
|
99
|
+
expect(p0.lower1).toBeCloseTo(95, 12)
|
|
100
|
+
expect(p0.upper2).toBeCloseTo(95, 12)
|
|
101
|
+
expect(p0.lower2).toBeCloseTo(95, 12)
|
|
102
|
+
expect(p0.cumulativeVolume).toBe(1000)
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
it('two bars: AVWAP[1] = (tp0*v0 + tp1*v1) / (v0 + v1)', () => {
|
|
106
|
+
// tp0 = (100+90+95)/3 = 95, v0 = 1000 → vwp0 = 95_000
|
|
107
|
+
// tp1 = (110+100+105)/3 = 105, v1 = 2000 → vwp1 = 210_000
|
|
108
|
+
// AVWAP[1] = (95_000 + 210_000) / (1000 + 2000) = 305_000 / 3000
|
|
109
|
+
const b0 = bar(100, 90, 95, 1000)
|
|
110
|
+
const b1 = bar(110, 100, 105, 2000)
|
|
111
|
+
const series = computeAnchoredVwap([b0, b1], 0, false)
|
|
112
|
+
|
|
113
|
+
expect(series).toHaveLength(2)
|
|
114
|
+
expect(series[0]!.vwap).toBeCloseTo(95, 12)
|
|
115
|
+
const expected = (95 * 1000 + 105 * 2000) / (1000 + 2000)
|
|
116
|
+
expect(series[1]!.vwap).toBeCloseTo(expected, 12)
|
|
117
|
+
expect(series[1]!.cumulativeVolume).toBe(3000)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it('10-bar slowly trending up: AVWAP is monotonically non-decreasing', () => {
|
|
121
|
+
// typical price rises by 1 per bar; constant volume.
|
|
122
|
+
const bars: AVWAPBar[] = []
|
|
123
|
+
for (let i = 0; i < 10; i++) {
|
|
124
|
+
const t = 100 + i // tp ≈ 100, 101, 102, ...
|
|
125
|
+
bars.push(bar(t + 1, t - 1, t, 100))
|
|
126
|
+
}
|
|
127
|
+
const series = computeAnchoredVwap(bars, 0, false)
|
|
128
|
+
for (let i = 1; i < series.length; i++) {
|
|
129
|
+
expect(series[i]!.vwap).toBeGreaterThanOrEqual(
|
|
130
|
+
series[i - 1]!.vwap,
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
// Sanity bound: AVWAP must lie inside the trading range.
|
|
134
|
+
expect(series[9]!.vwap).toBeGreaterThan(100)
|
|
135
|
+
expect(series[9]!.vwap).toBeLessThan(110)
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
it('high-volume bar dominates the AVWAP toward its typical price', () => {
|
|
139
|
+
// A massively oversized v on bar 2 should pull AVWAP toward tp(b2).
|
|
140
|
+
const b0 = bar(101, 99, 100, 10) // tp = 100
|
|
141
|
+
const b1 = bar(101, 99, 100, 10) // tp = 100
|
|
142
|
+
const b2 = bar(201, 199, 200, 1_000_000) // tp = 200, huge V
|
|
143
|
+
const series = computeAnchoredVwap([b0, b1, b2], 0, false)
|
|
144
|
+
// After the whale bar, AVWAP should be >>> 100 and close to 200.
|
|
145
|
+
expect(series[2]!.vwap).toBeGreaterThan(199)
|
|
146
|
+
expect(series[2]!.vwap).toBeLessThan(200)
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
it('anchorIndex > 0 ignores bars before the anchor', () => {
|
|
150
|
+
// Anchor at bar 2 → bars 0 and 1 must NOT contribute.
|
|
151
|
+
const ignored = bar(1000, 1000, 1000, 1_000_000) // massive but ignored
|
|
152
|
+
const b2 = bar(50, 50, 50, 100) // tp = 50
|
|
153
|
+
const b3 = bar(60, 60, 60, 100) // tp = 60
|
|
154
|
+
const series = computeAnchoredVwap([ignored, ignored, b2, b3], 2, false)
|
|
155
|
+
expect(series).toHaveLength(2)
|
|
156
|
+
expect(series[0]!.barIndex).toBe(2)
|
|
157
|
+
expect(series[1]!.barIndex).toBe(3)
|
|
158
|
+
expect(series[0]!.vwap).toBeCloseTo(50, 12)
|
|
159
|
+
// AVWAP at bar 3 = (50*100 + 60*100)/(200) = 55
|
|
160
|
+
expect(series[1]!.vwap).toBeCloseTo(55, 12)
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// Zero-volume handling
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
|
|
168
|
+
describe('computeAnchoredVwap — zero-volume handling', () => {
|
|
169
|
+
it('zero-volume bar mid-series carries forward the prior AVWAP', () => {
|
|
170
|
+
const b0 = bar(100, 100, 100, 1000) // tp = 100, vwap = 100
|
|
171
|
+
const b1 = bar(150, 150, 150, 0) // v = 0 → carry forward
|
|
172
|
+
const b2 = bar(110, 110, 110, 1000) // tp = 110
|
|
173
|
+
const series = computeAnchoredVwap([b0, b1, b2], 0, false)
|
|
174
|
+
|
|
175
|
+
expect(series).toHaveLength(3)
|
|
176
|
+
// Point 0: vwap = 100.
|
|
177
|
+
expect(series[0]!.vwap).toBeCloseTo(100, 12)
|
|
178
|
+
// Point 1: sumVol unchanged → vwap is still 100 (carry forward).
|
|
179
|
+
expect(series[1]!.vwap).toBeCloseTo(100, 12)
|
|
180
|
+
expect(series[1]!.cumulativeVolume).toBe(1000)
|
|
181
|
+
// Point 2: (100*1000 + 110*1000) / 2000 = 105
|
|
182
|
+
expect(series[2]!.vwap).toBeCloseTo(105, 12)
|
|
183
|
+
expect(series[2]!.cumulativeVolume).toBe(2000)
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
it('zero-volume anchor: first point is NaN, second is its own typical price', () => {
|
|
187
|
+
const b0 = bar(100, 100, 100, 0) // anchor — v = 0
|
|
188
|
+
const b1 = bar(200, 200, 200, 1000) // tp = 200
|
|
189
|
+
const series = computeAnchoredVwap([b0, b1], 0, true)
|
|
190
|
+
|
|
191
|
+
expect(series).toHaveLength(2)
|
|
192
|
+
// Point 0: NaN everywhere; cumulativeVolume is still 0.
|
|
193
|
+
expect(Number.isNaN(series[0]!.vwap)).toBe(true)
|
|
194
|
+
expect(Number.isNaN(series[0]!.upper1)).toBe(true)
|
|
195
|
+
expect(Number.isNaN(series[0]!.lower1)).toBe(true)
|
|
196
|
+
expect(Number.isNaN(series[0]!.upper2)).toBe(true)
|
|
197
|
+
expect(Number.isNaN(series[0]!.lower2)).toBe(true)
|
|
198
|
+
expect(series[0]!.cumulativeVolume).toBe(0)
|
|
199
|
+
// Point 1: sumVol becomes 1000 → vwap = tp(b1) = 200.
|
|
200
|
+
expect(series[1]!.vwap).toBeCloseTo(200, 12)
|
|
201
|
+
expect(series[1]!.cumulativeVolume).toBe(1000)
|
|
202
|
+
})
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Bands
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
|
|
209
|
+
describe('computeAnchoredVwap — bands', () => {
|
|
210
|
+
it('includeBands=false: upper1/lower1/upper2/lower2 all equal vwap', () => {
|
|
211
|
+
const b0 = bar(100, 90, 95, 1000)
|
|
212
|
+
const b1 = bar(110, 100, 105, 2000)
|
|
213
|
+
const series = computeAnchoredVwap([b0, b1], 0, false)
|
|
214
|
+
for (const p of series) {
|
|
215
|
+
expect(p.upper1).toBe(p.vwap)
|
|
216
|
+
expect(p.lower1).toBe(p.vwap)
|
|
217
|
+
expect(p.upper2).toBe(p.vwap)
|
|
218
|
+
expect(p.lower2).toBe(p.vwap)
|
|
219
|
+
}
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
it('at the anchor stdDev = 0 → upper/lower bands equal AVWAP exactly', () => {
|
|
223
|
+
const b0 = bar(101, 99, 100, 1000) // tp = 100
|
|
224
|
+
const series = computeAnchoredVwap([b0], 0, true)
|
|
225
|
+
expect(series[0]!.vwap).toBeCloseTo(100, 12)
|
|
226
|
+
// Bands collapse onto the line because there is no deviation yet.
|
|
227
|
+
expect(series[0]!.upper1).toBe(series[0]!.vwap)
|
|
228
|
+
expect(series[0]!.lower1).toBe(series[0]!.vwap)
|
|
229
|
+
expect(series[0]!.upper2).toBe(series[0]!.vwap)
|
|
230
|
+
expect(series[0]!.lower2).toBe(series[0]!.vwap)
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
it('ascending series with constant volume: upper1 > vwap > lower1 monotonically (sanity)', () => {
|
|
234
|
+
// Once dispersion appears (bar 1+), upper1 must strictly exceed
|
|
235
|
+
// vwap and lower1 must strictly trail it.
|
|
236
|
+
const bars: AVWAPBar[] = []
|
|
237
|
+
for (let i = 0; i < 10; i++) {
|
|
238
|
+
const t = 100 + i
|
|
239
|
+
bars.push(bar(t, t, t, 100))
|
|
240
|
+
}
|
|
241
|
+
const series = computeAnchoredVwap(bars, 0, true)
|
|
242
|
+
// Skip i = 0 (stdDev = 0). From i = 1 onward dispersion is positive.
|
|
243
|
+
for (let i = 1; i < series.length; i++) {
|
|
244
|
+
expect(series[i]!.upper1).toBeGreaterThan(series[i]!.vwap)
|
|
245
|
+
expect(series[i]!.lower1).toBeLessThan(series[i]!.vwap)
|
|
246
|
+
// 2σ envelope strictly contains 1σ envelope.
|
|
247
|
+
expect(series[i]!.upper2).toBeGreaterThan(series[i]!.upper1)
|
|
248
|
+
expect(series[i]!.lower2).toBeLessThan(series[i]!.lower1)
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
it('bands use prevailing AVWAP at j, not final AVWAP(i)', () => {
|
|
253
|
+
// Concrete 3-bar fixture engineered so the two formulas disagree
|
|
254
|
+
// by a measurable amount. tp/v chosen to keep the arithmetic
|
|
255
|
+
// verifiable by hand.
|
|
256
|
+
//
|
|
257
|
+
// bar j tp_j v_j AVWAP_j (prevailing)
|
|
258
|
+
// 0 100 1000 100
|
|
259
|
+
// 1 110 1000 105
|
|
260
|
+
// 2 120 1000 110
|
|
261
|
+
//
|
|
262
|
+
// sumVol = 3000
|
|
263
|
+
// sumVwp = 100_000 + 110_000 + 120_000 = 330_000
|
|
264
|
+
// AVWAP_2 = 110 (the "final" mean)
|
|
265
|
+
//
|
|
266
|
+
// CORRECT formula (prevailing AVWAP at j):
|
|
267
|
+
// sqDev(0) = (100 - 100)^2 * 1000 = 0
|
|
268
|
+
// sqDev(1) = (110 - 105)^2 * 1000 = 25_000
|
|
269
|
+
// sqDev(2) = (120 - 110)^2 * 1000 = 100_000
|
|
270
|
+
// sumSqDev = 125_000
|
|
271
|
+
// variance = 125_000 / 3_000 ≈ 41.6667
|
|
272
|
+
// stdDev ≈ 6.4550
|
|
273
|
+
//
|
|
274
|
+
// WRONG formula (final AVWAP for every j):
|
|
275
|
+
// sqDev(0) = (100 - 110)^2 * 1000 = 100_000
|
|
276
|
+
// sqDev(1) = (110 - 110)^2 * 1000 = 0
|
|
277
|
+
// sqDev(2) = (120 - 110)^2 * 1000 = 100_000
|
|
278
|
+
// sumSqDev = 200_000
|
|
279
|
+
// variance = 200_000 / 3_000 ≈ 66.6667
|
|
280
|
+
// stdDev ≈ 8.1650
|
|
281
|
+
//
|
|
282
|
+
// The two stdDevs differ by ~1.7 → upper1 differs by ~1.7. The
|
|
283
|
+
// test pins the CORRECT value; a regression to the wrong formula
|
|
284
|
+
// would fail loudly here.
|
|
285
|
+
const b0 = bar(100, 100, 100, 1000)
|
|
286
|
+
const b1 = bar(110, 110, 110, 1000)
|
|
287
|
+
const b2 = bar(120, 120, 120, 1000)
|
|
288
|
+
const series = computeAnchoredVwap([b0, b1, b2], 0, true)
|
|
289
|
+
|
|
290
|
+
// Final AVWAP is 110 either way.
|
|
291
|
+
expect(series[2]!.vwap).toBeCloseTo(110, 12)
|
|
292
|
+
|
|
293
|
+
// Hand-computed using the prevailing-AVWAP rule.
|
|
294
|
+
const expectedStdDev = Math.sqrt(125_000 / 3000)
|
|
295
|
+
expect(series[2]!.upper1).toBeCloseTo(110 + expectedStdDev, 9)
|
|
296
|
+
expect(series[2]!.lower1).toBeCloseTo(110 - expectedStdDev, 9)
|
|
297
|
+
expect(series[2]!.upper2).toBeCloseTo(110 + 2 * expectedStdDev, 9)
|
|
298
|
+
expect(series[2]!.lower2).toBeCloseTo(110 - 2 * expectedStdDev, 9)
|
|
299
|
+
|
|
300
|
+
// Sanity: the WRONG-formula stdDev would be sqrt(200_000 / 3000).
|
|
301
|
+
// If a regression switched to that formula, the assertion above
|
|
302
|
+
// would fail by ~1.7 — well outside `toBeCloseTo(_, 9)`.
|
|
303
|
+
const wrongStdDev = Math.sqrt(200_000 / 3000)
|
|
304
|
+
expect(Math.abs(expectedStdDev - wrongStdDev)).toBeGreaterThan(1)
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
it('mixed-volume bars: bands match a hand-computed reference', () => {
|
|
308
|
+
// Sanity check that the prevailing formula also handles uneven
|
|
309
|
+
// volumes (the formula is variance-weighted, not equal-weighted).
|
|
310
|
+
const b0 = bar(100, 100, 100, 1000) // tp = 100
|
|
311
|
+
const b1 = bar(120, 120, 120, 3000) // tp = 120
|
|
312
|
+
const series = computeAnchoredVwap([b0, b1], 0, true)
|
|
313
|
+
|
|
314
|
+
// sumVwp = 100*1000 + 120*3000 = 460_000
|
|
315
|
+
// sumVol = 4000
|
|
316
|
+
// AVWAP[1] = 115
|
|
317
|
+
expect(series[1]!.vwap).toBeCloseTo(115, 12)
|
|
318
|
+
|
|
319
|
+
// sqDev(0): (100 - 100)^2 * 1000 = 0 (AVWAP_0 = 100, prevailing)
|
|
320
|
+
// sqDev(1): (120 - 115)^2 * 3000 = 75_000
|
|
321
|
+
// sumSqDev = 75_000
|
|
322
|
+
// variance = 75_000 / 4000 = 18.75
|
|
323
|
+
// stdDev = 4.330127...
|
|
324
|
+
const stdDev = Math.sqrt(75_000 / 4000)
|
|
325
|
+
expect(series[1]!.upper1).toBeCloseTo(115 + stdDev, 9)
|
|
326
|
+
expect(series[1]!.lower1).toBeCloseTo(115 - stdDev, 9)
|
|
327
|
+
// Use the locally-derived tp helper to avoid bit-rot: we want
|
|
328
|
+
// the test to use the same tp formula the implementation does.
|
|
329
|
+
expect(tp(b1)).toBe(120)
|
|
330
|
+
})
|
|
331
|
+
})
|