@forgecharts/sdk 1.1.23 → 1.1.28
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/__tests__/backwardCompatibility.test.d.ts +14 -0
- package/dist/__tests__/backwardCompatibility.test.d.ts.map +1 -0
- package/dist/__tests__/backwardCompatibility.test.js +159 -0
- package/dist/__tests__/backwardCompatibility.test.js.map +1 -0
- package/dist/__tests__/candleInvariant.test.d.ts +20 -0
- package/dist/__tests__/candleInvariant.test.d.ts.map +1 -0
- package/dist/__tests__/candleInvariant.test.js +415 -0
- package/dist/__tests__/candleInvariant.test.js.map +1 -0
- package/dist/__tests__/public-api-surface.d.ts +13 -0
- package/dist/__tests__/public-api-surface.d.ts.map +1 -0
- package/{src/__tests__/public-api-surface.ts → dist/__tests__/public-api-surface.js} +4 -42
- package/dist/__tests__/public-api-surface.js.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.js +452 -0
- package/dist/__tests__/timeframeBoundary.test.js.map +1 -0
- package/dist/api/DrawingManager.d.ts +20 -0
- package/dist/api/DrawingManager.d.ts.map +1 -0
- package/dist/api/DrawingManager.js +190 -0
- package/dist/api/DrawingManager.js.map +1 -0
- package/dist/api/EventBus.d.ts +19 -0
- package/dist/api/EventBus.d.ts.map +1 -0
- package/dist/api/EventBus.js +44 -0
- package/dist/api/EventBus.js.map +1 -0
- package/dist/api/IndicatorDAG.d.ts +85 -0
- package/dist/api/IndicatorDAG.d.ts.map +1 -0
- package/dist/api/IndicatorDAG.js +316 -0
- package/dist/api/IndicatorDAG.js.map +1 -0
- package/dist/api/IndicatorRegistry.d.ts +22 -0
- package/dist/api/IndicatorRegistry.d.ts.map +1 -0
- package/dist/api/IndicatorRegistry.js +39 -0
- package/dist/api/IndicatorRegistry.js.map +1 -0
- package/dist/api/LayoutManager.d.ts +30 -0
- package/dist/api/LayoutManager.d.ts.map +1 -0
- package/dist/api/LayoutManager.js +51 -0
- package/dist/api/LayoutManager.js.map +1 -0
- package/dist/api/PaneManager.d.ts +42 -0
- package/dist/api/PaneManager.d.ts.map +1 -0
- package/dist/api/PaneManager.js +119 -0
- package/dist/api/PaneManager.js.map +1 -0
- package/dist/api/ReferenceAPI.d.ts +78 -0
- package/dist/api/ReferenceAPI.d.ts.map +1 -0
- package/dist/api/ReferenceAPI.js +153 -0
- package/dist/api/ReferenceAPI.js.map +1 -0
- package/dist/api/TChart.d.ts +345 -0
- package/dist/api/TChart.d.ts.map +1 -0
- package/dist/api/TChart.js +765 -0
- package/dist/api/TChart.js.map +1 -0
- package/{src/api/createChart.ts → dist/api/createChart.d.ts} +2 -7
- package/dist/api/createChart.d.ts.map +1 -0
- package/dist/api/createChart.js +42 -0
- package/dist/api/createChart.js.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts +4 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js +22 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.js +16 -0
- package/dist/api/drawing tools/lines menu/crossLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts +17 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js +59 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js +17 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js +41 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.js +19 -0
- package/dist/api/drawing tools/lines menu/horizontal.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js +20 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.js +107 -0
- package/dist/api/drawing tools/lines menu/infoLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js +31 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js +43 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js +12 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.js +23 -0
- package/dist/api/drawing tools/lines menu/ray.js.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js +127 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js +51 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.js +11 -0
- package/dist/api/drawing tools/lines menu/trendline.js.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.js +11 -0
- package/dist/api/drawing tools/lines menu/vertical.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts +16 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.js } +6 -7
- package/dist/api/drawing tools/pointers menu/crosshair.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts +15 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/cursor.ts → dist/api/drawing tools/pointers menu/cursor.js } +7 -8
- package/dist/api/drawing tools/pointers menu/cursor.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts +30 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.js } +9 -14
- package/dist/api/drawing tools/pointers menu/demonstration.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts +23 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.js } +8 -11
- package/dist/api/drawing tools/pointers menu/dot.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js +19 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.js +25 -0
- package/dist/api/drawing tools/shapes menu/text.js.map +1 -0
- package/dist/api/drawingUtils.d.ts +22 -0
- package/dist/api/drawingUtils.d.ts.map +1 -0
- package/dist/api/drawingUtils.js +83 -0
- package/dist/api/drawingUtils.js.map +1 -0
- package/dist/core/CanvasLayer.d.ts +26 -0
- package/dist/core/CanvasLayer.d.ts.map +1 -0
- package/dist/core/CanvasLayer.js +56 -0
- package/dist/core/CanvasLayer.js.map +1 -0
- package/dist/core/Chart.d.ts +164 -0
- package/dist/core/Chart.d.ts.map +1 -0
- package/dist/core/Chart.js +839 -0
- package/dist/core/Chart.js.map +1 -0
- package/dist/core/CoordTransform.d.ts +168 -0
- package/dist/core/CoordTransform.d.ts.map +1 -0
- package/dist/core/CoordTransform.js +224 -0
- package/dist/core/CoordTransform.js.map +1 -0
- package/dist/core/Crosshair.d.ts +30 -0
- package/dist/core/Crosshair.d.ts.map +1 -0
- package/dist/core/Crosshair.js +186 -0
- package/dist/core/Crosshair.js.map +1 -0
- package/dist/core/IndicatorEngine.d.ts +51 -0
- package/dist/core/IndicatorEngine.d.ts.map +1 -0
- package/dist/core/IndicatorEngine.js +181 -0
- package/dist/core/IndicatorEngine.js.map +1 -0
- package/dist/core/InteractionManager.d.ts +197 -0
- package/dist/core/InteractionManager.d.ts.map +1 -0
- package/dist/core/InteractionManager.js +698 -0
- package/dist/core/InteractionManager.js.map +1 -0
- package/dist/core/PriceScale.d.ts +27 -0
- package/dist/core/PriceScale.d.ts.map +1 -0
- package/dist/core/PriceScale.js +113 -0
- package/dist/core/PriceScale.js.map +1 -0
- package/dist/core/Series.d.ts +40 -0
- package/dist/core/Series.d.ts.map +1 -0
- package/dist/core/Series.js +114 -0
- package/dist/core/Series.js.map +1 -0
- package/dist/core/TimeScale.d.ts +43 -0
- package/dist/core/TimeScale.d.ts.map +1 -0
- package/dist/core/TimeScale.js +150 -0
- package/dist/core/TimeScale.js.map +1 -0
- package/dist/datafeed/DatafeedConnector.d.ts +89 -0
- package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
- package/dist/datafeed/DatafeedConnector.js +268 -0
- package/dist/datafeed/DatafeedConnector.js.map +1 -0
- package/dist/engine/CandleEngine.d.ts +207 -0
- package/dist/engine/CandleEngine.d.ts.map +1 -0
- package/dist/engine/CandleEngine.js +318 -0
- package/dist/engine/CandleEngine.js.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts +2 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.js +300 -0
- package/dist/engine/__tests__/CandleEngine.test.js.map +1 -0
- package/dist/engine/candleInvariants.d.ts +66 -0
- package/dist/engine/candleInvariants.d.ts.map +1 -0
- package/dist/engine/candleInvariants.js +134 -0
- package/dist/engine/candleInvariants.js.map +1 -0
- package/{src/engine/mergeUtils.ts → dist/engine/mergeUtils.d.ts} +15 -52
- package/dist/engine/mergeUtils.d.ts.map +1 -0
- package/dist/engine/mergeUtils.js +64 -0
- package/dist/engine/mergeUtils.js.map +1 -0
- package/dist/engine/timeframeUtils.d.ts +80 -0
- package/dist/engine/timeframeUtils.d.ts.map +1 -0
- package/{src/engine/timeframeUtils.ts → dist/engine/timeframeUtils.js} +30 -48
- package/dist/engine/timeframeUtils.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +29 -0
- package/dist/internal.d.ts.map +1 -0
- package/{src/internal.ts → dist/internal.js} +2 -11
- package/dist/internal.js.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts +233 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.js +310 -0
- package/dist/licensing/ChartRuntimeResolver.js.map +1 -0
- package/dist/licensing/LicenseManager.d.ts +55 -0
- package/dist/licensing/LicenseManager.d.ts.map +1 -0
- package/dist/licensing/LicenseManager.js +114 -0
- package/dist/licensing/LicenseManager.js.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +13 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +177 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts +12 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.js +153 -0
- package/dist/licensing/__tests__/LicenseManager.test.js.map +1 -0
- package/dist/licensing/licenseTypes.d.ts +18 -0
- package/dist/licensing/licenseTypes.d.ts.map +1 -0
- package/dist/licensing/licenseTypes.js +2 -0
- package/dist/licensing/licenseTypes.js.map +1 -0
- package/dist/pine/PineCompiler.d.ts +35 -0
- package/dist/pine/PineCompiler.d.ts.map +1 -0
- package/dist/pine/PineCompiler.js +44 -0
- package/dist/pine/PineCompiler.js.map +1 -0
- package/dist/pine/diagnostics.d.ts +20 -0
- package/dist/pine/diagnostics.d.ts.map +1 -0
- package/dist/pine/diagnostics.js +11 -0
- package/dist/pine/diagnostics.js.map +1 -0
- package/{src/pine/index.ts → dist/pine/index.d.ts} +4 -3
- package/dist/pine/index.d.ts.map +1 -0
- package/dist/pine/index.js +5 -0
- package/dist/pine/index.js.map +1 -0
- package/dist/pine/pine-ast.d.ts +142 -0
- package/dist/pine/pine-ast.d.ts.map +1 -0
- package/dist/pine/pine-ast.js +19 -0
- package/dist/pine/pine-ast.js.map +1 -0
- package/dist/pine/pine-lexer.d.ts +41 -0
- package/dist/pine/pine-lexer.d.ts.map +1 -0
- package/dist/pine/pine-lexer.js +249 -0
- package/dist/pine/pine-lexer.js.map +1 -0
- package/dist/pine/pine-parser.d.ts +51 -0
- package/dist/pine/pine-parser.d.ts.map +1 -0
- package/dist/pine/pine-parser.js +416 -0
- package/dist/pine/pine-parser.js.map +1 -0
- package/dist/pine/pine-transpiler.d.ts +33 -0
- package/dist/pine/pine-transpiler.d.ts.map +1 -0
- package/dist/pine/pine-transpiler.js +260 -0
- package/dist/pine/pine-transpiler.js.map +1 -0
- package/dist/pixi/LayerName.d.ts +18 -0
- package/dist/pixi/LayerName.d.ts.map +1 -0
- package/dist/pixi/LayerName.js +35 -0
- package/dist/pixi/LayerName.js.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.js +107 -0
- package/dist/pixi/PixiCandlestickRenderer.js.map +1 -0
- package/dist/pixi/PixiChart.d.ts +72 -0
- package/dist/pixi/PixiChart.d.ts.map +1 -0
- package/dist/pixi/PixiChart.js +367 -0
- package/dist/pixi/PixiChart.js.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.js +110 -0
- package/dist/pixi/PixiCrosshairRenderer.js.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.js +111 -0
- package/dist/pixi/PixiDrawingRenderer.js.map +1 -0
- package/dist/pixi/PixiGridRenderer.d.ts +22 -0
- package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiGridRenderer.js +114 -0
- package/dist/pixi/PixiGridRenderer.js.map +1 -0
- package/dist/pixi/PixiLayerManager.d.ts +56 -0
- package/dist/pixi/PixiLayerManager.d.ts.map +1 -0
- package/dist/pixi/PixiLayerManager.js +92 -0
- package/dist/pixi/PixiLayerManager.js.map +1 -0
- package/dist/react/canvas/ChartCanvas.d.ts +85 -0
- package/dist/react/canvas/ChartCanvas.d.ts.map +1 -0
- package/dist/react/canvas/ChartCanvas.js +604 -0
- package/dist/react/canvas/ChartCanvas.js.map +1 -0
- package/dist/react/canvas/ChartContextMenu.d.ts +18 -0
- package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -0
- package/dist/react/canvas/ChartContextMenu.js +5 -0
- package/dist/react/canvas/ChartContextMenu.js.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts +25 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.js +28 -0
- package/dist/react/canvas/ChartSettingsDialog.js.map +1 -0
- package/dist/react/canvas/IndicatorLabel.d.ts +21 -0
- package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorLabel.js +196 -0
- package/dist/react/canvas/IndicatorLabel.js.map +1 -0
- package/dist/react/canvas/IndicatorPane.d.ts +32 -0
- package/dist/react/canvas/IndicatorPane.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorPane.js +395 -0
- package/dist/react/canvas/IndicatorPane.js.map +1 -0
- package/dist/react/canvas/PointerOverlay.d.ts +23 -0
- package/dist/react/canvas/PointerOverlay.d.ts.map +1 -0
- package/dist/react/canvas/PointerOverlay.js +61 -0
- package/dist/react/canvas/PointerOverlay.js.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts +19 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js +407 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js.map +1 -0
- package/dist/react/hooks/useChartCapabilities.d.ts +21 -0
- package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
- package/dist/react/hooks/useChartCapabilities.js +66 -0
- package/dist/react/hooks/useChartCapabilities.js.map +1 -0
- package/dist/react/index.d.ts +30 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +28 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/internal.d.ts +38 -0
- package/dist/react/internal.d.ts.map +1 -0
- package/dist/react/internal.js +44 -0
- package/dist/react/internal.js.map +1 -0
- package/dist/react/shell/ManagedAppShell.d.ts +91 -0
- package/dist/react/shell/ManagedAppShell.d.ts.map +1 -0
- package/dist/react/shell/ManagedAppShell.js +440 -0
- package/dist/react/shell/ManagedAppShell.js.map +1 -0
- package/dist/react/trading/TradingBridge.d.ts +86 -0
- package/dist/react/trading/TradingBridge.d.ts.map +1 -0
- package/dist/react/trading/TradingBridge.js +73 -0
- package/dist/react/trading/TradingBridge.js.map +1 -0
- package/dist/react/workspace/ChartWorkspace.d.ts +73 -0
- package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -0
- package/dist/react/workspace/ChartWorkspace.js +42 -0
- package/dist/react/workspace/ChartWorkspace.js.map +1 -0
- package/dist/react/workspace/FloatingPanel.d.ts +18 -0
- package/dist/react/workspace/FloatingPanel.d.ts.map +1 -0
- package/dist/react/workspace/FloatingPanel.js +82 -0
- package/dist/react/workspace/FloatingPanel.js.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts +8 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.js +121 -0
- package/dist/react/workspace/IndicatorsDialog.js.map +1 -0
- package/dist/react/workspace/LayoutMenu.d.ts +33 -0
- package/dist/react/workspace/LayoutMenu.d.ts.map +1 -0
- package/dist/react/workspace/LayoutMenu.js +113 -0
- package/dist/react/workspace/LayoutMenu.js.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts +10 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.js +245 -0
- package/dist/react/workspace/SymbolSearchDialog.js.map +1 -0
- package/dist/react/workspace/TabBar.d.ts +17 -0
- package/dist/react/workspace/TabBar.d.ts.map +1 -0
- package/dist/react/workspace/TabBar.js +29 -0
- package/dist/react/workspace/TabBar.js.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts +19 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js +236 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts +8 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.js +18 -0
- package/dist/react/workspace/toolbars/RightToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts +41 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.js +82 -0
- package/dist/react/workspace/toolbars/TopToolbar.js.map +1 -0
- package/dist/renderers/CandlestickRenderer.d.ts +13 -0
- package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
- package/dist/renderers/CandlestickRenderer.js +98 -0
- package/dist/renderers/CandlestickRenderer.js.map +1 -0
- package/dist/renderers/HistogramRenderer.d.ts +11 -0
- package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
- package/dist/renderers/HistogramRenderer.js +50 -0
- package/dist/renderers/HistogramRenderer.js.map +1 -0
- package/dist/renderers/LineRenderer.d.ts +12 -0
- package/dist/renderers/LineRenderer.d.ts.map +1 -0
- package/dist/renderers/LineRenderer.js +64 -0
- package/dist/renderers/LineRenderer.js.map +1 -0
- package/dist/theme/colors.d.ts +4 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +19 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/tools/barDivergenceCheck.d.ts +120 -0
- package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
- package/dist/tools/barDivergenceCheck.js +200 -0
- package/dist/tools/barDivergenceCheck.js.map +1 -0
- package/dist/trading/TradingOverlayStore.d.ts +86 -0
- package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
- package/dist/trading/TradingOverlayStore.js +139 -0
- package/dist/trading/TradingOverlayStore.js.map +1 -0
- package/dist/trading/UnmanagedIngestion.d.ts +91 -0
- package/dist/trading/UnmanagedIngestion.d.ts.map +1 -0
- package/dist/trading/UnmanagedIngestion.js +114 -0
- package/dist/trading/UnmanagedIngestion.js.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts +18 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js +271 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts +16 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js +267 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts +16 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js +170 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +1 -0
- package/dist/trading/managed/ManagedTradingController.d.ts +110 -0
- package/dist/trading/managed/ManagedTradingController.d.ts.map +1 -0
- package/dist/trading/managed/ManagedTradingController.js +247 -0
- package/dist/trading/managed/ManagedTradingController.js.map +1 -0
- package/dist/trading/managed/managedCapabilities.d.ts +45 -0
- package/dist/trading/managed/managedCapabilities.d.ts.map +1 -0
- package/dist/trading/managed/managedCapabilities.js +79 -0
- package/dist/trading/managed/managedCapabilities.js.map +1 -0
- package/dist/trading/managed/managedTypes.d.ts +122 -0
- package/dist/trading/managed/managedTypes.d.ts.map +1 -0
- package/dist/trading/managed/managedTypes.js +13 -0
- package/dist/trading/managed/managedTypes.js.map +1 -0
- package/dist/trading/tradingTypes.d.ts +89 -0
- package/dist/trading/tradingTypes.d.ts.map +1 -0
- package/dist/trading/tradingTypes.js +8 -0
- package/dist/trading/tradingTypes.js.map +1 -0
- package/dist/tscript/TScriptIndicator.d.ts +41 -0
- package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
- package/dist/tscript/TScriptIndicator.js +47 -0
- package/dist/tscript/TScriptIndicator.js.map +1 -0
- package/dist/tscript/ast.d.ts +89 -0
- package/dist/tscript/ast.d.ts.map +1 -0
- package/dist/tscript/ast.js +22 -0
- package/dist/tscript/ast.js.map +1 -0
- package/dist/tscript/lexer.d.ts +36 -0
- package/dist/tscript/lexer.d.ts.map +1 -0
- package/dist/tscript/lexer.js +187 -0
- package/dist/tscript/lexer.js.map +1 -0
- package/dist/tscript/parser.d.ts +50 -0
- package/dist/tscript/parser.d.ts.map +1 -0
- package/dist/tscript/parser.js +318 -0
- package/dist/tscript/parser.js.map +1 -0
- package/dist/tscript/runtime.d.ts +123 -0
- package/dist/tscript/runtime.d.ts.map +1 -0
- package/dist/tscript/runtime.js +475 -0
- package/dist/tscript/runtime.js.map +1 -0
- package/dist/tscript/series.d.ts +49 -0
- package/dist/tscript/series.d.ts.map +1 -0
- package/dist/tscript/series.js +79 -0
- package/dist/tscript/series.js.map +1 -0
- package/dist/types/IChart.d.ts +48 -0
- package/dist/types/IChart.d.ts.map +1 -0
- package/dist/types/IChart.js +2 -0
- package/dist/types/IChart.js.map +1 -0
- package/{src/types/IRenderer.ts → dist/types/IRenderer.d.ts} +2 -8
- package/dist/types/IRenderer.d.ts.map +1 -0
- package/dist/types/IRenderer.js +2 -0
- package/dist/types/IRenderer.js.map +1 -0
- package/dist/types/ISeries.d.ts +26 -0
- package/dist/types/ISeries.d.ts.map +1 -0
- package/dist/types/ISeries.js +2 -0
- package/dist/types/ISeries.js.map +1 -0
- package/package.json +32 -4
- package/src/__tests__/backwardCompatibility.test.ts +0 -191
- package/src/__tests__/candleInvariant.test.ts +0 -500
- package/src/__tests__/timeframeBoundary.test.ts +0 -583
- package/src/api/DrawingManager.ts +0 -188
- package/src/api/EventBus.ts +0 -53
- package/src/api/IndicatorDAG.ts +0 -389
- package/src/api/IndicatorRegistry.ts +0 -47
- package/src/api/LayoutManager.ts +0 -72
- package/src/api/PaneManager.ts +0 -129
- package/src/api/ReferenceAPI.ts +0 -195
- package/src/api/TChart.ts +0 -881
- package/src/api/drawing tools/fib gann menu/fibRetracement.ts +0 -27
- package/src/api/drawing tools/lines menu/crossLine.ts +0 -21
- package/src/api/drawing tools/lines menu/disjointChannel.ts +0 -74
- package/src/api/drawing tools/lines menu/extendedLine.ts +0 -22
- package/src/api/drawing tools/lines menu/flatTopBottom.ts +0 -45
- package/src/api/drawing tools/lines menu/horizontal.ts +0 -24
- package/src/api/drawing tools/lines menu/horizontalRay.ts +0 -25
- package/src/api/drawing tools/lines menu/infoLine.ts +0 -127
- package/src/api/drawing tools/lines menu/insidePitchfork.ts +0 -21
- package/src/api/drawing tools/lines menu/modifiedSchiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/parallelChannel.ts +0 -47
- package/src/api/drawing tools/lines menu/pitchfork.ts +0 -15
- package/src/api/drawing tools/lines menu/ray.ts +0 -28
- package/src/api/drawing tools/lines menu/regressionTrend.ts +0 -157
- package/src/api/drawing tools/lines menu/schiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/trendAngle.ts +0 -64
- package/src/api/drawing tools/lines menu/trendline.ts +0 -16
- package/src/api/drawing tools/lines menu/vertical.ts +0 -16
- package/src/api/drawing tools/shapes menu/rectangle.ts +0 -24
- package/src/api/drawing tools/shapes menu/text.ts +0 -30
- package/src/api/drawingUtils.ts +0 -82
- package/src/core/CanvasLayer.ts +0 -77
- package/src/core/Chart.ts +0 -917
- package/src/core/CoordTransform.ts +0 -282
- package/src/core/Crosshair.ts +0 -207
- package/src/core/IndicatorEngine.ts +0 -216
- package/src/core/InteractionManager.ts +0 -899
- package/src/core/PriceScale.ts +0 -133
- package/src/core/Series.ts +0 -132
- package/src/core/TimeScale.ts +0 -175
- package/src/datafeed/DatafeedConnector.ts +0 -300
- package/src/engine/CandleEngine.ts +0 -458
- package/src/engine/__tests__/CandleEngine.test.ts +0 -402
- package/src/engine/candleInvariants.ts +0 -172
- package/src/index.ts +0 -190
- package/src/licensing/ChartRuntimeResolver.ts +0 -380
- package/src/licensing/LicenseManager.ts +0 -131
- package/src/licensing/__tests__/ChartRuntimeResolver.test.ts +0 -207
- package/src/licensing/__tests__/LicenseManager.test.ts +0 -180
- package/src/licensing/licenseTypes.ts +0 -19
- package/src/pine/PineCompiler.ts +0 -68
- package/src/pine/diagnostics.ts +0 -30
- package/src/pine/pine-ast.ts +0 -163
- package/src/pine/pine-lexer.ts +0 -265
- package/src/pine/pine-parser.ts +0 -439
- package/src/pine/pine-transpiler.ts +0 -301
- package/src/pixi/LayerName.ts +0 -35
- package/src/pixi/PixiCandlestickRenderer.ts +0 -125
- package/src/pixi/PixiChart.ts +0 -425
- package/src/pixi/PixiCrosshairRenderer.ts +0 -134
- package/src/pixi/PixiDrawingRenderer.ts +0 -121
- package/src/pixi/PixiGridRenderer.ts +0 -136
- package/src/pixi/PixiLayerManager.ts +0 -102
- package/src/renderers/CandlestickRenderer.ts +0 -130
- package/src/renderers/HistogramRenderer.ts +0 -63
- package/src/renderers/LineRenderer.ts +0 -77
- package/src/theme/colors.ts +0 -21
- package/src/tools/barDivergenceCheck.ts +0 -305
- package/src/trading/TradingOverlayStore.ts +0 -161
- package/src/trading/UnmanagedIngestion.ts +0 -156
- package/src/trading/__tests__/ManagedTradingController.test.ts +0 -338
- package/src/trading/__tests__/TradingOverlayStore.test.ts +0 -323
- package/src/trading/__tests__/UnmanagedIngestion.test.ts +0 -205
- package/src/trading/managed/ManagedTradingController.ts +0 -292
- package/src/trading/managed/managedCapabilities.ts +0 -98
- package/src/trading/managed/managedTypes.ts +0 -151
- package/src/trading/tradingTypes.ts +0 -135
- package/src/tscript/TScriptIndicator.ts +0 -54
- package/src/tscript/ast.ts +0 -105
- package/src/tscript/lexer.ts +0 -190
- package/src/tscript/parser.ts +0 -334
- package/src/tscript/runtime.ts +0 -525
- package/src/tscript/series.ts +0 -84
- package/src/types/IChart.ts +0 -56
- package/src/types/ISeries.ts +0 -30
- package/tsconfig.json +0 -22
- package/tsup.config.ts +0 -15
- package/vitest.config.ts +0 -25
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CandleEngine.test.js","sourceRoot":"","sources":["../../../src/engine/__tests__/CandleEngine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Candle Invariant Guards
|
|
3
|
+
*
|
|
4
|
+
* Defensive assertions for the CandleEngine update pipeline.
|
|
5
|
+
* All guards are no-ops in production (`NODE_ENV === 'production'`).
|
|
6
|
+
*
|
|
7
|
+
* Design principles:
|
|
8
|
+
* - Each guard checks exactly ONE invariant and logs a descriptive warning.
|
|
9
|
+
* - Guards never throw by default — they warn so streaming data is never blocked.
|
|
10
|
+
* - Call sites pass a `context` string that identifies where the check ran.
|
|
11
|
+
* - A test harness can replace `_reporter` to assert on violations.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* import { assertOhlcRelationships, assertNotFinalized } from './candleInvariants';
|
|
15
|
+
*/
|
|
16
|
+
import type { CandleBar } from './CandleEngine';
|
|
17
|
+
/** Called for every invariant violation. Replaced in unit tests. */
|
|
18
|
+
export declare let _reporter: (message: string) => void;
|
|
19
|
+
/** Replace the violation reporter (for unit-test assertions). */
|
|
20
|
+
export declare function _setReporter(fn: (message: string) => void): void;
|
|
21
|
+
/** Re-install the default console.warn reporter. */
|
|
22
|
+
export declare function _resetReporter(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Verify that `high >= open, close, low` and `low <= open, close`.
|
|
25
|
+
*
|
|
26
|
+
* Floats from external feeds can occasionally violate these due to rounding.
|
|
27
|
+
* This guard surfaces them immediately rather than silently corrupting the chart.
|
|
28
|
+
*/
|
|
29
|
+
export declare function assertOhlcRelationships(bar: CandleBar, context: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Verify that `bar.timeMs` is exactly equal to the candle-open boundary for the
|
|
32
|
+
* given timeframe. If it is not, `normalizeOhlcv` or `getCalendarBucketStart`
|
|
33
|
+
* has a bug.
|
|
34
|
+
*/
|
|
35
|
+
export declare function assertBucketAlignment(bar: CandleBar, tf: string, context: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Verify that we are NOT about to mutate a candle that has already been finalised
|
|
38
|
+
* (`isClosed === true`). Mutating a closed candle corrupts the historical record.
|
|
39
|
+
*
|
|
40
|
+
* Triggers on: same-bucket update landing on a bar already marked closed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function assertNotFinalized(bar: CandleBar, context: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Verify that a same-bucket update did NOT silently overwrite the candle's `open`.
|
|
45
|
+
*
|
|
46
|
+
* The first tick's open is authoritative; subsequent updates for the same bucket
|
|
47
|
+
* must preserve it. Call this AFTER the in-place mutation with the captured
|
|
48
|
+
* `prevOpen` value.
|
|
49
|
+
*/
|
|
50
|
+
export declare function assertOpenImmutability(prevOpen: number, bar: CandleBar, context: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Verify that a same-bucket update does NOT append a new bar instead of
|
|
53
|
+
* updating the existing one.
|
|
54
|
+
*
|
|
55
|
+
* Call after an in-place update with the pre- and post-update bar counts.
|
|
56
|
+
*/
|
|
57
|
+
export declare function assertNoDuplicateAppend(prevCount: number, nextCount: number, context: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Verify that a new-bucket append does NOT reduce the bar count or silently
|
|
60
|
+
* overwrite a finalized candle (would require bar count to stay the same while
|
|
61
|
+
* the last bar's timeMs changes, which the engine never does).
|
|
62
|
+
*
|
|
63
|
+
* Call after appending a new bar with the previous last bar for comparison.
|
|
64
|
+
*/
|
|
65
|
+
export declare function assertFinalizedUnchanged(prevLastBar: Readonly<CandleBar>, currentBars: readonly CandleBar[], context: string): void;
|
|
66
|
+
//# sourceMappingURL=candleInvariants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candleInvariants.d.ts","sourceRoot":"","sources":["../../src/engine/candleInvariants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,qEAAqE;AACrE,eAAO,IAAI,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAiC,CAAC;AAE7E,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAEhE;AAED,oDAAoD;AACpD,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAiBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAU7E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAWvF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASxE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,MAAM,GACd,IAAI,CAUN;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,IAAI,CAUN;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,EAChC,WAAW,EAAE,SAAS,SAAS,EAAE,EACjC,OAAO,EAAE,MAAM,GACd,IAAI,CAaN"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Candle Invariant Guards
|
|
3
|
+
*
|
|
4
|
+
* Defensive assertions for the CandleEngine update pipeline.
|
|
5
|
+
* All guards are no-ops in production (`NODE_ENV === 'production'`).
|
|
6
|
+
*
|
|
7
|
+
* Design principles:
|
|
8
|
+
* - Each guard checks exactly ONE invariant and logs a descriptive warning.
|
|
9
|
+
* - Guards never throw by default — they warn so streaming data is never blocked.
|
|
10
|
+
* - Call sites pass a `context` string that identifies where the check ran.
|
|
11
|
+
* - A test harness can replace `_reporter` to assert on violations.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* import { assertOhlcRelationships, assertNotFinalized } from './candleInvariants';
|
|
15
|
+
*/
|
|
16
|
+
import { getCalendarBucketStart } from './timeframeUtils';
|
|
17
|
+
// ─── Reporter (swappable in tests) ───────────────────────────────────────────
|
|
18
|
+
/** Called for every invariant violation. Replaced in unit tests. */
|
|
19
|
+
export let _reporter = (msg) => console.warn(msg);
|
|
20
|
+
/** Replace the violation reporter (for unit-test assertions). */
|
|
21
|
+
export function _setReporter(fn) {
|
|
22
|
+
_reporter = fn;
|
|
23
|
+
}
|
|
24
|
+
/** Re-install the default console.warn reporter. */
|
|
25
|
+
export function _resetReporter() {
|
|
26
|
+
_reporter = (msg) => console.warn(msg);
|
|
27
|
+
}
|
|
28
|
+
// ─── Dev guard ───────────────────────────────────────────────────────────────
|
|
29
|
+
function isDevMode() {
|
|
30
|
+
// Access process via globalThis to avoid relying on @types/node in browser builds
|
|
31
|
+
const nodeEnv = globalThis
|
|
32
|
+
.process?.env?.['NODE_ENV'];
|
|
33
|
+
return nodeEnv !== 'production';
|
|
34
|
+
}
|
|
35
|
+
function violation(context, message) {
|
|
36
|
+
_reporter(`[CANDLE_INVARIANT] ${context}: ${message}`);
|
|
37
|
+
}
|
|
38
|
+
// ─── Guards ───────────────────────────────────────────────────────────────────
|
|
39
|
+
/**
|
|
40
|
+
* Verify that `high >= open, close, low` and `low <= open, close`.
|
|
41
|
+
*
|
|
42
|
+
* Floats from external feeds can occasionally violate these due to rounding.
|
|
43
|
+
* This guard surfaces them immediately rather than silently corrupting the chart.
|
|
44
|
+
*/
|
|
45
|
+
export function assertOhlcRelationships(bar, context) {
|
|
46
|
+
if (!isDevMode())
|
|
47
|
+
return;
|
|
48
|
+
const { open, high, low, close, timeMs } = bar;
|
|
49
|
+
if (high < open)
|
|
50
|
+
violation(context, `high(${high}) < open(${open}) at timeMs=${timeMs}`);
|
|
51
|
+
if (high < close)
|
|
52
|
+
violation(context, `high(${high}) < close(${close}) at timeMs=${timeMs}`);
|
|
53
|
+
if (high < low)
|
|
54
|
+
violation(context, `high(${high}) < low(${low}) at timeMs=${timeMs}`);
|
|
55
|
+
if (low > open)
|
|
56
|
+
violation(context, `low(${low}) > open(${open}) at timeMs=${timeMs}`);
|
|
57
|
+
if (low > close)
|
|
58
|
+
violation(context, `low(${low}) > close(${close}) at timeMs=${timeMs}`);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Verify that `bar.timeMs` is exactly equal to the candle-open boundary for the
|
|
62
|
+
* given timeframe. If it is not, `normalizeOhlcv` or `getCalendarBucketStart`
|
|
63
|
+
* has a bug.
|
|
64
|
+
*/
|
|
65
|
+
export function assertBucketAlignment(bar, tf, context) {
|
|
66
|
+
if (!isDevMode())
|
|
67
|
+
return;
|
|
68
|
+
const expected = getCalendarBucketStart(bar.timeMs, tf);
|
|
69
|
+
if (bar.timeMs !== expected) {
|
|
70
|
+
violation(context, `timeMs(${bar.timeMs}) ≠ bucketStart(${expected}) for tf=${tf} ` +
|
|
71
|
+
`(delta=${bar.timeMs - expected} ms)`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Verify that we are NOT about to mutate a candle that has already been finalised
|
|
76
|
+
* (`isClosed === true`). Mutating a closed candle corrupts the historical record.
|
|
77
|
+
*
|
|
78
|
+
* Triggers on: same-bucket update landing on a bar already marked closed.
|
|
79
|
+
*/
|
|
80
|
+
export function assertNotFinalized(bar, context) {
|
|
81
|
+
if (!isDevMode())
|
|
82
|
+
return;
|
|
83
|
+
if (bar.isClosed) {
|
|
84
|
+
violation(context, `attempted to mutate a finalized (isClosed=true) candle at timeMs=${bar.timeMs}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Verify that a same-bucket update did NOT silently overwrite the candle's `open`.
|
|
89
|
+
*
|
|
90
|
+
* The first tick's open is authoritative; subsequent updates for the same bucket
|
|
91
|
+
* must preserve it. Call this AFTER the in-place mutation with the captured
|
|
92
|
+
* `prevOpen` value.
|
|
93
|
+
*/
|
|
94
|
+
export function assertOpenImmutability(prevOpen, bar, context) {
|
|
95
|
+
if (!isDevMode())
|
|
96
|
+
return;
|
|
97
|
+
if (bar.open !== prevOpen) {
|
|
98
|
+
violation(context, `open changed from ${prevOpen} → ${bar.open} on same-bucket update ` +
|
|
99
|
+
`at timeMs=${bar.timeMs} — first-tick open is authoritative`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Verify that a same-bucket update does NOT append a new bar instead of
|
|
104
|
+
* updating the existing one.
|
|
105
|
+
*
|
|
106
|
+
* Call after an in-place update with the pre- and post-update bar counts.
|
|
107
|
+
*/
|
|
108
|
+
export function assertNoDuplicateAppend(prevCount, nextCount, context) {
|
|
109
|
+
if (!isDevMode())
|
|
110
|
+
return;
|
|
111
|
+
if (nextCount > prevCount) {
|
|
112
|
+
violation(context, `same-bucket update incremented bar count from ${prevCount} → ${nextCount} ` +
|
|
113
|
+
`(should have updated in-place, not appended)`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Verify that a new-bucket append does NOT reduce the bar count or silently
|
|
118
|
+
* overwrite a finalized candle (would require bar count to stay the same while
|
|
119
|
+
* the last bar's timeMs changes, which the engine never does).
|
|
120
|
+
*
|
|
121
|
+
* Call after appending a new bar with the previous last bar for comparison.
|
|
122
|
+
*/
|
|
123
|
+
export function assertFinalizedUnchanged(prevLastBar, currentBars, context) {
|
|
124
|
+
if (!isDevMode())
|
|
125
|
+
return;
|
|
126
|
+
const prevIndex = currentBars.findIndex(b => b.timeMs === prevLastBar.timeMs);
|
|
127
|
+
if (prevIndex === -1)
|
|
128
|
+
return; // bar may have been legitimately removed by merge
|
|
129
|
+
const preserved = currentBars[prevIndex];
|
|
130
|
+
if (!preserved.isClosed) {
|
|
131
|
+
violation(context, `bar at timeMs=${prevLastBar.timeMs} should be isClosed=true after new-bucket append`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=candleInvariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candleInvariants.js","sourceRoot":"","sources":["../../src/engine/candleInvariants.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,25 +4,23 @@
|
|
|
4
4
|
* These utilities operate on plain data objects and have no side-effects,
|
|
5
5
|
* making them easy to test and reuse.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
/**
|
|
9
8
|
* Normalised candle shape. Defined here so that mergeUtils has no dependency
|
|
10
9
|
* on CandleEngine (avoids circular imports). CandleEngine re-exports this type.
|
|
11
10
|
*/
|
|
12
11
|
export interface CandleBar {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
12
|
+
/** Candle open-time in milliseconds — the primary bucket key. */
|
|
13
|
+
timeMs: number;
|
|
14
|
+
/** Candle open-time in seconds — passed directly to the chart library. */
|
|
15
|
+
time: number;
|
|
16
|
+
open: number;
|
|
17
|
+
high: number;
|
|
18
|
+
low: number;
|
|
19
|
+
close: number;
|
|
20
|
+
volume: number;
|
|
21
|
+
/** True once the next candle has started and this bar is fully formed. */
|
|
22
|
+
isClosed: boolean;
|
|
24
23
|
}
|
|
25
|
-
|
|
26
24
|
/**
|
|
27
25
|
* Count the number of missing candle buckets between two consecutive bar times.
|
|
28
26
|
*
|
|
@@ -33,14 +31,7 @@ export interface CandleBar {
|
|
|
33
31
|
* getMissingBarCount(60_000, 240_000, 60_000) // → 2 (10:01 and 10:02 missing)
|
|
34
32
|
* getMissingBarCount(60_000, 3_660_000, 60_000) // → 59 (whole hour gap)
|
|
35
33
|
*/
|
|
36
|
-
export function getMissingBarCount(
|
|
37
|
-
lastTimeMs: number,
|
|
38
|
-
nextTimeMs: number,
|
|
39
|
-
intervalMs: number,
|
|
40
|
-
): number {
|
|
41
|
-
return Math.max(0, Math.floor((nextTimeMs - lastTimeMs) / intervalMs) - 1);
|
|
42
|
-
}
|
|
43
|
-
|
|
34
|
+
export declare function getMissingBarCount(lastTimeMs: number, nextTimeMs: number, intervalMs: number): number;
|
|
44
35
|
/**
|
|
45
36
|
* Merge two candle arrays into a single deduplicated, time-sorted array.
|
|
46
37
|
*
|
|
@@ -56,38 +47,10 @@ export function getMissingBarCount(
|
|
|
56
47
|
* @param incoming New bars to merge in (read-only — not mutated).
|
|
57
48
|
* @returns A new sorted array with duplicates removed.
|
|
58
49
|
*/
|
|
59
|
-
export function mergeBars(
|
|
60
|
-
existing: readonly CandleBar[],
|
|
61
|
-
incoming: readonly CandleBar[],
|
|
62
|
-
): CandleBar[] {
|
|
63
|
-
const map = new Map<number, CandleBar>();
|
|
64
|
-
|
|
65
|
-
// Load existing bars first
|
|
66
|
-
for (const bar of existing) {
|
|
67
|
-
map.set(bar.timeMs, bar);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Incoming bars override based on conflict resolution rules
|
|
71
|
-
for (const bar of incoming) {
|
|
72
|
-
const prev = map.get(bar.timeMs);
|
|
73
|
-
// Incoming wins when:
|
|
74
|
-
// a) no previous bar at this time (simple insert)
|
|
75
|
-
// b) previous bar is closed — REST data is authoritative for closed candles
|
|
76
|
-
// c) incoming bar is open (live) — always prefer the latest live tick
|
|
77
|
-
if (!prev || prev.isClosed || !bar.isClosed) {
|
|
78
|
-
map.set(bar.timeMs, bar);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return Array.from(map.values()).sort((a, b) => a.timeMs - b.timeMs);
|
|
83
|
-
}
|
|
84
|
-
|
|
50
|
+
export declare function mergeBars(existing: readonly CandleBar[], incoming: readonly CandleBar[]): CandleBar[];
|
|
85
51
|
/**
|
|
86
52
|
* Deduplicate a single sorted array by `timeMs`, keeping the last occurrence
|
|
87
53
|
* of any duplicate (latest data wins).
|
|
88
54
|
*/
|
|
89
|
-
export function deduplicateBars(bars: CandleBar[]): CandleBar[]
|
|
90
|
-
|
|
91
|
-
for (const bar of bars) map.set(bar.timeMs, bar);
|
|
92
|
-
return Array.from(map.values()).sort((a, b) => a.timeMs - b.timeMs);
|
|
93
|
-
}
|
|
55
|
+
export declare function deduplicateBars(bars: CandleBar[]): CandleBar[];
|
|
56
|
+
//# sourceMappingURL=mergeUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeUtils.d.ts","sourceRoot":"","sources":["../../src/engine/mergeUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,SAAS,SAAS,EAAE,EAC9B,QAAQ,EAAE,SAAS,SAAS,EAAE,GAC7B,SAAS,EAAE,CAqBb;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAI9D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge / reconciliation helpers for the candle engine.
|
|
3
|
+
*
|
|
4
|
+
* These utilities operate on plain data objects and have no side-effects,
|
|
5
|
+
* making them easy to test and reuse.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Count the number of missing candle buckets between two consecutive bar times.
|
|
9
|
+
*
|
|
10
|
+
* Returns 0 when bars are adjacent (no gap), ≥1 when candles are missing.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* getMissingBarCount(60_000, 120_000, 60_000) // → 0 (consecutive 1m bars)
|
|
14
|
+
* getMissingBarCount(60_000, 240_000, 60_000) // → 2 (10:01 and 10:02 missing)
|
|
15
|
+
* getMissingBarCount(60_000, 3_660_000, 60_000) // → 59 (whole hour gap)
|
|
16
|
+
*/
|
|
17
|
+
export function getMissingBarCount(lastTimeMs, nextTimeMs, intervalMs) {
|
|
18
|
+
return Math.max(0, Math.floor((nextTimeMs - lastTimeMs) / intervalMs) - 1);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Merge two candle arrays into a single deduplicated, time-sorted array.
|
|
22
|
+
*
|
|
23
|
+
* Conflict resolution when both arrays contain a bar with the same `timeMs`:
|
|
24
|
+
* - Closed bars from `incoming` always override `existing` candles —
|
|
25
|
+
* REST-fetched data is treated as authoritative for finished candles.
|
|
26
|
+
* - The live (open) candle: `incoming` also wins — it is the freshest tick.
|
|
27
|
+
*
|
|
28
|
+
* This covers both gap backfill (REST data fills missing closed bars) and
|
|
29
|
+
* reconnect reconciliation (recent REST window corrects stale candles).
|
|
30
|
+
*
|
|
31
|
+
* @param existing Current engine bar array (read-only — not mutated).
|
|
32
|
+
* @param incoming New bars to merge in (read-only — not mutated).
|
|
33
|
+
* @returns A new sorted array with duplicates removed.
|
|
34
|
+
*/
|
|
35
|
+
export function mergeBars(existing, incoming) {
|
|
36
|
+
const map = new Map();
|
|
37
|
+
// Load existing bars first
|
|
38
|
+
for (const bar of existing) {
|
|
39
|
+
map.set(bar.timeMs, bar);
|
|
40
|
+
}
|
|
41
|
+
// Incoming bars override based on conflict resolution rules
|
|
42
|
+
for (const bar of incoming) {
|
|
43
|
+
const prev = map.get(bar.timeMs);
|
|
44
|
+
// Incoming wins when:
|
|
45
|
+
// a) no previous bar at this time (simple insert)
|
|
46
|
+
// b) previous bar is closed — REST data is authoritative for closed candles
|
|
47
|
+
// c) incoming bar is open (live) — always prefer the latest live tick
|
|
48
|
+
if (!prev || prev.isClosed || !bar.isClosed) {
|
|
49
|
+
map.set(bar.timeMs, bar);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return Array.from(map.values()).sort((a, b) => a.timeMs - b.timeMs);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Deduplicate a single sorted array by `timeMs`, keeping the last occurrence
|
|
56
|
+
* of any duplicate (latest data wins).
|
|
57
|
+
*/
|
|
58
|
+
export function deduplicateBars(bars) {
|
|
59
|
+
const map = new Map();
|
|
60
|
+
for (const bar of bars)
|
|
61
|
+
map.set(bar.timeMs, bar);
|
|
62
|
+
return Array.from(map.values()).sort((a, b) => a.timeMs - b.timeMs);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=mergeUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeUtils.js","sourceRoot":"","sources":["../../src/engine/mergeUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,UAAkB,EAClB,UAAkB;IAElB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CACvB,QAA8B,EAC9B,QAA8B;IAE9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEzC,2BAA2B;IAC3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,4DAA4D;IAC5D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,sBAAsB;QACtB,oDAAoD;QACpD,8EAA8E;QAC9E,wEAAwE;QACxE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC5C,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAiB;IAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeframe utilities — thin compatibility wrappers over `@forgecharts/shared/time`.
|
|
3
|
+
*
|
|
4
|
+
* All bucket-alignment logic now lives in the canonical shared module.
|
|
5
|
+
* These exports keep the existing `CandleEngine` and `DatafeedConnector` import
|
|
6
|
+
* surface stable while delegating every calculation to the single source of truth.
|
|
7
|
+
*
|
|
8
|
+
* Migration note:
|
|
9
|
+
* New code should import directly from `@forgecharts/shared/time`:
|
|
10
|
+
* import { getBucketStart, getWeekBucketStart, getMonthBucketStart } from '@forgecharts/shared/time';
|
|
11
|
+
*
|
|
12
|
+
* Legacy imports from this file continue to work unchanged.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Convert a timeframe label to its duration in milliseconds.
|
|
16
|
+
*
|
|
17
|
+
* Returns `60_000` (1 minute) for calendar timeframes (`1w`, `1M`) and unknown
|
|
18
|
+
* labels — preserving the previous behaviour that `CandleEngine` depended on.
|
|
19
|
+
* New code should use `sharedTimeframeToMs` (which returns `null` for those
|
|
20
|
+
* cases) and handle `null` explicitly.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* timeframeToMs('1m') // → 60_000
|
|
24
|
+
* timeframeToMs('4h') // → 14_400_000
|
|
25
|
+
* timeframeToMs('1w') // → 60_000 (calendar — no fixed duration; fallback)
|
|
26
|
+
*/
|
|
27
|
+
export declare function timeframeToMs(timeframe: string): number;
|
|
28
|
+
/**
|
|
29
|
+
* Floor a millisecond timestamp to the start of its fixed-interval bucket.
|
|
30
|
+
*
|
|
31
|
+
* This overload takes an explicit `intervalMs` and is used internally by
|
|
32
|
+
* `aggregateToBucket` for sub-daily custom timeframe synthesis.
|
|
33
|
+
*
|
|
34
|
+
* For timeframe-label–based alignment (including 1w / 1M calendar logic)
|
|
35
|
+
* use `getCalendarBucketStart` or import `getBucketStart` from `@forgecharts/shared`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* getBucketStart(62_000, 60_000) // → 60_000
|
|
39
|
+
* getBucketStart(3_720_000, 3_600_000) // → 3_600_000
|
|
40
|
+
*/
|
|
41
|
+
export declare function getBucketStart(timeMs: number, intervalMs: number): number;
|
|
42
|
+
/**
|
|
43
|
+
* Floor a millisecond timestamp to the candle-open boundary for the given
|
|
44
|
+
* timeframe label, with correct calendar alignment:
|
|
45
|
+
*
|
|
46
|
+
* `1w` — Monday-aligned week (ISO 8601, UTC) via `getWeekBucketStart`
|
|
47
|
+
* `1M` — first of calendar month, UTC via `getMonthBucketStart`
|
|
48
|
+
* all others — plain epoch-floor via `getBucketStart`
|
|
49
|
+
*
|
|
50
|
+
* Delegates entirely to the canonical shared module.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getCalendarBucketStart(timeMs: number, tf: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* Build a custom timeframe by aggregating base-timeframe candles into larger buckets.
|
|
55
|
+
* Returns the aggregated candles for all buckets covered by `subBars`.
|
|
56
|
+
*
|
|
57
|
+
* This is the building block for synthesising e.g. 3m from 1m feeds.
|
|
58
|
+
*
|
|
59
|
+
* @param subBars Candles from the base timeframe, sorted ascending by timeMs.
|
|
60
|
+
* @param targetMs Target timeframe duration in ms (e.g. 180_000 for 3m).
|
|
61
|
+
*
|
|
62
|
+
* @throws {Error} If `targetMs` corresponds to a calendar-irregular timeframe
|
|
63
|
+
* (`1w` / `1M`). Use `getCalendarBucketStart` for those directly.
|
|
64
|
+
*/
|
|
65
|
+
export declare function aggregateToBucket(subBars: ReadonlyArray<{
|
|
66
|
+
timeMs: number;
|
|
67
|
+
open: number;
|
|
68
|
+
high: number;
|
|
69
|
+
low: number;
|
|
70
|
+
close: number;
|
|
71
|
+
volume: number;
|
|
72
|
+
}>, targetMs: number): Array<{
|
|
73
|
+
timeMs: number;
|
|
74
|
+
open: number;
|
|
75
|
+
high: number;
|
|
76
|
+
low: number;
|
|
77
|
+
close: number;
|
|
78
|
+
volume: number;
|
|
79
|
+
}>;
|
|
80
|
+
//# sourceMappingURL=timeframeUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeframeUtils.d.ts","sourceRoot":"","sources":["../../src/engine/timeframeUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzE;AAID;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzE;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CACxF,CAAC,EACF,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBnG"}
|
|
@@ -11,14 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Legacy imports from this file continue to work unchanged.
|
|
13
13
|
*/
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
getBucketStart as sharedGetBucketStart,
|
|
17
|
-
timeframeToMs as sharedTimeframeToMs,
|
|
18
|
-
} from '@forgecharts/shared/time';
|
|
19
|
-
|
|
14
|
+
import { getBucketStart as sharedGetBucketStart, timeframeToMs as sharedTimeframeToMs, } from '@forgecharts/shared/time';
|
|
20
15
|
// ─── timeframeToMs ────────────────────────────────────────────────────────────
|
|
21
|
-
|
|
22
16
|
/**
|
|
23
17
|
* Convert a timeframe label to its duration in milliseconds.
|
|
24
18
|
*
|
|
@@ -32,12 +26,10 @@ import {
|
|
|
32
26
|
* timeframeToMs('4h') // → 14_400_000
|
|
33
27
|
* timeframeToMs('1w') // → 60_000 (calendar — no fixed duration; fallback)
|
|
34
28
|
*/
|
|
35
|
-
export function timeframeToMs(timeframe
|
|
36
|
-
|
|
29
|
+
export function timeframeToMs(timeframe) {
|
|
30
|
+
return sharedTimeframeToMs(timeframe) ?? 60_000;
|
|
37
31
|
}
|
|
38
|
-
|
|
39
32
|
// ─── getBucketStart (interval-based) ─────────────────────────────────────────
|
|
40
|
-
|
|
41
33
|
/**
|
|
42
34
|
* Floor a millisecond timestamp to the start of its fixed-interval bucket.
|
|
43
35
|
*
|
|
@@ -51,12 +43,10 @@ export function timeframeToMs(timeframe: string): number {
|
|
|
51
43
|
* getBucketStart(62_000, 60_000) // → 60_000
|
|
52
44
|
* getBucketStart(3_720_000, 3_600_000) // → 3_600_000
|
|
53
45
|
*/
|
|
54
|
-
export function getBucketStart(timeMs
|
|
55
|
-
|
|
46
|
+
export function getBucketStart(timeMs, intervalMs) {
|
|
47
|
+
return Math.floor(timeMs / intervalMs) * intervalMs;
|
|
56
48
|
}
|
|
57
|
-
|
|
58
49
|
// ─── getCalendarBucketStart ───────────────────────────────────────────────────
|
|
59
|
-
|
|
60
50
|
/**
|
|
61
51
|
* Floor a millisecond timestamp to the candle-open boundary for the given
|
|
62
52
|
* timeframe label, with correct calendar alignment:
|
|
@@ -67,12 +57,10 @@ export function getBucketStart(timeMs: number, intervalMs: number): number {
|
|
|
67
57
|
*
|
|
68
58
|
* Delegates entirely to the canonical shared module.
|
|
69
59
|
*/
|
|
70
|
-
export function getCalendarBucketStart(timeMs
|
|
71
|
-
|
|
60
|
+
export function getCalendarBucketStart(timeMs, tf) {
|
|
61
|
+
return sharedGetBucketStart(timeMs, tf);
|
|
72
62
|
}
|
|
73
|
-
|
|
74
63
|
// ─── aggregateToBucket ────────────────────────────────────────────────────────
|
|
75
|
-
|
|
76
64
|
/**
|
|
77
65
|
* Build a custom timeframe by aggregating base-timeframe candles into larger buckets.
|
|
78
66
|
* Returns the aggregated candles for all buckets covered by `subBars`.
|
|
@@ -85,34 +73,28 @@ export function getCalendarBucketStart(timeMs: number, tf: string): number {
|
|
|
85
73
|
* @throws {Error} If `targetMs` corresponds to a calendar-irregular timeframe
|
|
86
74
|
* (`1w` / `1M`). Use `getCalendarBucketStart` for those directly.
|
|
87
75
|
*/
|
|
88
|
-
export function aggregateToBucket(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
// Guard prevents accidentally using fixed-interval bucketing for weekly candles
|
|
96
|
-
// where DST can make weeks slightly unequal (though UTC avoids this).
|
|
97
|
-
const WEEK_MS = 7 * 24 * 60 * 60 * 1000; // 604_800_000
|
|
98
|
-
if (targetMs === WEEK_MS) {
|
|
99
|
-
throw new Error('aggregateToBucket: use getCalendarBucketStart for 1w/1M aggregation');
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const buckets = new Map<number, { timeMs: number; open: number; high: number; low: number; close: number; volume: number }>();
|
|
103
|
-
|
|
104
|
-
for (const bar of subBars) {
|
|
105
|
-
const bucket = getBucketStart(bar.timeMs, targetMs);
|
|
106
|
-
const existing = buckets.get(bucket);
|
|
107
|
-
if (!existing) {
|
|
108
|
-
buckets.set(bucket, { timeMs: bucket, open: bar.open, high: bar.high, low: bar.low, close: bar.close, volume: bar.volume });
|
|
109
|
-
} else {
|
|
110
|
-
existing.high = Math.max(existing.high, bar.high);
|
|
111
|
-
existing.low = Math.min(existing.low, bar.low);
|
|
112
|
-
existing.close = bar.close;
|
|
113
|
-
existing.volume += bar.volume;
|
|
76
|
+
export function aggregateToBucket(subBars, targetMs) {
|
|
77
|
+
// 1w is 7 days exactly; 1M has no fixed duration and can never equal a targetMs.
|
|
78
|
+
// Guard prevents accidentally using fixed-interval bucketing for weekly candles
|
|
79
|
+
// where DST can make weeks slightly unequal (though UTC avoids this).
|
|
80
|
+
const WEEK_MS = 7 * 24 * 60 * 60 * 1000; // 604_800_000
|
|
81
|
+
if (targetMs === WEEK_MS) {
|
|
82
|
+
throw new Error('aggregateToBucket: use getCalendarBucketStart for 1w/1M aggregation');
|
|
114
83
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
84
|
+
const buckets = new Map();
|
|
85
|
+
for (const bar of subBars) {
|
|
86
|
+
const bucket = getBucketStart(bar.timeMs, targetMs);
|
|
87
|
+
const existing = buckets.get(bucket);
|
|
88
|
+
if (!existing) {
|
|
89
|
+
buckets.set(bucket, { timeMs: bucket, open: bar.open, high: bar.high, low: bar.low, close: bar.close, volume: bar.volume });
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
existing.high = Math.max(existing.high, bar.high);
|
|
93
|
+
existing.low = Math.min(existing.low, bar.low);
|
|
94
|
+
existing.close = bar.close;
|
|
95
|
+
existing.volume += bar.volume;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return Array.from(buckets.values()).sort((a, b) => a.timeMs - b.timeMs);
|
|
118
99
|
}
|
|
100
|
+
//# sourceMappingURL=timeframeUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeframeUtils.js","sourceRoot":"","sources":["../../src/engine/timeframeUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,cAAc,IAAM,oBAAoB,EACxC,aAAa,IAAO,mBAAmB,GACxC,MAAM,0BAA0B,CAAC;AAElC,iFAAiF;AAEjF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;AAClD,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,UAAkB;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACtD,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,EAAU;IAC/D,OAAO,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAEE,EACF,QAAgB;IAEhB,iFAAiF;IACjF,gFAAgF;IAChF,sEAAsE;IACtE,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,cAAc;IACvD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsG,CAAC;IAE9H,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9H,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,GAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACpD,QAAQ,CAAC,GAAG,GAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACnD,QAAQ,CAAC,KAAK,GAAI,GAAG,CAAC,KAAK,CAAC;YAC5B,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC"}
|