@tradecanvas/core 1.4.0 → 1.10.0
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/README.md +107 -107
- package/dist/WebGLSeriesRenderer-DQOPCwno.js +1643 -0
- package/dist/WebGLSeriesRenderer-DQOPCwno.js.map +1 -0
- package/dist/WebGLSeriesRenderer-DspCYR38.cjs +429 -0
- package/dist/WebGLSeriesRenderer-DspCYR38.cjs.map +1 -0
- package/dist/axis/GridRenderer.d.ts.map +1 -1
- package/dist/axis/PriceAxis.d.ts +12 -1
- package/dist/axis/PriceAxis.d.ts.map +1 -1
- package/dist/axis/TimeAxis.d.ts +7 -4
- package/dist/axis/TimeAxis.d.ts.map +1 -1
- package/dist/axis/gridLines.d.ts +9 -0
- package/dist/axis/gridLines.d.ts.map +1 -0
- package/dist/charts/BarRenderer.d.ts.map +1 -1
- package/dist/charts/CandlestickRenderer.d.ts.map +1 -1
- package/dist/charts/CompareRenderer.d.ts +21 -4
- package/dist/charts/CompareRenderer.d.ts.map +1 -1
- package/dist/charts/HiLoRenderer.d.ts +14 -0
- package/dist/charts/HiLoRenderer.d.ts.map +1 -0
- package/dist/charts/HollowCandleRenderer.d.ts.map +1 -1
- package/dist/charts/PeriodLevelsRenderer.d.ts.map +1 -1
- package/dist/charts/VolumeCandleRenderer.d.ts.map +1 -1
- package/dist/charts/VolumeRenderer.d.ts +6 -3
- package/dist/charts/VolumeRenderer.d.ts.map +1 -1
- package/dist/charts/denseBars.d.ts +28 -0
- package/dist/charts/denseBars.d.ts.map +1 -0
- package/dist/charts/index.d.ts +3 -0
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/pixelGrid.d.ts +49 -0
- package/dist/charts/pixelGrid.d.ts.map +1 -0
- package/dist/charts/transforms/kagi.d.ts +3 -2
- package/dist/charts/transforms/kagi.d.ts.map +1 -1
- package/dist/charts/transforms/renko.d.ts.map +1 -1
- package/dist/drawings/DrawingBase.d.ts +34 -1
- package/dist/drawings/DrawingBase.d.ts.map +1 -1
- package/dist/drawings/DrawingCreator.d.ts +51 -0
- package/dist/drawings/DrawingCreator.d.ts.map +1 -0
- package/dist/drawings/DrawingDrag.d.ts +36 -0
- package/dist/drawings/DrawingDrag.d.ts.map +1 -0
- package/dist/drawings/DrawingManager.d.ts +156 -33
- package/dist/drawings/DrawingManager.d.ts.map +1 -1
- package/dist/drawings/DrawingRenderer.d.ts +2 -2
- package/dist/drawings/DrawingRenderer.d.ts.map +1 -1
- package/dist/drawings/DrawingSelection.d.ts +28 -0
- package/dist/drawings/DrawingSelection.d.ts.map +1 -0
- package/dist/drawings/drawingHistory.d.ts +12 -0
- package/dist/drawings/drawingHistory.d.ts.map +1 -0
- package/dist/drawings/drawingShortcuts.d.ts +11 -0
- package/dist/drawings/drawingShortcuts.d.ts.map +1 -0
- package/dist/drawings/drawingState.d.ts +29 -0
- package/dist/drawings/drawingState.d.ts.map +1 -0
- package/dist/drawings/index.d.ts +2 -1
- package/dist/drawings/index.d.ts.map +1 -1
- package/dist/drawings/magnetSnap.d.ts +12 -0
- package/dist/drawings/magnetSnap.d.ts.map +1 -0
- package/dist/drawings/tools/AnchoredVWAP.d.ts.map +1 -1
- package/dist/drawings/tools/Circle.d.ts +1 -0
- package/dist/drawings/tools/Circle.d.ts.map +1 -1
- package/dist/drawings/tools/CrossLine.d.ts.map +1 -1
- package/dist/drawings/tools/DateRange.d.ts.map +1 -1
- package/dist/drawings/tools/ElliottWave.d.ts +128 -3
- package/dist/drawings/tools/ElliottWave.d.ts.map +1 -1
- package/dist/drawings/tools/Ellipse.d.ts +1 -0
- package/dist/drawings/tools/Ellipse.d.ts.map +1 -1
- package/dist/drawings/tools/ExtendedLine.d.ts +1 -0
- package/dist/drawings/tools/ExtendedLine.d.ts.map +1 -1
- package/dist/drawings/tools/FibChannel.d.ts +7 -0
- package/dist/drawings/tools/FibChannel.d.ts.map +1 -1
- package/dist/drawings/tools/FibExtension.d.ts +20 -0
- package/dist/drawings/tools/FibExtension.d.ts.map +1 -1
- package/dist/drawings/tools/FibRetracement.d.ts +28 -0
- package/dist/drawings/tools/FibRetracement.d.ts.map +1 -1
- package/dist/drawings/tools/FibSpeedResistanceFan.d.ts +9 -1
- package/dist/drawings/tools/FibSpeedResistanceFan.d.ts.map +1 -1
- package/dist/drawings/tools/FibTimeZones.d.ts +16 -0
- package/dist/drawings/tools/FibTimeZones.d.ts.map +1 -1
- package/dist/drawings/tools/GannBox.d.ts.map +1 -1
- package/dist/drawings/tools/GannFan.d.ts.map +1 -1
- package/dist/drawings/tools/HorizontalLine.d.ts +1 -0
- package/dist/drawings/tools/HorizontalLine.d.ts.map +1 -1
- package/dist/drawings/tools/HorizontalRay.d.ts +1 -0
- package/dist/drawings/tools/HorizontalRay.d.ts.map +1 -1
- package/dist/drawings/tools/Measure.d.ts.map +1 -1
- package/dist/drawings/tools/ParallelChannel.d.ts +12 -0
- package/dist/drawings/tools/ParallelChannel.d.ts.map +1 -1
- package/dist/drawings/tools/PriceLabel.d.ts +1 -0
- package/dist/drawings/tools/PriceLabel.d.ts.map +1 -1
- package/dist/drawings/tools/PriceRange.d.ts.map +1 -1
- package/dist/drawings/tools/Ray.d.ts +1 -0
- package/dist/drawings/tools/Ray.d.ts.map +1 -1
- package/dist/drawings/tools/Rectangle.d.ts +1 -0
- package/dist/drawings/tools/Rectangle.d.ts.map +1 -1
- package/dist/drawings/tools/RegressionChannel.d.ts +1 -0
- package/dist/drawings/tools/RegressionChannel.d.ts.map +1 -1
- package/dist/drawings/tools/RiskReward.d.ts +59 -6
- package/dist/drawings/tools/RiskReward.d.ts.map +1 -1
- package/dist/drawings/tools/TextAnnotation.d.ts +1 -0
- package/dist/drawings/tools/TextAnnotation.d.ts.map +1 -1
- package/dist/drawings/tools/TrendAngle.d.ts.map +1 -1
- package/dist/drawings/tools/TrendLine.d.ts +3 -0
- package/dist/drawings/tools/TrendLine.d.ts.map +1 -1
- package/dist/drawings/tools/Triangle.d.ts +1 -0
- package/dist/drawings/tools/Triangle.d.ts.map +1 -1
- package/dist/drawings/tools/VerticalLine.d.ts.map +1 -1
- package/dist/drawings/tools/VolumeProfileRange.d.ts +1 -0
- package/dist/drawings/tools/VolumeProfileRange.d.ts.map +1 -1
- package/dist/drawings/tools/annotations.d.ts +113 -0
- package/dist/drawings/tools/annotations.d.ts.map +1 -0
- package/dist/drawings/tools/cycles.d.ts +37 -0
- package/dist/drawings/tools/cycles.d.ts.map +1 -0
- package/dist/drawings/tools/fibGeometry.d.ts +202 -0
- package/dist/drawings/tools/fibGeometry.d.ts.map +1 -0
- package/dist/drawings/tools/forecast.d.ts +85 -0
- package/dist/drawings/tools/forecast.d.ts.map +1 -0
- package/dist/drawings/tools/freehand.d.ts +81 -0
- package/dist/drawings/tools/freehand.d.ts.map +1 -0
- package/dist/drawings/tools/index.d.ts +7 -0
- package/dist/drawings/tools/index.d.ts.map +1 -1
- package/dist/drawings/tools/labels.d.ts +32 -3
- package/dist/drawings/tools/labels.d.ts.map +1 -1
- package/dist/drawings/tools/options.d.ts +16 -0
- package/dist/drawings/tools/options.d.ts.map +1 -0
- package/dist/drawings/tools/patterns.d.ts +32 -0
- package/dist/drawings/tools/patterns.d.ts.map +1 -1
- package/dist/drawings/tools/priceLevels.d.ts +29 -0
- package/dist/drawings/tools/priceLevels.d.ts.map +1 -0
- package/dist/drawings/tools/textBox.d.ts +39 -0
- package/dist/drawings/tools/textBox.d.ts.map +1 -0
- package/dist/engine/LayerManager.d.ts +23 -0
- package/dist/engine/LayerManager.d.ts.map +1 -1
- package/dist/engine/RenderEngine.d.ts +53 -1
- package/dist/engine/RenderEngine.d.ts.map +1 -1
- package/dist/engine/gpu.d.ts +83 -0
- package/dist/engine/gpu.d.ts.map +1 -0
- package/dist/engine/index.d.ts +2 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/loadWebGL.d.ts +9 -0
- package/dist/engine/loadWebGL.d.ts.map +1 -0
- package/dist/engine/plotSteps.d.ts +39 -0
- package/dist/engine/plotSteps.d.ts.map +1 -0
- package/dist/events/EventBus.d.ts +2 -0
- package/dist/events/EventBus.d.ts.map +1 -1
- package/dist/features/AlertManager.d.ts +117 -6
- package/dist/features/AlertManager.d.ts.map +1 -1
- package/dist/features/ChartState.d.ts +19 -1
- package/dist/features/ChartState.d.ts.map +1 -1
- package/dist/features/DataExporter.d.ts +7 -2
- package/dist/features/DataExporter.d.ts.map +1 -1
- package/dist/features/ReplayManager.d.ts +7 -0
- package/dist/features/ReplayManager.d.ts.map +1 -1
- package/dist/features/SignalMarkerManager.d.ts +8 -0
- package/dist/features/SignalMarkerManager.d.ts.map +1 -1
- package/dist/features/TradeZoneManager.d.ts.map +1 -1
- package/dist/features/UndoRedoManager.d.ts +30 -1
- package/dist/features/UndoRedoManager.d.ts.map +1 -1
- package/dist/features/index.d.ts +3 -1
- package/dist/features/index.d.ts.map +1 -1
- package/dist/gridLines-J41F0DQ6.cjs +2 -0
- package/dist/gridLines-J41F0DQ6.cjs.map +1 -0
- package/dist/gridLines-kFhXyH-u.js +218 -0
- package/dist/gridLines-kFhXyH-u.js.map +1 -0
- package/dist/index.cjs +11 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10638 -4930
- package/dist/index.js.map +1 -1
- package/dist/indicators/IndicatorBase.d.ts +5 -1
- package/dist/indicators/IndicatorBase.d.ts.map +1 -1
- package/dist/indicators/IndicatorEngine.d.ts +123 -11
- package/dist/indicators/IndicatorEngine.d.ts.map +1 -1
- package/dist/indicators/PointwiseIndicator.d.ts +25 -0
- package/dist/indicators/PointwiseIndicator.d.ts.map +1 -0
- package/dist/indicators/index.d.ts +32 -0
- package/dist/indicators/index.d.ts.map +1 -1
- package/dist/indicators/linePen.d.ts +38 -0
- package/dist/indicators/linePen.d.ts.map +1 -0
- package/dist/indicators/math.d.ts +47 -0
- package/dist/indicators/math.d.ts.map +1 -0
- package/dist/indicators/overlay/ALMA.d.ts +20 -0
- package/dist/indicators/overlay/ALMA.d.ts.map +1 -0
- package/dist/indicators/overlay/Alligator.d.ts +2 -14
- package/dist/indicators/overlay/Alligator.d.ts.map +1 -1
- package/dist/indicators/overlay/AnchoredVWAP.d.ts +2 -9
- package/dist/indicators/overlay/AnchoredVWAP.d.ts.map +1 -1
- package/dist/indicators/overlay/BollingerBands.d.ts +2 -10
- package/dist/indicators/overlay/BollingerBands.d.ts.map +1 -1
- package/dist/indicators/overlay/ChandeKrollStop.d.ts +16 -0
- package/dist/indicators/overlay/ChandeKrollStop.d.ts.map +1 -0
- package/dist/indicators/overlay/ChandelierExit.d.ts +2 -10
- package/dist/indicators/overlay/ChandelierExit.d.ts.map +1 -1
- package/dist/indicators/overlay/DEMA.d.ts +11 -0
- package/dist/indicators/overlay/DEMA.d.ts.map +1 -0
- package/dist/indicators/overlay/DonchianChannel.d.ts +2 -9
- package/dist/indicators/overlay/DonchianChannel.d.ts.map +1 -1
- package/dist/indicators/overlay/EMA.d.ts +2 -9
- package/dist/indicators/overlay/EMA.d.ts.map +1 -1
- package/dist/indicators/overlay/Envelope.d.ts +2 -10
- package/dist/indicators/overlay/Envelope.d.ts.map +1 -1
- package/dist/indicators/overlay/GuppyMMA.d.ts +11 -0
- package/dist/indicators/overlay/GuppyMMA.d.ts.map +1 -0
- package/dist/indicators/overlay/HullMA.d.ts +2 -9
- package/dist/indicators/overlay/HullMA.d.ts.map +1 -1
- package/dist/indicators/overlay/Ichimoku.d.ts +2 -12
- package/dist/indicators/overlay/Ichimoku.d.ts.map +1 -1
- package/dist/indicators/overlay/KAMA.d.ts +15 -0
- package/dist/indicators/overlay/KAMA.d.ts.map +1 -0
- package/dist/indicators/overlay/KeltnerChannel.d.ts +2 -11
- package/dist/indicators/overlay/KeltnerChannel.d.ts.map +1 -1
- package/dist/indicators/overlay/LSMA.d.ts +19 -0
- package/dist/indicators/overlay/LSMA.d.ts.map +1 -0
- package/dist/indicators/overlay/LinearRegressionChannel.d.ts +2 -10
- package/dist/indicators/overlay/LinearRegressionChannel.d.ts.map +1 -1
- package/dist/indicators/overlay/MACross.d.ts +9 -0
- package/dist/indicators/overlay/MACross.d.ts.map +1 -0
- package/dist/indicators/overlay/MARibbon.d.ts +8 -0
- package/dist/indicators/overlay/MARibbon.d.ts.map +1 -0
- package/dist/indicators/overlay/MTFMovingAverage.d.ts +2 -10
- package/dist/indicators/overlay/MTFMovingAverage.d.ts.map +1 -1
- package/dist/indicators/overlay/McGinleyDynamic.d.ts +13 -0
- package/dist/indicators/overlay/McGinleyDynamic.d.ts.map +1 -0
- package/dist/indicators/overlay/ParabolicSAR.d.ts +2 -10
- package/dist/indicators/overlay/ParabolicSAR.d.ts.map +1 -1
- package/dist/indicators/overlay/PivotPoints.d.ts +2 -9
- package/dist/indicators/overlay/PivotPoints.d.ts.map +1 -1
- package/dist/indicators/overlay/SMA.d.ts +2 -9
- package/dist/indicators/overlay/SMA.d.ts.map +1 -1
- package/dist/indicators/overlay/SMMA.d.ts +13 -0
- package/dist/indicators/overlay/SMMA.d.ts.map +1 -0
- package/dist/indicators/overlay/SessionVWAP.d.ts +2 -9
- package/dist/indicators/overlay/SessionVWAP.d.ts.map +1 -1
- package/dist/indicators/overlay/StandardErrorBands.d.ts +12 -0
- package/dist/indicators/overlay/StandardErrorBands.d.ts.map +1 -0
- package/dist/indicators/overlay/Supertrend.d.ts +2 -10
- package/dist/indicators/overlay/Supertrend.d.ts.map +1 -1
- package/dist/indicators/overlay/TEMA.d.ts +2 -9
- package/dist/indicators/overlay/TEMA.d.ts.map +1 -1
- package/dist/indicators/overlay/VWAP.d.ts +2 -7
- package/dist/indicators/overlay/VWAP.d.ts.map +1 -1
- package/dist/indicators/overlay/VWMA.d.ts +2 -9
- package/dist/indicators/overlay/VWMA.d.ts.map +1 -1
- package/dist/indicators/overlay/WMA.d.ts +2 -9
- package/dist/indicators/overlay/WMA.d.ts.map +1 -1
- package/dist/indicators/overlay/WilliamsFractals.d.ts +15 -0
- package/dist/indicators/overlay/WilliamsFractals.d.ts.map +1 -0
- package/dist/indicators/overlay/ZigZag.d.ts +2 -9
- package/dist/indicators/overlay/ZigZag.d.ts.map +1 -1
- package/dist/indicators/panel/ADX.d.ts +2 -10
- package/dist/indicators/panel/ADX.d.ts.map +1 -1
- package/dist/indicators/panel/ATR.d.ts +2 -10
- package/dist/indicators/panel/ATR.d.ts.map +1 -1
- package/dist/indicators/panel/AcceleratorOscillator.d.ts +5 -10
- package/dist/indicators/panel/AcceleratorOscillator.d.ts.map +1 -1
- package/dist/indicators/panel/AccumulationDistribution.d.ts +2 -8
- package/dist/indicators/panel/AccumulationDistribution.d.ts.map +1 -1
- package/dist/indicators/panel/Aroon.d.ts +2 -10
- package/dist/indicators/panel/Aroon.d.ts.map +1 -1
- package/dist/indicators/panel/AverageDayRange.d.ts +9 -0
- package/dist/indicators/panel/AverageDayRange.d.ts.map +1 -0
- package/dist/indicators/panel/AwesomeOscillator.d.ts +2 -11
- package/dist/indicators/panel/AwesomeOscillator.d.ts.map +1 -1
- package/dist/indicators/panel/BalanceOfPower.d.ts +2 -10
- package/dist/indicators/panel/BalanceOfPower.d.ts.map +1 -1
- package/dist/indicators/panel/BollingerBandWidth.d.ts +18 -0
- package/dist/indicators/panel/BollingerBandWidth.d.ts.map +1 -0
- package/dist/indicators/panel/BollingerPercentB.d.ts +21 -0
- package/dist/indicators/panel/BollingerPercentB.d.ts.map +1 -0
- package/dist/indicators/panel/CCI.d.ts +2 -10
- package/dist/indicators/panel/CCI.d.ts.map +1 -1
- package/dist/indicators/panel/CMF.d.ts +2 -10
- package/dist/indicators/panel/CMF.d.ts.map +1 -1
- package/dist/indicators/panel/ChaikinOscillator.d.ts +2 -11
- package/dist/indicators/panel/ChaikinOscillator.d.ts.map +1 -1
- package/dist/indicators/panel/ChaikinVolatility.d.ts +2 -11
- package/dist/indicators/panel/ChaikinVolatility.d.ts.map +1 -1
- package/dist/indicators/panel/ChandeMomentum.d.ts +2 -10
- package/dist/indicators/panel/ChandeMomentum.d.ts.map +1 -1
- package/dist/indicators/panel/ChoppinessIndex.d.ts +2 -10
- package/dist/indicators/panel/ChoppinessIndex.d.ts.map +1 -1
- package/dist/indicators/panel/ConnorsRSI.d.ts +2 -12
- package/dist/indicators/panel/ConnorsRSI.d.ts.map +1 -1
- package/dist/indicators/panel/Coppock.d.ts +2 -12
- package/dist/indicators/panel/Coppock.d.ts.map +1 -1
- package/dist/indicators/panel/DetrendedPriceOscillator.d.ts +2 -10
- package/dist/indicators/panel/DetrendedPriceOscillator.d.ts.map +1 -1
- package/dist/indicators/panel/DisparityIndex.d.ts +2 -10
- package/dist/indicators/panel/DisparityIndex.d.ts.map +1 -1
- package/dist/indicators/panel/EaseOfMovement.d.ts +2 -12
- package/dist/indicators/panel/EaseOfMovement.d.ts.map +1 -1
- package/dist/indicators/panel/ElderRay.d.ts +3 -9
- package/dist/indicators/panel/ElderRay.d.ts.map +1 -1
- package/dist/indicators/panel/FisherTransform.d.ts +2 -10
- package/dist/indicators/panel/FisherTransform.d.ts.map +1 -1
- package/dist/indicators/panel/ForceIndex.d.ts +2 -10
- package/dist/indicators/panel/ForceIndex.d.ts.map +1 -1
- package/dist/indicators/panel/HistoricalVolatility.d.ts +22 -0
- package/dist/indicators/panel/HistoricalVolatility.d.ts.map +1 -0
- package/dist/indicators/panel/KST.d.ts +2 -18
- package/dist/indicators/panel/KST.d.ts.map +1 -1
- package/dist/indicators/panel/Klinger.d.ts +2 -12
- package/dist/indicators/panel/Klinger.d.ts.map +1 -1
- package/dist/indicators/panel/LinearRegressionSlope.d.ts +9 -0
- package/dist/indicators/panel/LinearRegressionSlope.d.ts.map +1 -0
- package/dist/indicators/panel/MACD.d.ts +2 -12
- package/dist/indicators/panel/MACD.d.ts.map +1 -1
- package/dist/indicators/panel/MFI.d.ts +2 -10
- package/dist/indicators/panel/MFI.d.ts.map +1 -1
- package/dist/indicators/panel/MassIndex.d.ts +2 -11
- package/dist/indicators/panel/MassIndex.d.ts.map +1 -1
- package/dist/indicators/panel/Momentum.d.ts +9 -0
- package/dist/indicators/panel/Momentum.d.ts.map +1 -0
- package/dist/indicators/panel/NetVolume.d.ts +11 -0
- package/dist/indicators/panel/NetVolume.d.ts.map +1 -0
- package/dist/indicators/panel/OBV.d.ts +2 -8
- package/dist/indicators/panel/OBV.d.ts.map +1 -1
- package/dist/indicators/panel/PercentagePriceOscillator.d.ts +2 -12
- package/dist/indicators/panel/PercentagePriceOscillator.d.ts.map +1 -1
- package/dist/indicators/panel/PrettyGoodOscillator.d.ts +2 -10
- package/dist/indicators/panel/PrettyGoodOscillator.d.ts.map +1 -1
- package/dist/indicators/panel/PriceVolumeTrend.d.ts +2 -8
- package/dist/indicators/panel/PriceVolumeTrend.d.ts.map +1 -1
- package/dist/indicators/panel/Qstick.d.ts +2 -10
- package/dist/indicators/panel/Qstick.d.ts.map +1 -1
- package/dist/indicators/panel/ROC.d.ts +2 -10
- package/dist/indicators/panel/ROC.d.ts.map +1 -1
- package/dist/indicators/panel/RSI.d.ts +2 -10
- package/dist/indicators/panel/RSI.d.ts.map +1 -1
- package/dist/indicators/panel/RelativeMomentumIndex.d.ts +2 -11
- package/dist/indicators/panel/RelativeMomentumIndex.d.ts.map +1 -1
- package/dist/indicators/panel/RelativeVigor.d.ts +2 -10
- package/dist/indicators/panel/RelativeVigor.d.ts.map +1 -1
- package/dist/indicators/panel/RelativeVolatilityIndex.d.ts +12 -0
- package/dist/indicators/panel/RelativeVolatilityIndex.d.ts.map +1 -0
- package/dist/indicators/panel/SchaffTrendCycle.d.ts +2 -12
- package/dist/indicators/panel/SchaffTrendCycle.d.ts.map +1 -1
- package/dist/indicators/panel/StandardError.d.ts +9 -0
- package/dist/indicators/panel/StandardError.d.ts.map +1 -0
- package/dist/indicators/panel/StdDev.d.ts +2 -10
- package/dist/indicators/panel/StdDev.d.ts.map +1 -1
- package/dist/indicators/panel/Stochastic.d.ts +2 -12
- package/dist/indicators/panel/Stochastic.d.ts.map +1 -1
- package/dist/indicators/panel/StochasticMomentumIndex.d.ts +12 -0
- package/dist/indicators/panel/StochasticMomentumIndex.d.ts.map +1 -0
- package/dist/indicators/panel/StochasticRSI.d.ts +2 -13
- package/dist/indicators/panel/StochasticRSI.d.ts.map +1 -1
- package/dist/indicators/panel/TRIX.d.ts +2 -11
- package/dist/indicators/panel/TRIX.d.ts.map +1 -1
- package/dist/indicators/panel/TSI.d.ts +2 -12
- package/dist/indicators/panel/TSI.d.ts.map +1 -1
- package/dist/indicators/panel/TrendStrengthIndex.d.ts +9 -0
- package/dist/indicators/panel/TrendStrengthIndex.d.ts.map +1 -0
- package/dist/indicators/panel/UlcerIndex.d.ts +15 -0
- package/dist/indicators/panel/UlcerIndex.d.ts.map +1 -0
- package/dist/indicators/panel/UltimateOscillator.d.ts +2 -12
- package/dist/indicators/panel/UltimateOscillator.d.ts.map +1 -1
- package/dist/indicators/panel/VROC.d.ts +2 -10
- package/dist/indicators/panel/VROC.d.ts.map +1 -1
- package/dist/indicators/panel/VolumeDelta.d.ts +2 -10
- package/dist/indicators/panel/VolumeDelta.d.ts.map +1 -1
- package/dist/indicators/panel/VolumeOscillator.d.ts +11 -0
- package/dist/indicators/panel/VolumeOscillator.d.ts.map +1 -0
- package/dist/indicators/panel/VolumeProfile.d.ts +2 -9
- package/dist/indicators/panel/VolumeProfile.d.ts.map +1 -1
- package/dist/indicators/panel/Vortex.d.ts +2 -10
- package/dist/indicators/panel/Vortex.d.ts.map +1 -1
- package/dist/indicators/panel/WilliamsAD.d.ts +2 -10
- package/dist/indicators/panel/WilliamsAD.d.ts.map +1 -1
- package/dist/indicators/panel/WilliamsR.d.ts +2 -10
- package/dist/indicators/panel/WilliamsR.d.ts.map +1 -1
- package/dist/indicators/plots.d.ts +49 -0
- package/dist/indicators/plots.d.ts.map +1 -0
- package/dist/indicators/registry.d.ts.map +1 -1
- package/dist/indicators/sources.d.ts +37 -0
- package/dist/indicators/sources.d.ts.map +1 -0
- package/dist/indicators/symbols/SymbolSeriesStore.d.ts +21 -0
- package/dist/indicators/symbols/SymbolSeriesStore.d.ts.map +1 -0
- package/dist/indicators/symbols/symbolIndicators.d.ts +34 -0
- package/dist/indicators/symbols/symbolIndicators.d.ts.map +1 -0
- package/dist/interaction/CrosshairHandler.d.ts +7 -4
- package/dist/interaction/CrosshairHandler.d.ts.map +1 -1
- package/dist/interaction/CrosshairTooltip.d.ts +11 -5
- package/dist/interaction/CrosshairTooltip.d.ts.map +1 -1
- package/dist/interaction/InteractionManager.d.ts +63 -1
- package/dist/interaction/InteractionManager.d.ts.map +1 -1
- package/dist/interaction/PaneResizeHandler.d.ts.map +1 -1
- package/dist/interaction/PinnedTooltip.d.ts +9 -1
- package/dist/interaction/PinnedTooltip.d.ts.map +1 -1
- package/dist/interaction/PriceAxisAddButton.d.ts +17 -0
- package/dist/interaction/PriceAxisAddButton.d.ts.map +1 -0
- package/dist/interaction/ZoomHandler.d.ts +8 -0
- package/dist/interaction/ZoomHandler.d.ts.map +1 -1
- package/dist/interaction/index.d.ts +2 -0
- package/dist/interaction/index.d.ts.map +1 -1
- package/dist/realtime/CurrentPriceLine.d.ts.map +1 -1
- package/dist/realtime/StreamManager.d.ts +5 -0
- package/dist/realtime/StreamManager.d.ts.map +1 -1
- package/dist/realtime/TickAggregator.d.ts.map +1 -1
- package/dist/realtime/TickBars.d.ts +58 -0
- package/dist/realtime/TickBars.d.ts.map +1 -0
- package/dist/realtime/adapters/BinanceAdapter.d.ts +24 -1
- package/dist/realtime/adapters/BinanceAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/BybitAdapter.d.ts +3 -1
- package/dist/realtime/adapters/BybitAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/CoinbaseAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/KrakenAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/MockAdapter.d.ts +19 -1
- package/dist/realtime/adapters/MockAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/PollingAdapter.d.ts +14 -1
- package/dist/realtime/adapters/PollingAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/ResamplingAdapter.d.ts +84 -0
- package/dist/realtime/adapters/ResamplingAdapter.d.ts.map +1 -0
- package/dist/realtime/adapters/WebSocketAdapter.d.ts +14 -1
- package/dist/realtime/adapters/WebSocketAdapter.d.ts.map +1 -1
- package/dist/realtime/adapters/binanceTypes.d.ts +10 -1
- package/dist/realtime/adapters/binanceTypes.d.ts.map +1 -1
- package/dist/realtime/adapters/index.d.ts +1 -0
- package/dist/realtime/adapters/index.d.ts.map +1 -1
- package/dist/realtime/index.d.ts +1 -0
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/trading/BracketTool.d.ts.map +1 -1
- package/dist/trading/OrderDraftTool.d.ts.map +1 -1
- package/dist/trading/OrderRenderer.d.ts +2 -1
- package/dist/trading/OrderRenderer.d.ts.map +1 -1
- package/dist/trading/PaperExecutionAdapter.d.ts +17 -3
- package/dist/trading/PaperExecutionAdapter.d.ts.map +1 -1
- package/dist/trading/PositionRenderer.d.ts +6 -1
- package/dist/trading/PositionRenderer.d.ts.map +1 -1
- package/dist/trading/TradingContextMenu.d.ts +1 -1
- package/dist/trading/TradingContextMenu.d.ts.map +1 -1
- package/dist/trading/TradingDragHandler.d.ts.map +1 -1
- package/dist/trading/TradingManager.d.ts +26 -2
- package/dist/trading/TradingManager.d.ts.map +1 -1
- package/dist/trading/TradingRenderer.d.ts +2 -0
- package/dist/trading/TradingRenderer.d.ts.map +1 -1
- package/dist/trading/fillMarks.d.ts +14 -0
- package/dist/trading/fillMarks.d.ts.map +1 -0
- package/dist/trading/lineButtons.d.ts +31 -0
- package/dist/trading/lineButtons.d.ts.map +1 -0
- package/dist/trading/plot.d.ts +4 -0
- package/dist/trading/plot.d.ts.map +1 -0
- package/dist/trading/positionFormat.d.ts +1 -1
- package/dist/trading/positionFormat.d.ts.map +1 -1
- package/dist/ui/BarCountdown.d.ts.map +1 -1
- package/dist/ui/PriceLines.d.ts +38 -0
- package/dist/ui/PriceLines.d.ts.map +1 -0
- package/dist/ui/SessionBreaks.d.ts +14 -1
- package/dist/ui/SessionBreaks.d.ts.map +1 -1
- package/dist/ui/SessionShading.d.ts +5 -0
- package/dist/ui/SessionShading.d.ts.map +1 -1
- package/dist/ui/Watermark.d.ts +2 -0
- package/dist/ui/Watermark.d.ts.map +1 -1
- package/dist/ui/axisValueLabels.d.ts +52 -0
- package/dist/ui/axisValueLabels.d.ts.map +1 -0
- package/dist/ui/index.d.ts +7 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/sessionHours.d.ts +12 -2
- package/dist/ui/sessionHours.d.ts.map +1 -1
- package/dist/ui/shapes.d.ts +9 -0
- package/dist/ui/shapes.d.ts.map +1 -0
- package/dist/viewport/Viewport.d.ts +35 -2
- package/dist/viewport/Viewport.d.ts.map +1 -1
- package/dist/viewport/index.d.ts +1 -1
- package/dist/viewport/index.d.ts.map +1 -1
- package/dist/viewport/rangePresets.d.ts +4 -2
- package/dist/viewport/rangePresets.d.ts.map +1 -1
- package/dist/webgl/WebGLSeriesRenderer.d.ts +70 -0
- package/dist/webgl/WebGLSeriesRenderer.d.ts.map +1 -0
- package/dist/webgl/commandDrawer.d.ts +31 -0
- package/dist/webgl/commandDrawer.d.ts.map +1 -0
- package/dist/webgl/glColor.d.ts +13 -0
- package/dist/webgl/glColor.d.ts.map +1 -0
- package/dist/webgl/glKit.d.ts +26 -0
- package/dist/webgl/glKit.d.ts.map +1 -0
- package/dist/webgl/index.d.ts +5 -0
- package/dist/webgl/index.d.ts.map +1 -0
- package/dist/webgl/polygonSpans.d.ts +20 -0
- package/dist/webgl/polygonSpans.d.ts.map +1 -0
- package/dist/webgl/recordedCommands.d.ts +75 -0
- package/dist/webgl/recordedCommands.d.ts.map +1 -0
- package/dist/webgl/recordedPath.d.ts +51 -0
- package/dist/webgl/recordedPath.d.ts.map +1 -0
- package/dist/webgl/recordedShaders.d.ts +38 -0
- package/dist/webgl/recordedShaders.d.ts.map +1 -0
- package/dist/webgl/recorder.d.ts +67 -0
- package/dist/webgl/recorder.d.ts.map +1 -0
- package/dist/webgl/seriesUploads.d.ts +40 -0
- package/dist/webgl/seriesUploads.d.ts.map +1 -0
- package/dist/webgl/shaders.d.ts +39 -0
- package/dist/webgl/shaders.d.ts.map +1 -0
- package/dist/webgl/strokeGeometry.d.ts +28 -0
- package/dist/webgl/strokeGeometry.d.ts.map +1 -0
- package/dist/webgl/yMapping.d.ts +32 -0
- package/dist/webgl/yMapping.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { GpuRenderer } from './gpu.js';
|
|
2
|
+
/**
|
|
3
|
+
* The WebGL renderer, loaded on first use so it stays out of the main bundle.
|
|
4
|
+
* Null where WebGL 2 can't be had (with 'auto': nor where it only runs in
|
|
5
|
+
* software, slower than Canvas 2D). A failure to load (offline, a blocked
|
|
6
|
+
* script) is logged as a warning, not thrown: the chart draws on with Canvas 2D.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadWebGLRenderer(mode: 'webgl' | 'auto'): Promise<GpuRenderer | null>;
|
|
9
|
+
//# sourceMappingURL=loadWebGL.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadWebGL.d.ts","sourceRoot":"","sources":["../../src/engine/loadWebGL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAS3F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Rect } from '@tradecanvas/commons';
|
|
2
|
+
import { GpuRecorder, GpuRegion } from './gpu.js';
|
|
3
|
+
/** A piece of the chart's drawing, on any 2D context: the chart's own, or one recording for the GPU. */
|
|
4
|
+
export type DrawStep = (c: CanvasRenderingContext2D) => void;
|
|
5
|
+
/** A pane's drawing: its background over the whole pane, then levels and indicators below its header. */
|
|
6
|
+
export interface PaneSteps {
|
|
7
|
+
id: string;
|
|
8
|
+
rect: Rect;
|
|
9
|
+
inner: Rect;
|
|
10
|
+
background: DrawStep;
|
|
11
|
+
steps: DrawStep[];
|
|
12
|
+
}
|
|
13
|
+
/** What is left for Canvas 2D in a pane once the GPU has taken what it can. */
|
|
14
|
+
export interface PanePlan {
|
|
15
|
+
/** Whether the GPU drew the background. */
|
|
16
|
+
background: boolean;
|
|
17
|
+
/** The text of the steps the GPU drew. */
|
|
18
|
+
text: GpuRegion | null;
|
|
19
|
+
/** The steps left for Canvas 2D, in order. */
|
|
20
|
+
rest: DrawStep[];
|
|
21
|
+
}
|
|
22
|
+
/** Who draws what in the plot and panes this frame. */
|
|
23
|
+
export interface StepPlan {
|
|
24
|
+
/** The plot's steps left for Canvas 2D, in order. */
|
|
25
|
+
plot: DrawStep[];
|
|
26
|
+
/** The text of the plot steps the GPU drew. */
|
|
27
|
+
plotText: GpuRegion | null;
|
|
28
|
+
/** Per pane; a pane not here is drawn wholly with Canvas 2D. */
|
|
29
|
+
panes: Map<string, PanePlan>;
|
|
30
|
+
}
|
|
31
|
+
/** Everything with Canvas 2D. */
|
|
32
|
+
export declare function canvasPlan(plot: DrawStep[]): StepPlan;
|
|
33
|
+
/**
|
|
34
|
+
* Record for the GPU the longest run of steps from the start of the plot and
|
|
35
|
+
* of each pane that it can draw. The rest stay with Canvas 2D, drawn over it
|
|
36
|
+
* in the same order, so the stacking is as with Canvas 2D alone.
|
|
37
|
+
*/
|
|
38
|
+
export declare function recordSteps(recorder: GpuRecorder, plotRect: Rect, plot: DrawStep[], panes: readonly PaneSteps[]): StepPlan;
|
|
39
|
+
//# sourceMappingURL=plotSteps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plotSteps.d.ts","sourceRoot":"","sources":["../../src/engine/plotSteps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEvD,wGAAwG;AACxG,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,wBAAwB,KAAK,IAAI,CAAC;AAE7D,yGAAyG;AACzG,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,IAAI,CAAC;IACZ,UAAU,EAAE,QAAQ,CAAC;IACrB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,8CAA8C;IAC9C,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,uDAAuD;AACvD,MAAM,WAAW,QAAQ;IACvB,qDAAqD;IACrD,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,gEAAgE;IAChE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC9B;AAED,iCAAiC;AACjC,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAErD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,QAAQ,CAa1H"}
|
|
@@ -14,6 +14,8 @@ export declare class EventBus {
|
|
|
14
14
|
private tauriBridge;
|
|
15
15
|
on(type: ChartEventType, listener: Listener): void;
|
|
16
16
|
off(type: ChartEventType, listener: Listener): void;
|
|
17
|
+
/** Whether anything listens for `type` (a menu only opens when a host shows it). */
|
|
18
|
+
hasListeners(type: ChartEventType): boolean;
|
|
17
19
|
emit(type: ChartEventType, payload: unknown): void;
|
|
18
20
|
enableTauriBridge(options: TauriBridgeOptions): void;
|
|
19
21
|
disableTauriBridge(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/events/EventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE3F,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,SAAS,CAAC,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;aACtD,CAAC;SACH,CAAC;KACH;CACF;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,WAAW,CAAmC;IAEtD,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IASlD,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAInD,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAoBlD,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIpD,kBAAkB,IAAI,IAAI;IAI1B,OAAO,IAAI,IAAI;CAIhB"}
|
|
1
|
+
{"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/events/EventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE3F,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,SAAS,CAAC,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;aACtD,CAAC;SACH,CAAC;KACH;CACF;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,WAAW,CAAmC;IAEtD,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IASlD,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAInD,oFAAoF;IACpF,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAI3C,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAoBlD,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIpD,kBAAkB,IAAI,IAAI;IAI1B,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
import { ViewportState, Theme, Point } from '@tradecanvas/commons';
|
|
2
2
|
import { Emitter } from '../realtime/Emitter.js';
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* When an alert fires: the value crosses the level (or the other line, with
|
|
5
|
+
* `target`), stays above or below it, or moves `percent` up or down within
|
|
6
|
+
* `bars` bars (`movesUp` / `movesDown`).
|
|
7
|
+
*/
|
|
8
|
+
export type AlertCondition = 'crossingUp' | 'crossingDown' | 'crossing' | 'greaterThan' | 'lessThan' | 'movesUp' | 'movesDown';
|
|
9
|
+
/** What an alert can add to a level: another line, a move, bar closes, an end. */
|
|
10
|
+
export interface AlertOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Compare with this channel instead of the level: the price crossing a
|
|
13
|
+
* moving average (`'<instanceId>:value'`), one indicator line crossing
|
|
14
|
+
* another. Not with `movesUp` / `movesDown`.
|
|
15
|
+
*/
|
|
16
|
+
target?: string;
|
|
17
|
+
/** `movesUp` / `movesDown`: the move in percent… */
|
|
18
|
+
percent?: number;
|
|
19
|
+
/**
|
|
20
|
+
* …within this many bars (2–500), counting the forming one; the move is
|
|
21
|
+
* measured on each bar's latest value (its close, for a closed bar).
|
|
22
|
+
*/
|
|
23
|
+
bars?: number;
|
|
24
|
+
/** Look only at bars that closed: no firing on a wick that comes back. */
|
|
25
|
+
onBarClose?: boolean;
|
|
26
|
+
/** When it stops (ms since the epoch): past it, it is `expired` and fires no more. */
|
|
27
|
+
expiresAt?: number;
|
|
28
|
+
}
|
|
29
|
+
/** The most bars a move may be measured over. */
|
|
30
|
+
export declare const MAX_ALERT_BARS = 500;
|
|
31
|
+
/** The fewest: a move is between two bars at least. */
|
|
32
|
+
export declare const MIN_ALERT_BARS = 2;
|
|
4
33
|
export interface PriceAlert {
|
|
5
34
|
id: string;
|
|
6
35
|
price: number;
|
|
@@ -13,12 +42,29 @@ export interface PriceAlert {
|
|
|
13
42
|
channel: string;
|
|
14
43
|
/** Human label for the source (e.g. "RSI"). Defaults to the price. */
|
|
15
44
|
label?: string;
|
|
45
|
+
/**
|
|
46
|
+
* The drawing whose line(s) the price is checked against (a trend line, a
|
|
47
|
+
* channel). `price` then follows the drawing's first line at the latest bar.
|
|
48
|
+
*/
|
|
49
|
+
drawingId?: string;
|
|
50
|
+
/** See {@link AlertOptions}. */
|
|
51
|
+
target?: string;
|
|
52
|
+
percent?: number;
|
|
53
|
+
bars?: number;
|
|
54
|
+
onBarClose?: boolean;
|
|
55
|
+
expiresAt?: number;
|
|
56
|
+
/** It reached `expiresAt` without being taken down: it fires no more. */
|
|
57
|
+
expired?: boolean;
|
|
16
58
|
}
|
|
59
|
+
/** A plain level on the price: the only alerts with a line of their own on the chart. */
|
|
60
|
+
export declare function isPriceLevelAlert(alert: PriceAlert): boolean;
|
|
17
61
|
interface AlertEvents {
|
|
18
62
|
triggered: PriceAlert;
|
|
19
63
|
added: PriceAlert;
|
|
20
64
|
removed: string;
|
|
21
65
|
updated: PriceAlert;
|
|
66
|
+
/** It reached its `expiresAt` without firing. */
|
|
67
|
+
expired: PriceAlert;
|
|
22
68
|
[key: string]: unknown;
|
|
23
69
|
}
|
|
24
70
|
/**
|
|
@@ -28,11 +74,40 @@ interface AlertEvents {
|
|
|
28
74
|
export declare class AlertManager extends Emitter<AlertEvents> {
|
|
29
75
|
private alerts;
|
|
30
76
|
private lastValues;
|
|
77
|
+
/** Per drawing alert, which side of each of its lines the price was on (-1, 0, 1). */
|
|
78
|
+
private drawingSides;
|
|
79
|
+
private drawingLevels;
|
|
31
80
|
private requestRender;
|
|
32
81
|
private pricePrecision;
|
|
82
|
+
/** The forming bar's time, for moves over bars and bar closes. */
|
|
83
|
+
private barTime;
|
|
84
|
+
private expiryTimer;
|
|
85
|
+
private history;
|
|
86
|
+
/** Per alert on another line, this line minus that one when last seen (a crossing needs two). */
|
|
87
|
+
private lastDiffs;
|
|
88
|
+
/** The time of the bar forming now: values come per bar from here on. */
|
|
89
|
+
setBarTime(time: number | null): void;
|
|
33
90
|
setRequestRender(cb: () => void): void;
|
|
34
91
|
setPricePrecision(precision: number): void;
|
|
35
|
-
addAlert(price: number, condition?: AlertCondition, message?: string, repeating?: boolean, channel?: string, label?: string): string;
|
|
92
|
+
addAlert(price: number, condition?: AlertCondition, message?: string, repeating?: boolean, channel?: string, label?: string, options?: AlertOptions): string;
|
|
93
|
+
/**
|
|
94
|
+
* Where a drawing's lines are now: its prices at the latest bar, or null
|
|
95
|
+
* when it is gone or doesn't reach that time. Drawing alerts need it.
|
|
96
|
+
*/
|
|
97
|
+
setDrawingLevels(resolver: ((drawingId: string) => number[] | null) | null): void;
|
|
98
|
+
/** Alert when the price crosses a drawing's line(s). Throws a RangeError for a non-crossing condition. */
|
|
99
|
+
addDrawingAlert(drawingId: string, condition?: AlertCondition, message?: string, repeating?: boolean, label?: string): string;
|
|
100
|
+
/** Remove every alert on a drawing (it was deleted). */
|
|
101
|
+
removeDrawingAlerts(drawingId: string): void;
|
|
102
|
+
/**
|
|
103
|
+
* Remove a drawing's alerts and hand them over, to put back with
|
|
104
|
+
* `restoreAlerts` if the drawing comes back (an undo).
|
|
105
|
+
*/
|
|
106
|
+
takeDrawingAlerts(drawingId: string): PriceAlert[];
|
|
107
|
+
/** Put alerts back (from `takeDrawingAlerts`); ones already here are skipped. */
|
|
108
|
+
restoreAlerts(alerts: readonly PriceAlert[]): void;
|
|
109
|
+
/** Remove alerts on drawings that aren't in `drawingIds`. Returns how many went. */
|
|
110
|
+
pruneDrawingAlerts(drawingIds: ReadonlySet<string>): number;
|
|
36
111
|
removeAlert(id: string): void;
|
|
37
112
|
getAlerts(): PriceAlert[];
|
|
38
113
|
/** First alert whose line is within `tolerance` px of `point.y`, or null. */
|
|
@@ -40,14 +115,48 @@ export declare class AlertManager extends Emitter<AlertEvents> {
|
|
|
40
115
|
/** Move an alert to a new price (used by drag). Re-arms a triggered alert. */
|
|
41
116
|
updateAlertPrice(id: string, price: number): void;
|
|
42
117
|
clearAlerts(): void;
|
|
43
|
-
/** Call on each price update to check price-channel alerts. */
|
|
118
|
+
/** Call on each price update to check price-channel alerts and alerts on drawings. */
|
|
44
119
|
checkPrice(price: number): void;
|
|
120
|
+
/** Alerts on drawings, against the price (`checkChannels` covers the others). */
|
|
121
|
+
checkDrawings(price: number): void;
|
|
122
|
+
/** Alerts past their `expiresAt` stop, and say so (a one-shot that already fired is done, not expired). */
|
|
123
|
+
private expire;
|
|
124
|
+
/** Wake up at the next expiry, so an alert expires without ticks too. */
|
|
125
|
+
private scheduleExpiry;
|
|
126
|
+
/** Stop the expiry timer (the chart is going). */
|
|
127
|
+
dispose(): void;
|
|
128
|
+
private checkDrawingAlerts;
|
|
45
129
|
/**
|
|
46
|
-
* Evaluate every alert
|
|
47
|
-
* indicator-line value
|
|
48
|
-
*
|
|
130
|
+
* Evaluate every alert on `channel` (or comparing with it) against `value`,
|
|
131
|
+
* e.g. the latest indicator-line value. The previous value per channel is
|
|
132
|
+
* kept for crossings, and one value per bar (`setBarTime`) for moves over
|
|
133
|
+
* bars and for alerts that look only at closed bars. To compare lines at
|
|
134
|
+
* the same moment, give them together with `checkChannels`.
|
|
49
135
|
*/
|
|
50
136
|
checkChannel(channel: string, value: number): void;
|
|
137
|
+
/**
|
|
138
|
+
* Take the latest value of several channels at once (the price and the
|
|
139
|
+
* indicator lines alerts watch), then evaluate the alerts on them: a line
|
|
140
|
+
* against another line compares values of the same moment. With
|
|
141
|
+
* `together`, an alert comparing two lines waits for a call that gives
|
|
142
|
+
* both (otherwise it takes the other's latest value).
|
|
143
|
+
*/
|
|
144
|
+
checkChannels(values: ReadonlyMap<string, number> | Readonly<Record<string, number>>, options?: {
|
|
145
|
+
together?: boolean;
|
|
146
|
+
}): void;
|
|
147
|
+
/** Fire once on entering the condition; a repeating alert re-arms once it leaves. */
|
|
148
|
+
private settle;
|
|
149
|
+
/** The line against the other one, tick by tick: their difference crossing zero. */
|
|
150
|
+
private targetMet;
|
|
151
|
+
/** `percent` up from the lowest (or down from the highest) value of the last `bars` bars. */
|
|
152
|
+
private moveMet;
|
|
153
|
+
/** On the bar that just closed (`closed` in the history of the alert's channel). */
|
|
154
|
+
private closedBarMet;
|
|
155
|
+
/**
|
|
156
|
+
* Keep `value` as the forming bar's on `channel`. Returns the bar that just
|
|
157
|
+
* closed when this value starts a new one.
|
|
158
|
+
*/
|
|
159
|
+
private recordBar;
|
|
51
160
|
/**
|
|
52
161
|
* Forget per-channel previous values. Call on a data context change (symbol /
|
|
53
162
|
* timeframe switch) so the first value of the new context seeds cleanly
|
|
@@ -58,5 +167,7 @@ export declare class AlertManager extends Emitter<AlertEvents> {
|
|
|
58
167
|
loadFromStorage(key: string): void;
|
|
59
168
|
render(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme): void;
|
|
60
169
|
}
|
|
170
|
+
/** The options of a stored alert (anything else is left out). */
|
|
171
|
+
export declare function readAlertOptions(raw: Record<string, unknown>): AlertOptions;
|
|
61
172
|
export {};
|
|
62
173
|
//# sourceMappingURL=AlertManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlertManager.d.ts","sourceRoot":"","sources":["../../src/features/AlertManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"AlertManager.d.ts","sourceRoot":"","sources":["../../src/features/AlertManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChartType, DrawingState, IndicatorStyleConfig, TradingOrder, TradingPosition, Theme } from '@tradecanvas/commons';
|
|
1
|
+
import { ChartType, ChartTypeOptions, DrawingState, IndicatorStyleConfig, TradingOrder, TradingPosition, Theme } from '@tradecanvas/commons';
|
|
2
2
|
import { PriceAlert } from './AlertManager.js';
|
|
3
3
|
/**
|
|
4
4
|
* Serializable chart state for save/load functionality.
|
|
@@ -10,6 +10,8 @@ export interface ChartSnapshot {
|
|
|
10
10
|
symbol?: string;
|
|
11
11
|
timeframe?: string;
|
|
12
12
|
chartType: ChartType;
|
|
13
|
+
/** Settings of the chart types that build their own bars. */
|
|
14
|
+
chartTypeOptions?: ChartTypeOptions;
|
|
13
15
|
viewport: {
|
|
14
16
|
barWidth: number;
|
|
15
17
|
barSpacing: number;
|
|
@@ -32,6 +34,21 @@ export interface SnapshotIndicator {
|
|
|
32
34
|
position?: string;
|
|
33
35
|
style?: IndicatorStyleConfig;
|
|
34
36
|
visible?: boolean;
|
|
37
|
+
/** Its own reference levels; absent = the indicator's defaults. */
|
|
38
|
+
levels?: number[];
|
|
39
|
+
/** The instance (id when saved) whose pane it is drawn in, when not its own. */
|
|
40
|
+
pane?: string;
|
|
41
|
+
/** `'left'`: an overlay on the left price scale. */
|
|
42
|
+
scale?: 'left';
|
|
43
|
+
/** For an indicator with a pane of its own: the pane's height, place among the panes, fold and maximise. */
|
|
44
|
+
paneSize?: number;
|
|
45
|
+
paneOrder?: number;
|
|
46
|
+
paneCollapsed?: boolean;
|
|
47
|
+
paneMaximized?: boolean;
|
|
48
|
+
/** The pane's value scale: logarithmic, upside down. */
|
|
49
|
+
paneLog?: boolean;
|
|
50
|
+
paneInvert?: boolean;
|
|
51
|
+
panePercent?: boolean;
|
|
35
52
|
}
|
|
36
53
|
/**
|
|
37
54
|
* 2: indicators (params, pane, style, visibility) and full alerts (channel,
|
|
@@ -54,6 +71,7 @@ export declare class ChartStateManager {
|
|
|
54
71
|
symbol?: string;
|
|
55
72
|
timeframe?: string;
|
|
56
73
|
chartType?: ChartType;
|
|
74
|
+
chartTypeOptions?: ChartTypeOptions;
|
|
57
75
|
}): ChartSnapshot;
|
|
58
76
|
/** Serialize to JSON string */
|
|
59
77
|
static serialize(snapshot: ChartSnapshot): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartState.d.ts","sourceRoot":"","sources":["../../src/features/ChartState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ChartState.d.ts","sourceRoot":"","sources":["../../src/features/ChartState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { OHLCBar } from '@tradecanvas/commons';
|
|
2
|
+
/** One more column next to the bars: an indicator line, one value per bar. */
|
|
3
|
+
export interface ExportColumn {
|
|
4
|
+
name: string;
|
|
5
|
+
values: ReadonlyArray<number | null | undefined>;
|
|
6
|
+
}
|
|
2
7
|
export declare class DataExporter {
|
|
3
|
-
static toCSV(data: ReadonlyArray<OHLCBar
|
|
4
|
-
static toJSON(data: ReadonlyArray<OHLCBar
|
|
8
|
+
static toCSV(data: ReadonlyArray<OHLCBar>, columns?: readonly ExportColumn[]): string;
|
|
9
|
+
static toJSON(data: ReadonlyArray<OHLCBar>, columns?: readonly ExportColumn[]): string;
|
|
5
10
|
static download(content: string, filename: string, mimeType: string): void;
|
|
6
11
|
}
|
|
7
12
|
//# sourceMappingURL=DataExporter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataExporter.d.ts","sourceRoot":"","sources":["../../src/features/DataExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"DataExporter.d.ts","sourceRoot":"","sources":["../../src/features/DataExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAClD;AAoBD,qBAAa,YAAY;IACvB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,GAAE,SAAS,YAAY,EAAO,GAAG,MAAM;IASzF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,GAAE,SAAS,YAAY,EAAO,GAAG,MAAM;IAkB1F,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAW3E"}
|
|
@@ -9,6 +9,13 @@ export interface ReplayConfig {
|
|
|
9
9
|
* the first tick — so entering replay shows the cut immediately.
|
|
10
10
|
*/
|
|
11
11
|
paused?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Finer bars to replay through (5-minute bars under an hourly chart): each
|
|
14
|
+
* step grows the forming bar from them, and closed bars show as they are
|
|
15
|
+
* in the chart's series. `startIndex` stays a bar of the chart's series.
|
|
16
|
+
* The chart reads this; the manager itself steps through what it is given.
|
|
17
|
+
*/
|
|
18
|
+
steps?: DataSeries;
|
|
12
19
|
}
|
|
13
20
|
interface ReplayEvents {
|
|
14
21
|
bar: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReplayManager.d.ts","sourceRoot":"","sources":["../../src/features/ReplayManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ReplayManager.d.ts","sourceRoot":"","sources":["../../src/features/ReplayManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,GAAG,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC9C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,OAAO,CAAC,YAAY,CAAC;IACtD,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,MAAM,CAA6C;IAE3D,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAM5B,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IA2B1C,KAAK,IAAI,IAAI;IAKb,MAAM,IAAI,IAAI;IAId,IAAI,IAAI,IAAI;IAMZ;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,QAAQ,IAAI,SAAS,GAAG,QAAQ,GAAG,SAAS;IAI5C,yCAAyC;IACzC,OAAO,IAAI,OAAO;IAIlB,sEAAsE;IACtE,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IASlE,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,IAAI;IAiBZ,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,QAAQ;CAKjB"}
|
|
@@ -22,6 +22,14 @@ export declare class SignalMarkerManager extends Emitter<SignalMarkerEvents> {
|
|
|
22
22
|
getMarkers(): SignalMarker[];
|
|
23
23
|
clearMarkers(): void;
|
|
24
24
|
setMarkers(markers: SignalMarker[]): void;
|
|
25
|
+
/**
|
|
26
|
+
* The marker under `point` (the one drawn last when several overlap), or
|
|
27
|
+
* null. Its arrow and a few pixels around it count.
|
|
28
|
+
*/
|
|
29
|
+
markerAt(point: {
|
|
30
|
+
x: number;
|
|
31
|
+
y: number;
|
|
32
|
+
}, viewport: ViewportState): SignalMarker | null;
|
|
25
33
|
render(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme): void;
|
|
26
34
|
private resolveColor;
|
|
27
35
|
private renderArrow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignalMarkerManager.d.ts","sourceRoot":"","sources":["../../src/features/SignalMarkerManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9G,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"SignalMarkerManager.d.ts","sourceRoot":"","sources":["../../src/features/SignalMarkerManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9G,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAOD,qBAAa,mBAAoB,SAAQ,OAAO,CAAC,kBAAkB,CAAC;IAClE,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,KAAK,CAAkD;IAC/D,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAAmC;IAErD,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAItC,aAAa,CAAC,MAAM,EAAE,MAAM,UAAU,GAAG,IAAI;IAI7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAKjD,QAAQ,IAAI,iBAAiB;IAI7B,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IASrE,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM9B,UAAU,IAAI,YAAY,EAAE;IAI5B,YAAY,IAAI,IAAI;IAMpB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI;IAKzC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI;IAmBvF,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAsDlF,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,WAAW;CAiCpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TradeZoneManager.d.ts","sourceRoot":"","sources":["../../src/features/TradeZoneManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGxG,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"TradeZoneManager.d.ts","sourceRoot":"","sources":["../../src/features/TradeZoneManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGxG,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,UAAU,eAAe;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,qBAAa,gBAAiB,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC5D,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,KAAK,CAAmD;IAChE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,cAAc,CAAK;IAE3B,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAItC,aAAa,CAAC,MAAM,EAAE,MAAM,UAAU,GAAG,IAAI;IAI7C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAK9C,QAAQ,IAAI,cAAc;IAI1B,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAS9D,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI;IAOrE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM5B,QAAQ,IAAI,SAAS,EAAE;IAIvB,UAAU,IAAI,IAAI;IAMlB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI;IAKlC,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAmBlF,OAAO,CAAC,UAAU;CA4GnB"}
|
|
@@ -1,12 +1,35 @@
|
|
|
1
1
|
import { DrawingState } from '@tradecanvas/commons';
|
|
2
|
+
import { SnapshotIndicator } from './ChartState.js';
|
|
2
3
|
export interface UndoableAction {
|
|
3
|
-
|
|
4
|
+
/** `'indicators'`: the chart's indicators changed (added, removed, edited, moved between panes). */
|
|
5
|
+
type: 'drawingCreate' | 'drawingRemove' | 'drawingModify' | 'drawingBatch' | 'drawingOrder' | 'indicators' | 'custom';
|
|
4
6
|
/** State before the action (null for create) */
|
|
5
7
|
before: DrawingState | null;
|
|
6
8
|
/** State after the action (null for remove) */
|
|
7
9
|
after: DrawingState | null;
|
|
8
10
|
/** For 'drawingBatch': the actions undone/redone together as one step. */
|
|
9
11
|
actions?: UndoableAction[];
|
|
12
|
+
/** For 'drawingRemove': where the drawing was, so undo puts it back there. */
|
|
13
|
+
index?: number;
|
|
14
|
+
/** For 'drawingOrder': the drawings' ids, bottom to top, before and after. */
|
|
15
|
+
order?: {
|
|
16
|
+
before: string[];
|
|
17
|
+
after: string[];
|
|
18
|
+
};
|
|
19
|
+
/** For 'indicators': the indicators before and after, and what changed (to merge a burst of edits). */
|
|
20
|
+
indicators?: {
|
|
21
|
+
before: SnapshotIndicator[];
|
|
22
|
+
after: SnapshotIndicator[];
|
|
23
|
+
subject?: string;
|
|
24
|
+
at?: number;
|
|
25
|
+
};
|
|
26
|
+
/** For 'custom': a change recorded by its owner (`Chart.recordUndo`), and what it was about (to merge a burst). */
|
|
27
|
+
custom?: {
|
|
28
|
+
undo: () => void;
|
|
29
|
+
redo: () => void;
|
|
30
|
+
subject?: string;
|
|
31
|
+
at: number;
|
|
32
|
+
};
|
|
10
33
|
}
|
|
11
34
|
export declare class UndoRedoManager {
|
|
12
35
|
private undoStack;
|
|
@@ -20,6 +43,12 @@ export declare class UndoRedoManager {
|
|
|
20
43
|
undo(): UndoableAction | null;
|
|
21
44
|
redo(): UndoableAction | null;
|
|
22
45
|
clear(): void;
|
|
46
|
+
/** The step an undo would take back, or null. */
|
|
47
|
+
last(): UndoableAction | null;
|
|
48
|
+
/** Forget the last step (nothing to redo after it either). */
|
|
49
|
+
dropLast(): void;
|
|
50
|
+
/** Put `action` in place of the last step (a burst of edits as one step); nothing to redo after it. */
|
|
51
|
+
replaceLast(action: UndoableAction): void;
|
|
23
52
|
getState(): {
|
|
24
53
|
canUndo: boolean;
|
|
25
54
|
canRedo: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UndoRedoManager.d.ts","sourceRoot":"","sources":["../../src/features/UndoRedoManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"UndoRedoManager.d.ts","sourceRoot":"","sources":["../../src/features/UndoRedoManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,oGAAoG;IACpG,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,GAAG,cAAc,GAAG,YAAY,GAAG,QAAQ,CAAC;IACtH,gDAAgD;IAChD,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,+CAA+C;IAC/C,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9C,uGAAuG;IACvG,UAAU,CAAC,EAAE;QAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxG,mHAAmH;IACnH,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAA6B;IAE7C,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAIjC,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAUlC,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,OAAO;IAIlB,IAAI,IAAI,cAAc,GAAG,IAAI;IAQ7B,IAAI,IAAI,cAAc,GAAG,IAAI;IAQ7B,KAAK,IAAI,IAAI;IAMb,iDAAiD;IACjD,IAAI,IAAI,cAAc,GAAG,IAAI;IAI7B,8DAA8D;IAC9D,QAAQ,IAAI,IAAI;IAOhB,uGAAuG;IACvG,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAUzC,QAAQ,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAQzF"}
|
package/dist/features/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { AlertManager } from './AlertManager.js';
|
|
2
|
-
export type { PriceAlert, AlertCondition } from './AlertManager.js';
|
|
2
|
+
export type { PriceAlert, AlertCondition, AlertOptions } from './AlertManager.js';
|
|
3
|
+
export { isPriceLevelAlert, readAlertOptions, MAX_ALERT_BARS, MIN_ALERT_BARS } from './AlertManager.js';
|
|
3
4
|
export { ReplayManager } from './ReplayManager.js';
|
|
4
5
|
export type { ReplayConfig } from './ReplayManager.js';
|
|
5
6
|
export { ChartStateManager } from './ChartState.js';
|
|
@@ -8,6 +9,7 @@ export { SNAPSHOT_VERSION } from './ChartState.js';
|
|
|
8
9
|
export { UndoRedoManager } from './UndoRedoManager.js';
|
|
9
10
|
export type { UndoableAction } from './UndoRedoManager.js';
|
|
10
11
|
export { DataExporter } from './DataExporter.js';
|
|
12
|
+
export type { ExportColumn } from './DataExporter.js';
|
|
11
13
|
export { SignalMarkerManager } from './SignalMarkerManager.js';
|
|
12
14
|
export { TradeZoneManager } from './TradeZoneManager.js';
|
|
13
15
|
export { MeasureOverlay } from './MeasureOverlay.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvF,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require(`@tradecanvas/commons`);function t(e,t){return e*(t.barWidth+t.barSpacing)-t.offset+t.chartRect.x+t.barWidth/2}function n(e,t){let{min:n,max:r}=t.priceRange,{y:i,height:a}=t.chartRect,o;if(t.logScale&&n>0&&r>0){let t=Math.log(n),s=Math.log(r)-t;if(s===0)return i+a/2;o=(Math.log(Math.max(e,2**-52))-t)/s}else{let t=r-n;if(t===0)return i+a/2;o=(e-n)/t}return i+a*(t.invertScale?o:1-o)}function r(e){let{min:t,max:n}=e.priceRange,{y:r,height:i}=e.chartRect,a=e.invertScale===!0;if(e.logScale&&t>0&&n>0){let e=Math.log(t),o=Math.log(n)-e;if(o===0)return()=>r+i/2;let s=i/o,c=r+i;return a?t=>r+(Math.log(Math.max(t,2**-52))-e)*s:t=>c-(Math.log(Math.max(t,2**-52))-e)*s}let o=n-t;if(o===0)return()=>r+i/2;let s=i/o;return a?e=>r+(e-t)*s:e=>r+(n-e)*s}function i(e,t,n,r){let{min:i,max:a}=n.priceRange,o=(a-i)/t,s=r(i+e*o),c=r(i+(e+1)*o);return{top:Math.min(s,c),height:Math.abs(s-c),mid:(s+c)/2}}function a(e,t){let n=t.barWidth+t.barSpacing;return Math.round((e-t.chartRect.x-t.barWidth/2+t.offset)/n)}function o(e,t){let{min:n,max:r}=t.priceRange,i=(e-t.chartRect.y)/t.chartRect.height,a=t.invertScale?i:1-i;if(t.logScale&&n>0&&r>0){let e=Math.log(n);return Math.exp(e+(Math.log(r)-e)*a)}return n+(r-n)*a}var s=new WeakMap;function c(e){let t=e.length;if(t<2)return 0;let n=s.get(e);if(n&&n.length===t)return n.step;let r=[];for(let n=Math.max(1,t-20);n<t;n++)r.push(e[n].time-e[n-1].time);r.sort((e,t)=>e-t);let i=Math.max(0,r[r.length>>1]);return s.set(e,{length:t,step:i}),i}function l(e){let t=c(e);return(e.length>0?e[e.length-1].time:0)>0xe8d4a51000?t:t*1e3}function u(e,t){let n=t.length;if(n===0)return e;let r=n-1;if(e>r)return t[r].time+(e-r)*c(t);if(e<0)return t[0].time+e*c(t);let i=Math.floor(e);return i===e||i>=r?t[i].time:t[i].time+(e-i)*(t[i+1].time-t[i].time)}function d(e,t){if(t.length===0)return-1;let n=t[0].time,r=t.length-1,i=t[r].time;if(e<=n||e>=i){if(e===n)return 0;if(e===i)return r;let a=c(t);return a<=0?e<n?0:r:e<n?(e-n)/a:r+(e-i)/a}let a=0,o=t.length-1;for(;a<=o;){let n=a+o>>>1;if(t[n].time===e)return n;t[n].time<e?a=n+1:o=n-1}if(a>=t.length)return t.length-1;if(o<0)return 0;let s=t[o].time,l=t[a].time,u=l===s?0:(e-s)/(l-s);return o+u}function f(e,t){let n=t.data;return n&&n.length>0?d(e,n):e}function p(e,n){return t(f(e,n),n)}function m(e,t){let n=a(e,t),r=t.data;return r&&r.length>0?u(n,r):n}function h(e){let t=typeof e.getTransform==`function`?e.getTransform():void 0;return{a:t&&Number.isFinite(t.a)&&t.a>0?t.a:1,d:t&&Number.isFinite(t.d)&&t.d>0?t.d:1,e:t&&Number.isFinite(t.e)?t.e:0,f:t&&Number.isFinite(t.f)?t.f:0}}function g(e,t){let{a:n,d:r,e:i,f:a}=h(e);e.save(),e.setTransform(1,0,0,1,0,0);try{return t({ratio:n,x:e=>Math.round(e*n+i),y:e=>Math.round(e*r+a),left:(e,t)=>Math.round(e*n+i-t/2)})}finally{e.restore()}}function _(e,t){let n=Math.max(1,Math.floor(t)),r=Math.max(n,Math.round(e*t));return(r-n)%2!=0&&--r,{body:Math.max(r,n),wick:n}}function v(e,t,n,r){let i=Math.max(1,Math.round(t*n)),a=i%2?.5:0;return{at:(Math.round(e*n+r-a)+a-r)/n,width:i/n}}function y(e,t,n){let r=h(e),i=v(t,n,r.d,r.f);return{y:i.at,width:i.width}}function b(e,t,n){let r=h(e),i=v(t,n,r.a,r.e);return{x:i.at,width:i.width}}var x=1;function S(e){return e.barWidth<1}function C(e,t,n,r,i){let a=Math.min(n,e.length-1);if(t>a)return;let o={x:0,open:0,high:0,low:0,close:0,volume:0},s=!1;for(let n=Math.max(0,t);n<=a;n++){let t=e[n],a=Math.floor(r(n));s&&a!==o.x&&(i(o),s=!1),s?(t.high>o.high&&(o.high=t.high),t.low<o.low&&(o.low=t.low),t.volume>o.volume&&(o.volume=t.volume)):(o.x=a,o.open=t.open,o.high=t.high,o.low=t.low,o.volume=t.volume,s=!0),o.close=t.close}s&&i(o)}function w(e,t,n,i,a){let{from:o,to:s}=n.visibleRange,c=n.barWidth+n.barSpacing,l=-n.offset+n.chartRect.x+n.barWidth/2,u=r(n);g(e,n=>{let r=new Path2D,d=new Path2D;C(t,o,s,e=>e*c+l,e=>{let t=n.y(u(e.high)),i=n.y(u(e.low)),a=n.x(e.x),o=Math.max(1,n.x(e.x+1)-a);(e.close>=e.open?r:d).rect(a,Math.min(t,i),o,Math.max(Math.abs(i-t),1))}),e.fillStyle=i,e.fill(r),e.fillStyle=a,e.fill(d)})}var T=80;function E(t){let{chartRect:n,priceRange:i}=t;if(i.max-i.min<=0)return{horizontal:[],vertical:[]};let a=r(t),o=[],s=(0,e.computeTickStep)(i.min,i.max,8),c=Math.ceil(i.min/s)*s;for(let e=c;e<=i.max;e+=s)o.push(Math.round(a(e))+.5);let l=[],u=t.barWidth+t.barSpacing,d=Math.max(1,Math.ceil(T/u)),f=-t.offset+n.x+t.barWidth/2,p=Math.floor(t.offset/u),m=Math.ceil((t.offset+n.width)/u);for(let e=p;e<=m;e++)e%d===0&&l.push(Math.round(e*u+f)+.5);return{horizontal:o,vertical:l}}Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return d}});
|
|
2
|
+
//# sourceMappingURL=gridLines-J41F0DQ6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gridLines-J41F0DQ6.cjs","names":[],"sources":["../src/viewport/ScaleMapping.ts","../src/charts/pixelGrid.ts","../src/charts/denseBars.ts","../src/axis/gridLines.ts"],"sourcesContent":["import type { ViewportState } from '@tradecanvas/commons';\n\nexport function barIndexToX(index: number, viewport: ViewportState): number {\n const barUnit = viewport.barWidth + viewport.barSpacing;\n return index * barUnit - viewport.offset + viewport.chartRect.x + viewport.barWidth / 2;\n}\n\nexport function priceToY(price: number, viewport: ViewportState): number {\n const { min, max } = viewport.priceRange;\n const { y: top, height } = viewport.chartRect;\n let ratio: number;\n if (viewport.logScale && min > 0 && max > 0) {\n const logMin = Math.log(min);\n const logRange = Math.log(max) - logMin;\n if (logRange === 0) return top + height / 2;\n ratio = (Math.log(Math.max(price, Number.EPSILON)) - logMin) / logRange;\n } else {\n const range = max - min;\n if (range === 0) return top + height / 2;\n ratio = (price - min) / range;\n }\n return top + height * (viewport.invertScale ? ratio : 1 - ratio);\n}\n\n/**\n * `priceToY` for one frame, with the per-call work hoisted out: for renderers\n * that map every visible bar. Follows the log scale and the inverted scale.\n */\nexport function priceToYMapper(viewport: ViewportState): (price: number) => number {\n const { min, max } = viewport.priceRange;\n const { y: top, height } = viewport.chartRect;\n const invert = viewport.invertScale === true;\n if (viewport.logScale && min > 0 && max > 0) {\n const logMin = Math.log(min);\n const logRange = Math.log(max) - logMin;\n if (logRange === 0) return () => top + height / 2;\n const k = height / logRange;\n const bottom = top + height;\n return invert\n ? (price) => top + (Math.log(Math.max(price, Number.EPSILON)) - logMin) * k\n : (price) => bottom - (Math.log(Math.max(price, Number.EPSILON)) - logMin) * k;\n }\n const range = max - min;\n if (range === 0) return () => top + height / 2;\n const k = height / range;\n return invert ? (price) => top + (price - min) * k : (price) => top + (max - price) * k;\n}\n\n/**\n * Where bucket `b` of `count` equal price buckets across the price range sits\n * on screen (bucket 0 holds the lowest prices), on any scale. `toY` is the\n * frame's `priceToYMapper`.\n */\nexport function priceBucketRow(\n b: number,\n count: number,\n viewport: ViewportState,\n toY: (price: number) => number,\n): { top: number; height: number; mid: number } {\n const { min, max } = viewport.priceRange;\n const step = (max - min) / count;\n const yLow = toY(min + b * step);\n const yHigh = toY(min + (b + 1) * step);\n return { top: Math.min(yLow, yHigh), height: Math.abs(yLow - yHigh), mid: (yLow + yHigh) / 2 };\n}\n\nexport function xToBarIndex(x: number, viewport: ViewportState): number {\n const barUnit = viewport.barWidth + viewport.barSpacing;\n return Math.round((x - viewport.chartRect.x - viewport.barWidth / 2 + viewport.offset) / barUnit);\n}\n\nexport function yToPrice(y: number, viewport: ViewportState): number {\n const { min, max } = viewport.priceRange;\n const fromTop = (y - viewport.chartRect.y) / viewport.chartRect.height;\n const ratio = viewport.invertScale ? fromTop : 1 - fromTop;\n if (viewport.logScale && min > 0 && max > 0) {\n const logMin = Math.log(min);\n const logMax = Math.log(max);\n return Math.exp(logMin + (logMax - logMin) * ratio);\n }\n return min + (max - min) * ratio;\n}\n\ntype TimedSeries = ReadonlyArray<{ time: number }>;\n\nconst stepCache = new WeakMap<TimedSeries, { length: number; step: number }>();\n\n/**\n * Typical spacing between bar times — the median of the last ~20 intervals,\n * so a weekend or halt gap doesn't skew it. Used to place times beyond either\n * end of the data (the empty future the chart can be panned into). Cached per\n * series and length; 0 when there are fewer than two bars.\n */\nexport function barTimeStep(data: TimedSeries): number {\n const n = data.length;\n if (n < 2) return 0;\n const cached = stepCache.get(data);\n if (cached && cached.length === n) return cached.step;\n const diffs: number[] = [];\n for (let i = Math.max(1, n - 20); i < n; i++) diffs.push(data[i].time - data[i - 1].time);\n diffs.sort((a, b) => a - b);\n const step = Math.max(0, diffs[diffs.length >> 1]);\n stepCache.set(data, { length: n, step });\n return step;\n}\n\n/**\n * `barTimeStep` in milliseconds whatever unit the series uses: bar times\n * below 1e12 are seconds (the same rule as `normalizeBarTime`).\n */\nexport function barTimeStepMs(data: TimedSeries): number {\n const step = barTimeStep(data);\n const last = data.length > 0 ? data[data.length - 1].time : 0;\n return last > 1e12 ? step : step * 1000;\n}\n\n/**\n * Time at bar index `index`, extrapolated by `barTimeStep` past either end of\n * the data — e.g. the future area right of the newest bar.\n */\nexport function barIndexToTime(index: number, data: TimedSeries): number {\n const n = data.length;\n if (n === 0) return index;\n const last = n - 1;\n if (index > last) return data[last].time + (index - last) * barTimeStep(data);\n if (index < 0) return data[0].time + index * barTimeStep(data);\n const lo = Math.floor(index);\n if (lo === index || lo >= last) return data[lo].time;\n return data[lo].time + (index - lo) * (data[lo + 1].time - data[lo].time);\n}\n\n/**\n * Convert a bar timestamp to its data-array index via binary search.\n * Falls back to fractional interpolation when the timestamp falls between bars,\n * and extrapolates (by `barTimeStep`) for times beyond either end — so a drawing\n * anchored in the future keeps its place instead of collapsing onto the last bar.\n * Returns -1 if data is empty.\n */\nexport function timestampToBarIndex(timestamp: number, data: TimedSeries): number {\n if (data.length === 0) return -1;\n const first = data[0].time;\n const lastIdx = data.length - 1;\n const lastTime = data[lastIdx].time;\n if (timestamp <= first || timestamp >= lastTime) {\n if (timestamp === first) return 0;\n if (timestamp === lastTime) return lastIdx;\n const step = barTimeStep(data);\n if (step <= 0) return timestamp < first ? 0 : lastIdx;\n return timestamp < first ? (timestamp - first) / step : lastIdx + (timestamp - lastTime) / step;\n }\n // Binary search\n let lo = 0, hi = data.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n if (data[mid].time === timestamp) return mid;\n if (data[mid].time < timestamp) lo = mid + 1;\n else hi = mid - 1;\n }\n // lo is the insertion point; interpolate between hi and lo\n if (lo >= data.length) return data.length - 1;\n if (hi < 0) return 0;\n const tLo = data[hi].time, tHi = data[lo].time;\n const frac = tHi !== tLo ? (timestamp - tLo) / (tHi - tLo) : 0;\n return hi + frac;\n}\n\n/**\n * Resolve an anchor `time` value to a (possibly fractional) bar index in the\n * current series. When `viewport.data` is set, `time` is interpreted as a real\n * timestamp and converted via `timestampToBarIndex`. Otherwise `time` is\n * already a bar index and is returned unchanged.\n */\nexport function resolveBarIndex(time: number, viewport: ViewportState): number {\n const data = viewport.data;\n if (data && data.length > 0) {\n return timestampToBarIndex(time, data);\n }\n return time;\n}\n\n/**\n * Map an anchor `time` value to its pixel x. Works whether `time` is a\n * timestamp (when `viewport.data` is set) or a bar index (legacy callers).\n */\nexport function timeToX(time: number, viewport: ViewportState): number {\n return barIndexToX(resolveBarIndex(time, viewport), viewport);\n}\n\n/**\n * Map a pixel x back to an anchor `time` value. Returns a real timestamp when\n * `viewport.data` is set (so the value survives timeframe switches), otherwise\n * returns a bar index for legacy callers.\n */\nexport function xToTime(x: number, viewport: ViewportState): number {\n const idx = xToBarIndex(x, viewport);\n const data = viewport.data;\n if (data && data.length > 0) {\n // Past either end (the empty future, or before the oldest bar) the time\n // is extrapolated, so drawings can be placed there.\n return barIndexToTime(idx, data);\n }\n return idx;\n}\n","/**\n * Drawing on whole device pixels. The chart draws in CSS pixels under the\n * device-pixel-ratio transform, so a 1 px line at a fractional position\n * spreads over two device pixels at half strength and looks soft and thick.\n * Bars drawn here go back to the canvas's own pixels and round to them: a\n * wick is one sharp column, a body has hard edges, at any ratio (1, 1.25, 2…).\n */\n\nfunction transformOf(ctx: CanvasRenderingContext2D): { a: number; d: number; e: number; f: number } {\n const m = typeof ctx.getTransform === 'function' ? ctx.getTransform() : undefined;\n return {\n a: m && Number.isFinite(m.a) && m.a > 0 ? m.a : 1,\n d: m && Number.isFinite(m.d) && m.d > 0 ? m.d : 1,\n e: m && Number.isFinite(m.e) ? m.e : 0,\n f: m && Number.isFinite(m.f) ? m.f : 0,\n };\n}\n\n/** CSS to device-pixel mapping, rounded to whole pixels. */\nexport interface PixelGrid {\n /** Device pixels per CSS pixel. */\n ratio: number;\n /** The device pixel a CSS x falls on. */\n x(cssX: number): number;\n /** The device pixel a CSS y falls on. */\n y(cssY: number): number;\n /**\n * Left edge (device px) of a column `width` device pixels wide centred on\n * CSS x `cssCenter`: the same column `crispX` strokes for a line there.\n */\n left(cssCenter: number, width: number): number;\n}\n\n/**\n * Run `draw` with the transform reset to device pixels, then put it back.\n * A context without a readable transform (a test stand-in) is taken as 1:1.\n */\nexport function inDevicePixels<T>(ctx: CanvasRenderingContext2D, draw: (grid: PixelGrid) => T): T {\n const { a, d, e, f } = transformOf(ctx);\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n try {\n return draw({\n ratio: a,\n x: (v) => Math.round(v * a + e),\n y: (v) => Math.round(v * d + f),\n left: (v, width) => Math.round(v * a + e - width / 2),\n });\n } finally {\n ctx.restore();\n }\n}\n\n/**\n * A bar's columns in device pixels: the wick one CSS pixel wide (at least one\n * device pixel), the body about the bar's width, with an even difference so\n * the wick sits exactly in the middle.\n */\nexport function barColumns(barWidth: number, ratio: number): { body: number; wick: number } {\n const wick = Math.max(1, Math.floor(ratio));\n let body = Math.max(wick, Math.round(barWidth * ratio));\n if ((body - wick) % 2 !== 0) body -= 1;\n return { body: Math.max(body, wick), wick };\n}\n\n/** Snap a line's centre (in CSS px) so a `width`-wide stroke covers whole device pixels. */\nfunction snap(v: number, width: number, scale: number, shift: number): { at: number; width: number } {\n const w = Math.max(1, Math.round(width * scale));\n const half = w % 2 ? 0.5 : 0;\n return { at: (Math.round(v * scale + shift - half) + half - shift) / scale, width: w / scale };\n}\n\n/**\n * A horizontal line's y and width, snapped so the stroke covers whole device\n * pixels: one sharp row instead of a soft two-pixel smear.\n */\nexport function crispY(ctx: CanvasRenderingContext2D, y: number, width: number): { y: number; width: number } {\n const t = transformOf(ctx);\n const s = snap(y, width, t.d, t.f);\n return { y: s.at, width: s.width };\n}\n\n/** A vertical line's x and width, snapped like `crispY`. */\nexport function crispX(ctx: CanvasRenderingContext2D, x: number, width: number): { x: number; width: number } {\n const t = transformOf(ctx);\n const s = snap(x, width, t.a, t.e);\n return { x: s.at, width: s.width };\n}\n","import type { DataSeries, ViewportState } from '@tradecanvas/commons';\nimport { priceToYMapper } from '../viewport/ScaleMapping.js';\nimport { inDevicePixels } from './pixelGrid.js';\n\n/**\n * Below this bar width (CSS px) bar-shaped charts draw one column per pixel\n * instead of one shape per bar: thousands of sub-pixel candles would blur\n * into each other and cost a path segment each.\n */\nexport const DENSE_BAR_WIDTH = 1;\n\nexport function isDense(viewport: Pick<ViewportState, 'barWidth'>): boolean {\n return viewport.barWidth < DENSE_BAR_WIDTH;\n}\n\n/** The bars on one pixel column merged into one: first open, last close, extremes, largest volume. */\nexport interface PixelColumn {\n x: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\n/**\n * Walk bars `from`..`to` merged per pixel column (`Math.floor` of their x).\n * The column object is reused between calls: copy it to keep it.\n */\nexport function forEachPixelColumn(\n data: DataSeries,\n from: number,\n to: number,\n toX: (index: number) => number,\n visit: (column: Readonly<PixelColumn>) => void,\n): void {\n const last = Math.min(to, data.length - 1);\n if (from > last) return;\n const col: PixelColumn = { x: 0, open: 0, high: 0, low: 0, close: 0, volume: 0 };\n let open = false;\n for (let i = Math.max(0, from); i <= last; i++) {\n const bar = data[i];\n const x = Math.floor(toX(i));\n if (open && x !== col.x) {\n visit(col);\n open = false;\n }\n if (!open) {\n col.x = x;\n col.open = bar.open;\n col.high = bar.high;\n col.low = bar.low;\n col.volume = bar.volume;\n open = true;\n } else {\n if (bar.high > col.high) col.high = bar.high;\n if (bar.low < col.low) col.low = bar.low;\n if (bar.volume > col.volume) col.volume = bar.volume;\n }\n col.close = bar.close;\n }\n if (open) visit(col);\n}\n\n/**\n * Draw a dense price series as one high–low line per pixel column, coloured by\n * the column's direction (its last close against its first open).\n */\nexport function renderDenseBars(\n ctx: CanvasRenderingContext2D,\n data: DataSeries,\n viewport: ViewportState,\n upColor: string,\n downColor: string,\n): void {\n const { from, to } = viewport.visibleRange;\n const barUnit = viewport.barWidth + viewport.barSpacing;\n const offsetX = -viewport.offset + viewport.chartRect.x + viewport.barWidth / 2;\n const toY = priceToYMapper(viewport);\n inDevicePixels(ctx, (px) => {\n const up = new Path2D();\n const down = new Path2D();\n forEachPixelColumn(data, from, to, (i) => i * barUnit + offsetX, (c) => {\n const top = px.y(toY(c.high));\n const bottom = px.y(toY(c.low));\n // A flat column still gets a pixel, like a doji's body.\n // Each column reaches the next with no gap: at 125% a CSS pixel is 1 or 2 device pixels.\n const left = px.x(c.x);\n const width = Math.max(1, px.x(c.x + 1) - left);\n (c.close >= c.open ? up : down).rect(left, Math.min(top, bottom), width, Math.max(Math.abs(bottom - top), 1));\n });\n ctx.fillStyle = upColor;\n ctx.fill(up);\n ctx.fillStyle = downColor;\n ctx.fill(down);\n });\n}\n","import type { ViewportState } from '@tradecanvas/commons';\nimport { computeTickStep } from '@tradecanvas/commons';\nimport { priceToYMapper } from '../viewport/ScaleMapping.js';\n\n/** The grid's lines as CSS-pixel centres: one across per price step, one down every few slots. */\nexport interface GridLines {\n horizontal: number[];\n vertical: number[];\n}\n\n/** Bars between vertical lines: at least this many pixels apart. */\nconst MIN_COLUMN_SPACING = 80;\n\n/** Where the grid lines go, for the 2D grid and the GPU alike. */\nexport function gridLines(viewport: ViewportState): GridLines {\n const { chartRect, priceRange } = viewport;\n if (priceRange.max - priceRange.min <= 0) return { horizontal: [], vertical: [] };\n const toY = priceToYMapper(viewport);\n\n const horizontal: number[] = [];\n const priceStep = computeTickStep(priceRange.min, priceRange.max, 8);\n const firstPrice = Math.ceil(priceRange.min / priceStep) * priceStep;\n for (let price = firstPrice; price <= priceRange.max; price += priceStep) {\n horizontal.push(Math.round(toY(price)) + 0.5);\n }\n\n const vertical: number[] = [];\n const barUnit = viewport.barWidth + viewport.barSpacing;\n const barsPerGrid = Math.max(1, Math.ceil(MIN_COLUMN_SPACING / barUnit));\n const offsetX = -viewport.offset + chartRect.x + viewport.barWidth / 2;\n // Every slot on screen — the empty space past either end of the data\n // (where the chart can be panned) keeps its grid too.\n const from = Math.floor(viewport.offset / barUnit);\n const to = Math.ceil((viewport.offset + chartRect.width) / barUnit);\n for (let i = from; i <= to; i++) {\n if (i % barsPerGrid !== 0) continue;\n vertical.push(Math.round(i * barUnit + offsetX) + 0.5);\n }\n return { horizontal, vertical };\n}\n"],"mappings":"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"}
|