@363045841yyt/klinechart-core 0.8.5 → 0.8.7
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/config/chartSettings.d.ts +21 -2
- package/dist/config/chartSettings.d.ts.map +1 -1
- package/dist/config/chartSettings.js +9 -1
- package/dist/config/chartSettings.js.map +1 -1
- package/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +50 -3
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +34 -23
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.d.ts +0 -3
- package/dist/data-fetchers/baostock.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +0 -1
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.d.ts +13 -2
- package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.js +41 -7
- package/dist/data-fetchers/dataBuffer.js.map +1 -1
- package/dist/data-fetchers/dataBufferTypes.d.ts +11 -0
- package/dist/data-fetchers/dataBufferTypes.d.ts.map +1 -0
- package/dist/data-fetchers/dataBufferTypes.js +2 -0
- package/dist/data-fetchers/dataBufferTypes.js.map +1 -0
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts +4 -3
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js +9 -2
- package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
- package/dist/data-fetchers/gotdx/gotdx.d.ts +7 -0
- package/dist/data-fetchers/gotdx/gotdx.d.ts.map +1 -0
- package/dist/data-fetchers/gotdx/gotdx.js +7 -0
- package/dist/data-fetchers/gotdx/gotdx.js.map +1 -0
- package/dist/data-fetchers/gotdx.d.ts +0 -8
- package/dist/data-fetchers/gotdx.d.ts.map +1 -1
- package/dist/data-fetchers/gotdx.js +40 -3
- package/dist/data-fetchers/gotdx.js.map +1 -1
- package/dist/data-fetchers/hundred-mock.d.ts +0 -3
- package/dist/data-fetchers/hundred-mock.d.ts.map +1 -1
- package/dist/data-fetchers/hundred-mock.js +0 -1
- package/dist/data-fetchers/hundred-mock.js.map +1 -1
- package/dist/data-fetchers/index.d.ts +10 -8
- package/dist/data-fetchers/index.d.ts.map +1 -1
- package/dist/data-fetchers/index.js +8 -7
- package/dist/data-fetchers/index.js.map +1 -1
- package/dist/data-fetchers/router.d.ts +2 -0
- package/dist/data-fetchers/router.d.ts.map +1 -1
- package/dist/data-fetchers/router.js +8 -1
- package/dist/data-fetchers/router.js.map +1 -1
- package/dist/data-fetchers/thousand-mock.d.ts +0 -3
- package/dist/data-fetchers/thousand-mock.d.ts.map +1 -1
- package/dist/data-fetchers/thousand-mock.js +0 -1
- package/dist/data-fetchers/thousand-mock.js.map +1 -1
- package/dist/data-fetchers/timeShareBuffer.d.ts +27 -0
- package/dist/data-fetchers/timeShareBuffer.d.ts.map +1 -0
- package/dist/data-fetchers/timeShareBuffer.js +79 -0
- package/dist/data-fetchers/timeShareBuffer.js.map +1 -0
- package/dist/data-fetchers/tradingview.d.ts +0 -8
- package/dist/data-fetchers/tradingview.d.ts.map +1 -1
- package/dist/data-fetchers/tradingview.js +1 -2
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/data-fetchers/types.d.ts +9 -1
- package/dist/data-fetchers/types.d.ts.map +1 -1
- package/dist/engine/chart.d.ts +29 -1
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +140 -5
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/chartTypes.d.ts +3 -0
- package/dist/engine/chartTypes.d.ts.map +1 -1
- package/dist/engine/controller/interaction.d.ts +12 -1
- package/dist/engine/controller/interaction.d.ts.map +1 -1
- package/dist/engine/controller/interaction.js +105 -14
- package/dist/engine/controller/interaction.js.map +1 -1
- package/dist/engine/data/chartDataManager.d.ts +38 -11
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +491 -188
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/draw/pixelAlign.d.ts +0 -27
- package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
- package/dist/engine/draw/pixelAlign.js +1 -1
- package/dist/engine/draw/pixelAlign.js.map +1 -1
- package/dist/engine/indicators/calculators.d.ts +0 -104
- package/dist/engine/indicators/calculators.d.ts.map +1 -1
- package/dist/engine/indicators/calculators.js +77 -171
- package/dist/engine/indicators/calculators.js.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.js +3 -2
- package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
- package/dist/engine/indicators/ichimokuState.d.ts +2 -0
- package/dist/engine/indicators/ichimokuState.d.ts.map +1 -1
- package/dist/engine/indicators/ichimokuState.js.map +1 -1
- package/dist/engine/indicators/macdState.d.ts +0 -5
- package/dist/engine/indicators/macdState.d.ts.map +1 -1
- package/dist/engine/indicators/macdState.js +1 -1
- package/dist/engine/indicators/macdState.js.map +1 -1
- package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
- package/dist/engine/indicators/registerBuiltins.js +1 -0
- package/dist/engine/indicators/registerBuiltins.js.map +1 -1
- package/dist/engine/indicators/rsiState.d.ts +0 -4
- package/dist/engine/indicators/rsiState.d.ts.map +1 -1
- package/dist/engine/indicators/rsiState.js +1 -1
- package/dist/engine/indicators/rsiState.js.map +1 -1
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +1 -7
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/indicators/visibleStateComposers.d.ts +14 -0
- package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -1
- package/dist/engine/indicators/visibleStateComposers.js +34 -0
- package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
- package/dist/engine/layout/chartPaneLayout.d.ts +2 -0
- package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
- package/dist/engine/layout/chartPaneLayout.js +24 -6
- package/dist/engine/layout/chartPaneLayout.js.map +1 -1
- package/dist/engine/modes/kLineMode.d.ts +37 -0
- package/dist/engine/modes/kLineMode.d.ts.map +1 -0
- package/dist/engine/modes/kLineMode.js +22 -0
- package/dist/engine/modes/kLineMode.js.map +1 -0
- package/dist/engine/modes/timeShareMode.d.ts +37 -0
- package/dist/engine/modes/timeShareMode.d.ts.map +1 -0
- package/dist/engine/modes/timeShareMode.js +59 -0
- package/dist/engine/modes/timeShareMode.js.map +1 -0
- package/dist/engine/modes/types.d.ts +47 -0
- package/dist/engine/modes/types.d.ts.map +1 -0
- package/dist/engine/modes/types.js +2 -0
- package/dist/engine/modes/types.js.map +1 -0
- package/dist/engine/paneRenderer.d.ts +4 -0
- package/dist/engine/paneRenderer.d.ts.map +1 -1
- package/dist/engine/paneRenderer.js +27 -40
- package/dist/engine/paneRenderer.js.map +1 -1
- package/dist/engine/render/chartRenderer.d.ts +4 -23
- package/dist/engine/render/chartRenderer.d.ts.map +1 -1
- package/dist/engine/render/chartRenderer.js +87 -17
- package/dist/engine/render/chartRenderer.js.map +1 -1
- package/dist/engine/renderers/Indicator/atr.d.ts +1 -18
- package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/atr.js +3 -22
- package/dist/engine/renderers/Indicator/atr.js.map +1 -1
- package/dist/engine/renderers/Indicator/boll.d.ts +1 -4
- package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/boll.js +3 -18
- package/dist/engine/renderers/Indicator/boll.js.map +1 -1
- package/dist/engine/renderers/Indicator/cci.d.ts +1 -22
- package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/cci.js +8 -20
- package/dist/engine/renderers/Indicator/cci.js.map +1 -1
- package/dist/engine/renderers/Indicator/chaikinVol.d.ts +1 -7
- package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/chaikinVol.js +3 -16
- package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
- package/dist/engine/renderers/Indicator/cmf.d.ts +1 -7
- package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/cmf.js +3 -15
- package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
- package/dist/engine/renderers/Indicator/dema.d.ts +1 -7
- package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/dema.js +3 -17
- package/dist/engine/renderers/Indicator/dema.js.map +1 -1
- package/dist/engine/renderers/Indicator/donchian.d.ts +1 -8
- package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/donchian.js +2 -2
- package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
- package/dist/engine/renderers/Indicator/ene.d.ts +1 -12
- package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ene.js +3 -18
- package/dist/engine/renderers/Indicator/ene.js.map +1 -1
- package/dist/engine/renderers/Indicator/expma.d.ts +1 -4
- package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/expma.js +2 -2
- package/dist/engine/renderers/Indicator/expma.js.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.d.ts +1 -22
- package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.js +11 -64
- package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
- package/dist/engine/renderers/Indicator/fib.d.ts +1 -6
- package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/fib.js +2 -2
- package/dist/engine/renderers/Indicator/fib.js.map +1 -1
- package/dist/engine/renderers/Indicator/hma.d.ts +1 -7
- package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/hma.js +3 -17
- package/dist/engine/renderers/Indicator/hma.js.map +1 -1
- package/dist/engine/renderers/Indicator/hv.d.ts +1 -7
- package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/hv.js +3 -16
- package/dist/engine/renderers/Indicator/hv.js.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.d.ts +1 -8
- package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.js +27 -5
- package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
- package/dist/engine/renderers/Indicator/kama.d.ts +1 -7
- package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kama.js +3 -17
- package/dist/engine/renderers/Indicator/kama.js.map +1 -1
- package/dist/engine/renderers/Indicator/keltner.d.ts +1 -8
- package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/keltner.js +2 -2
- package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
- package/dist/engine/renderers/Indicator/kst.d.ts +1 -22
- package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kst.js +2 -2
- package/dist/engine/renderers/Indicator/kst.js.map +1 -1
- package/dist/engine/renderers/Indicator/ma.d.ts +1 -4
- package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ma.js +1 -1
- package/dist/engine/renderers/Indicator/ma.js.map +1 -1
- package/dist/engine/renderers/Indicator/macd.d.ts +1 -49
- package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/macd.js +2 -12
- package/dist/engine/renderers/Indicator/macd.js.map +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +205 -0
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
- package/dist/engine/renderers/Indicator/mfi.d.ts +1 -7
- package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mfi.js +3 -15
- package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
- package/dist/engine/renderers/Indicator/mom.d.ts +1 -22
- package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mom.js +8 -23
- package/dist/engine/renderers/Indicator/mom.js.map +1 -1
- package/dist/engine/renderers/Indicator/obv.d.ts +1 -7
- package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/obv.js +3 -14
- package/dist/engine/renderers/Indicator/obv.js.map +1 -1
- package/dist/engine/renderers/Indicator/parkinson.d.ts +1 -7
- package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/parkinson.js +3 -16
- package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
- package/dist/engine/renderers/Indicator/pivot.d.ts +1 -6
- package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/pivot.js +2 -2
- package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
- package/dist/engine/renderers/Indicator/pvt.d.ts +1 -7
- package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/pvt.js +3 -14
- package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
- package/dist/engine/renderers/Indicator/roc.d.ts +1 -8
- package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/roc.js +3 -15
- package/dist/engine/renderers/Indicator/roc.js.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.d.ts +0 -32
- package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.js +3 -3
- package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
- package/dist/engine/renderers/Indicator/sar.d.ts +1 -8
- package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/sar.js +2 -2
- package/dist/engine/renderers/Indicator/sar.js.map +1 -1
- package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +2 -0
- package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/scale/indicator_scale.js +10 -6
- package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
- package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts +4 -0
- package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts.map +1 -0
- package/dist/engine/renderers/Indicator/shared/dashedLines.js +50 -0
- package/dist/engine/renderers/Indicator/shared/dashedLines.js.map +1 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts +14 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.js +25 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.d.ts +5 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.d.ts.map +1 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.js +17 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.js.map +1 -0
- package/dist/engine/renderers/Indicator/stoch.d.ts +1 -22
- package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/stoch.js +5 -46
- package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
- package/dist/engine/renderers/Indicator/structure.d.ts +1 -7
- package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/structure.js +2 -2
- package/dist/engine/renderers/Indicator/structure.js.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.d.ts +1 -8
- package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.js +2 -2
- package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
- package/dist/engine/renderers/Indicator/tema.d.ts +1 -7
- package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/tema.js +3 -17
- package/dist/engine/renderers/Indicator/tema.js.map +1 -1
- package/dist/engine/renderers/Indicator/trix.d.ts +1 -8
- package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/trix.js +2 -2
- package/dist/engine/renderers/Indicator/trix.js.map +1 -1
- package/dist/engine/renderers/Indicator/vma.d.ts +1 -7
- package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/vma.js +3 -15
- package/dist/engine/renderers/Indicator/vma.js.map +1 -1
- package/dist/engine/renderers/Indicator/volumeProfile.d.ts +1 -7
- package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/volumeProfile.js +2 -2
- package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
- package/dist/engine/renderers/Indicator/vwap.d.ts +1 -7
- package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/vwap.js +3 -14
- package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
- package/dist/engine/renderers/Indicator/wma.d.ts +1 -7
- package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/wma.js +3 -17
- package/dist/engine/renderers/Indicator/wma.js.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -22
- package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.js +8 -23
- package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
- package/dist/engine/renderers/Indicator/zones.d.ts +1 -6
- package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/zones.js +2 -2
- package/dist/engine/renderers/Indicator/zones.js.map +1 -1
- package/dist/engine/renderers/candle.d.ts +0 -16
- package/dist/engine/renderers/candle.d.ts.map +1 -1
- package/dist/engine/renderers/candle.js +1 -1
- package/dist/engine/renderers/candle.js.map +1 -1
- package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
- package/dist/engine/renderers/comparisonLine.js +2 -0
- package/dist/engine/renderers/comparisonLine.js.map +1 -1
- package/dist/engine/renderers/crosshair.js +1 -1
- package/dist/engine/renderers/crosshair.js.map +1 -1
- package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
- package/dist/engine/renderers/extremaMarkers.js +2 -0
- package/dist/engine/renderers/extremaMarkers.js.map +1 -1
- package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
- package/dist/engine/renderers/lastPrice.js +7 -2
- package/dist/engine/renderers/lastPrice.js.map +1 -1
- package/dist/engine/renderers/leftYAxis.d.ts +11 -0
- package/dist/engine/renderers/leftYAxis.d.ts.map +1 -0
- package/dist/engine/renderers/leftYAxis.js +67 -0
- package/dist/engine/renderers/leftYAxis.js.map +1 -0
- package/dist/engine/renderers/subVolume.d.ts +1 -13
- package/dist/engine/renderers/subVolume.d.ts.map +1 -1
- package/dist/engine/renderers/subVolume.js +1 -1
- package/dist/engine/renderers/subVolume.js.map +1 -1
- package/dist/engine/renderers/timeAxis.d.ts +0 -2
- package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
- package/dist/engine/renderers/timeAxis.js +4 -1
- package/dist/engine/renderers/timeAxis.js.map +1 -1
- package/dist/engine/renderers/timeShare.d.ts +3 -0
- package/dist/engine/renderers/timeShare.d.ts.map +1 -0
- package/dist/engine/renderers/timeShare.js +260 -0
- package/dist/engine/renderers/timeShare.js.map +1 -0
- package/dist/engine/renderers/yAxis.d.ts.map +1 -1
- package/dist/engine/renderers/yAxis.js +9 -1
- package/dist/engine/renderers/yAxis.js.map +1 -1
- package/dist/engine/scale/price.d.ts +0 -7
- package/dist/engine/scale/price.d.ts.map +1 -1
- package/dist/engine/scale/price.js +3 -2
- package/dist/engine/scale/price.js.map +1 -1
- package/dist/engine/theme/fonts.d.ts +0 -2
- package/dist/engine/theme/fonts.d.ts.map +1 -1
- package/dist/engine/theme/fonts.js +1 -1
- package/dist/engine/theme/fonts.js.map +1 -1
- package/dist/engine/utils/klineConfig.d.ts.map +1 -1
- package/dist/engine/utils/klineConfig.js +1 -5
- package/dist/engine/utils/klineConfig.js.map +1 -1
- package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
- package/dist/engine/viewport/chartViewportManager.js +6 -5
- package/dist/engine/viewport/chartViewportManager.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/chartBridge.d.ts.map +1 -1
- package/dist/mcp/chartBridge.js +2 -1
- package/dist/mcp/chartBridge.js.map +1 -1
- package/dist/plugin/types.d.ts +1 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/types.js.map +1 -1
- package/dist/semantic/types.d.ts +1 -1
- package/dist/semantic/types.d.ts.map +1 -1
- package/dist/tokens/theme-base.d.ts +5 -0
- package/dist/tokens/theme-base.d.ts.map +1 -0
- package/dist/tokens/theme-base.js +31 -0
- package/dist/tokens/theme-base.js.map +1 -0
- package/dist/tokens/theme-china.d.ts.map +1 -1
- package/dist/tokens/theme-china.js +3 -0
- package/dist/tokens/theme-china.js.map +1 -1
- package/dist/tokens/theme-dark.d.ts.map +1 -1
- package/dist/tokens/theme-dark.js +12 -31
- package/dist/tokens/theme-dark.js.map +1 -1
- package/dist/tokens/theme-light.d.ts.map +1 -1
- package/dist/tokens/theme-light.js +11 -30
- package/dist/tokens/theme-light.js.map +1 -1
- package/dist/tokens/types.d.ts +7 -0
- package/dist/tokens/types.d.ts.map +1 -1
- package/dist/types/price.d.ts +8 -0
- package/dist/types/price.d.ts.map +1 -1
- package/dist/types/price.js +4 -0
- package/dist/types/price.js.map +1 -1
- package/dist/utils/dateFormat.d.ts +5 -42
- package/dist/utils/dateFormat.d.ts.map +1 -1
- package/dist/utils/dateFormat.js +24 -4
- package/dist/utils/dateFormat.js.map +1 -1
- package/dist/utils/kLineDraw/axis.d.ts +9 -28
- package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
- package/dist/utils/kLineDraw/axis.js +33 -58
- package/dist/utils/kLineDraw/axis.js.map +1 -1
- package/dist/utils/uuid.d.ts +2 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +10 -0
- package/dist/utils/uuid.js.map +1 -0
- package/dist/utils/volumePrice.d.ts +0 -40
- package/dist/utils/volumePrice.d.ts.map +1 -1
- package/dist/utils/volumePrice.js +2 -2
- package/dist/utils/volumePrice.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/config/chartSettings.ts +9 -1
- package/src/controllers/createChartController.ts +53 -3
- package/src/controllers/types.ts +36 -17
- package/src/data-fetchers/__tests__/dataBuffer.test.ts +39 -5
- package/src/data-fetchers/baostock.ts +1 -1
- package/src/data-fetchers/dataBuffer.ts +48 -11
- package/src/data-fetchers/dataBufferTypes.ts +11 -0
- package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -4
- package/src/data-fetchers/gotdx/gotdx.ts +6 -0
- package/src/data-fetchers/gotdx.ts +45 -7
- package/src/data-fetchers/hundred-mock.ts +1 -1
- package/src/data-fetchers/index.ts +10 -20
- package/src/data-fetchers/router.ts +12 -1
- package/src/data-fetchers/thousand-mock.ts +1 -1
- package/src/data-fetchers/timeShareBuffer.ts +92 -0
- package/src/data-fetchers/tradingview.ts +2 -2
- package/src/data-fetchers/types.ts +15 -2
- package/src/engine/__tests__/chart.dpr.test.ts +1 -0
- package/src/engine/chart.ts +157 -7
- package/src/engine/chartTypes.ts +3 -0
- package/src/engine/controller/__tests__/interaction.dpr.test.ts +2 -0
- package/src/engine/controller/interaction.ts +115 -16
- package/src/engine/data/chartDataManager.ts +557 -214
- package/src/engine/draw/pixelAlign.ts +1 -1
- package/src/engine/indicators/__tests__/_propertyAssertions.ts +2 -2
- package/src/engine/indicators/__tests__/ichimoku.test.ts +3 -3
- package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -1
- package/src/engine/indicators/calculators.ts +105 -236
- package/src/engine/indicators/chartIndicatorManager.ts +3 -2
- package/src/engine/indicators/ichimokuState.ts +2 -0
- package/src/engine/indicators/macdState.ts +1 -1
- package/src/engine/indicators/registerBuiltins.ts +1 -0
- package/src/engine/indicators/rsiState.ts +1 -1
- package/src/engine/indicators/scheduler.ts +1 -7
- package/src/engine/indicators/visibleStateComposers.ts +51 -0
- package/src/engine/layout/chartPaneLayout.ts +26 -6
- package/src/engine/modes/kLineMode.ts +57 -0
- package/src/engine/modes/timeShareMode.ts +95 -0
- package/src/engine/modes/types.ts +63 -0
- package/src/engine/paneRenderer.ts +37 -46
- package/src/engine/render/chartRenderer.ts +93 -20
- package/src/engine/renderers/Indicator/atr.ts +4 -29
- package/src/engine/renderers/Indicator/boll.ts +3 -24
- package/src/engine/renderers/Indicator/cci.ts +9 -27
- package/src/engine/renderers/Indicator/chaikinVol.ts +3 -23
- package/src/engine/renderers/Indicator/cmf.ts +3 -22
- package/src/engine/renderers/Indicator/dema.ts +5 -26
- package/src/engine/renderers/Indicator/donchian.ts +3 -3
- package/src/engine/renderers/Indicator/ene.ts +3 -24
- package/src/engine/renderers/Indicator/expma.ts +2 -2
- package/src/engine/renderers/Indicator/fastk.ts +12 -95
- package/src/engine/renderers/Indicator/fib.ts +2 -2
- package/src/engine/renderers/Indicator/hma.ts +5 -26
- package/src/engine/renderers/Indicator/hv.ts +3 -23
- package/src/engine/renderers/Indicator/ichimoku.ts +26 -6
- package/src/engine/renderers/Indicator/kama.ts +5 -26
- package/src/engine/renderers/Indicator/keltner.ts +3 -3
- package/src/engine/renderers/Indicator/kst.ts +3 -3
- package/src/engine/renderers/Indicator/ma.ts +1 -1
- package/src/engine/renderers/Indicator/macd.ts +4 -21
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +228 -1
- package/src/engine/renderers/Indicator/mfi.ts +3 -22
- package/src/engine/renderers/Indicator/mom.ts +9 -30
- package/src/engine/renderers/Indicator/obv.ts +3 -21
- package/src/engine/renderers/Indicator/parkinson.ts +3 -23
- package/src/engine/renderers/Indicator/pivot.ts +2 -2
- package/src/engine/renderers/Indicator/pvt.ts +3 -21
- package/src/engine/renderers/Indicator/roc.ts +4 -23
- package/src/engine/renderers/Indicator/rsi.ts +4 -4
- package/src/engine/renderers/Indicator/sar.ts +3 -3
- package/src/engine/renderers/Indicator/scale/indicator_scale.ts +11 -4
- package/src/engine/renderers/Indicator/shared/dashedLines.ts +81 -0
- package/src/engine/renderers/Indicator/shared/titleInfo.ts +52 -0
- package/src/engine/renderers/Indicator/shared/webglBand.ts +23 -0
- package/src/engine/renderers/Indicator/stoch.ts +6 -71
- package/src/engine/renderers/Indicator/structure.ts +2 -2
- package/src/engine/renderers/Indicator/supertrend.ts +3 -3
- package/src/engine/renderers/Indicator/tema.ts +5 -26
- package/src/engine/renderers/Indicator/trix.ts +3 -3
- package/src/engine/renderers/Indicator/vma.ts +3 -22
- package/src/engine/renderers/Indicator/volumeProfile.ts +2 -2
- package/src/engine/renderers/Indicator/vwap.ts +3 -21
- package/src/engine/renderers/Indicator/wma.ts +5 -26
- package/src/engine/renderers/Indicator/wmsr.ts +9 -30
- package/src/engine/renderers/Indicator/zones.ts +2 -2
- package/src/engine/renderers/candle.ts +1 -1
- package/src/engine/renderers/comparisonLine.ts +1 -0
- package/src/engine/renderers/crosshair.ts +1 -1
- package/src/engine/renderers/extremaMarkers.ts +1 -0
- package/src/engine/renderers/lastPrice.ts +5 -2
- package/src/engine/renderers/leftYAxis.ts +77 -0
- package/src/engine/renderers/subVolume.ts +3 -3
- package/src/engine/renderers/timeAxis.ts +16 -13
- package/src/engine/renderers/timeShare.ts +271 -0
- package/src/engine/renderers/yAxis.ts +9 -1
- package/src/engine/scale/price.ts +2 -2
- package/src/engine/theme/fonts.ts +1 -1
- package/src/engine/utils/klineConfig.ts +1 -5
- package/src/engine/viewport/chartViewportManager.ts +6 -5
- package/src/index.ts +1 -0
- package/src/mcp/chartBridge.ts +2 -1
- package/src/plugin/types.ts +1 -0
- package/src/semantic/types.ts +1 -1
- package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +15 -1
- package/src/tokens/theme-base.ts +36 -0
- package/src/tokens/theme-china.ts +4 -0
- package/src/tokens/theme-dark.ts +13 -33
- package/src/tokens/theme-light.ts +13 -33
- package/src/tokens/types.ts +9 -0
- package/src/types/price.ts +13 -0
- package/src/utils/dateFormat.ts +27 -4
- package/src/utils/kLineDraw/axis.ts +40 -107
- package/src/utils/uuid.ts +8 -0
- package/src/utils/volumePrice.ts +2 -2
- package/src/version.ts +1 -1
|
@@ -29,6 +29,7 @@ import type {
|
|
|
29
29
|
PaneSpec,
|
|
30
30
|
SymbolSpec,
|
|
31
31
|
DataFetcher,
|
|
32
|
+
CustomDataSource,
|
|
32
33
|
} from './types'
|
|
33
34
|
import type { CustomMarkerEntity } from '../engine/marker/registry'
|
|
34
35
|
import { Chart, type InteractionSnapshot as LegacyInteractionSnapshot } from '../engine/chart'
|
|
@@ -60,6 +61,7 @@ const DEFAULT_OPTS = {
|
|
|
60
61
|
minKWidth: 1,
|
|
61
62
|
maxKWidth: 50,
|
|
62
63
|
rightAxisWidth: 0,
|
|
64
|
+
leftAxisWidth: 0,
|
|
63
65
|
bottomAxisHeight: 24,
|
|
64
66
|
priceLabelWidth: 60,
|
|
65
67
|
zoomLevels: 20,
|
|
@@ -119,6 +121,7 @@ interface MountedDom {
|
|
|
119
121
|
scrollContent?: HTMLDivElement
|
|
120
122
|
canvasLayer: HTMLDivElement
|
|
121
123
|
rightAxisLayer: HTMLDivElement
|
|
124
|
+
leftAxisLayer?: HTMLDivElement
|
|
122
125
|
xAxisCanvas: HTMLCanvasElement
|
|
123
126
|
cleanup: () => void
|
|
124
127
|
}
|
|
@@ -264,10 +267,18 @@ function buildDom(container: HTMLElement): MountedDom {
|
|
|
264
267
|
rightAxisLayer.style.right = '0'
|
|
265
268
|
chartContainer.appendChild(rightAxisLayer)
|
|
266
269
|
|
|
270
|
+
const leftAxisLayer = ownerDoc.createElement('div')
|
|
271
|
+
leftAxisLayer.className = 'klc-left-axis-host'
|
|
272
|
+
leftAxisLayer.style.position = 'absolute'
|
|
273
|
+
leftAxisLayer.style.top = '0'
|
|
274
|
+
leftAxisLayer.style.left = '0'
|
|
275
|
+
chartContainer.appendChild(leftAxisLayer)
|
|
276
|
+
|
|
267
277
|
const cleanup = (): void => {
|
|
268
278
|
try {
|
|
269
279
|
scrollContent.remove()
|
|
270
280
|
rightAxisLayer.remove()
|
|
281
|
+
leftAxisLayer.remove()
|
|
271
282
|
if (containerCreatedByUs) {
|
|
272
283
|
chartContainer.remove()
|
|
273
284
|
}
|
|
@@ -276,7 +287,7 @@ function buildDom(container: HTMLElement): MountedDom {
|
|
|
276
287
|
}
|
|
277
288
|
}
|
|
278
289
|
|
|
279
|
-
return { container: chartContainer, scrollContent, canvasLayer, rightAxisLayer, xAxisCanvas, cleanup }
|
|
290
|
+
return { container: chartContainer, scrollContent, canvasLayer, rightAxisLayer, leftAxisLayer, xAxisCanvas, cleanup }
|
|
280
291
|
}
|
|
281
292
|
|
|
282
293
|
// ---------------------------------------------------------------------------
|
|
@@ -299,6 +310,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
299
310
|
container: opts.container as HTMLDivElement,
|
|
300
311
|
canvasLayer: opts.canvasLayer as HTMLDivElement,
|
|
301
312
|
rightAxisLayer: opts.rightAxisLayer as HTMLDivElement,
|
|
313
|
+
leftAxisLayer: opts.leftAxisLayer as HTMLDivElement | undefined,
|
|
302
314
|
xAxisCanvas: opts.xAxisCanvas!,
|
|
303
315
|
cleanup: () => { /* DOM owned by caller */ },
|
|
304
316
|
}
|
|
@@ -310,6 +322,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
310
322
|
const chartOptions: ChartOptions = {
|
|
311
323
|
yPaddingPx: opts.yPaddingPx ?? DEFAULT_OPTS.yPaddingPx,
|
|
312
324
|
rightAxisWidth: opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth,
|
|
325
|
+
leftAxisWidth: opts.leftAxisWidth ?? DEFAULT_OPTS.leftAxisWidth,
|
|
313
326
|
bottomAxisHeight: opts.bottomAxisHeight ?? DEFAULT_OPTS.bottomAxisHeight,
|
|
314
327
|
minKWidth: opts.minKWidth ?? DEFAULT_OPTS.minKWidth,
|
|
315
328
|
maxKWidth: opts.maxKWidth ?? DEFAULT_OPTS.maxKWidth,
|
|
@@ -326,6 +339,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
326
339
|
scrollContent: mounted.scrollContent,
|
|
327
340
|
canvasLayer: mounted.canvasLayer,
|
|
328
341
|
rightAxisLayer: mounted.rightAxisLayer,
|
|
342
|
+
leftAxisLayer: mounted.leftAxisLayer,
|
|
329
343
|
xAxisCanvas: mounted.xAxisCanvas,
|
|
330
344
|
},
|
|
331
345
|
chartOptions,
|
|
@@ -428,7 +442,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
428
442
|
|
|
429
443
|
// dataLoading
|
|
430
444
|
unsubs.push(
|
|
431
|
-
chart.
|
|
445
|
+
chart.loading.subscribe(() => dataLoading.set(chart.loading.peek())),
|
|
432
446
|
)
|
|
433
447
|
|
|
434
448
|
// theme
|
|
@@ -530,6 +544,31 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
530
544
|
chart.removeComparisonSymbol(symbol)
|
|
531
545
|
}
|
|
532
546
|
|
|
547
|
+
function setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void {
|
|
548
|
+
if (disposed) return
|
|
549
|
+
chart.setComparisonData(symbol, [...data])
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
function setCurrentSymbol(symbol: string): void {
|
|
553
|
+
if (disposed) return
|
|
554
|
+
chart.setCurrentSymbol(symbol)
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
function setCurrentPeriod(period: string): void {
|
|
558
|
+
if (disposed) return
|
|
559
|
+
chart.setCurrentPeriod(period)
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
function switchToTimeShareForDate(dateYYYYMMDD: number): void {
|
|
563
|
+
if (disposed) return
|
|
564
|
+
chart.switchToTimeShareForDate(dateYYYYMMDD)
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
function applyCustomData(source: CustomDataSource): void {
|
|
568
|
+
if (disposed) return
|
|
569
|
+
chart.applyCustomData(source)
|
|
570
|
+
}
|
|
571
|
+
|
|
533
572
|
function setDataFetcher(fetcher: DataFetcher | null): void {
|
|
534
573
|
if (disposed) return
|
|
535
574
|
chart.setDataFetcher(fetcher)
|
|
@@ -679,6 +718,11 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
679
718
|
chart.setDrawings(drawings)
|
|
680
719
|
}
|
|
681
720
|
|
|
721
|
+
function getFullDrawings(): any[] {
|
|
722
|
+
if (disposed) return []
|
|
723
|
+
return chart.drawings() as any[]
|
|
724
|
+
}
|
|
725
|
+
|
|
682
726
|
function setSelectedDrawingId(id: string | null): void {
|
|
683
727
|
if (disposed) return
|
|
684
728
|
chart.setSelectedDrawingId(id)
|
|
@@ -815,7 +859,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
815
859
|
let bridge: ChartBridge | null = null
|
|
816
860
|
if (opts.mcp) {
|
|
817
861
|
const mcp = opts.mcp
|
|
818
|
-
const wsUrl = mcp.wsUrl ?? 'ws://localhost:
|
|
862
|
+
const wsUrl = mcp.wsUrl ?? 'ws://localhost:8081'
|
|
819
863
|
console.info(`[MCP] Creating bridge, wsUrl=${wsUrl}`)
|
|
820
864
|
bridge = new ChartBridge({
|
|
821
865
|
wsUrl,
|
|
@@ -859,6 +903,11 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
859
903
|
setSymbols,
|
|
860
904
|
addComparisonSymbol,
|
|
861
905
|
removeComparisonSymbol,
|
|
906
|
+
setComparisonData,
|
|
907
|
+
setCurrentSymbol,
|
|
908
|
+
setCurrentPeriod,
|
|
909
|
+
switchToTimeShareForDate,
|
|
910
|
+
applyCustomData,
|
|
862
911
|
setDataFetcher,
|
|
863
912
|
ensureDataRange,
|
|
864
913
|
setData,
|
|
@@ -887,6 +936,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
887
936
|
clearDrawings,
|
|
888
937
|
removeDrawing,
|
|
889
938
|
setDrawings,
|
|
939
|
+
getFullDrawings,
|
|
890
940
|
setSelectedDrawingId,
|
|
891
941
|
getViewport,
|
|
892
942
|
getKWidthKGap,
|
package/src/controllers/types.ts
CHANGED
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type { Signal } from '../reactivity'
|
|
12
|
-
import type { CustomMarkerEntity
|
|
12
|
+
import type { CustomMarkerEntity } from '../engine/marker/registry'
|
|
13
13
|
import type { PaneSpec } from '../engine/chartTypes'
|
|
14
|
+
import type { InteractionSnapshot } from '../engine/chart'
|
|
14
15
|
|
|
15
16
|
// Controller-owned public surface. Legacy engine types may mirror these
|
|
16
17
|
// shapes internally, but adapters depend only on core-defined contracts.
|
|
@@ -74,6 +75,14 @@ export interface KLineData {
|
|
|
74
75
|
date?: string
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
export interface TimeShareData {
|
|
79
|
+
timestamp: number
|
|
80
|
+
price: number
|
|
81
|
+
average: number
|
|
82
|
+
volume: number
|
|
83
|
+
amount: number
|
|
84
|
+
}
|
|
85
|
+
|
|
77
86
|
export type { PaneSpec }
|
|
78
87
|
|
|
79
88
|
// ---------------------------------------------------------------------------
|
|
@@ -102,6 +111,17 @@ export type DataFetcher = (
|
|
|
102
111
|
},
|
|
103
112
|
) => Promise<ReadonlyArray<KLineData>>
|
|
104
113
|
|
|
114
|
+
/** User-provided K-line data bundle — bypasses the fetcher pipeline entirely */
|
|
115
|
+
export interface CustomDataSource {
|
|
116
|
+
symbol?: string
|
|
117
|
+
period?: string
|
|
118
|
+
adjust?: string
|
|
119
|
+
/** Main chart K-line data (required) */
|
|
120
|
+
data: ReadonlyArray<KLineData>
|
|
121
|
+
/** Comparison products keyed by symbol */
|
|
122
|
+
comparisons?: Record<string, ReadonlyArray<KLineData>>
|
|
123
|
+
}
|
|
124
|
+
|
|
105
125
|
// ---------------------------------------------------------------------------
|
|
106
126
|
// Indicator metadata
|
|
107
127
|
// ---------------------------------------------------------------------------
|
|
@@ -130,22 +150,7 @@ export interface IndicatorDefinition {
|
|
|
130
150
|
// Interaction state
|
|
131
151
|
// ---------------------------------------------------------------------------
|
|
132
152
|
|
|
133
|
-
export
|
|
134
|
-
crosshairPos: { x: number; y: number } | null
|
|
135
|
-
crosshairIndex: number | null
|
|
136
|
-
crosshairPrice: number | null
|
|
137
|
-
hoveredIndex: number | null
|
|
138
|
-
activePaneId: string | null
|
|
139
|
-
tooltipPos: { x: number; y: number }
|
|
140
|
-
tooltipAnchorPlacement: 'right-bottom' | 'left-bottom'
|
|
141
|
-
hoveredMarkerData: MarkerEntity | null
|
|
142
|
-
hoveredCustomMarker: CustomMarkerEntity | null
|
|
143
|
-
isDragging: boolean
|
|
144
|
-
isResizingPaneBoundary: boolean
|
|
145
|
-
isHoveringPaneBoundary: boolean
|
|
146
|
-
hoveredPaneBoundaryId: string | null
|
|
147
|
-
isHoveringRightAxis: boolean
|
|
148
|
-
}
|
|
153
|
+
export type { InteractionSnapshot }
|
|
149
154
|
|
|
150
155
|
// ---------------------------------------------------------------------------
|
|
151
156
|
// Pane info (read-only pane metadata for DrawingChartAdapter)
|
|
@@ -170,6 +175,8 @@ export interface DrawingChartViewport {
|
|
|
170
175
|
export interface DrawingChartAdapter {
|
|
171
176
|
/** persist full drawing list to the chart engine */
|
|
172
177
|
setDrawings(drawings: any[]): void
|
|
178
|
+
/** read the full drawing list (plugin-level DrawingObject) */
|
|
179
|
+
getFullDrawings(): any[]
|
|
173
180
|
/** highlight a drawing by ID */
|
|
174
181
|
setSelectedDrawingId(id: string | null): void
|
|
175
182
|
/** current viewport (nullable if chart not ready) */
|
|
@@ -218,11 +225,13 @@ export interface ChartMountOptions {
|
|
|
218
225
|
// Pre-existing DOM elements (skip buildDom when provided)
|
|
219
226
|
canvasLayer?: HTMLElement
|
|
220
227
|
rightAxisLayer?: HTMLElement
|
|
228
|
+
leftAxisLayer?: HTMLElement
|
|
221
229
|
xAxisCanvas?: HTMLCanvasElement
|
|
222
230
|
|
|
223
231
|
// Chart options overrides
|
|
224
232
|
yPaddingPx?: number
|
|
225
233
|
rightAxisWidth?: number
|
|
234
|
+
leftAxisWidth?: number
|
|
226
235
|
bottomAxisHeight?: number
|
|
227
236
|
priceLabelWidth?: number
|
|
228
237
|
minKWidth?: number
|
|
@@ -262,6 +271,16 @@ export interface ChartController extends DrawingChartAdapter {
|
|
|
262
271
|
setSymbols(next: ReadonlyArray<SymbolSpec>): void
|
|
263
272
|
addComparisonSymbol(spec: SymbolSpec): void
|
|
264
273
|
removeComparisonSymbol(symbol: string): void
|
|
274
|
+
/** Inject comparison product data directly (bypasses fetcher) */
|
|
275
|
+
setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void
|
|
276
|
+
/** Update the main symbol code without triggering a fetch */
|
|
277
|
+
setCurrentSymbol(symbol: string): void
|
|
278
|
+
/** Update the K-line period without triggering a fetch */
|
|
279
|
+
setCurrentPeriod(period: string): void
|
|
280
|
+
/** Switch to time-share view for a specific date (YYYYMMDD), e.g. after double-clicking a daily bar */
|
|
281
|
+
switchToTimeShareForDate(dateYYYYMMDD: number): void
|
|
282
|
+
/** Inject a complete custom data bundle (bypasses fetcher pipeline) */
|
|
283
|
+
applyCustomData(source: CustomDataSource): void
|
|
265
284
|
setDataFetcher(fetcher: DataFetcher | null): void
|
|
266
285
|
setData(next: ReadonlyArray<KLineData>): void
|
|
267
286
|
appendData(next: ReadonlyArray<KLineData>): void
|
|
@@ -199,6 +199,38 @@ describe('DataBuffer', () => {
|
|
|
199
199
|
expect(fetchCount).toBeGreaterThanOrEqual(2)
|
|
200
200
|
})
|
|
201
201
|
|
|
202
|
+
it('deduplicates same-boundary ensureRange calls while request is pending', async () => {
|
|
203
|
+
const now = Date.now()
|
|
204
|
+
const oneYearAgo = now - 365 * MS_PER_DAY
|
|
205
|
+
|
|
206
|
+
const initialData = [makeKLine(oneYearAgo), makeKLine(now)]
|
|
207
|
+
let fetchCount = 0
|
|
208
|
+
const fetcher: DataFetcher = async () => {
|
|
209
|
+
fetchCount++
|
|
210
|
+
await new Promise((r) => setTimeout(r, 10))
|
|
211
|
+
if (fetchCount === 1) return initialData
|
|
212
|
+
return [makeKLine(oneYearAgo - 90 * MS_PER_DAY)]
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
buffer.setFetcher(fetcher)
|
|
216
|
+
buffer.setSymbol(defaultSpec)
|
|
217
|
+
|
|
218
|
+
await vi.waitFor(() => {
|
|
219
|
+
expect(buffer.loading()).toBe(false)
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
buffer.ensureRange(oneYearAgo - 30 * MS_PER_DAY, oneYearAgo)
|
|
223
|
+
buffer.ensureRange(oneYearAgo - 60 * MS_PER_DAY, oneYearAgo)
|
|
224
|
+
|
|
225
|
+
expect(fetchCount).toBe(2)
|
|
226
|
+
|
|
227
|
+
await vi.waitFor(() => {
|
|
228
|
+
expect(buffer.loading()).toBe(false)
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
expect(fetchCount).toBe(2)
|
|
232
|
+
})
|
|
233
|
+
|
|
202
234
|
it('dispose prevents further fetches', async () => {
|
|
203
235
|
const fetcher: DataFetcher = async () => {
|
|
204
236
|
return [makeKLine(Date.now())]
|
|
@@ -285,7 +317,7 @@ describe('DataBuffer', () => {
|
|
|
285
317
|
expect(prependCalls).toHaveLength(0)
|
|
286
318
|
})
|
|
287
319
|
|
|
288
|
-
it('ensureRange
|
|
320
|
+
it('ensureRange allows retry when previous fetch did not advance earliestTs', async () => {
|
|
289
321
|
const now = Date.now()
|
|
290
322
|
const oneYearAgo = now - 365 * MS_PER_DAY
|
|
291
323
|
const initialData = [makeKLine(oneYearAgo), makeKLine(now)]
|
|
@@ -295,7 +327,7 @@ describe('DataBuffer', () => {
|
|
|
295
327
|
fetchCount++
|
|
296
328
|
if (fetchCount === 1) return initialData
|
|
297
329
|
// Return data with same timestamps so mergeSortedData deduplicates them,
|
|
298
|
-
// avoiding loadedWindow change
|
|
330
|
+
// avoiding loadedWindow change. The boundary should remain retryable.
|
|
299
331
|
return initialData
|
|
300
332
|
}
|
|
301
333
|
|
|
@@ -316,12 +348,14 @@ describe('DataBuffer', () => {
|
|
|
316
348
|
|
|
317
349
|
expect(fetchCount).toBe(2)
|
|
318
350
|
|
|
319
|
-
//
|
|
351
|
+
// Same boundary but the previous fetch did not prepend data, so retry.
|
|
320
352
|
buffer.ensureRange(oneYearAgo - 60 * MS_PER_DAY, oneYearAgo)
|
|
321
353
|
|
|
322
|
-
await
|
|
354
|
+
await vi.waitFor(() => {
|
|
355
|
+
expect(buffer.loading()).toBe(false)
|
|
356
|
+
})
|
|
323
357
|
|
|
324
|
-
expect(fetchCount).toBe(
|
|
358
|
+
expect(fetchCount).toBe(3)
|
|
325
359
|
})
|
|
326
360
|
|
|
327
361
|
it('ensureRange allows retry when earliestTs moves after successful load', async () => {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createSignal, type Signal } from '../reactivity/signal'
|
|
2
2
|
import type { DataFetcher, KLineData, SymbolSpec } from '../controllers/types'
|
|
3
|
+
import type { DataBufferLike } from './dataBufferTypes'
|
|
3
4
|
|
|
4
5
|
export interface DataWindow {
|
|
5
6
|
earliestTs: number
|
|
@@ -35,7 +36,7 @@ function mergeSortedData(
|
|
|
35
36
|
return merged
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
export class DataBuffer {
|
|
39
|
+
export class DataBuffer implements DataBufferLike {
|
|
39
40
|
private _data: KLineData[] = []
|
|
40
41
|
private _dataSignal: Signal<ReadonlyArray<KLineData>>
|
|
41
42
|
private _loadingSignal: Signal<boolean>
|
|
@@ -54,8 +55,8 @@ export class DataBuffer {
|
|
|
54
55
|
this._loadingSignal = createSignal<boolean>(false)
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
get data(): Signal<ReadonlyArray<
|
|
58
|
-
return this._dataSignal
|
|
58
|
+
get data(): Signal<ReadonlyArray<unknown>> {
|
|
59
|
+
return this._dataSignal as Signal<ReadonlyArray<unknown>>
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
get loading(): Signal<boolean> {
|
|
@@ -70,6 +71,10 @@ export class DataBuffer {
|
|
|
70
71
|
return this._loadedWindow
|
|
71
72
|
}
|
|
72
73
|
|
|
74
|
+
getRawData(): KLineData[] {
|
|
75
|
+
return this._data
|
|
76
|
+
}
|
|
77
|
+
|
|
73
78
|
setFetcher(fetcher: DataFetcher | null): void {
|
|
74
79
|
this._fetcher = fetcher
|
|
75
80
|
}
|
|
@@ -159,17 +164,22 @@ export class DataBuffer {
|
|
|
159
164
|
const oldLength = this._data.length
|
|
160
165
|
const oldEarliestTs = oldLength > 0 ? this._data[0]!.timestamp : null
|
|
161
166
|
const merged = mergeSortedData(this._data, [...incoming])
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
const newEarliestTs = merged[0]?.timestamp ?? null
|
|
168
|
+
const advancedEarliest = oldEarliestTs !== null
|
|
169
|
+
&& newEarliestTs !== null
|
|
170
|
+
&& newEarliestTs < oldEarliestTs
|
|
171
|
+
|
|
172
|
+
if (oldLength > 0 && merged.length > oldLength && advancedEarliest) {
|
|
173
|
+
const prependCount = merged.findIndex((d) => d.timestamp === oldEarliestTs)
|
|
174
|
+
if (prependCount > 0) {
|
|
175
|
+
this.onPrepend?.(prependCount)
|
|
170
176
|
}
|
|
171
177
|
}
|
|
172
178
|
|
|
179
|
+
if (oldLength > 0 && !advancedEarliest) {
|
|
180
|
+
this._attemptedBoundaries.delete(endTs)
|
|
181
|
+
}
|
|
182
|
+
|
|
173
183
|
this._data = merged
|
|
174
184
|
this._dataSignal.set([...merged])
|
|
175
185
|
|
|
@@ -217,6 +227,33 @@ export class DataBuffer {
|
|
|
217
227
|
})
|
|
218
228
|
}
|
|
219
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Put the buffer in inline mode — use the provided data directly
|
|
232
|
+
* instead of fetching. Sets data signal and tracks loadedWindow.
|
|
233
|
+
*/
|
|
234
|
+
setInlineData(data: unknown[]): void {
|
|
235
|
+
if (this._disposed) return
|
|
236
|
+
const kData = data as KLineData[]
|
|
237
|
+
this._data = [...kData]
|
|
238
|
+
this._dataSignal.set([...kData])
|
|
239
|
+
if (data.length > 0) {
|
|
240
|
+
this._loadedWindow = {
|
|
241
|
+
earliestTs: kData[0]!.timestamp,
|
|
242
|
+
latestTs: kData[kData.length - 1]!.timestamp,
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
this._loadedWindow = null
|
|
246
|
+
}
|
|
247
|
+
this._attemptedBoundaries.clear()
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Update just the spec metadata without triggering any fetch.
|
|
252
|
+
*/
|
|
253
|
+
setCurrentSpec(spec: SymbolSpec): void {
|
|
254
|
+
this._currentSpec = spec
|
|
255
|
+
}
|
|
256
|
+
|
|
220
257
|
dispose(): void {
|
|
221
258
|
this._disposed = true
|
|
222
259
|
this._pendingFetch = null
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Signal } from '../reactivity/signal'
|
|
2
|
+
import type { DataWindow } from './dataBuffer'
|
|
3
|
+
|
|
4
|
+
export interface DataBufferLike {
|
|
5
|
+
readonly data: Signal<ReadonlyArray<unknown>>
|
|
6
|
+
readonly loading: Signal<boolean>
|
|
7
|
+
readonly loadedWindow: DataWindow | null
|
|
8
|
+
getRawData(): unknown[]
|
|
9
|
+
setInlineData(data: unknown[]): void
|
|
10
|
+
dispose(): void
|
|
11
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn } from './types'
|
|
1
|
+
import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn, TimeShareFetcherFn } from './types'
|
|
2
2
|
|
|
3
3
|
type DataFetcherClass = {
|
|
4
4
|
new(...args: never[]): unknown
|
|
5
5
|
fetcher: DataFetcherFn
|
|
6
|
+
timeShareFetcher?: TimeShareFetcherFn
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
const definitions = new Map<string, DataFetcherDefinition>()
|
|
@@ -18,6 +19,7 @@ export function DataFetcher(config: DataFetcherDefinitionConfig) {
|
|
|
18
19
|
definitions.set(config.name, {
|
|
19
20
|
...config,
|
|
20
21
|
fetcher: this.fetcher,
|
|
22
|
+
timeShareFetcher: this.timeShareFetcher,
|
|
21
23
|
})
|
|
22
24
|
})
|
|
23
25
|
return value
|
|
@@ -30,11 +32,11 @@ export function getRegisteredFetcher(
|
|
|
30
32
|
return definitions.get(name)
|
|
31
33
|
}
|
|
32
34
|
|
|
33
|
-
|
|
35
|
+
function getRegisteredFetchers(): DataFetcherDefinition[] {
|
|
34
36
|
return Array.from(definitions.values())
|
|
35
37
|
}
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
function fetcherHasCapability(name: string, capability: string): boolean {
|
|
38
40
|
return definitions.get(name)?.capabilities?.includes(capability) ?? false
|
|
39
41
|
}
|
|
40
42
|
|
|
@@ -45,6 +47,14 @@ export function fetcherSupportsPeriod(name: string, period: string): boolean {
|
|
|
45
47
|
return def.capabilities.includes('*') || def.capabilities.includes(period)
|
|
46
48
|
}
|
|
47
49
|
|
|
50
|
+
export function getTimeShareFetcher(name: string): TimeShareFetcherFn | undefined {
|
|
51
|
+
return definitions.get(name)?.timeShareFetcher
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function fetcherSupportsTimeShare(name: string): boolean {
|
|
55
|
+
return typeof definitions.get(name)?.timeShareFetcher === 'function'
|
|
56
|
+
}
|
|
57
|
+
|
|
48
58
|
export function clearRegisteredFetchersForTest(): void {
|
|
49
59
|
definitions.clear()
|
|
50
|
-
}
|
|
60
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { KLineData } from '../controllers/types'
|
|
1
|
+
import type { KLineData, TimeShareData } from '../controllers/types'
|
|
2
2
|
import { DataFetcher } from './fetcherDefinitionRegistry'
|
|
3
|
-
import type { FetchConfig } from './types'
|
|
3
|
+
import type { FetchConfig, TimeShareFetchConfig } from './types'
|
|
4
4
|
|
|
5
5
|
const PERIOD_TO_CATEGORY: Record<string, number> = {
|
|
6
6
|
'1min': 8,
|
|
@@ -31,6 +31,46 @@ const EXCHANGE_EX_CATEGORY: Record<string, number> = {
|
|
|
31
31
|
|
|
32
32
|
const BASE_URL = 'http://127.0.0.1:8080'
|
|
33
33
|
|
|
34
|
+
function getShanghaiDateYYYYMMDD(): number {
|
|
35
|
+
const formatter = new Intl.DateTimeFormat('zh-CN', {
|
|
36
|
+
timeZone: 'Asia/Shanghai',
|
|
37
|
+
year: 'numeric', month: '2-digit', day: '2-digit',
|
|
38
|
+
})
|
|
39
|
+
const parts = formatter.formatToParts(new Date())
|
|
40
|
+
let y = '', m = '', d = ''
|
|
41
|
+
for (const p of parts) {
|
|
42
|
+
if (p.type === 'year') y = p.value
|
|
43
|
+
else if (p.type === 'month') m = p.value
|
|
44
|
+
else if (p.type === 'day') d = p.value
|
|
45
|
+
}
|
|
46
|
+
return +y * 10000 + +m * 100 + +d
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function fetchGotdxHistoryTick(
|
|
50
|
+
_source: string,
|
|
51
|
+
config: TimeShareFetchConfig,
|
|
52
|
+
): Promise<ReadonlyArray<TimeShareData>> {
|
|
53
|
+
const body = {
|
|
54
|
+
date: config.date ?? getShanghaiDateYYYYMMDD(),
|
|
55
|
+
market: config.symbol.startsWith('6') || config.symbol.startsWith('9') ? 1 : 0,
|
|
56
|
+
code: config.symbol,
|
|
57
|
+
}
|
|
58
|
+
const res = await fetch(`${BASE_URL}/api/stock/history-tick`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: { 'Content-Type': 'application/json' },
|
|
61
|
+
body: JSON.stringify(body),
|
|
62
|
+
})
|
|
63
|
+
if (!res.ok) throw new Error(`[gotdx] history-tick failed: ${res.status} ${res.statusText}`)
|
|
64
|
+
const list: Array<{ timestamp: string; Price: number; Avg: number; Vol: number }> = await res.json()
|
|
65
|
+
return list.map((item) => ({
|
|
66
|
+
timestamp: new Date(item.timestamp).getTime(),
|
|
67
|
+
price: item.Price,
|
|
68
|
+
average: item.Avg,
|
|
69
|
+
volume: item.Vol,
|
|
70
|
+
amount: item.Price * item.Vol,
|
|
71
|
+
}))
|
|
72
|
+
}
|
|
73
|
+
|
|
34
74
|
interface SecurityBar {
|
|
35
75
|
Last: number
|
|
36
76
|
Open: number
|
|
@@ -154,9 +194,7 @@ async function fetchGotdx(
|
|
|
154
194
|
'daily', 'weekly', 'monthly', 'quarterly', 'yearly',
|
|
155
195
|
],
|
|
156
196
|
})
|
|
157
|
-
|
|
197
|
+
class GotdxFetcher {
|
|
158
198
|
static fetcher = fetchGotdx
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
/** @deprecated Use `GotdxFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
162
|
-
export const gotdxDataFetcher = fetchGotdx
|
|
199
|
+
static timeShareFetcher = fetchGotdxHistoryTick
|
|
200
|
+
}
|
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export { GotdxFetcher, gotdxDataFetcher } from './gotdx'
|
|
6
|
-
export { routerDataFetcher } from './router'
|
|
1
|
+
export { hundredMockDataFetcher } from './hundred-mock'
|
|
2
|
+
export { thousandMockDataFetcher } from './thousand-mock'
|
|
3
|
+
export { baostockDataFetcher } from './baostock'
|
|
4
|
+
export { routerDataFetcher, routerTimeShareFetcher } from './router'
|
|
7
5
|
export { DataBuffer } from './dataBuffer'
|
|
8
6
|
export type { DataWindow } from './dataBuffer'
|
|
9
|
-
export {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
clearRegisteredFetchersForTest,
|
|
16
|
-
} from './fetcherDefinitionRegistry'
|
|
17
|
-
export type {
|
|
18
|
-
FetchConfig,
|
|
19
|
-
DataFetcherDefinitionConfig,
|
|
20
|
-
DataFetcherDefinition,
|
|
21
|
-
DataFetcherFn,
|
|
22
|
-
} from './types'
|
|
7
|
+
export { TimeShareBuffer } from './timeShareBuffer'
|
|
8
|
+
export type { DataBufferLike } from './dataBufferTypes'
|
|
9
|
+
export { getRegisteredFetcher, getTimeShareFetcher, fetcherSupportsTimeShare } from './fetcherDefinitionRegistry'
|
|
10
|
+
export type { TimeShareFetcherFn, TimeShareFetchConfig } from './types'
|
|
11
|
+
import './gotdx'
|
|
12
|
+
import './tradingview'
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DataFetcher } from '../controllers/types'
|
|
2
|
-
import {
|
|
2
|
+
import type { TimeShareFetcherFn } from './types'
|
|
3
|
+
import { getRegisteredFetcher, fetcherSupportsPeriod, getTimeShareFetcher } from './fetcherDefinitionRegistry'
|
|
3
4
|
|
|
4
5
|
const FALLBACK_SOURCE = 'baostock'
|
|
5
6
|
|
|
@@ -30,3 +31,13 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
|
|
|
30
31
|
|
|
31
32
|
return def.fetcher(source, config)
|
|
32
33
|
}
|
|
34
|
+
|
|
35
|
+
export const routerTimeShareFetcher: TimeShareFetcherFn = (source, config) => {
|
|
36
|
+
const fetcher = getTimeShareFetcher(source)
|
|
37
|
+
if (!fetcher) {
|
|
38
|
+
return Promise.reject(
|
|
39
|
+
new Error(`[DataFetcher] "${source}" does not support timeshare data fetching`),
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
return fetcher(source, config)
|
|
43
|
+
}
|