@vninvestcharts/widget 0.0.0-stage → 0.2.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/LICENSE +201 -0
- package/NOTICE.md +83 -0
- package/README.md +851 -3
- package/dist/AlertsModal-WKEUDTUZ.js +2 -0
- package/dist/ConnectedTradingPanel-KWJMIKTN.css +2 -0
- package/dist/ConnectedTradingPanel-XDKMOQY5.js +2 -0
- package/dist/PineEditorPanel-AUXB4FD3.js +2 -0
- package/dist/PineEditorPanel-V6YN2OTU.css +2 -0
- package/dist/RightSidebarDockHost-6FPZ6EKV.css +2 -0
- package/dist/RightSidebarDockHost-OBFXKSIY.js +2 -0
- package/dist/StrategyTesterPanel-6IUTS2P4.js +2 -0
- package/dist/StrategyTesterPanel-LEWEUMXP.css +2 -0
- package/dist/VolumeProfileWorker-UREKVPUE.js +189 -0
- package/dist/adapters/index.cjs +2532 -0
- package/dist/adapters/index.d.mts +673 -0
- package/dist/adapters/index.d.ts +673 -0
- package/dist/adapters/index.js +2521 -0
- package/dist/adapters/index.umd.js +2535 -0
- package/dist/chunk-5T6DGB3V.js +2 -0
- package/dist/chunk-66JBEGR3.js +4 -0
- package/dist/chunk-6D7DVBIK.js +2 -0
- package/dist/chunk-76E7CKUD.js +2 -0
- package/dist/chunk-AKWVXRQ6.js +2 -0
- package/dist/chunk-FHHSTO6Z.js +2 -0
- package/dist/chunk-HPL723JA.js +2 -0
- package/dist/chunk-NVGTF73S.js +2 -0
- package/dist/chunk-PNIB4OM3.js +2 -0
- package/dist/chunk-UKJ5AKQX.js +595 -0
- package/dist/chunk-UYJTX3SD.js +2 -0
- package/dist/combined.css +3068 -0
- package/dist/css-modules-manifest.json +297 -0
- package/dist/dist-Y6PZ2RN3.js +12 -0
- package/dist/drawing/index.cjs +53 -0
- package/dist/drawing/index.d.mts +2 -0
- package/dist/drawing/index.d.ts +2 -0
- package/dist/drawing/index.js +2 -0
- package/dist/drawing/index.umd.js +54 -0
- package/dist/dts/drawing-shim.d.ts +3 -0
- package/dist/dts/index.d.ts +31 -0
- package/dist/dts/lib/Chart.d.ts +31 -0
- package/dist/dts/lib/ChartContext.d.ts +10 -0
- package/dist/dts/lib/EventCapture.d.ts +3 -0
- package/dist/dts/lib/GenericChartComponent.d.ts +5 -0
- package/dist/dts/lib/GenericComponent.d.ts +124 -0
- package/dist/dts/lib/StockChartContext.d.ts +53 -0
- package/dist/dts/lib/adapters/BaseAdapter.d.ts +25 -0
- package/dist/dts/lib/adapters/BinanceAdapter.d.ts +51 -0
- package/dist/dts/lib/adapters/CSVAdapter.d.ts +17 -0
- package/dist/dts/lib/adapters/ContinuousContractAdapter.d.ts +63 -0
- package/dist/dts/lib/adapters/ContinuousContractTypes.d.ts +154 -0
- package/dist/dts/lib/adapters/DBAdapter.d.ts +16 -0
- package/dist/dts/lib/adapters/DataAdapter.d.ts +136 -0
- package/dist/dts/lib/adapters/DjangoVnstockAdapter.d.ts +15 -0
- package/dist/dts/lib/adapters/LocalCacheAdapter.d.ts +18 -0
- package/dist/dts/lib/adapters/MockAdapter.d.ts +22 -0
- package/dist/dts/lib/adapters/RESTAdapter.d.ts +16 -0
- package/dist/dts/lib/adapters/StockDataAdapter.d.ts +1 -0
- package/dist/dts/lib/adapters/UDFDataAdapter.d.ts +29 -0
- package/dist/dts/lib/adapters/VNStocksAdapter.d.ts +8 -0
- package/dist/dts/lib/adapters/WSAdapter.d.ts +30 -0
- package/dist/dts/lib/adapters/gapFixture.d.ts +71 -0
- package/dist/dts/lib/adapters/index.d.ts +15 -0
- package/dist/dts/lib/adapters/rollAlgorithms.d.ts +68 -0
- package/dist/dts/lib/advisory/AdvisoryPanel.d.ts +5 -0
- package/dist/dts/lib/alerts/AlertEvaluator.d.ts +5 -0
- package/dist/dts/lib/alerts/AlertManager.d.ts +123 -0
- package/dist/dts/lib/alerts/types.d.ts +58 -0
- package/dist/dts/lib/cache/cacheDebug.d.ts +3 -0
- package/dist/dts/lib/calendars/ExchangeCalendar.d.ts +23 -0
- package/dist/dts/lib/calendars/calendarRegistry.d.ts +10 -0
- package/dist/dts/lib/calendars/index.d.ts +3 -0
- package/dist/dts/lib/core/ChartPane.d.ts +8 -0
- package/dist/dts/lib/core/ChartSplitter.d.ts +70 -0
- package/dist/dts/lib/core/ChartTerminal.d.ts +12 -0
- package/dist/dts/lib/core/ErrorBoundary.d.ts +17 -0
- package/dist/dts/lib/core/IndicatorLegend.d.ts +47 -0
- package/dist/dts/lib/core/PaneHeader.d.ts +24 -0
- package/dist/dts/lib/core/PaneLabel.d.ts +8 -0
- package/dist/dts/lib/core/PaneSplitter.d.ts +9 -0
- package/dist/dts/lib/core/SeriesPicker.d.ts +10 -0
- package/dist/dts/lib/core/calculators/alignBarsByDate.d.ts +38 -0
- package/dist/dts/lib/core/calculators/buildIndicatorComputationPlan.d.ts +16 -0
- package/dist/dts/lib/core/calculators/calcCVDApprox.d.ts +6 -0
- package/dist/dts/lib/core/calculators/calcStrengthElder.d.ts +7 -0
- package/dist/dts/lib/core/calculators/calcWhaleApprox.d.ts +6 -0
- package/dist/dts/lib/core/calculators/computationHelpers.d.ts +12 -0
- package/dist/dts/lib/core/calculators/computeIndicatorComputationResult.d.ts +3 -0
- package/dist/dts/lib/core/calculators/computeMarketStructure.d.ts +8 -0
- package/dist/dts/lib/core/calculators/computeMomentum.d.ts +22 -0
- package/dist/dts/lib/core/calculators/computeMovingAverage.d.ts +15 -0
- package/dist/dts/lib/core/calculators/computeProfile.d.ts +9 -0
- package/dist/dts/lib/core/calculators/computeTrend.d.ts +10 -0
- package/dist/dts/lib/core/calculators/computeVolatility.d.ts +14 -0
- package/dist/dts/lib/core/calculators/computeVolumeFlow.d.ts +19 -0
- package/dist/dts/lib/core/calculators/enrichData.d.ts +7 -0
- package/dist/dts/lib/core/calculators/enrichDataWithCanonicalStore.d.ts +33 -0
- package/dist/dts/lib/core/calculators/exoticChartData.d.ts +140 -0
- package/dist/dts/lib/core/calculators/fixtures/mockData.d.ts +2 -0
- package/dist/dts/lib/core/calculators/indicatorComputation.d.ts +27 -0
- package/dist/dts/lib/core/calculators/indicatorComputationTypes.d.ts +249 -0
- package/dist/dts/lib/core/calculators/materializeIndicatorValues.d.ts +3 -0
- package/dist/dts/lib/core/calculators/normalizePrices.d.ts +36 -0
- package/dist/dts/lib/core/calculators/resolveCalculationOrder.d.ts +17 -0
- package/dist/dts/lib/core/calculators/types.d.ts +269 -0
- package/dist/dts/lib/core/canvas/ChartRenderContext.d.ts +14 -0
- package/dist/dts/lib/core/canvas/OverlayCanvas.d.ts +19 -0
- package/dist/dts/lib/core/context/ChartSyncContext.d.ts +21 -0
- package/dist/dts/lib/core/context/DataContext.d.ts +15 -0
- package/dist/dts/lib/core/context/PaneManagerContext.d.ts +10 -0
- package/dist/dts/lib/core/hooks/paneSizingHelpers.d.ts +13 -0
- package/dist/dts/lib/core/hooks/useCanvasResize.d.ts +8 -0
- package/dist/dts/lib/core/hooks/useChartTheme.d.ts +12 -0
- package/dist/dts/lib/core/hooks/useDynamicPanes.d.ts +155 -0
- package/dist/dts/lib/core/hooks/useIndicatorSets.d.ts +20 -0
- package/dist/dts/lib/core/hooks/usePaneManager.d.ts +39 -0
- package/dist/dts/lib/core/hooks/usePaneSizes.d.ts +52 -0
- package/dist/dts/lib/core/index.d.ts +41 -0
- package/dist/dts/lib/core/paneScaleSlotDomains.d.ts +3 -0
- package/dist/dts/lib/core/registry/SeriesRegistry.d.ts +22 -0
- package/dist/dts/lib/core/registry/filterPanesBySeriesTier.d.ts +43 -0
- package/dist/dts/lib/core/registry/marketStructure.d.ts +7 -0
- package/dist/dts/lib/core/registry/momentum.d.ts +20 -0
- package/dist/dts/lib/core/registry/movingAverage.d.ts +14 -0
- package/dist/dts/lib/core/registry/priceChartTypes.d.ts +16 -0
- package/dist/dts/lib/core/registry/profile.d.ts +8 -0
- package/dist/dts/lib/core/registry/registerAll.d.ts +1 -0
- package/dist/dts/lib/core/registry/registerPhaseOne.d.ts +3 -0
- package/dist/dts/lib/core/registry/registryCore.d.ts +77 -0
- package/dist/dts/lib/core/registry/trend.d.ts +11 -0
- package/dist/dts/lib/core/registry/volatility.d.ts +11 -0
- package/dist/dts/lib/core/registry/volumeFlow.d.ts +20 -0
- package/dist/dts/lib/core/replay/BarReplayController.d.ts +62 -0
- package/dist/dts/lib/core/replay/ReplayEventBus.d.ts +68 -0
- package/dist/dts/lib/core/replay/ReplayFillSimulator.d.ts +33 -0
- package/dist/dts/lib/core/replay/ReplayOrderBook.d.ts +24 -0
- package/dist/dts/lib/core/replay/ReplayPositionManager.d.ts +30 -0
- package/dist/dts/lib/core/replay/ReplaySessionAnalytics.d.ts +31 -0
- package/dist/dts/lib/core/replay/createReplayTradeMarkerPrimitives.d.ts +7 -0
- package/dist/dts/lib/core/replay/pnlUtils.d.ts +2 -0
- package/dist/dts/lib/core/replay/replayBrokerAdapters.d.ts +51 -0
- package/dist/dts/lib/core/replay/replayTradingTypes.d.ts +61 -0
- package/dist/dts/lib/core/scales/computeScales.d.ts +8 -0
- package/dist/dts/lib/core/seriesValueResolver.d.ts +27 -0
- package/dist/dts/lib/core/sets/builtins.d.ts +2 -0
- package/dist/dts/lib/core/sets/indicatorSetCodec.d.ts +15 -0
- package/dist/dts/lib/core/trading/AnalyticsEngine.d.ts +56 -0
- package/dist/dts/lib/core/trading/BrokerAPI.d.ts +40 -0
- package/dist/dts/lib/core/trading/ExecutionSimulator.d.ts +53 -0
- package/dist/dts/lib/core/trading/FillSettlement.d.ts +38 -0
- package/dist/dts/lib/core/trading/MarketDataPort.d.ts +41 -0
- package/dist/dts/lib/core/trading/MarketRules.d.ts +58 -0
- package/dist/dts/lib/core/trading/OrderManagementSystem.d.ts +57 -0
- package/dist/dts/lib/core/trading/PositionManager.d.ts +79 -0
- package/dist/dts/lib/core/trading/RiskEngine.d.ts +40 -0
- package/dist/dts/lib/core/trading/SettlementCalendar.d.ts +10 -0
- package/dist/dts/lib/core/trading/VirtualBrokerEngine.d.ts +92 -0
- package/dist/dts/lib/core/trading/orderMargin.d.ts +3 -0
- package/dist/dts/lib/core/trading/storage/InMemoryStorageAdapter.d.ts +10 -0
- package/dist/dts/lib/core/trading/storage/TradingStorage.d.ts +34 -0
- package/dist/dts/lib/core/trading/types.d.ts +99 -0
- package/dist/dts/lib/core/types/chart.d.ts +21 -0
- package/dist/dts/lib/core/types/indicator-catalog.d.ts +38 -0
- package/dist/dts/lib/core/types/indicator-set.d.ts +19 -0
- package/dist/dts/lib/core/types/pane-descriptor.d.ts +46 -0
- package/dist/dts/lib/core/types/seriesComponents.d.ts +15 -0
- package/dist/dts/lib/credentials/credentialStore.d.ts +93 -0
- package/dist/dts/lib/helper/SaveChartAsImage.d.ts +90 -0
- package/dist/dts/lib/indicator/defaultOptionsForAppearance.d.ts +105 -0
- package/dist/dts/lib/indicators/builtin/MTFWrapper.d.ts +3 -0
- package/dist/dts/lib/indicators/builtin/VolumeProfileWorker.d.ts +19 -0
- package/dist/dts/lib/indicators/builtin/ac.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/alligator.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/anchoredVwap.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/ao.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/bbi.d.ts +10 -0
- package/dist/dts/lib/indicators/builtin/bias.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/bollinger.d.ts +9 -0
- package/dist/dts/lib/indicators/builtin/brar.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/cci.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/chaikinOscillator.d.ts +14 -0
- package/dist/dts/lib/indicators/builtin/chaikinVol.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/ci.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/cmf.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/cr.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/cvd.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/deltaProfile.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/dema.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/dma.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/dmi.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/donchian.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/ema.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/emv.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/footprint.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/fractals.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/gator.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/hma.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/hv.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/ichimoku.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/kdj.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/keltner.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/ma.d.ts +10 -0
- package/dist/dts/lib/indicators/builtin/maRibbon.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/macd.d.ts +9 -0
- package/dist/dts/lib/indicators/builtin/marketProfile.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/mfi.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/mtm.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/obv.d.ts +10 -0
- package/dist/dts/lib/indicators/builtin/pivotHighLow.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/pivotStandard.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/psy.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/pvt.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/roc.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/rsi.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/sar.d.ts +10 -0
- package/dist/dts/lib/indicators/builtin/sma.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/smfi.d.ts +8 -0
- package/dist/dts/lib/indicators/builtin/stdDev.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/strengthRelative.d.ts +7 -0
- package/dist/dts/lib/indicators/builtin/supertrend.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/tema.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/trix.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/volOsc.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/volume.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/volumeProfile.d.ts +8 -0
- package/dist/dts/lib/indicators/builtin/vr.d.ts +10 -0
- package/dist/dts/lib/indicators/builtin/vwap.d.ts +5 -0
- package/dist/dts/lib/indicators/builtin/vwma.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/wma.d.ts +4 -0
- package/dist/dts/lib/indicators/builtin/wr.d.ts +10 -0
- package/dist/dts/lib/indicators/builtin/wyckoffWave.d.ts +15 -0
- package/dist/dts/lib/indicators/index.d.ts +63 -0
- package/dist/dts/lib/indicators/indicatorValueShapes.d.ts +15 -0
- package/dist/dts/lib/indicators/outputKeys.d.ts +50 -0
- package/dist/dts/lib/indicators/overlays/CVDIndicator.d.ts +26 -0
- package/dist/dts/lib/indicators/overlays/DarkFlowBadge.d.ts +19 -0
- package/dist/dts/lib/indicators/overlays/ExternalCVDOverlay.d.ts +15 -0
- package/dist/dts/lib/indicators/overlays/WhaleBubbleOverlay.d.ts +14 -0
- package/dist/dts/lib/indicators/overlays/WhaleMarketBubbleOverlay.d.ts +27 -0
- package/dist/dts/lib/indicators/overlays/whaleDetector.d.ts +66 -0
- package/dist/dts/lib/indicators/registry.d.ts +6 -0
- package/dist/dts/lib/indicators/types.d.ts +5 -0
- package/dist/dts/lib/indicators/utils.d.ts +259 -0
- package/dist/dts/lib/pinescript/PineCompiler.d.ts +34 -0
- package/dist/dts/lib/pinescript/ast.d.ts +73 -0
- package/dist/dts/lib/pinescript/compile.d.ts +40 -0
- package/dist/dts/lib/pinescript/grammar.d.ts +12 -0
- package/dist/dts/lib/pinescript/pine.worker.d.ts +1 -0
- package/dist/dts/lib/pinescript/pineBlocks.d.ts +54 -0
- package/dist/dts/lib/pinescript/pineBuiltins.d.ts +47 -0
- package/dist/dts/lib/pinescript/pineEnv.d.ts +46 -0
- package/dist/dts/lib/pinescript/pineMath.d.ts +13 -0
- package/dist/dts/lib/pinescript/pineParse.d.ts +25 -0
- package/dist/dts/lib/pinescript/pineStrings.d.ts +50 -0
- package/dist/dts/lib/pinescript/runtime.d.ts +5 -0
- package/dist/dts/lib/pinescript/scriptRegistry.d.ts +40 -0
- package/dist/dts/lib/pinescript/series-value.d.ts +64 -0
- package/dist/dts/lib/pinescript/vnscript-completion.d.ts +1 -0
- package/dist/dts/lib/pinescript/vnscript-grammar.d.ts +19 -0
- package/dist/dts/lib/scale/discontinuousTimeScaleProvider.d.ts +3 -0
- package/dist/dts/lib/scale/financeDiscontinuousScale.d.ts +15 -0
- package/dist/dts/lib/scale/index.d.ts +1 -0
- package/dist/dts/lib/scale/levels.d.ts +12 -0
- package/dist/dts/lib/series/AlternatingFillAreaSeries.d.ts +13 -0
- package/dist/dts/lib/series/AreaOnlySeries.d.ts +10 -0
- package/dist/dts/lib/series/AreaSeries.d.ts +30 -0
- package/dist/dts/lib/series/BarSeries.d.ts +40 -0
- package/dist/dts/lib/series/BollingerSeries.d.ts +11 -0
- package/dist/dts/lib/series/CandlestickSeries.d.ts +56 -0
- package/dist/dts/lib/series/CircleMarker.d.ts +28 -0
- package/dist/dts/lib/series/ElderRaySeries.d.ts +14 -0
- package/dist/dts/lib/series/FootprintSeries.d.ts +21 -0
- package/dist/dts/lib/series/GroupedBarSeries.d.ts +9 -0
- package/dist/dts/lib/series/HTFOverlaySeries.d.ts +32 -0
- package/dist/dts/lib/series/HistogramSeries.d.ts +51 -0
- package/dist/dts/lib/series/KagiSeries.d.ts +9 -0
- package/dist/dts/lib/series/LineBreakSeries.d.ts +28 -0
- package/dist/dts/lib/series/LineSeries.d.ts +54 -0
- package/dist/dts/lib/series/MACDSeries.d.ts +28 -0
- package/dist/dts/lib/series/MarketProfileSeries.d.ts +18 -0
- package/dist/dts/lib/series/OHLCSeries.d.ts +9 -0
- package/dist/dts/lib/series/OverlayBarSeries.d.ts +9 -0
- package/dist/dts/lib/series/PointAndFigureSeries.d.ts +45 -0
- package/dist/dts/lib/series/RSISeries.d.ts +38 -0
- package/dist/dts/lib/series/RenkoSeries.d.ts +9 -0
- package/dist/dts/lib/series/SARSeries.d.ts +10 -0
- package/dist/dts/lib/series/SVGComponent.d.ts +5 -0
- package/dist/dts/lib/series/ScatterSeries.d.ts +9 -0
- package/dist/dts/lib/series/SquareMarker.d.ts +28 -0
- package/dist/dts/lib/series/StackedBarSeries.d.ts +19 -0
- package/dist/dts/lib/series/StochasticSeries.d.ts +9 -0
- package/dist/dts/lib/series/StraightLine.d.ts +18 -0
- package/dist/dts/lib/series/TriangleMarker.d.ts +30 -0
- package/dist/dts/lib/series/VolumeProfileSeries.d.ts +9 -0
- package/dist/dts/lib/series/index.d.ts +28 -0
- package/dist/dts/lib/strategy/BrokerSimulator.d.ts +11 -0
- package/dist/dts/lib/strategy/types.d.ts +35 -0
- package/dist/dts/lib/tape/TapePanel.d.ts +5 -0
- package/dist/dts/lib/types/adapter.d.ts +1 -0
- package/dist/dts/lib/types/index.d.ts +5 -0
- package/dist/dts/lib/types/indicator.d.ts +11 -0
- package/dist/dts/lib/types/ohlcv.d.ts +1 -0
- package/dist/dts/lib/types/pane.d.ts +23 -0
- package/dist/dts/lib/types/runtime.d.ts +11 -0
- package/dist/dts/lib/types/vninvest.d.ts +320 -0
- package/dist/dts/lib/types.d.ts +45 -0
- package/dist/dts/lib/utils/ChartDataUtil.d.ts +26 -0
- package/dist/dts/lib/utils/PureComponent.d.ts +5 -0
- package/dist/dts/lib/utils/accumulatingWindow.d.ts +1 -0
- package/dist/dts/lib/utils/axisPriceFormat.d.ts +6 -0
- package/dist/dts/lib/utils/barWidth.d.ts +14 -0
- package/dist/dts/lib/utils/identity.d.ts +1 -0
- package/dist/dts/lib/utils/index.d.ts +70 -0
- package/dist/dts/lib/utils/logger.d.ts +28 -0
- package/dist/dts/lib/utils/mappedSlidingWindow.d.ts +1 -0
- package/dist/dts/lib/utils/merge.d.ts +6 -0
- package/dist/dts/lib/utils/noop.d.ts +1 -0
- package/dist/dts/lib/utils/rebind.d.ts +1 -0
- package/dist/dts/lib/utils/shallowEqual.d.ts +1 -0
- package/dist/dts/lib/utils/slidingWindow.d.ts +1 -0
- package/dist/dts/lib/utils/storage.d.ts +32 -0
- package/dist/dts/lib/utils/strokeDasharray.d.ts +3 -0
- package/dist/dts/lib/utils/timezoneFormatter.d.ts +14 -0
- package/dist/dts/lib/utils/zipper.d.ts +4 -0
- package/dist/dts/public-api.d.ts +31 -0
- package/dist/dts/widget/BackfillWorkerFlags.d.ts +12 -0
- package/dist/dts/widget/CanaryRollbackHelper.d.ts +95 -0
- package/dist/dts/widget/CanaryRolloutConfig.d.ts +100 -0
- package/dist/dts/widget/DrawingPriceLabelsOverlay.d.ts +20 -0
- package/dist/dts/widget/ForkDrawingsOverlay.d.ts +16 -0
- package/dist/dts/widget/MeasurementOverlay.d.ts +24 -0
- package/dist/dts/widget/VNInvestCharts.d.ts +5 -0
- package/dist/dts/widget/VNInvestChartsProps.d.ts +302 -0
- package/dist/dts/widget/VNInvestMultiCharts.d.ts +8 -0
- package/dist/dts/widget/VNInvestMultiCharts.types.d.ts +130 -0
- package/dist/dts/widget/WidgetEmptyState.d.ts +11 -0
- package/dist/dts/widget/WidgetErrorBoundary.d.ts +26 -0
- package/dist/dts/widget/adapters/ContinuousFuturesStockDataAdapter.d.ts +18 -0
- package/dist/dts/widget/adapters/DataProviderAdapterWrapper.d.ts +14 -0
- package/dist/dts/widget/adapters/MultiSourceDataAdapter.d.ts +24 -0
- package/dist/dts/widget/adapters/VNInvestClient.d.ts +161 -0
- package/dist/dts/widget/adapters/VNInvestDataAdapter.d.ts +77 -0
- package/dist/dts/widget/adapters/VNInvestWebSocketClient.d.ts +79 -0
- package/dist/dts/widget/adapters/barsPagingPolicy.d.ts +18 -0
- package/dist/dts/widget/adapters/corporateEvents.d.ts +13 -0
- package/dist/dts/widget/adapters/index.d.ts +20 -0
- package/dist/dts/widget/adapters/nativeShapes.d.ts +32 -0
- package/dist/dts/widget/adapters/watchlistRealtimeSync.d.ts +16 -0
- package/dist/dts/widget/alerts/DrawingAlertsHost.d.ts +18 -0
- package/dist/dts/widget/alerts/useDrawingAlerts.d.ts +37 -0
- package/dist/dts/widget/canaryBarFiltering.d.ts +35 -0
- package/dist/dts/widget/capabilities/CapabilityResolver.d.ts +71 -0
- package/dist/dts/widget/capabilities/capabilityProbe.d.ts +28 -0
- package/dist/dts/widget/capabilities/useTierGatedFeatures.d.ts +48 -0
- package/dist/dts/widget/components/BottomPanelHost.d.ts +80 -0
- package/dist/dts/widget/components/BottomPanelSplitter.d.ts +15 -0
- package/dist/dts/widget/components/CapabilityGate.d.ts +65 -0
- package/dist/dts/widget/components/ChartDiagOverlay.d.ts +31 -0
- package/dist/dts/widget/components/ConfirmDialog.d.ts +12 -0
- package/dist/dts/widget/components/DowngradeBanner.d.ts +9 -0
- package/dist/dts/widget/components/ForkPaneSeparators.d.ts +11 -0
- package/dist/dts/widget/components/ForkPaneTooltips.d.ts +23 -0
- package/dist/dts/widget/components/ForkXAxisOverlay.d.ts +11 -0
- package/dist/dts/widget/components/ForkYAxisCrosshairLabels.d.ts +9 -0
- package/dist/dts/widget/components/LayoutDesigner.d.ts +26 -0
- package/dist/dts/widget/components/PremiumFeatureGate.d.ts +10 -0
- package/dist/dts/widget/components/ShortcutHelpModal.d.ts +44 -0
- package/dist/dts/widget/components/SystemMenu.d.ts +66 -0
- package/dist/dts/widget/components/Toast.d.ts +20 -0
- package/dist/dts/widget/components/canvas/BarCountdownBadge.d.ts +8 -0
- package/dist/dts/widget/components/canvas/ChartA11ySummary.d.ts +40 -0
- package/dist/dts/widget/components/canvas/ChartStatusLine.d.ts +39 -0
- package/dist/dts/widget/components/canvas/PricePaneHeader.d.ts +24 -0
- package/dist/dts/widget/components/canvas/PriceScaleMenu.d.ts +27 -0
- package/dist/dts/widget/components/canvas/TimeAxisScrollbar.d.ts +18 -0
- package/dist/dts/widget/components/common/Icons.d.ts +67 -0
- package/dist/dts/widget/components/dock/DataWindow.d.ts +7 -0
- package/dist/dts/widget/components/dock/DockUpgradeNudge.d.ts +10 -0
- package/dist/dts/widget/components/dock/RightSidebarDockHost.d.ts +57 -0
- package/dist/dts/widget/components/dock/WatchlistPanel.d.ts +7 -0
- package/dist/dts/widget/components/dock/WorkspaceRightDockSlot.d.ts +46 -0
- package/dist/dts/widget/components/dock/dockAccess.d.ts +20 -0
- package/dist/dts/widget/components/dock/drawingDockContentBuilders.d.ts +29 -0
- package/dist/dts/widget/components/drawing/DrawingDock.d.ts +47 -0
- package/dist/dts/widget/components/drawing/DrawingInspector.d.ts +94 -0
- package/dist/dts/widget/components/drawing/DrawingListPanel.d.ts +62 -0
- package/dist/dts/widget/components/drawing/DrawingSemanticPointLegend.d.ts +14 -0
- package/dist/dts/widget/components/drawing/FloatingDrawingInspector.d.ts +18 -0
- package/dist/dts/widget/components/drawing/IconPickerPanel.d.ts +5 -0
- package/dist/dts/widget/components/drawing/InlineTextEditor.d.ts +20 -0
- package/dist/dts/widget/components/drawing/PatternScanPanel.d.ts +27 -0
- package/dist/dts/widget/components/drawing/TemplateManagerPanel.d.ts +18 -0
- package/dist/dts/widget/components/events/CorporateEventsOverlay.d.ts +23 -0
- package/dist/dts/widget/components/events/EventMarkerIcon.d.ts +6 -0
- package/dist/dts/widget/components/footer/ChartFooter.d.ts +26 -0
- package/dist/dts/widget/components/footer/MultiChartsFooter.d.ts +37 -0
- package/dist/dts/widget/components/footer/TimeframeFooter.d.ts +25 -0
- package/dist/dts/widget/components/footer/useBarCountdown.d.ts +5 -0
- package/dist/dts/widget/components/header/OHLCHeader.d.ts +72 -0
- package/dist/dts/widget/components/layout/DrawingConflictNotice.d.ts +4 -0
- package/dist/dts/widget/components/layout/GridContainer.d.ts +70 -0
- package/dist/dts/widget/components/layout/GridSlotErrorBoundary.d.ts +17 -0
- package/dist/dts/widget/components/layout/Splitter.d.ts +23 -0
- package/dist/dts/widget/components/layout/gridSplitterMath.d.ts +40 -0
- package/dist/dts/widget/components/layout/useGridSplitterDrag.d.ts +18 -0
- package/dist/dts/widget/components/mobile/MobileChartCarousel.d.ts +11 -0
- package/dist/dts/widget/components/mobile/MobileToolbar.d.ts +29 -0
- package/dist/dts/widget/components/overlays/AdvisoryPanel.d.ts +25 -0
- package/dist/dts/widget/components/overlays/TapePanel.d.ts +25 -0
- package/dist/dts/widget/components/overlays/WhalePanel.d.ts +5 -0
- package/dist/dts/widget/components/panels/AdvisoryPanel.d.ts +25 -0
- package/dist/dts/widget/components/panels/PineEditorPanel.d.ts +18 -0
- package/dist/dts/widget/components/panels/StrategyTesterPanel.d.ts +7 -0
- package/dist/dts/widget/components/panels/TapePanel.d.ts +17 -0
- package/dist/dts/widget/components/panels/index.d.ts +8 -0
- package/dist/dts/widget/components/replay/FloatingReplayToolbar.d.ts +24 -0
- package/dist/dts/widget/components/replay/ReplayCutOverlay.d.ts +8 -0
- package/dist/dts/widget/components/search/SymbolCompareModal.d.ts +24 -0
- package/dist/dts/widget/components/search/SymbolSearchModal.d.ts +12 -0
- package/dist/dts/widget/components/search/VNSymbolSearch.d.ts +83 -0
- package/dist/dts/widget/components/settings/AlertsModal.d.ts +74 -0
- package/dist/dts/widget/components/settings/SettingsContext.d.ts +58 -0
- package/dist/dts/widget/components/settings/SettingsModal.d.ts +78 -0
- package/dist/dts/widget/components/settings/SettingsRangeSlider.d.ts +17 -0
- package/dist/dts/widget/components/settings/SnapshotPreviewModal.d.ts +16 -0
- package/dist/dts/widget/components/settings/WorkspaceSettingsContext.d.ts +27 -0
- package/dist/dts/widget/components/settings/helpers/seriesFormatters.d.ts +11 -0
- package/dist/dts/widget/components/settings/model/appearancePayload.d.ts +31 -0
- package/dist/dts/widget/components/settings/model/chartSettingsSchema.d.ts +100 -0
- package/dist/dts/widget/components/settings/model/defaultSettings.d.ts +5 -0
- package/dist/dts/widget/components/settings/model/indicatorShare.d.ts +29 -0
- package/dist/dts/widget/components/settings/storageKeys.d.ts +29 -0
- package/dist/dts/widget/components/settings/tabs/AppearanceSettingsTab.d.ts +5 -0
- package/dist/dts/widget/components/settings/tabs/IndicatorParamsForm.d.ts +12 -0
- package/dist/dts/widget/components/settings/tabs/IndicatorsSettingsTab.d.ts +34 -0
- package/dist/dts/widget/components/settings/tabs/LicensingSettingsTab.d.ts +5 -0
- package/dist/dts/widget/components/settings/tabs/PanesLayoutSettingsTab.d.ts +11 -0
- package/dist/dts/widget/components/settings/tabs/ResetSettingsTab.d.ts +8 -0
- package/dist/dts/widget/components/settings/tabs/ScalesSettingsTab.d.ts +5 -0
- package/dist/dts/widget/components/settings/tabs/StatusLineSettingsTab.d.ts +5 -0
- package/dist/dts/widget/components/settings/tabs/SymbolSettingsTab.d.ts +5 -0
- package/dist/dts/widget/components/settings/tabs/ThemePaletteSettingsTab.d.ts +9 -0
- package/dist/dts/widget/components/settings/tabs/TradingEventsSettingsTab.d.ts +8 -0
- package/dist/dts/widget/components/toolbar/DrawingToolIcon.d.ts +10 -0
- package/dist/dts/widget/components/toolbar/DrawingToolbar.d.ts +33 -0
- package/dist/dts/widget/components/toolbar/FloatingChartBar.d.ts +20 -0
- package/dist/dts/widget/components/toolbar/FloatingFavoritesBar.d.ts +18 -0
- package/dist/dts/widget/components/toolbar/MultiChartTopbar.d.ts +47 -0
- package/dist/dts/widget/components/toolbar/UnifiedDrawingToolbar.d.ts +28 -0
- package/dist/dts/widget/components/trading/PaperTradePanel.d.ts +41 -0
- package/dist/dts/widget/components/workspace/WorkspaceToolbar.d.ts +25 -0
- package/dist/dts/widget/config/toolGroups.d.ts +11 -0
- package/dist/dts/widget/config/toolShortcuts.d.ts +27 -0
- package/dist/dts/widget/constants/comparison.d.ts +1 -0
- package/dist/dts/widget/constants/symbolSearch.d.ts +14 -0
- package/dist/dts/widget/constants/vn30.d.ts +7 -0
- package/dist/dts/widget/context/DataProviderContext.d.ts +7 -0
- package/dist/dts/widget/context/HoverEmitter.d.ts +50 -0
- package/dist/dts/widget/context/SyncContextShare.d.ts +11 -0
- package/dist/dts/widget/context/VNInvestChartsConfigContext.d.ts +24 -0
- package/dist/dts/widget/context/VNInvestChartsContext.d.ts +70 -0
- package/dist/dts/widget/context/VNInvestChartsStateContext.d.ts +50 -0
- package/dist/dts/widget/context/WidgetI18nContext.d.ts +25 -0
- package/dist/dts/widget/context/WorkspaceLiveTradingContext.d.ts +30 -0
- package/dist/dts/widget/context/WorkspacePaperVisibilityContext.d.ts +23 -0
- package/dist/dts/widget/context/WorkspaceReplayTradingContext.d.ts +36 -0
- package/dist/dts/widget/contexts/SaaSFeatureContext.d.ts +23 -0
- package/dist/dts/widget/data/DataEnvelope.d.ts +100 -0
- package/dist/dts/widget/drawingPriceLabelInputs.d.ts +3 -0
- package/dist/dts/widget/export/chartCsv.d.ts +59 -0
- package/dist/dts/widget/forkAnchorReconciliation.d.ts +6 -0
- package/dist/dts/widget/forkInteractionHelpers.d.ts +69 -0
- package/dist/dts/widget/grid/DeviceProfiles.d.ts +49 -0
- package/dist/dts/widget/grid/GridChartRegistry.d.ts +9 -0
- package/dist/dts/widget/grid/MemoryBudgetManager.d.ts +63 -0
- package/dist/dts/widget/grid/PerformanceMonitor.d.ts +70 -0
- package/dist/dts/widget/grid/customPresets.d.ts +42 -0
- package/dist/dts/widget/grid/presets.d.ts +18 -0
- package/dist/dts/widget/grid/types.d.ts +39 -0
- package/dist/dts/widget/history/BackfillDedupContext.d.ts +63 -0
- package/dist/dts/widget/history/RequestCoordinator.d.ts +59 -0
- package/dist/dts/widget/history/SharedBarStoreContext.d.ts +22 -0
- package/dist/dts/widget/history/cache/IndexedDBCacheMatrix.d.ts +16 -0
- package/dist/dts/widget/history/cache/LocalCacheMatrix.d.ts +86 -0
- package/dist/dts/widget/history/cache/index.d.ts +3 -0
- package/dist/dts/widget/history/chunkStore.d.ts +77 -0
- package/dist/dts/widget/history/externalBarsNormalization.d.ts +9 -0
- package/dist/dts/widget/history/externalBarsNormalization.worker.d.ts +1 -0
- package/dist/dts/widget/history/externalBarsNormalizationAsync.d.ts +25 -0
- package/dist/dts/widget/history/historyDataUtils.d.ts +82 -0
- package/dist/dts/widget/history/historyWindowPlanner.d.ts +89 -0
- package/dist/dts/widget/history/inflightController.d.ts +15 -0
- package/dist/dts/widget/history/requestCoalescing.d.ts +10 -0
- package/dist/dts/widget/history/sessionGuards.d.ts +3 -0
- package/dist/dts/widget/history/singleWriterLane.d.ts +4 -0
- package/dist/dts/widget/history/useExternalBarsNormalization.d.ts +5 -0
- package/dist/dts/widget/hooks/ShortcutManager.d.ts +65 -0
- package/dist/dts/widget/hooks/overlays/PaneHeaderWrapper.d.ts +11 -0
- package/dist/dts/widget/hooks/overlays/overlayHelpers.d.ts +60 -0
- package/dist/dts/widget/hooks/overlays/useDrawingDockNode.d.ts +15 -0
- package/dist/dts/widget/hooks/overlays/useLegendChrome.d.ts +36 -0
- package/dist/dts/widget/hooks/overlays/useMultiSelectActions.d.ts +22 -0
- package/dist/dts/widget/hooks/overlays/useSidebarResize.d.ts +13 -0
- package/dist/dts/widget/hooks/resolveEntitlement.d.ts +73 -0
- package/dist/dts/widget/hooks/useBottomPanelBehavior.d.ts +38 -0
- package/dist/dts/widget/hooks/useBottomPanelHeight.d.ts +39 -0
- package/dist/dts/widget/hooks/useCanvasTheme.d.ts +24 -0
- package/dist/dts/widget/hooks/useChartImperativeHandle.d.ts +57 -0
- package/dist/dts/widget/hooks/useClockAdapter.d.ts +11 -0
- package/dist/dts/widget/hooks/useComparisonState.d.ts +29 -0
- package/dist/dts/widget/hooks/useDialogFocus.d.ts +25 -0
- package/dist/dts/widget/hooks/useDrawingToolShortcuts.d.ts +16 -0
- package/dist/dts/widget/hooks/useFeatureGate.d.ts +28 -0
- package/dist/dts/widget/hooks/useFloatingChartBar.d.ts +33 -0
- package/dist/dts/widget/hooks/useForkRuntime.d.ts +155 -0
- package/dist/dts/widget/hooks/useIndicatorsShareApplier.d.ts +1 -0
- package/dist/dts/widget/hooks/useIntersectionObserver.d.ts +49 -0
- package/dist/dts/widget/hooks/useKeyboardAdapter.d.ts +9 -0
- package/dist/dts/widget/hooks/useLayoutHistory.d.ts +8 -0
- package/dist/dts/widget/hooks/useLicenseDiagnostics.d.ts +15 -0
- package/dist/dts/widget/hooks/useMultiChartReplaySync.d.ts +31 -0
- package/dist/dts/widget/hooks/useMultiWorkspacePersistence.d.ts +49 -0
- package/dist/dts/widget/hooks/usePaperTradeConfig.d.ts +27 -0
- package/dist/dts/widget/hooks/usePaperTradeInteraction.d.ts +27 -0
- package/dist/dts/widget/hooks/usePatTierAuthentication.d.ts +42 -0
- package/dist/dts/widget/hooks/usePineScriptRestore.d.ts +23 -0
- package/dist/dts/widget/hooks/usePortalAdapter.d.ts +8 -0
- package/dist/dts/widget/hooks/useRecentSymbols.d.ts +3 -0
- package/dist/dts/widget/hooks/useReplayState.d.ts +28 -0
- package/dist/dts/widget/hooks/useReplayTrading.d.ts +26 -0
- package/dist/dts/widget/hooks/useResizeAdapter.d.ts +13 -0
- package/dist/dts/widget/hooks/useScaleOverlays.d.ts +62 -0
- package/dist/dts/widget/hooks/useScriptPersistence.d.ts +72 -0
- package/dist/dts/widget/hooks/useSymbolSearch.d.ts +30 -0
- package/dist/dts/widget/hooks/useViewportBreakpoint.d.ts +15 -0
- package/dist/dts/widget/hooks/useWidgetCoordinateBridge.d.ts +70 -0
- package/dist/dts/widget/hooks/useWidgetData.d.ts +138 -0
- package/dist/dts/widget/hooks/useWidgetDataBackfill.d.ts +67 -0
- package/dist/dts/widget/hooks/useWidgetDataEnrichment.d.ts +32 -0
- package/dist/dts/widget/hooks/useWidgetDrawings.d.ts +38 -0
- package/dist/dts/widget/hooks/useWidgetForkInteraction.d.ts +68 -0
- package/dist/dts/widget/hooks/useWidgetInteractionActions.d.ts +36 -0
- package/dist/dts/widget/hooks/useWidgetOverlays.d.ts +190 -0
- package/dist/dts/widget/hooks/useWidgetRuntime.d.ts +20 -0
- package/dist/dts/widget/hooks/useWidgetSettings.d.ts +244 -0
- package/dist/dts/widget/hooks/useWidgetWorkspaceIO.d.ts +24 -0
- package/dist/dts/widget/hooks/useWorkspaceDockPanels.d.ts +11 -0
- package/dist/dts/widget/hooks/useWorkspaceLiveTrading.d.ts +28 -0
- package/dist/dts/widget/hooks/useWorkspaceReplayTrading.d.ts +22 -0
- package/dist/dts/widget/i18n/a11y.messages.en.d.ts +8 -0
- package/dist/dts/widget/i18n/a11y.messages.vi.d.ts +3 -0
- package/dist/dts/widget/i18n/capability.messages.en.d.ts +7 -0
- package/dist/dts/widget/i18n/capability.messages.vi.d.ts +3 -0
- package/dist/dts/widget/i18n/dock.messages.en.d.ts +2 -0
- package/dist/dts/widget/i18n/dock.messages.vi.d.ts +2 -0
- package/dist/dts/widget/i18n/messages.en.d.ts +2 -0
- package/dist/dts/widget/i18n/messages.licensing.d.ts +48 -0
- package/dist/dts/widget/i18n/messages.vi.d.ts +2 -0
- package/dist/dts/widget/i18n/trading.messages.en.d.ts +2 -0
- package/dist/dts/widget/i18n/trading.messages.vi.d.ts +2 -0
- package/dist/dts/widget/i18n/types.d.ts +3 -0
- package/dist/dts/widget/iframe/builtInAdapters.d.ts +63 -0
- package/dist/dts/widget/iframe/host-entry.d.ts +11 -0
- package/dist/dts/widget/iframe/hostSDK.d.ts +151 -0
- package/dist/dts/widget/iframe/iframeBridge.d.ts +165 -0
- package/dist/dts/widget/iframe/iframeEntry.d.ts +52 -0
- package/dist/dts/widget/iframe/iframeFrame.d.ts +15 -0
- package/dist/dts/widget/iframe/iframeQuotes.d.ts +20 -0
- package/dist/dts/widget/iframe/messageProtocol.d.ts +545 -0
- package/dist/dts/widget/iframe/quoteHub.d.ts +20 -0
- package/dist/dts/widget/iframe/useVNInvestChartsHost.d.ts +8 -0
- package/dist/dts/widget/iife-entry.d.ts +61 -0
- package/dist/dts/widget/iifeWidgetInstance.d.ts +60 -0
- package/dist/dts/widget/index.d.ts +56 -0
- package/dist/dts/widget/multiChartDefaults.d.ts +18 -0
- package/dist/dts/widget/paneInteractionUtils.d.ts +25 -0
- package/dist/dts/widget/patterns/autoPatternScan.d.ts +77 -0
- package/dist/dts/widget/patterns/patternDrawingFactory.d.ts +87 -0
- package/dist/dts/widget/plugin/ProPluginRegistry.d.ts +40 -0
- package/dist/dts/widget/runtime/ChartScaleAdapter.d.ts +73 -0
- package/dist/dts/widget/runtime/ChartSerializer.d.ts +12 -0
- package/dist/dts/widget/runtime/ForkRuntimeAdapter.d.ts +19 -0
- package/dist/dts/widget/runtime/IRuntimeEngine.d.ts +40 -0
- package/dist/dts/widget/runtime/WorkspaceSerializer.d.ts +31 -0
- package/dist/dts/widget/runtimePolicy.d.ts +36 -0
- package/dist/dts/widget/styles/injectStyles.d.ts +9 -0
- package/dist/dts/widget/theme/ThemeConfig.d.ts +21 -0
- package/dist/dts/widget/theme/applyTheme.d.ts +3 -0
- package/dist/dts/widget/trading/chart/DraggableOrderHandles.d.ts +15 -0
- package/dist/dts/widget/trading/chart/InteractivePositionOverlay.d.ts +19 -0
- package/dist/dts/widget/trading/chart/PendingOrderOverlay.d.ts +11 -0
- package/dist/dts/widget/trading/chart/QuickTradingHeader.d.ts +20 -0
- package/dist/dts/widget/trading/chart/TradingChartSurface.d.ts +8 -0
- package/dist/dts/widget/trading/chart/TradingOverlaysHost.d.ts +28 -0
- package/dist/dts/widget/trading/chart/priceTicks.d.ts +1 -0
- package/dist/dts/widget/trading/chart/useFloatingDrag.d.ts +40 -0
- package/dist/dts/widget/trading/chart/useTradingHotkeys.d.ts +21 -0
- package/dist/dts/widget/trading/config/paperRuntimeConfig.d.ts +53 -0
- package/dist/dts/widget/trading/context/PaperPanelRegistry.d.ts +45 -0
- package/dist/dts/widget/trading/context/TradingContext.d.ts +80 -0
- package/dist/dts/widget/trading/context/WorkspaceTradingSync.d.ts +24 -0
- package/dist/dts/widget/trading/hooks/usePaperRuntimeConfig.d.ts +36 -0
- package/dist/dts/widget/trading/index.d.ts +5 -0
- package/dist/dts/widget/trading/panel/AccountSummaryTab.d.ts +7 -0
- package/dist/dts/widget/trading/panel/ActiveChartPaperPanel.d.ts +26 -0
- package/dist/dts/widget/trading/panel/ConnectedTradingPanel.d.ts +3 -0
- package/dist/dts/widget/trading/panel/HistoryTab.d.ts +5 -0
- package/dist/dts/widget/trading/panel/MarketFallbackBanner.d.ts +4 -0
- package/dist/dts/widget/trading/panel/OrdersTab.d.ts +8 -0
- package/dist/dts/widget/trading/panel/PaperCapitalDialog.d.ts +8 -0
- package/dist/dts/widget/trading/panel/PaperSettingsModal.d.ts +17 -0
- package/dist/dts/widget/trading/panel/PositionsTab.d.ts +15 -0
- package/dist/dts/widget/trading/panel/TradeHistoryTab.d.ts +5 -0
- package/dist/dts/widget/trading/panel/TradingBottomPanel.d.ts +36 -0
- package/dist/dts/widget/trading/panel/TradingLogTab.d.ts +8 -0
- package/dist/dts/widget/trading/panel/TradingPanelHeader.d.ts +17 -0
- package/dist/dts/widget/trading/panel/csvExport.d.ts +18 -0
- package/dist/dts/widget/trading/ticket/ConnectedTradingDockPanel.d.ts +5 -0
- package/dist/dts/widget/trading/ticket/OrderTicketForm.d.ts +31 -0
- package/dist/dts/widget/trading/ticket/OrderTicketModal.d.ts +29 -0
- package/dist/dts/widget/trading/ticket/RegistryTradingDockPanel.d.ts +9 -0
- package/dist/dts/widget/trading/ticket/RiskCalculatorView.d.ts +9 -0
- package/dist/dts/widget/trading/ticket/TradingDockPanel.d.ts +36 -0
- package/dist/dts/widget/trading/ticket/orderTicketModel.d.ts +49 -0
- package/dist/dts/widget/trading/visibility/paperVisibility.d.ts +38 -0
- package/dist/dts/widget/types/dataProvider.d.ts +8 -0
- package/dist/dts/widget/types/fullChartHandle.d.ts +25 -0
- package/dist/dts/widget/types/saas.d.ts +83 -0
- package/dist/dts/widget/types/symbolSearch.d.ts +9 -0
- package/dist/dts/widget/types/watchlist.d.ts +26 -0
- package/dist/dts/widget/utils/axisHit.d.ts +16 -0
- package/dist/dts/widget/utils/chartRange.d.ts +12 -0
- package/dist/dts/widget/utils/chartTypeOptions.d.ts +38 -0
- package/dist/dts/widget/utils/clickOutside.d.ts +1 -0
- package/dist/dts/widget/utils/coordinateBridge.d.ts +31 -0
- package/dist/dts/widget/utils/crosshairSync.d.ts +50 -0
- package/dist/dts/widget/utils/drawingSync.d.ts +198 -0
- package/dist/dts/widget/utils/enrichedHash.d.ts +15 -0
- package/dist/dts/widget/utils/headerSync.d.ts +12 -0
- package/dist/dts/widget/utils/numberFormat.d.ts +13 -0
- package/dist/dts/widget/utils/paperTradeAdapters.d.ts +11 -0
- package/dist/dts/widget/utils/pineSeriesData.d.ts +71 -0
- package/dist/dts/widget/utils/rangeSync.d.ts +29 -0
- package/dist/dts/widget/utils/telemetry.d.ts +19 -0
- package/dist/dts/widget/utils/widgetEquality.d.ts +57 -0
- package/dist/dts/widget/utils/widgetErrors.d.ts +29 -0
- package/dist/dts/widget/utils/widgetHelpers.d.ts +395 -0
- package/dist/dts/widget/utils/xAxisTickFormatter.d.ts +33 -0
- package/dist/dts/widget/visibleRangeBridge.d.ts +28 -0
- package/dist/dts/widget/visibleRangeDiagnostics.d.ts +10 -0
- package/dist/dts/widget/visibleRangePolicies.d.ts +6 -0
- package/dist/dts/widget/workspace/WorkspaceManager.d.ts +23 -0
- package/dist/dts/widget/workspace/WorkspaceStore.d.ts +85 -0
- package/dist/dts/widget/workspace/types.d.ts +21 -0
- package/dist/externalBarsNormalization.worker.js +108 -0
- package/dist/iframe/index.html +63 -0
- package/dist/iframe/injected.css +6456 -0
- package/dist/iframe/vninvestchart.iframe.css +2 -0
- package/dist/iframe/vninvestchart.iframe.js +945 -0
- package/dist/iframe-host/host-entry.cjs +687 -0
- package/dist/iframe-host/host-entry.d.mts +818 -0
- package/dist/iframe-host/host-entry.d.ts +818 -0
- package/dist/iframe-host/host-entry.js +680 -0
- package/dist/index.cjs +7253 -0
- package/dist/index.css +3390 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +6461 -0
- package/dist/injected.css +6456 -0
- package/dist/rollAlgorithms-2P2ZKKHO.js +2 -0
- package/dist/types/runtime.cjs +8 -0
- package/dist/types/runtime.d.mts +92 -0
- package/dist/types/runtime.d.ts +92 -0
- package/dist/types/runtime.js +5 -0
- package/dist/types/runtime.umd.js +14 -0
- package/dist/vninvestchart.iife.css +2 -0
- package/dist/vninvestchart.iife.js +945 -0
- package/package.json +225 -5
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function r(e){return e==="BollingerBands"?"BollingerBand":e}var l="rsc-pane-layout-v2",o=5,i=[{id:"price",label:"Price",pinned:!0,visible:!0,heightRatio:.85,splitScale:!1,tooltip:"ohlc",series:[{type:"Candlestick",yAxis:"right"},{type:"EMA",params:{period:20,color:"#2d9cdb"},yAxis:"right",overlay:!0},{type:"EMA",params:{period:50,color:"#f2994a"},yAxis:"right",overlay:!0},{type:"BollingerBand",params:{period:20,stdDev:2},color:"#38bdf8",yAxis:"right",overlay:!0}]},{id:"volume",label:"Volume",pinned:!1,visible:!0,heightRatio:.15,splitScale:!1,tooltip:"value",series:[{type:"Volume",yAxis:"right"}]},{id:"momentum",label:"RSI+MACD",pinned:!1,visible:!1,heightRatio:.2,splitScale:!0,tooltip:"value",series:[{type:"RSI",params:{period:14},yAxis:"left",scaleSlotId:"momentum-left"},{type:"MACD",params:{fast:12,slow:26,signal:9},yAxis:"right",scaleSlotId:"momentum-right"}]},{id:"orderflow",label:"Order Flow",pinned:!1,visible:!1,heightRatio:.2,splitScale:!1,tooltip:"value",series:[{type:"Whale",params:{threshold:5e4},yAxis:"right"},{type:"CVDApprox",yAxis:"right"}]},{id:"strength",label:"Strength",pinned:!1,visible:!1,heightRatio:.18,splitScale:!0,tooltip:"value",series:[{type:"StrengthElder",yAxis:"left",scaleSlotId:"strength-left"},{type:"StrengthRelative",yAxis:"right",scaleSlotId:"strength-right"}]}],t=new Set(i.map(e=>e.id));function s(e){return t.has(e)}export{r as a,l as b,o as c,i as d,s as e};
|
|
2
|
+
//# sourceMappingURL=chunk-5T6DGB3V.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{c as Te,g as nt,o as at,t as ot}from"./chunk-76E7CKUD.js";import{e as I}from"./chunk-FHHSTO6Z.js";import{createContext as Pr,useCallback as kt,useContext as xr,useEffect as se,useMemo as wt,useRef as Z,useState as le}from"react";function Yr(r){return r==="VN_SPOT"||r==="VN_DERIVATIVES"}var te=1e5,me=1e9,st=1e12,lt={profile:"VN_SPOT",baseCurrency:"VND",lotSize:100,allowShortSelling:!1,settlementDays:2,maxLeverage:1,getTickSize(r,e="HOSE"){return e==="HNX"||e==="UPCOM"?100:r<1e4?10:r<5e4?50:100},getPriceBand(r,e="HOSE"){let t=e==="UPCOM"?.15:e==="HNX"?.1:.07,i=100,n=Math.floor(Number((r*(1+t)).toPrecision(12))/i)*i,a=Math.ceil(Number((r*(1-t)).toPrecision(12))/i)*i;return{ceilingPrice:n,floorPrice:a}},validateOrder(r){return!Number.isInteger(r.quantity)||r.quantity<=0||r.quantity%100!==0?{valid:!1,reason:"Kh\u1ED1i l\u01B0\u1EE3ng ph\u1EA3i l\xE0 b\u1ED9i s\u1ED1 d\u01B0\u01A1ng c\u1EE7a l\xF4 100",code:"INVALID_QUANTITY"}:r.side==="sell"&&!r.isClosingPosition&&!this.allowShortSelling?{valid:!1,reason:"T\xE0i kho\u1EA3n c\u01A1 s\u1EDF kh\xF4ng \u0111\u01B0\u1EE3c ph\xE9p b\xE1n kh\u1ED1ng",code:"SHORT_NOT_ALLOWED"}:{valid:!0}}},tr={profile:"GLOBAL_MARGIN",baseCurrency:"USD",lotSize:1,allowShortSelling:!1,settlementDays:0,maxLeverage:1,getTickSize(r){return r>=1e3?.1:r>=100?.01:.001},getPriceBand(r){return{ceilingPrice:Number.POSITIVE_INFINITY,floorPrice:0}},validateOrder(r){return!Number.isFinite(r.quantity)||r.quantity<=0?{valid:!1,reason:"Kh\u1ED1i l\u01B0\u1EE3ng ph\u1EA3i d\u01B0\u01A1ng",code:"INVALID_QUANTITY"}:r.side==="sell"&&!r.isClosingPosition&&!this.allowShortSelling?{valid:!1,reason:"Spot crypto kh\xF4ng \u0111\u01B0\u1EE3c b\xE1n kh\u1ED1ng",code:"SHORT_NOT_ALLOWED"}:{valid:!0}}};function ne(r){let e=r.trim().toUpperCase();return/^VN30F/i.test(e)?rr:/(USDT|USDC|USD|BTC|ETH)$/.test(e)||e.includes("/")||e.includes(":")?tr:/^[A-Z]{4,}$/.test(e)?ir:lt}function dt(r){let e=r.trim().toUpperCase();return!(/^VN30F/i.test(e)||/(USDT|USDC|USD|BTC|ETH)$/.test(e)||e.includes("/")||e.includes(":")||/^[A-Z]{4,}$/.test(e)||/^[A-Z]{3}$/.test(e))}var rr={profile:"VN_DERIVATIVES",baseCurrency:"VND",lotSize:1,contractMultiplier:1e5,allowShortSelling:!0,settlementDays:0,maxLeverage:5.71,initialMarginRate:.175,brokerBufferMultiplier:1.25,maxOrderQuantity:500,maxPositionQuantity:5e3,getTickSize(){return .1},getPriceBand(r){let e=Number((r*1.07).toFixed(1)),t=Number((r*.93).toFixed(1));return{ceilingPrice:e,floorPrice:t}},validateOrder(r){if(!Number.isInteger(r.quantity)||r.quantity<1)return{valid:!1,reason:"S\u1ED1 l\u01B0\u1EE3ng h\u1EE3p \u0111\u1ED3ng ph\u1EA3i l\xE0 s\u1ED1 nguy\xEAn d\u01B0\u01A1ng",code:"INVALID_QUANTITY"};let e=this.maxOrderQuantity;return e!=null&&r.quantity>e?{valid:!1,reason:`V\u01B0\u1EE3t gi\u1EDBi h\u1EA1n ${e} H\u0110/l\u1EC7nh`,code:"INVALID_QUANTITY"}:{valid:!0}}},Xr={...lt,profile:"VN_SPOT",settlementDays:0},ir={profile:"GLOBAL_MARGIN",baseCurrency:"USD",lotSize:1,allowShortSelling:!0,settlementDays:0,maxLeverage:100,getTickSize(){return .01},getPriceBand(r){return{ceilingPrice:Number.POSITIVE_INFINITY,floorPrice:0}},validateOrder(r){return!Number.isFinite(r.quantity)||r.quantity<=0?{valid:!1,reason:"Kh\u1ED1i l\u01B0\u1EE3ng ph\u1EA3i d\u01B0\u01A1ng",code:"INVALID_QUANTITY"}:{valid:!0}}};var nr=["market","limit","stop","trailing_stop","ato","atc","mp","mtl","plo"];function ct(r){return r==="market"||r==="mp"||r==="mtl"||r==="ato"||r==="atc"||r==="plo"?0:r==="stop"||r==="trailing_stop"?1:2}function ut(r){return r==="market"||r==="mp"||r==="mtl"||r==="ato"||r==="atc"}var ke=class r{tickSizeProvider;orders=new Map;trailingPeak=new Map;seq=0;constructor(e={}){this.tickSizeProvider=e.tickSizeProvider??(()=>1)}listOrders(){return[...this.orders.values()]}getOrder(e){return this.orders.get(e)}getTrailingPeaks(){return Object.fromEntries(this.trailingPeak)}cancelOrder(e){let t=this.orders.get(e);return!t||t.status!=="working"&&t.status!=="pending"?!1:(t.status="cancelled",t.updatedAt=Date.now(),!0)}modifyOrder(e,t){let i=this.orders.get(e);if(!i)throw new Error(`Order not found: ${e}`);if(i.status!=="working")throw new Error(`Only working orders can be modified: ${e}`);return t.price!=null&&(i.price=t.price),t.stopPrice!=null&&(i.stopPrice=t.stopPrice),i.updatedAt=Date.now(),i}clear(){this.orders.clear(),this.trailingPeak.clear(),this.seq=0}restoreState(e,t){this.clear();for(let i of e){this.orders.set(i.id,{...i});let n=Number(/^ord_(\d+)$/.exec(i.id)?.[1]);Number.isInteger(n)&&n>=this.seq&&(this.seq=n+1)}if(t)for(let[i,n]of Object.entries(t))this.orders.has(i)&&this.trailingPeak.set(i,n)}placeOrder(e){let t=Date.now(),i={id:`ord_${++this.seq}`,clientOrderId:e.clientOrderId??`cli_${this.seq}`,symbol:e.symbol,side:e.side,type:e.type,quantity:e.quantity,createdAt:t,updatedAt:t},n=(d,o="GTC")=>{let s={...i,status:"rejected",filledQuantity:0,timeInForce:o,rejectCode:d};return this.orders.set(s.id,s),s};if(!nr.includes(e.type))return n("UNSUPPORTED_ORDER_TYPE");if(!["GTC","DAY","IOC","FOK"].includes(e.timeInForce??"GTC"))return n("UNSUPPORTED_TIF",e.timeInForce??"GTC");if(!Number.isFinite(e.quantity)||e.quantity<=0)return n("INVALID_QUANTITY");if(e.type==="limit"&&(e.price==null||!Number.isFinite(e.price))||(e.type==="stop"||e.type==="trailing_stop")&&(e.stopPrice==null||!Number.isFinite(e.stopPrice)))return n("INVALID_PRICE");let a={...i,status:"working",filledQuantity:0,price:e.price,stopPrice:e.stopPrice,bracket:e.bracket,timeInForce:e.timeInForce??"GTC"};return this.orders.set(a.id,a),a}static utcDayKey(e){let t=e instanceof Date?e:new Date(e),i=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0"),a=String(t.getUTCDate()).padStart(2,"0");return`${i}-${n}-${a}`}processBar(e,t,i){let n=i??Date.now(),a=[],d=[...this.orders.values()].filter(o=>o.symbol===e&&o.status==="working").sort((o,s)=>ct(o.type)-ct(s.type));for(let o of d){if(o.status!=="working")continue;if(o.timeInForce==="DAY"&&!o.parentOrderId){let l=r.utcDayKey(t.date);if(o.dayKey==null)o.dayKey=l;else if(o.dayKey!==l){o.status="expired",o.updatedAt=n;continue}}this.ratchetTrailing(o,t);let s=this.resolveFill(o,t);s!=null&&this.fillOrder(o,s,n,a)}for(let o of d)o.status==="working"&&(o.parentOrderId||(o.timeInForce==="IOC"||o.timeInForce==="FOK")&&(o.status="cancelled",o.updatedAt=n));return a}tickDelta(e){return(e.bracket?.trailingStopDeltaTicks??0)*this.tickSizeProvider(e.symbol)}ratchetTrailing(e,t){if(e.type!=="trailing_stop")return;let i=this.tickDelta(e);if(!(i<=0||e.stopPrice==null))if(e.side==="sell"){let n=Math.max(this.trailingPeak.get(e.id)??Number.NEGATIVE_INFINITY,t.high);this.trailingPeak.set(e.id,n),e.stopPrice=Math.max(e.stopPrice,n-i)}else{let n=Math.min(this.trailingPeak.get(e.id)??Number.POSITIVE_INFINITY,t.low);this.trailingPeak.set(e.id,n),e.stopPrice=Math.min(e.stopPrice,n+i)}}resolveFill(e,t){switch(e.type){case"market":case"mp":case"mtl":case"ato":return t.open;case"atc":return t.close;case"plo":case"limit":return e.price==null?null:e.side==="buy"?t.low<=e.price?e.price:null:t.high>=e.price?e.price:null;case"stop":case"trailing_stop":return e.stopPrice==null?null:e.side==="buy"?t.high<e.stopPrice?null:t.open>e.stopPrice?t.open:e.stopPrice:t.low>e.stopPrice?null:t.open<e.stopPrice?t.open:e.stopPrice;default:return null}}fillOrder(e,t,i,n){if(e.status="filled",e.filledQuantity=e.quantity,e.updatedAt=i,n.push({orderId:e.id,symbol:e.symbol,side:e.side,fillPrice:t,filledQuantity:e.quantity,timestamp:i}),!e.parentOrderId&&e.bracket&&this.spawnBracketChildren(e,t,i),e.parentOrderId)for(let a of this.orders.values())a.parentOrderId===e.parentOrderId&&a.id!==e.id&&a.status==="working"&&(a.status="cancelled",a.updatedAt=i)}spawnBracketChildren(e,t,i){let n=e.bracket;if(!n)return;let a=e.side==="buy"?"sell":"buy",d=e.side==="buy"?1:-1;if(n.takeProfitPrice!=null&&this.addChild(e,{type:"limit",side:a,price:n.takeProfitPrice},i),n.stopLossPrice!=null)this.addChild(e,{type:"stop",side:a,stopPrice:n.stopLossPrice},i);else if(n.trailingStopDeltaTicks!=null&&n.trailingStopDeltaTicks>0){let o=this.tickSizeProvider(e.symbol),s=this.addChild(e,{type:"trailing_stop",side:a,stopPrice:t-d*n.trailingStopDeltaTicks*o},i);this.trailingPeak.set(s.id,t)}}addChild(e,t,i){let n={id:`ord_${++this.seq}`,clientOrderId:`${e.clientOrderId}-c${this.seq}`,symbol:e.symbol,side:t.side,type:t.type,status:"working",quantity:e.quantity,filledQuantity:0,price:t.price,stopPrice:t.stopPrice,bracket:e.bracket,timeInForce:"GTC",parentOrderId:e.id,createdAt:i,updatedAt:i};return this.orders.set(n.id,n),n}};function fe(r){return r==="long"?1:-1}var we=class{hedgingMode;multiplier;costBasisMethod;positions=new Map;lots=new Map;seq=0;lotSeq=0;constructor(e={}){this.hedgingMode=e.hedgingMode??!1,this.multiplier=e.contractMultiplier??1,this.costBasisMethod=e.costBasisMethod??"average"}setCostBasisMethod(e){this.costBasisMethod=e}clear(){this.positions.clear(),this.lots.clear(),this.seq=0,this.lotSeq=0}matchCloseLots(e,t,i){let n=this.lots.get(e.id);if(!n||n.length===0)return(i-e.entryPrice)*fe(e.side)*t*this.multiplier;let a=t,d=0;for(;a>0&&n.length>0;){let s=n[0],l=Math.min(a,s.quantity);d+=(i-s.price)*fe(e.side)*l*this.multiplier,s.quantity-=l,a-=l,s.quantity<=0&&n.shift()}let o=n.reduce((s,l)=>s+l.quantity,0);return o>0&&(e.entryPrice=n.reduce((s,l)=>s+l.quantity*l.price,0)/o),d}trackLot(e,t,i,n){let a=this.lots.get(e.id)??[];a.push({lotId:`lot_${++this.lotSeq}`,quantity:t,price:i,timestamp:n}),this.lots.set(e.id,a)}restoreState(e){this.clear();for(let t of e){this.positions.set(t.id,{...t});let i=Number(/^pos_(\d+)$/.exec(t.id)?.[1]);Number.isInteger(i)&&i>=this.seq&&(this.seq=i+1)}}listPositions(){return[...this.positions.values()]}getPositionById(e){return this.positions.get(e)}getPosition(e){return this.listPositions().find(t=>t.symbol===e)}openPosition(e){if(!Number.isFinite(e.quantity)||e.quantity<=0)throw new Error("Position quantity must be positive");if(!Number.isFinite(e.price)||e.price<=0)throw new Error("Position price must be positive");let t=this.listPositions().find(i=>i.symbol===e.symbol&&i.side===e.side);if(t)return t.entryPrice=(t.quantity*t.entryPrice+e.quantity*e.price)/(t.quantity+e.quantity),t.quantity+=e.quantity,t.availableQuantity+=e.settlementDate==null?e.quantity:0,t.updatedAt=e.timestamp,this.costBasisMethod==="fifo"&&this.lots.has(t.id)&&this.trackLot(t,e.quantity,e.price,e.timestamp),t;if(!this.hedgingMode){let i=this.listPositions().find(n=>n.symbol===e.symbol);if(i)return this.offsetOpposite(i,e)}return this.createPosition(e)}offsetOpposite(e,t){let i=fe(e.side),n=this.costBasisMethod==="fifo"&&this.lots.has(e.id);if(t.quantity<e.quantity){let l=n?this.matchCloseLots(e,t.quantity,t.price):(t.price-e.entryPrice)*i*t.quantity*this.multiplier;return e.quantity-=t.quantity,e.availableQuantity=Math.max(0,e.availableQuantity-t.quantity),e.realizedPnl+=l,e.updatedAt=t.timestamp,e}let a=n?this.matchCloseLots(e,e.quantity,t.price):(t.price-e.entryPrice)*i*e.quantity*this.multiplier;this.positions.delete(e.id),this.lots.delete(e.id);let d=t.quantity-e.quantity,o=e.realizedPnl+a;if(d===0)return{...e,quantity:0,availableQuantity:0,realizedPnl:o};let s=this.createPosition({symbol:t.symbol,side:t.side,quantity:d,price:t.price,timestamp:t.timestamp});return s.realizedPnl=o,s}createPosition(e){let t={id:`pos_${++this.seq}`,symbol:e.symbol,side:e.side,quantity:e.quantity,availableQuantity:e.settlementDate==null?e.quantity:0,entryPrice:e.price,currentPrice:e.price,unrealizedPnl:0,realizedPnl:0,entryFees:e.entryFees??0,settlementDate:e.settlementDate,createdAt:e.timestamp,updatedAt:e.timestamp};return this.positions.set(t.id,t),this.costBasisMethod==="fifo"&&this.trackLot(t,e.quantity,e.price,e.timestamp),t}closePosition(e,t,i,n,a,d){let o=this.positions.get(e);if(!o)throw new Error(`Position not found: ${e}`);let l=d?.enforceAvailable??!0?o.availableQuantity:o.quantity;if(!Number.isFinite(t)||t<=0||t>l)throw new Error("Close quantity exceeds available quantity");let u=this.costBasisMethod==="fifo"&&this.lots.has(o.id)?this.matchCloseLots(o,t,i):(i-o.entryPrice)*fe(o.side)*t*this.multiplier,b=o.quantity;o.quantity-=t,o.availableQuantity=Math.max(0,o.availableQuantity-t),o.realizedPnl+=u,o.updatedAt=n;let T=o.entryFees??0,D=b>0?T*t/b:0,O=T-D;return o.quantity===0?(this.positions.delete(e),this.lots.delete(e),{closedQuantity:t,realizedPnl:u,entryFees:D,remaining:null}):(o.entryFees=O,{closedQuantity:t,realizedPnl:u,entryFees:D,remaining:o})}updateMarkPrice(e,t,i){for(let n of this.positions.values())n.symbol===e&&(n.currentPrice=t,n.unrealizedPnl=(t-n.entryPrice)*fe(n.side)*n.quantity*this.multiplier,n.updatedAt=i)}applySettlement(e){for(let t of this.positions.values())t.settlementDate!=null&&e>=t.settlementDate&&(t.availableQuantity=t.quantity,t.updatedAt=e)}};function ar(r,e,t){return t==="VND"?Math.round(r)-Math.round(e)>0:r-e>1e-6}function Se(r,e){return e==="VND"?Math.round(r):r}var ae=class{calculateOrderMargin(e,t,i){if(!Number.isFinite(i)||i<=0)throw new Error("Margin price must be positive");if(t.profile==="VN_SPOT")return{vsdMargin:0,totalRequiredMargin:Se(e.quantity*i,t.baseCurrency)};let n=t.contractMultiplier??1,a=t.initialMarginRate??1/t.maxLeverage,d=t.brokerBufferMultiplier??1,o=e.quantity*i*n*a;return{vsdMargin:Se(o,t.baseCurrency),totalRequiredMargin:Se(o*d,t.baseCurrency)}}validateOrderRisk(e,t,i,n,a){if(e.type==="stop_limit")return{valid:!1,rejectCode:"UNSUPPORTED_ORDER_TYPE",reason:"Phase B",availableBuyingPower:t.freeMargin};if(!["GTC","DAY","IOC","FOK"].includes(e.timeInForce??"GTC"))return{valid:!1,rejectCode:"UNSUPPORTED_TIF",reason:"TIF kh\xF4ng h\u1ED7 tr\u1EE3",availableBuyingPower:t.freeMargin};if((e.type==="ato"||e.type==="atc"||e.type==="mp"||e.type==="mtl"||e.type==="plo")&&i.profile!=="VN_SPOT"&&i.profile!=="VN_DERIVATIVES")return{valid:!1,rejectCode:"UNSUPPORTED_ORDER_TYPE",reason:"L\u1EC7nh VN ch\u1EC9 cho HOSE/HNX/UPCOM/ph\xE1i sinh",availableBuyingPower:t.freeMargin};if(e.side==="sell"&&!e.isClosingPosition&&!i.allowShortSelling)return{valid:!1,rejectCode:"SHORT_NOT_ALLOWED",reason:"Spot kh\xF4ng b\xE1n kh\u1ED1ng",availableBuyingPower:t.freeMargin};let d=e.price??e.stopPrice??n;if(d==null||!Number.isFinite(d)||d<=0)return{valid:!1,rejectCode:"INVALID_PRICE",reason:"Thi\u1EBFu gi\xE1 \u0111\u1ECBnh gi\xE1",availableBuyingPower:t.freeMargin};let o=this.additionalMargin(e,d,i,a,t);return ar(o,t.freeMargin,t.currency)?{valid:!1,rejectCode:"INSUFFICIENT_BUYING_POWER",reason:"S\u1EE9c mua kh\xF4ng \u0111\u1EE7",requiredMargin:o,availableBuyingPower:t.freeMargin}:{valid:!0,requiredMargin:o,availableBuyingPower:t.freeMargin}}additionalMargin(e,t,i,n,a){if(e.isClosingPosition)return 0;if(i.profile==="VN_SPOT")return e.side==="buy"?Se(e.quantity*t,a.currency):0;let d=l=>this.calculateOrderMargin({quantity:l},i,t).totalRequiredMargin;if(!n||n.quantity===0||n.side==="long"==(e.side==="buy"))return d(e.quantity);let s=e.quantity-n.quantity;return s>0?d(s):0}recalculateAccount(e,t,i,n){let a=0,d=0,o=i.contractMultiplier??1;for(let g of t){let u=n[g.symbol]??g.currentPrice,b=g.side==="long"?1:-1;a+=(u-g.entryPrice)*b*g.quantity*o,i.profile!=="VN_SPOT"&&(d+=this.calculateOrderMargin(g,i,g.entryPrice).totalRequiredMargin)}let s=e.balance+a,l=s-d;return{...e,equity:s,marginUsed:d,freeMargin:l,buyingPower:i.profile==="GLOBAL_MARGIN"?l*i.maxLeverage:l}}evaluateAccountRisk(e){if(!(e.marginUsed>0))return{status:"safe",marginLevelPercent:Number.POSITIVE_INFINITY};let t=e.equity/e.marginUsed*100;return t<=50?{status:"liquidation",marginLevelPercent:t}:t<80?{status:"call_margin",marginLevelPercent:t}:t<100?{status:"warning",marginLevelPercent:t}:{status:"safe",marginLevelPercent:t}}calculateLiquidationPrice(e,t,i){if(!(t.marginUsed>0))return Number.POSITIVE_INFINITY;let n=i.contractMultiplier??1,a=e.side==="long"?1:-1;return e.entryPrice+(.5*t.marginUsed-t.balance)/(a*e.quantity*n)}};function or(r){return r==="long"?1:-1}function be(r,e){return e==="VND"?Math.round(r):r}var Ce=class{slippageTicks;brokerFeeRate;commissionPerContract;taxRate;constructor(e={}){this.slippageTicks=e.slippageTicks??0,this.brokerFeeRate=e.brokerFeeRate??.001,this.commissionPerContract=e.commissionPerContract??3e3,this.taxRate=e.taxRate??.001}updateOptions(e){return e.slippageTicks!==void 0&&(this.slippageTicks=e.slippageTicks),e.brokerFeeRate!==void 0&&(this.brokerFeeRate=e.brokerFeeRate),e.commissionPerContract!==void 0&&(this.commissionPerContract=e.commissionPerContract),e.taxRate!==void 0&&(this.taxRate=e.taxRate),{slippageTicks:this.slippageTicks,brokerFeeRate:this.brokerFeeRate,commissionPerContract:this.commissionPerContract,taxRate:this.taxRate}}executeFill(e,t){let{order:i,basePrice:n,quantity:a,timestamp:d,positionBasis:o,exitReason:s,ambiguousIntrabarFill:l,tieBreakReason:g}=e,u=this.applySlippage(n,i.side,t),b=this.calculateCommission(u,a,t),T=this.calculateTax(u,a,t,i.side),D=0;if(o){let O=t.contractMultiplier??1;D=(u-o.entryPrice)*or(o.side)*a*O-b-T}return{orderId:i.id,symbol:i.symbol,side:i.side,fillPrice:u,fillQuantity:a,commission:b,tax:T,pnl:D,exitReason:s,timestamp:d,ambiguousIntrabarFill:l,tieBreakReason:g}}applySlippage(e,t,i){if(this.slippageTicks===0)return e;let n=i.getTickSize(e),a=this.slippageTicks*n,d=t==="buy"?e+a:e-a;return Number(d.toFixed(4))}calculateCommission(e,t,i){return i.profile==="VN_DERIVATIVES"?be(t*this.commissionPerContract,i.baseCurrency):be(e*t*this.brokerFeeRate,i.baseCurrency)}calculateTax(e,t,i,n){if(i.profile==="VN_SPOT")return n!=="sell"?0:be(e*t*this.taxRate,i.baseCurrency);if(i.profile==="VN_DERIVATIVES"){let a=i.contractMultiplier??1e5,d=i.initialMarginRate??.175,o=e*a*t*(d/2)*this.taxRate;return be(o,i.baseCurrency)}return 0}checkIntrabarAmbiguity(e,t,i,n){return n==="long"?i.low<=t&&i.high>=e:i.high>=t&&i.low<=e}estimateOrderCost(e,t,i){let n=i.contractMultiplier??1,a=be(t*e.quantity*n,i.baseCurrency),d=this.calculateCommission(t,e.quantity,i),o=this.calculateTax(t,e.quantity,i,e.side),s=e.side==="buy"?a+d+o:a-d-o;return{estimatedCost:a,commission:d,estimatedTax:o,totalOutflow:s}}};var Oe=class{static holidaysVN=new Set(["2024-01-01","2024-02-08","2024-02-09","2024-02-12","2024-02-13","2024-02-14","2024-04-18","2024-04-30","2024-05-01","2024-09-02","2025-01-01","2025-01-27","2025-01-28","2025-01-29","2025-01-30","2025-01-31","2025-04-07","2025-04-30","2025-05-01","2025-09-01","2025-09-02","2026-01-01","2026-02-16","2026-02-17","2026-02-18","2026-02-19","2026-02-20","2026-04-26","2026-04-30","2026-05-01","2026-09-02","2026-09-03","2027-01-01"]);static configure(e){this.holidaysVN=new Set(e)}static isTradingDay(e){let t=e.getDay();if(t===0||t===6)return!1;let i=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`;return!this.holidaysVN.has(i)}static calculateSettlementTimestamp(e,t=2){if(t<=0)return e;let i=new Date(e),n=0;for(;n<t;)i.setDate(i.getDate()+1),this.isTradingDay(i)&&(n+=1);return i.setHours(13,0,0,0),i.getTime()}};function oe(r,e){return e==="VND"?Math.round(r):r}var Re=class{constructor(e,t,i,n){this.oms=e;this.pms=t;this.sim=i;this.rules=n}oms;pms;sim;rules;mktSeq=0;updateRules(e){this.rules=e}settle(e,t){let{symbol:i,side:n,quantity:a,price:d,timestamp:o}=t,l=(t.orderId?this.oms.getOrder(t.orderId):void 0)??{id:`mkt_${++this.mktSeq}`,clientOrderId:`mkt-cli-${this.mktSeq}`,symbol:i,side:n,type:"market",status:"filled",quantity:a,filledQuantity:a,timeInForce:"GTC",createdAt:o,updatedAt:o},g=this.pms.getPosition(i),u=g&&g.side==="long"==(n==="sell")?g:void 0,b=this.sim.executeFill({order:l,basePrice:d,quantity:a,timestamp:o,positionBasis:u?{entryPrice:u.entryPrice,side:u.side}:void 0,exitReason:t.exitReason},this.rules);if(this.flagAmbiguity(b,l,t.bar),u){let T=Math.min(a,u.quantity),D=this.pms.closePosition(u.id,T,b.fillPrice,o,t.exitReason,{enforceAvailable:!1});this.rules.profile!=="VN_SPOT"&&(e.account.balance=oe(e.account.balance+D.realizedPnl,e.account.currency)),e.analytics.recordClosedTrade({timestamp:o,realizedPnl:D.realizedPnl,commission:oe(D.entryFees+b.commission*T/a,e.account.currency),tax:oe(b.tax*T/a,e.account.currency),symbol:i,side:u.side,quantity:T,entryPrice:u.entryPrice,exitPrice:b.fillPrice,exitReason:t.exitReason});let O=a-T;O>0&&this.openFresh(i,n,O,b.fillPrice,o,b.commission,b.tax)}else this.openFresh(i,n,a,b.fillPrice,o,b.commission,b.tax);return this.applyCashflow(e,n,a,b),e.history.push(b),b}openFresh(e,t,i,n,a,d,o){this.pms.openPosition({symbol:e,side:t==="buy"?"long":"short",quantity:i,price:n,timestamp:a,entryFees:d+o,settlementDate:this.rules.settlementDays>0?Oe.calculateSettlementTimestamp(a,this.rules.settlementDays):void 0})}applyCashflow(e,t,i,n){let{currency:a}=e.account;this.rules.profile==="VN_SPOT"?t==="buy"?e.account.balance=oe(e.account.balance-i*n.fillPrice-n.commission,a):e.account.balance=oe(e.account.balance+i*n.fillPrice-n.commission-n.tax,a):e.account.balance=oe(e.account.balance-n.commission-n.tax,a)}flagAmbiguity(e,t,i){if(!t.parentOrderId||!i)return;let n=this.oms.listOrders().filter(s=>s.parentOrderId===t.parentOrderId),a=n.find(s=>s.type==="limit"),d=n.find(s=>s.type==="stop"||s.type==="trailing_stop");if(a?.price==null||d?.stopPrice==null)return;let o=e.side==="buy"?"short":"long";this.sim.checkIntrabarAmbiguity(a.price,d.stopPrice,i,o)&&(e.ambiguousIntrabarFill=!0,e.tieBreakReason="CONSERVATIVE_SL_PRIORITY")}};var Ee=class{listeners=new Map;on(e,t){let i=this.listeners.get(e);i||(i=new Set,this.listeners.set(e,i));let n=t;return i.add(n),()=>{i?.delete(n)}}emit(e,t){this.listeners.get(e)?.forEach(i=>i(t))}};var re=class{constructor(e,t="vnsc_paper_trading_v1"){this.adapter=e;this.storageKey=t}adapter;storageKey;async saveState(e){await this.adapter.setItem(this.storageKey,JSON.stringify({...e,version:2}))}async loadState(){try{let e=await this.adapter.getItem(this.storageKey);if(e==null)return null;let t=JSON.parse(e);if(t==null)return null;let i=t.version;return i===1?{...t,version:2}:i!==2?null:t}catch{return null}}async clearState(){await this.adapter.removeItem(this.storageKey)}};var Ne=class{trades=[];curve=[];recordClosedTrade(e){this.trades.push({...e})}recordEquityPoint(e,t){this.curve.push({timestamp:e,equity:t})}getClosedTrades(){return this.trades.map(e=>({...e}))}getEquityCurve(){return this.curve.map(e=>({...e}))}restoreClosedTrades(e){this.trades=e.map(t=>({...t}))}restoreEquityCurve(e){this.curve=e.map(t=>({...t}))}clear(){this.trades=[],this.curve=[]}getAnalytics(){let e=0,t=0,i=0,n=0;for(let g of this.trades){let u=g.realizedPnl-g.commission-g.tax;i+=u,g.realizedPnl>=0?(e+=g.realizedPnl,n+=1):t+=-g.realizedPnl}let a=this.trades.length,d=a-n,o=Number.NEGATIVE_INFINITY,s=0,l=0;for(let g of this.curve)if(g.equity>o&&(o=g.equity),o>0){let u=o-g.equity;u>s&&(s=u,l=u/o*100)}return{totalTrades:a,winningTrades:n,losingTrades:d,winRate:a===0?0:n/a,grossProfit:e,grossLoss:t,netProfit:i,profitFactor:a===0?0:t===0?e:e/t,maxDrawdown:s,maxDrawdownPercent:l,equityCurve:this.getEquityCurve(),closedTrades:this.getClosedTrades(),sharpeRatio:sr(this.curve)}}};function sr(r,e=252){if(r.length<3)return 0;let t=[];for(let d=1;d<r.length;d++){let o=r[d-1].equity,s=r[d].equity;o!==0&&t.push((s-o)/o)}if(t.length<2)return 0;let i=t.reduce((d,o)=>d+o,0)/t.length,n=t.reduce((d,o)=>d+(o-i)**2,0)/(t.length-1),a=Math.sqrt(n);return a>0?i/a*Math.sqrt(e):0}var ye=class r{rules;fillMarketOnPlace;port;oms;pms;risk=new ae;sim;settlement;analytics=new Ne;bus=new Ee;storage;account;history=[];lastClose=new Map;rejSeq=0;constructor(e){this.rules=e.rules,this.fillMarketOnPlace=e.fillMarketOnPlace??!1,this.port=e.marketDataPort,this.oms=new ke({tickSizeProvider:i=>this.rules.getTickSize(this.lastClose.get(i)??0)}),this.pms=new we({hedgingMode:e.hedgingMode,contractMultiplier:e.rules.contractMultiplier??1}),this.sim=new Ce(e.simulatorOptions),this.settlement=new Re(this.oms,this.pms,this.sim,e.rules),this.storage=e.storageAdapter?new re(e.storageAdapter,e.storageNamespace):null;let t=e.initialBalance??(e.rules.baseCurrency==="USD"?te:me);this.account=r.freshAccount(e.rules,t)}static freshAccount(e,t){return{accountId:`paper-${e.profile}`,balance:t,equity:t,marginUsed:0,freeMargin:t,buyingPower:t,currency:e.baseCurrency,pnl:0,pnlPercent:0}}getAccount(){return{...this.account}}getPositions(){return this.pms.listPositions()}getPositionById(e){return this.pms.getPositionById(e)}getOrders(){return this.oms.listOrders()}getHistory(){return[...this.history]}getAnalytics(){return this.analytics.getAnalytics()}on(e,t){return this.bus.on(e,t)}markPrice(e){return this.port?.getLatestQuote(e)?.lastPrice??this.lastClose.get(e)}books(){return{account:this.account,history:this.history,analytics:this.analytics}}placeOrder(e,t){if(t?.skipValidation){let s=this.oms.placeOrder(e);return this.afterMutation(),s}let i=e;if(e.side==="sell"&&this.rules.profile==="VN_SPOT"){let s=this.pms.getPosition(e.symbol),l=e.quantity<=(s?.availableQuantity??0);if(!l&&!this.rules.allowShortSelling)return this.rejected(e,"INVALID_QUANTITY","Kh\xF4ng \u0111\u1EE7 s\u1ED1 l\u01B0\u1EE3ng kh\u1EA3 d\u1EE5ng (T+2)");i=l?{...e,isClosingPosition:!0}:e}let n=this.rules.validateOrder(i);if(!n.valid)return this.rejected(e,n.code??"INVALID_QUANTITY",n.reason);let a=e.price??e.stopPrice??this.markPrice(e.symbol),d=this.risk.validateOrderRisk(i,this.account,this.rules,a,this.pms.getPosition(e.symbol));if(!d.valid)return this.rejected(e,d.rejectCode??"INSUFFICIENT_BUYING_POWER",d.reason);let o=this.oms.placeOrder(e);if(this.afterMutation(),this.fillMarketOnPlace&&o.status==="working"&&ut(o.type)){let s=this.markPrice(e.symbol);if(s!=null&&Number.isFinite(s)){let l=Date.now();return this.onBar(e.symbol,{open:s,high:s,low:s,close:s,date:l},l),this.oms.getOrder(o.id)??o}}if(o.status==="working"&&(o.timeInForce==="IOC"||o.timeInForce==="FOK")){let s=this.markPrice(e.symbol);if(s!=null&&Number.isFinite(s)){let l=Date.now();return this.onBar(e.symbol,{open:s,high:s,low:s,close:s,date:l},l),this.oms.getOrder(o.id)??o}}return o}cancelOrder(e){let t=this.oms.cancelOrder(e);return t&&this.afterMutation(),t}modifyOrder(e,t){if(t.quantity!=null)throw new Error("Quantity change requires cancel + replace (order id identity)");let i=this.oms.modifyOrder(e,t);return this.afterMutation(),i}closePosition(e,t){let i=this.pms.getPositionById(e);if(!i)throw new Error(`Position not found: ${e}`);let n=t?.quantity??i.availableQuantity;if(!(n>0))throw new Error("Nothing available to close (T+2 settlement?)");let a=this.markPrice(i.symbol);if(a==null)throw new Error(`No market price for ${i.symbol}`);return this.settlement.settle(this.books(),{symbol:i.symbol,side:i.side==="long"?"sell":"buy",quantity:n,price:a,timestamp:Date.now(),exitReason:"manual"}),this.afterMutation(),!0}closeAllPositions(e="manual",t){let i=0;for(let n of[...this.pms.listPositions()])if(!(t!==void 0&&n.symbol!==t))try{this.closePosition(n.id,{reason:e})&&(i+=1)}catch{continue}return i}rejected(e,t,i){let n=Date.now();return this.rejSeq+=1,{id:`rej_${this.rejSeq}`,clientOrderId:`rej-cli-${this.rejSeq}`,symbol:e.symbol,side:e.side,type:e.type,status:"rejected",quantity:e.quantity,filledQuantity:0,price:e.price,stopPrice:e.stopPrice,timeInForce:e.timeInForce??"GTC",rejectCode:t,createdAt:n,updatedAt:n}}onBar(e,t,i=Date.now()){this.lastClose.set(e,t.close);let n=this.oms.processBar(e,t,i),a=[];for(let d of n)a.push(this.settlement.settle(this.books(),{symbol:d.symbol,side:d.side,quantity:d.filledQuantity,price:d.fillPrice,timestamp:d.timestamp,orderId:d.orderId,exitReason:this.exitReasonOf(d.orderId),bar:{high:t.high,low:t.low}}));this.pms.updateMarkPrice(e,t.close,i),this.pms.applySettlement(i),this.syncAccount(),this.analytics.recordEquityPoint(i,this.account.equity),this.persist(),this.emitAll();for(let d of a)this.bus.emit("fill",d)}exitReasonOf(e){let t=this.oms.getOrder(e);if(t?.parentOrderId)return t.type==="limit"?"tp":t.type==="stop"||t.type==="trailing_stop"?"sl":"manual"}updateMarkPrice(e,t){this.pms.updateMarkPrice(e,t,Date.now()),this.syncAccount(),this.emitAll()}resetAccount(e){this.hydrated=!0,this.oms.clear(),this.pms.clear(),this.history=[],this.analytics.clear(),this.account=r.freshAccount(this.rules,e??(this.rules.baseCurrency==="USD"?te:me)),this.analytics.recordEquityPoint(Date.now(),this.account.equity),this.storage&&this.storage.clearState().then(()=>this.persist()).catch(()=>{}),this.emitAll()}applyRuntimeConfig(e){e.rules&&(this.rules=e.rules,this.settlement.updateRules(e.rules));let t=this.sim.updateOptions(e.simulatorOptions??{});return{appliedAt:Date.now(),profile:this.rules.profile,simulator:t}}async flush(){this.hydrated=!0,await this.persist()}async hydrate(){if(!this.storage)return!1;let e=await this.storage.loadState();return e?(this.oms.restoreState(e.orders,e.trailingPeaks),this.pms.restoreState(e.positions),this.account={...e.account},this.history=e.history.map(t=>({...t})),this.analytics.restoreClosedTrades(e.closedTrades),this.analytics.restoreEquityCurve(e.equityCurve),this.hydrated=!0,this.syncAccount(),!0):(this.hydrated=!0,!1)}hydrated=!1;syncAccount(){let e={};for(let[t,i]of this.lastClose)e[t]=i;this.account=this.risk.recalculateAccount(this.account,this.pms.listPositions(),this.rules,e)}persist(){return!this.storage||!this.hydrated?Promise.resolve():this.storage.saveState({version:1,savedAt:Date.now(),account:{...this.account},orders:this.oms.listOrders().map(e=>({...e})),positions:this.pms.listPositions().map(e=>({...e})),trailingPeaks:this.oms.getTrailingPeaks(),history:this.history.map(e=>({...e})),closedTrades:this.analytics.getClosedTrades(),equityCurve:this.analytics.getEquityCurve()}).catch(()=>{})}afterMutation(){this.syncAccount(),this.persist(),this.emitAll()}emitAll(){this.bus.emit("orderChange",this.oms.listOrders()),this.bus.emit("positionChange",this.pms.listPositions()),this.bus.emit("accountChange",this.getAccount())}};var lr=new ae;function Ue(r,e,t,i){let n=0;for(let a of r){if(a.status!=="working"&&a.status!=="pending")continue;let d=a.price??a.stopPrice??i[a.symbol]??0;if(!(d>0)||!(a.quantity>0))continue;let o=e.find(g=>g.symbol===a.symbol),s=o!=null&&o.side==="long"==(a.side==="sell")?Math.min(o.quantity,a.quantity):0,l=a.quantity-s;l<=0||(n+=lr.calculateOrderMargin({quantity:l},t,d).totalRequiredMargin)}return n}function dr(r){return r instanceof Date?r.getTime():r}function pt(r,e){return!Number.isFinite(e)||e<=0?r:Math.round(r/e)*e}function cr(r,e,t,i={}){let n=i.spreadBps??2;if(!Number.isFinite(e)||e<=0)return{symbol:r,lastPrice:e,bidPrice:e,askPrice:e,spread:0,spreadBps:0,isSyntheticSpread:!0,timestamp:t};let a=i.tickSizeProvider?.(r,e),d=a!=null&&a>0?a:e*n/1e4,o=d/2,s=a!=null&&a>0?pt(e-o,a):e-o,l=a!=null&&a>0?pt(e+o,a):e+o;return{symbol:r,lastPrice:e,bidPrice:s,askPrice:l,spread:d,spreadBps:d/e*1e4,isSyntheticSpread:!0,timestamp:t}}var Ae=class{config;latest=new Map;subscribers=new Map;constructor(e={}){this.config=e}getLatestQuote(e){return this.latest.get(e)}feedBar(e,t){let i=cr(e,t.close,dr(t.date),this.config);this.latest.set(e,i),this.subscribers.get(e)?.forEach(n=>n(i))}subscribeQuote(e,t){let i=this.subscribers.get(e);return i||(i=new Set,this.subscribers.set(e,i)),i.add(t),()=>{i?.delete(t)}}};import{createMemoryStorage as ur}from"@vninvestcharts/engine-react";var Ie=class{store=ur();async getItem(e){return this.store.getItem(e)}async setItem(e,t){this.store.setItem(e,t)}async removeItem(e){this.store.removeItem(e)}async clear(){this.store.clear()}async getAllKeys(){let e=[];for(let t=0;t<this.store.length;t+=1){let i=this.store.key(t);i!=null&&e.push(i)}return e}async getSize(){let e=0;for(let t of await this.getAllKeys())e+=(this.store.getItem(t)??"").length;return e}};import{hasCapability as Si}from"@vninvestcharts/engine-core";function gt(r){return r.localOverride!==void 0?r.localOverride:r.defaultEnabled!==void 0?r.defaultEnabled:r.chartId!==void 0&&r.perChart?.[r.chartId]!==void 0?r.perChart[r.chartId]:r.master!==void 0?r.master:r.legacyEnabled!==void 0?r.legacyEnabled:!0}function mt(){try{if(typeof window>"u"||!window.localStorage)return;let r=window.localStorage.getItem("vnsc.paper.enabled");if(r==="0")return!1;if(r==="1")return!0}catch{}}import{createContext as pr,useCallback as ze,useContext as gr,useEffect as mr,useMemo as fr,useState as ft}from"react";import{jsx as br}from"react/jsx-runtime";var yt=pr(null);function ht(){return gr(yt)}function vt(r){return`vnsc_paper_visibility_${r??"default"}`}function bt(r){try{if(typeof window>"u"||!window.localStorage)return{};let e=window.localStorage.getItem(vt(r));if(!e)return{};let t=JSON.parse(e);return{master:typeof t.master=="boolean"?t.master:void 0,perChart:t.perChart&&typeof t.perChart=="object"?t.perChart:void 0}}catch{return{}}}function Ri(r){let{workspaceId:e,charts:t}=r,[i,n]=ft(()=>bt(e).master??!0),[a,d]=ft(()=>bt(e).perChart??{});mr(()=>{try{typeof window<"u"&&window.localStorage&&window.localStorage.setItem(vt(e),JSON.stringify({master:i,perChart:a}))}catch{}},[e,i,a]);let o=ze(g=>n(g),[]),s=ze((g,u)=>{d(b=>b[g]===u?b:{...b,[g]:u})},[]),l=ze(g=>{d(u=>{if(!(g in u))return u;let b={...u};return delete b[g],b})},[]);return fr(()=>({master:i,perChart:a,charts:t,setMaster:o,setChart:s,clearChart:l}),[i,a,t,o,s,l])}function Ei(r){return br(yt.Provider,{value:r.value,children:r.children})}import{useSyncExternalStore as yr}from"react";var Qe=new Map,$e=new Map,He=new Map;function Pt(r){He.set(r,(He.get(r)??0)+1),$e.get(r)?.forEach(e=>{try{e()}catch{}})}function xt(r){Qe.set(r.chartId,r),Pt(r.chartId)}function Tt(r){Qe.delete(r)&&Pt(r)}function hr(r){if(r)return Qe.get(r)}function vr(r,e){if(!r)return()=>{};let t=$e.get(r);return t||(t=new Set,$e.set(r,t)),t.add(e),()=>{t.delete(e)}}function Mi(r){return yr(e=>vr(r,e),()=>He.get(r??"")??0,()=>0),hr(r)}import{jsx as Cr}from"react/jsx-runtime";var Ot=Pr(null);function Rt(){let r=xr(Ot);if(!r)throw new Error("useTradingContext must be used inside <TradingProvider>");return r}var St=200;function Tr(r){let e=r.date;return e instanceof Date?e.getTime():new Date(e).getTime()}var kr="vnsc.paper.enabled";function je(){return new Ae({tickSizeProvider:(r,e)=>ne(r).getTickSize(e)})}function Ct(r,e,t){return r??(e?`vnsc_paper_live_${t}_${e}`:`vnsc_paper_live_${t}`)}function wr(r,e,t,i){let n=je();return{broker:new ye({rules:r,marketDataPort:n,storageAdapter:t??new Ie,storageNamespace:i??"vnsc_paper_live",initialBalance:e,fillMarketOnPlace:!0}),port:n}}function Sr(r){let e=je();return{broker:new ye({rules:r,marketDataPort:e}),port:e}}function Ki({symbol:r,bars:e,rules:t,initialBalance:i,replayActive:n,replayPlaying:a,replayBar:d,liveStorageNamespace:o,storageAdapter:s,audioAdapter:l,externalBroker:g,externalPort:u,defaultEnabled:b,chartId:T,isActiveChart:D,children:O}){let L=D??!0,_=ht(),{t:E}=I(),[B,G]=le(void 0),U=gt({localOverride:B,defaultEnabled:b,chartId:T,perChart:_?.perChart,master:_?.master,legacyEnabled:mt()}),Q=Z(null),p=Z(null),S=Z(null),M=Z(null),j=Z([]),$=t??ne(r);if(g)Q.current?.broker!==g&&(Q.current={broker:g,port:u??je()},S.current=null),M.current=g;else if(M.current||!Q.current||S.current&&S.current!==$.profile){M.current=null;let h=Q.current!=null,m=i??($.baseCurrency==="USD"?te:void 0),x=Ct(o,T,$.profile);Q.current=wr($,m,s,x),h&&(j.current=[...j.current.slice(-(St-1)),{timestamp:Date.now(),message:`Switched market profile (${S.current} -> ${$.profile}): fresh paper book`}]),S.current=$.profile}p.current||(p.current=Sr($));let[_e,P]=le(0),ce=kt(h=>{if(_&&T)_.setChart(T,h);else{G(h);try{window.localStorage.setItem(kr,h?"1":"0")}catch{}}P(m=>m+1)},[_,T]),X=wt(()=>{let h=d?.date;return{active:!!n,playing:!!a,bar:d??null,timestamp:typeof h=="number"?h:h instanceof Date?h.getTime():Date.now()}},[n,a,d]),[Ye,xe]=le({open:!1,side:"buy"}),[Xe,Le]=le(null),[Je,Fe]=le(!1),[Ze,Wt]=le(!1),et=Z(!1),Yt=kt(h=>{et.current=h,Wt(h)},[]),tt=Z({symbol:"",timestamp:Number.NEGATIVE_INFINITY}),qe=Z(Number.NEGATIVE_INFINITY),J=X&&X.active&&X.playing?"replay":"live",rt=J==="replay"?p.current:Q.current,f=rt.broker,ue=rt.port,pe=h=>{j.current=[...j.current.slice(-(St-1)),{timestamp:Date.now(),message:h}]};se(()=>{let h=[f.on("fill",m=>{pe(`Fill ${m.side} ${m.fillQuantity} ${m.symbol} @ ${m.fillPrice}`);try{l?.playAlertSound(784,200,.4)}catch{}P(x=>x+1)}),f.on("orderChange",()=>P(m=>m+1)),f.on("positionChange",()=>P(m=>m+1)),f.on("accountChange",()=>P(m=>m+1))];return()=>{h.forEach(m=>m())}},[J,l]),se(()=>{g||(async()=>{if(T&&s){let h=Ct(o,T,$.profile),m=`vnsc_paper_live_${$.profile}`;if(h!==m)try{let x=new re(s,h);if(!await x.loadState()){let k=await new re(s,m).loadState();k&&await x.saveState(k)}}catch{}}try{await f.hydrate()}catch{}P(h=>h+1)})()},[]),se(()=>{let h=()=>{try{l?.resume?.()}catch{}};return window.addEventListener("pointerdown",h,{once:!0}),window.addEventListener("keydown",h,{once:!0}),()=>{window.removeEventListener("pointerdown",h),window.removeEventListener("keydown",h)}},[l]),se(()=>{if(J!=="live")return;let h=tt.current,m=e.map(k=>({bar:k,time:Tr(k)})).filter(k=>Number.isFinite(k.time)),x=h.symbol!==r?m.slice(-1):m.filter(k=>k.time>h.timestamp);for(let{bar:k,time:y}of x){let A={open:k.open,high:k.high,low:k.low,close:k.close,date:k.date};ue.feedBar(r,A),f.onBar(r,A,y)}x.length>0&&(tt.current={symbol:r,timestamp:x[x.length-1].time}),P(k=>k+1)},[J,r,e,f,ue]),se(()=>{if(J!=="replay"){p.current?.broker.resetAccount(),qe.current=Number.NEGATIVE_INFINITY,P(m=>m+1);return}let h=X?.bar;!h||X.timestamp<=qe.current||(qe.current=X.timestamp,ue.feedBar(r,h),f.onBar(r,h,X.timestamp),P(m=>m+1))},[J,X,r,f,ue]);let it=f.getAccount(),Xt=(h,m,x)=>{Le(null),xe({open:!0,side:h,price:m,quantity:x})};se(()=>{if(!T)return;let h=()=>{let m=f.getOrders(),x=f.getPositions(),k={};for(let y of x)k[y.symbol]=y.currentPrice;return{account:f.getAccount(),positions:x,orders:m.filter(y=>y.status==="working"),orderHistory:m,ordersMargin:Ue(m,x,$,k),analytics:f.getAnalytics(),log:j.current,tradingEnabled:U,onEnableTrading:()=>ce(!0)}};return xt({chartId:T,symbol:r,shared:M.current!=null,getSnapshot:h,closePosition:m=>{try{let x=f.closePosition(m);return P(k=>k+1),x}catch{return!1}},reversePosition:m=>{let x=f.getPositions().find(k=>k.id===m);if(x){try{f.closePosition(m),f.placeOrder({symbol:x.symbol,side:x.side==="long"?"sell":"buy",type:"market",quantity:x.quantity})}catch{}P(k=>k+1)}},cancelOrder:m=>{let x=f.cancelOrder(m);return P(k=>k+1),x},closeAllPositions:m=>{let x=f.closeAllPositions(m);return P(k=>k+1),x},getOrders:()=>f.getOrders(),placeOrder:m=>{let x=f.placeOrder(m);return P(k=>k+1),x},resetAccount:m=>{f.resetAccount(m),P(x=>x+1)},applyRuntimeConfig:m=>{let x=f.applyRuntimeConfig(m);return P(k=>k+1),x},subscribe:m=>{let x=[f.on("orderChange",m),f.on("positionChange",m),f.on("accountChange",m),f.on("fill",m)];return()=>x.forEach(k=>k())}}),()=>Tt(T)},[T,r,f,$,U,ce]);let Jt=wt(()=>{let h=f.getOrders(),m=f.getPositions(),x={};for(let y of m)x[y.symbol]=y.currentPrice;let k={account:f.getAccount(),positions:m,orders:h.filter(y=>y.status==="working"),orderHistory:h,ordersMargin:Ue(h,m,$,x),analytics:f.getAnalytics(),log:j.current,onClosePosition:y=>{try{f.closePosition(y)}catch(A){pe(`Close failed: ${A instanceof Error?A.message:"unknown"}`)}P(A=>A+1)},onReversePosition:y=>{let A=f.getPositions().find(W=>W.id===y);if(!A)return;let{symbol:ge,side:Zt,quantity:er}=A;try{f.closePosition(y);let W=f.placeOrder({symbol:ge,side:Zt==="long"?"sell":"buy",type:"market",quantity:er});W.status==="rejected"&&pe(`Reverse rejected: ${W.rejectCode??"unknown"}`)}catch(W){pe(`Reverse failed: ${W instanceof Error?W.message:"unknown"}`)}P(W=>W+1)},onCancelOrder:y=>{f.cancelOrder(y),P(A=>A+1)},onCloseAllPositions:()=>{f.closeAllPositions("manual"),P(y=>y+1)},onCancelAllOrders:()=>{for(let y of f.getOrders())y.status==="working"&&f.cancelOrder(y.id);P(y=>y+1)},onResetAccount:y=>{f.resetAccount(y),P(A=>A+1)},tradingEnabled:U,onEnableTrading:()=>ce(!0)};return{mode:J,symbol:r,rules:$,broker:f,port:ue,tradingEnabled:U,setTradingEnabled:ce,isActiveChart:L,panelProps:k,ticket:Ye,openTicket:Xt,closeTicket:()=>xe(y=>({...y,open:!1})),editTarget:Xe,startEditOrder:y=>{let A=f.getOrders().find(ge=>ge.id===y);A&&(Le({orderId:y,price:A.price,stopPrice:A.stopPrice}),xe({open:!0,side:A.side}))},cancelEdit:()=>{Le(null),xe(y=>({...y,open:!1}))},closeRequested:Je,requestClose:()=>{if(et.current){try{f.closeAllPositions("manual",r)}catch{}P(y=>y+1);return}Fe(!0)},cancelCloseRequest:()=>Fe(!1),confirmCloseAll:()=>{try{f.closeAllPositions("manual",r)}catch{}Fe(!1),P(y=>y+1)},oneKeyClose:Ze,setOneKeyClose:Yt,placeOrder:y=>{let A=f.placeOrder(y);return A.status==="rejected"&&pe(E("widget.trading.orderRejected",{side:y.side,quantity:y.quantity,symbol:y.symbol,code:A.rejectCode??"unknown",defaultValue:"Order rejected: {side} {quantity} {symbol} ({code})"})),P(ge=>ge+1),A}}},[J,r,Ye,Xe,Je,Ze,it.equity,it.balance,_e,U,ce,L]);return Cr(Ot.Provider,{value:Jt,children:O})}import{useState as jr}from"react";import{useState as Ge}from"react";import{useState as Rr}from"react";var c={panel:"oc",titleBadgeRow:"ec",titleBadge:"ac",titleBadgeDot:"nc",titleBadgeId:"tc",panelHeader:"Ae",headerLeft:"ic",brandSection:"sc",statusDot:"cc",brandTitle:"dc",brandBadge:"pc",kpiGrid:"lc",kpiCard:"xc",kpiCardPrimary:"bc",kpiCardRow:"gc",kpiValueRow:"vc",kpiStack:"fc",kpiWide:"Fr",kpiWide3:"E",kpiPair:"Ne",kpiValue:"Rr",kpiSubLabel:"uc",kpiSubVal:"hc",kpiLabel:"mc",kpiValueLarge:"yc",kpiSub:"wc",kpiCur:"kc",pnlPillPositive:"zc",pnlPillNegative:"jc",pnlPillNeutral:"Sc",marginBadgeSafe:"Mc",marginBadgeWarning:"Ic",marginBadgeDanger:"Fc",headerActions:"Rc",btnAction:"Hr",btnReset:"G",btnIconOnly:"Hc",tabBar:"Yc",tab:"Yr",activeTab:"De",tabBadge:"Cc",btnClosePinned:"qe",tabBody:"Bc",emptyContainer:"Uc",emptyIcon:"Tc",emptyTitle:"Xc",emptyHint:"Ac",table:"l",kpis:"Nc",logList:"Dc",ctaContainer:"qc",ctaTitle:"Ec",ctaHint:"Gc",ctaButton:"Ee",capitalOverlay:"Jc",capitalBox:"Kc",capitalTitle:"Lc",capitalHint:"Oc",capitalPresets:"Pc",capitalPreset:"Ge",capitalField:"Je",capitalError:"Qc",capitalActions:"k"};import{jsx as Y,jsxs as Ke}from"react/jsx-runtime";function Er(r){return r==="USD"?[1e4,5e4,1e5,5e5]:[1e8,5e8,1e9,5e9]}function Nr(r,e){try{return new Intl.NumberFormat(e==="USD"?"en-US":"vi-VN",{style:"currency",currency:e==="USD"?"USD":"VND",maximumFractionDigits:0}).format(r)}catch{return String(r)}}function Et({open:r,currency:e,defaultAmount:t,onConfirm:i,onCancel:n}){let{t:a}=I(),[d,o]=Rr(null),s=d??String(t),l=Number(s.replace(/[^0-9]/g,"")),g=s!==""&&Number.isFinite(l)&&l>0&&l<=st;return r?Y("div",{className:c.capitalOverlay,"data-testid":"capital-dialog",role:"dialog","aria-modal":"true",children:Ke("div",{className:c.capitalBox,children:[Y("div",{className:c.capitalTitle,children:a("widget.trading.refillTitle",{defaultValue:"Deposit paper capital"})}),Y("div",{className:c.capitalHint,children:a("widget.trading.refillMessage",{defaultValue:"Reset the account back to the capital you enter."})}),Y("div",{className:c.capitalPresets,children:Er(e).map(u=>Y("button",{type:"button",className:c.capitalPreset,"data-testid":`capital-preset-${u}`,onClick:()=>o(String(u)),children:Nr(u,e)},u))}),Ke("label",{className:c.capitalField,children:[a("widget.trading.refillAmount",{defaultValue:"Capital"}),Y("input",{"data-testid":"capital-input",inputMode:"numeric",value:d??t.toLocaleString("en-US"),onChange:u=>o(u.target.value.replace(/[^0-9]/g,"")),onKeyDown:u=>{u.key==="Enter"&&g&&i(l),u.key==="Escape"&&n()}})]}),!g&&Y("div",{className:c.capitalError,"data-testid":"capital-error",children:a("widget.trading.refillInvalid",{defaultValue:"Enter an amount from 1 to 1,000,000,000,000"})}),Ke("div",{className:c.capitalActions,children:[Y("button",{type:"button","data-testid":"capital-cancel",onClick:n,children:a("widget.trading.cancel",{defaultValue:"Cancel"})}),Y("button",{type:"button","data-testid":"capital-confirm",disabled:!g,onClick:()=>{g&&(i(l),o(null))},children:a("widget.trading.confirm",{defaultValue:"Confirm"})})]})]})}):null}import{useEffect as Ir,useRef as At,useState as It}from"react";import{createPortal as Mr}from"react-dom";var ve={brokerFeeRate:.001,commissionPerContract:3e3,taxRate:.001,slippageTicks:0,costBasisMethod:"average",allowShortSelling:!1,settlementDays:2,maxLeverage:1,pnlDisplayMode:"gross",effectiveFrom:0};function he(r,e,t){return Number.isFinite(r)&&r>=e&&r<=t}function Nt(r){let e=[];return r.brokerFeeRate!==void 0&&!he(r.brokerFeeRate,0,.05)&&e.push({field:"brokerFeeRate",message:"Fee must be between 0% and 5%"}),r.commissionPerContract!==void 0&&!he(r.commissionPerContract,0,1e5)&&e.push({field:"commissionPerContract",message:"Commission must be between 0 and 100,000"}),r.taxRate!==void 0&&!he(r.taxRate,0,.05)&&e.push({field:"taxRate",message:"Tax must be between 0% and 5%"}),r.slippageTicks!==void 0&&(!Number.isInteger(r.slippageTicks)||!he(r.slippageTicks,0,20))&&e.push({field:"slippageTicks",message:"Slippage must be an integer 0\u201320"}),r.settlementDays!==void 0&&![0,1,2,3].includes(r.settlementDays)&&e.push({field:"settlementDays",message:"Settlement must be 0, 1, 2 or 3"}),r.maxLeverage!==void 0&&!he(r.maxLeverage,1,100)&&e.push({field:"maxLeverage",message:"Leverage must be between 1 and 100"}),r.costBasisMethod!==void 0&&r.costBasisMethod!=="average"&&r.costBasisMethod!=="fifo"&&e.push({field:"costBasisMethod",message:"Cost basis must be average or fifo"}),r.pnlDisplayMode!==void 0&&r.pnlDisplayMode!=="gross"&&r.pnlDisplayMode!=="net"&&e.push({field:"pnlDisplayMode",message:"PnL mode must be gross or net"}),e}function nn(r){return{...ve,...r??{}}}var w={backdrop:"Vc",modal:"Wc",head:"Zc",closeBtn:"Ke",body:"_c",tablist:"J",row:"Cr",hint:"rd",checkRow:"Le",error:"od",seg:"z",field:"K",foot:"ed",btn:"Oe",btnPrimary:"Br",footSpacer:"ad"};import{Fragment as Vr,jsx as v,jsxs as R}from"react/jsx-runtime";function Mt({open:r,initial:e,perChartOverride:t,onToggleOverride:i,onSave:n,onCancel:a,hideSettlement:d=!1,hideVnFees:o=!1}){let{t:s}=I(),[l,g]=It("fees"),[u,b]=It({}),T=At(null),D=At(null);if(Ir(()=>r?(D.current=document.activeElement,T.current?.querySelector("input, button:not([data-autofocus-skip])")?.focus(),()=>{D.current?.focus?.()}):void 0,[r]),!r)return null;let O={...e,...u},L=Nt(O),_=L.length===0,E=p=>b(S=>({...S,...p})),B=p=>L.find(S=>S.field===p)?.message,G=p=>{if(p.key==="Escape"){a();return}if(p.key!=="Tab"||!T.current)return;let S=Array.from(T.current.querySelectorAll("button:not([disabled]), input:not([disabled])"));if(S.length===0)return;let M=S[0],j=S[S.length-1];p.shiftKey&&document.activeElement===M?(p.preventDefault(),j.focus()):!p.shiftKey&&document.activeElement===j&&(p.preventDefault(),M.focus())},U=[{id:"fees",label:s("widget.trading.tabFees")},{id:"execution",label:s("widget.trading.tabExec")},{id:"pnl",label:s("widget.trading.tabPnl")},{id:"rules",label:s("widget.trading.tabRules")}],Q=v("div",{className:w.backdrop,"data-testid":"paper-settings-modal",role:"dialog","aria-modal":"true","aria-label":s("widget.trading.settingsTitle"),onMouseDown:p=>{p.target===p.currentTarget&&a()},onKeyDown:G,children:R("div",{className:w.modal,ref:T,children:[R("div",{className:w.head,children:[v("span",{children:s("widget.trading.settingsTitle")}),v("button",{type:"button",className:w.closeBtn,"data-testid":"paper-settings-close","aria-label":s("widget.trading.cancel",{defaultValue:"Cancel"}),onClick:a,children:v(Te,{size:13})})]}),R("div",{className:w.body,children:[v("div",{className:`${w.seg} ${w.tablist}`,role:"tablist","aria-label":s("widget.trading.settingsTitle"),children:U.map(p=>v("button",{type:"button",role:"tab","aria-selected":l===p.id,"data-testid":`paper-settings-tab-${p.id}`,onClick:()=>g(p.id),children:p.label},p.id))}),l==="fees"&&R("div",{role:"tabpanel",children:[R("div",{className:w.row,children:[v("span",{children:s("widget.trading.commissionRate")}),R("div",{className:w.field,children:[v("input",{"data-testid":"paper-settings-fee",inputMode:"decimal",value:String(O.brokerFeeRate*100),onChange:p=>{let S=Number(p.target.value);(p.target.value===""||Number.isFinite(S))&&E({brokerFeeRate:(Number.isFinite(S)?S:0)/100})}}),v("span",{children:"%"})]})]}),B("brokerFeeRate")&&v("div",{className:w.error,"data-testid":"paper-settings-error-fee",children:B("brokerFeeRate")}),!o&&R(Vr,{children:[R("div",{className:w.row,children:[v("span",{children:s("widget.trading.taxRate")}),R("div",{className:w.field,children:[v("input",{"data-testid":"paper-settings-tax",inputMode:"decimal",value:String(O.taxRate*100),onChange:p=>{let S=Number(p.target.value);(p.target.value===""||Number.isFinite(S))&&E({taxRate:(Number.isFinite(S)?S:0)/100})}}),v("span",{children:"%"})]})]}),B("taxRate")&&v("div",{className:w.error,"data-testid":"paper-settings-error-tax",children:B("taxRate")}),R("div",{className:w.row,children:[v("span",{children:s("widget.trading.commissionFixed")}),R("div",{className:w.field,children:[v("input",{"data-testid":"paper-settings-commission",inputMode:"numeric",value:String(O.commissionPerContract),onChange:p=>{let S=p.target.value.replace(/[^0-9]/g,"");E({commissionPerContract:S===""?0:Number.parseInt(S,10)})}}),v("span",{children:"\u0111"})]})]}),B("commissionPerContract")&&v("div",{className:w.error,children:B("commissionPerContract")})]})]}),l==="execution"&&R("div",{role:"tabpanel",children:[R("div",{className:w.row,children:[v("span",{children:s("widget.trading.slippageTicks")}),R("div",{className:w.field,children:[v("input",{"data-testid":"paper-settings-slippage",inputMode:"numeric",value:String(O.slippageTicks),onChange:p=>{let S=p.target.value.replace(/[^0-9]/g,"");E({slippageTicks:S===""?0:Number.parseInt(S,10)})}}),v("span",{children:"ticks"})]})]}),B("slippageTicks")&&v("div",{className:w.error,children:B("slippageTicks")}),R("div",{className:w.row,children:[v("span",{children:s("widget.trading.leverage")}),R("div",{className:w.field,children:[v("input",{"data-testid":"paper-settings-leverage",inputMode:"numeric",value:String(O.maxLeverage),onChange:p=>{let S=p.target.value.replace(/[^0-9]/g,"");E({maxLeverage:S===""?1:Number.parseInt(S,10)})}}),v("span",{children:"\xD7"})]})]}),B("maxLeverage")&&v("div",{className:w.error,children:B("maxLeverage")})]}),l==="pnl"&&R("div",{role:"tabpanel",children:[R("div",{className:w.row,children:[v("span",{children:s("widget.trading.costBasisMethod")}),v("div",{className:w.seg,children:["average","fifo"].map(p=>v("button",{type:"button","aria-pressed":O.costBasisMethod===p,"data-testid":`paper-settings-basis-${p}`,title:s(p==="average"?"widget.trading.weightedAverage":"widget.trading.fifo"),onClick:()=>E({costBasisMethod:p}),children:s(p==="average"?"widget.trading.weightedAverage":"widget.trading.fifoShort")},p))})]}),R("div",{className:w.row,children:[v("span",{children:s("widget.trading.pnlDisplayMode")}),v("div",{className:w.seg,children:["gross","net"].map(p=>v("button",{type:"button","aria-pressed":O.pnlDisplayMode===p,"data-testid":`paper-settings-pnl-${p}`,onClick:()=>E({pnlDisplayMode:p}),children:s(p==="gross"?"widget.trading.pnlGross":"widget.trading.pnlNet")},p))})]}),v("div",{className:w.hint,children:s("widget.trading.pnlNetHint",{defaultValue:"Net = after fees and slippage"})})]}),l==="rules"&&R("div",{role:"tabpanel",children:[!d&&R("div",{className:w.row,children:[v("span",{children:s("widget.trading.settlementDays")}),v("div",{className:w.seg,children:[0,1,2,3].map(p=>R("button",{type:"button","aria-pressed":O.settlementDays===p,"data-testid":`paper-settings-settle-${p}`,onClick:()=>E({settlementDays:p}),children:["T+",p]},p))})]}),R("label",{className:w.checkRow,children:[v("input",{type:"checkbox","data-testid":"paper-settings-short",checked:O.allowShortSelling,onChange:p=>E({allowShortSelling:p.target.checked})}),s("widget.trading.allowShortSelling")]})]}),R("label",{className:w.checkRow,children:[v("input",{type:"checkbox","data-testid":"paper-settings-override",checked:t,onChange:p=>i(p.target.checked)}),s("widget.trading.perChartOverride")]})]}),R("div",{className:w.foot,children:[v("button",{type:"button",className:w.btn,"data-testid":"paper-settings-reset",title:s("widget.trading.resetDefaults"),onClick:()=>b({...ve}),children:s("widget.trading.resetDefaults")}),v("span",{className:w.footSpacer}),v("button",{type:"button",className:w.btn,"data-testid":"paper-settings-cancel",onClick:a,children:s("widget.trading.cancel",{defaultValue:"Cancel"})}),v("button",{type:"button",className:`${w.btn} ${w.btnPrimary}`,"data-testid":"paper-settings-save",disabled:!_,onClick:()=>{_&&n({...u,effectiveFrom:Date.now()})},children:s("widget.trading.confirm",{defaultValue:"Confirm"})})]})]})});return typeof document>"u"?Q:Mr(Q,document.body)}import{useState as Dr}from"react";import{jsx as Me,jsxs as Br}from"react/jsx-runtime";function Vt({symbol:r,onOpenSettings:e}){let{t}=I(),[i,n]=Dr(!1);return!r||i||!dt(r)?null:Br("div",{"data-testid":"market-fallback-banner",role:"status",children:[Me("span",{children:t("widget.trading.unknownMarket")}),Me("button",{type:"button","data-testid":"market-fallback-settings",onClick:e,children:t("widget.trading.openSettings")}),Me("button",{type:"button","data-testid":"market-fallback-dismiss","aria-label":t("widget.trading.cancel",{defaultValue:"Cancel"}),onClick:()=>n(!0),children:Me(Te,{size:10})})]})}import{jsx as N,jsxs as z}from"react/jsx-runtime";var _r=150,Lr=100;function Dt({account:r,positions:e,realizedPnl:t,ordersMargin:i,onResetAccount:n,onExportCsv:a,paperConfig:d,onSavePaperConfig:o,symbol:s}){let{t:l}=I(),[g,u]=Ge(!1),[b,T]=Ge(!1),[D,O]=Ge(!1),L=e.reduce((U,Q)=>U+Q.unrealizedPnl,0),_=r.marginUsed>0?r.equity/r.marginUsed*100:null,E=U=>Math.round(U).toLocaleString("en-US"),B=L>0?c.pnlPillPositive:L<0?c.pnlPillNegative:c.pnlPillNeutral,G=_==null?null:_>=_r?{cls:c.marginBadgeSafe,label:l("widget.trading.marginSafe",{defaultValue:"Safe"})}:_>=Lr?{cls:c.marginBadgeWarning,label:l("widget.trading.marginWarning",{defaultValue:"Warning"})}:{cls:c.marginBadgeDanger,label:l("widget.trading.marginDanger",{defaultValue:"Danger"})};return z("div",{className:c.panelHeader,"data-testid":"trading-panel-header",children:[N(Vt,{symbol:s,onOpenSettings:()=>T(!0)}),z("div",{className:c.headerLeft,children:[z("div",{className:c.brandSection,children:[N("span",{className:c.statusDot,"data-testid":"paper-status-dot"}),N("span",{className:c.brandTitle,children:l("widget.trading.paperTrading",{defaultValue:"Paper Trading"})})]}),z("div",{className:c.kpiGrid,children:[z("div",{className:`${c.kpiCard} ${c.kpiCardPrimary} ${c.kpiWide}`,children:[z("div",{className:c.kpiPair,children:[N("span",{className:c.kpiLabel,children:l("widget.trading.equity",{defaultValue:"Equity"})}),z("span",{className:c.kpiValue,"data-testid":"header-equity",children:[E(r.equity)," ",N("span",{className:c.kpiCur,children:r.currency})]}),z("span",{className:B,"data-testid":"header-unrealized",style:{fontVariantNumeric:"tabular-nums"},title:l("widget.trading.unrealizedPnl",{defaultValue:"Open PnL"}),children:[L>=0?"+":"",E(L)]})]}),z("div",{className:c.kpiPair,children:[N("span",{className:c.kpiLabel,children:l("widget.trading.buyingPower",{defaultValue:"Buying power"})}),z("span",{className:c.kpiValue,"data-testid":"header-power",children:[E(r.buyingPower)," ",N("span",{className:c.kpiCur,children:r.currency})]})]}),N("span",{className:c.kpiSubLabel,children:l("widget.trading.balance",{defaultValue:"Cash"})}),N("span",{className:c.kpiSubLabel,children:l("widget.trading.availableFunds",{defaultValue:"Available funds"})}),z("span",{className:c.kpiSubVal,"data-testid":"header-balance",children:[E(r.balance)," ",r.currency]}),z("span",{className:c.kpiSubVal,"data-testid":"header-available",children:[E(r.freeMargin)," ",r.currency]})]}),z("div",{className:`${c.kpiCard} ${c.kpiWide3}`,children:[z("div",{className:c.kpiPair,children:[N("span",{className:c.kpiLabel,children:l("widget.trading.marginLevel",{defaultValue:"Margin level"})}),z("span",{className:c.kpiValue,"data-testid":"header-margin",children:[_==null?"\u2014":`${_.toFixed(1)}%`,G&&N("span",{className:G.cls,children:G.label})]})]}),N("span",{className:c.kpiSubLabel,children:l("widget.trading.accountMargin",{defaultValue:"Account margin"})}),N("span",{className:c.kpiSubLabel,"data-testid":"header-orders-margin-label",children:l("widget.trading.ordersMargin",{defaultValue:"Orders margin"})}),N("span",{className:c.kpiSubLabel,"data-testid":"header-realized-label",children:l("widget.trading.netProfit",{defaultValue:"Net profit"})}),N("span",{className:c.kpiSubVal,"data-testid":"header-account-margin",children:E(r.marginUsed)}),N("span",{className:c.kpiSubVal,"data-testid":"header-orders-margin",children:E(i)}),z("span",{className:c.kpiSubVal,"data-testid":"header-realized",children:[t>=0?"+":"",E(t)]})]})]})]}),z("div",{className:c.headerActions,children:[N("button",{type:"button",className:`${c.btnAction} ${c.btnIconOnly}`,"data-testid":"panel-export",title:l("widget.trading.exportCsv",{defaultValue:"Export CSV"}),"aria-label":l("widget.trading.exportCsv",{defaultValue:"Export CSV"}),onClick:a,children:N(at,{size:13})}),N("button",{type:"button",className:`${c.btnAction} ${c.btnIconOnly}`,"data-testid":"panel-settings",title:l("widget.trading.settingsTitle"),"aria-label":l("widget.trading.settingsTitle"),onClick:()=>T(!0),children:N(ot,{size:13})}),N("button",{type:"button",className:`${c.btnAction} ${c.btnReset} ${c.btnIconOnly}`,"data-testid":"header-reset",title:l("widget.trading.reset",{defaultValue:"Reset"}),"aria-label":l("widget.trading.reset",{defaultValue:"Reset"}),onClick:()=>u(!0),children:N(nt,{size:13})}),N(Et,{open:g,currency:r.currency,defaultAmount:r.currency==="USD"?te:me,onConfirm:U=>{u(!1),n(U)},onCancel:()=>u(!1)}),N(Mt,{open:b,initial:d??ve,perChartOverride:D,hideSettlement:s!=null&&ne(s).profile!=="VN_SPOT",hideVnFees:s!=null&&ne(s).profile!=="VN_SPOT",onToggleOverride:O,onSave:U=>{T(!1),o?.(U)},onCancel:()=>T(!1)})]})]})}import{jsx as C,jsxs as ie}from"react/jsx-runtime";function Bt({positions:r,orders:e,onClosePosition:t,onReversePosition:i,onCloseAllPositions:n,pnlDisplayMode:a="gross",exitFeeRate:d=.001,exitTaxRate:o=.001,onTogglePnlDisplay:s}){let{t:l}=I();if(r.length===0)return ie("div",{className:c.emptyContainer,"data-testid":"positions-empty",children:[C("div",{className:c.emptyIcon,"aria-hidden":"true",children:"\u{1F4CA}"}),C("div",{className:c.emptyTitle,children:l("widget.trading.noPositions",{defaultValue:"No open positions"})}),C("div",{className:c.emptyHint,children:l("widget.trading.emptyPositionsHint",{defaultValue:"Place orders directly on chart or press Shift + B to open ticket"})})]});let g=new Map;for(let u of e){if(u.status!=="working")continue;let b=g.get(u.symbol)??[];b.push(u),g.set(u.symbol,b)}return ie("table",{className:c.table,"data-testid":"positions-table",children:[C("thead",{children:ie("tr",{children:[C("th",{children:l("widget.trading.symbol",{defaultValue:"Symbol"})}),C("th",{children:l("widget.trading.side",{defaultValue:"Side"})}),C("th",{children:l("widget.trading.quantity",{defaultValue:"Quantity"})}),C("th",{children:l("widget.trading.entryPrice",{defaultValue:"Entry"})}),C("th",{children:l("widget.trading.markPrice",{defaultValue:"Mark"})}),C("th",{children:l("widget.trading.availability",{defaultValue:"Status"})}),C("th",{children:l("widget.trading.stopLoss",{defaultValue:"Stop loss"})}),C("th",{children:l("widget.trading.takeProfit",{defaultValue:"Take profit"})}),C("th",{children:s?ie("button",{type:"button","data-testid":"positions-pnl-toggle","aria-pressed":a==="net",title:l(a==="net"?"widget.trading.pnlNet":"widget.trading.pnlGross"),onClick:s,children:["PnL (",l(a==="net"?"widget.trading.pnlNet":"widget.trading.pnlGross"),")"]}):"PnL"}),C("th",{children:n&&C("button",{type:"button","data-testid":"positions-close-all",title:l("widget.trading.closeAllPositions",{defaultValue:"Close all positions"}),onClick:n,children:l("widget.trading.closeAllPositions",{defaultValue:"Close all positions"})})})]})}),C("tbody",{children:r.map(u=>{let b=g.get(u.symbol)??[],T=b.find(B=>B.type==="stop"||B.type==="trailing_stop"),D=b.find(B=>B.type==="limit"),O=u.availableQuantity>=u.quantity,L=Math.abs(u.currentPrice)*u.quantity*(d+o),_=a==="net"?u.unrealizedPnl-L:u.unrealizedPnl,E=u.entryPrice!==0&&u.quantity!==0?_/(Math.abs(u.entryPrice)*u.quantity)*100:0;return ie("tr",{"data-testid":`position-row-${u.id}`,children:[C("td",{children:u.symbol}),C("td",{children:u.side==="long"?l("widget.trading.long",{defaultValue:"Long"}):l("widget.trading.short",{defaultValue:"Short"})}),C("td",{children:u.quantity}),C("td",{children:u.entryPrice.toLocaleString("en-US")}),C("td",{children:u.currentPrice.toLocaleString("en-US")}),C("td",{children:O?l("widget.trading.available",{defaultValue:"Available"}):l("widget.trading.awaitingSettlement",{defaultValue:"Settling (T+2)"})}),C("td",{children:T?.stopPrice?.toLocaleString("en-US")??"\u2014"}),C("td",{children:D?.price?.toLocaleString("en-US")??"\u2014"}),ie("td",{"data-testid":`position-pnl-${u.id}`,children:[_>=0?"+":"",Math.round(_).toLocaleString("en-US")," (",E.toFixed(2),"%)"]}),ie("td",{children:[C("button",{type:"button","data-testid":`position-close-${u.id}`,onClick:()=>t(u.id),children:"\u2715"}),C("button",{type:"button","data-testid":`position-reverse-${u.id}`,title:l("widget.trading.reverse",{defaultValue:"Reverse"}),onClick:()=>i(u.id),children:"\u21C4"})]})]},u.id)})})]})}import{jsx as V,jsxs as Ve}from"react/jsx-runtime";function _t({orders:r,onCancelOrder:e,onCancelAllOrders:t}){let{t:i}=I();return r.length===0?V("div",{"data-testid":"orders-empty",children:i("widget.trading.noOrders",{defaultValue:"No working orders"})}):Ve("div",{children:[t&&V("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:6},children:V("button",{type:"button","data-testid":"orders-cancel-all",title:i("widget.trading.cancelAllOrders",{defaultValue:"Cancel all pending orders"}),onClick:t,children:i("widget.trading.cancelAllOrders",{defaultValue:"Cancel all pending orders"})})}),Ve("table",{className:c.table,"data-testid":"orders-table",children:[V("thead",{children:Ve("tr",{children:[V("th",{children:i("widget.trading.symbol",{defaultValue:"Symbol"})}),V("th",{children:i("widget.trading.side",{defaultValue:"Side"})}),V("th",{children:i("widget.trading.orderType",{defaultValue:"Type"})}),V("th",{children:i("widget.trading.orderPrice",{defaultValue:"Price"})}),V("th",{children:i("widget.trading.triggerPrice",{defaultValue:"Trigger"})}),V("th",{children:i("widget.trading.quantity",{defaultValue:"Quantity"})}),V("th",{children:i("widget.trading.orderTime",{defaultValue:"Placed"})}),V("th",{})]})}),V("tbody",{children:r.map(n=>Ve("tr",{"data-testid":`order-row-${n.id}`,children:[V("td",{children:n.symbol}),V("td",{children:n.side==="buy"?i("widget.trading.buy",{defaultValue:"Buy"}):i("widget.trading.sell",{defaultValue:"Sell"})}),V("td",{children:n.type}),V("td",{children:n.price?.toLocaleString("en-US")??"\u2014"}),V("td",{children:n.stopPrice?.toLocaleString("en-US")??"\u2014"}),V("td",{children:n.quantity}),V("td",{children:new Date(n.createdAt).toLocaleString()}),V("td",{children:V("button",{type:"button","data-testid":`order-cancel-${n.id}`,onClick:()=>e(n.id),children:"\u2715"})})]},n.id))})]})]})}import{Fragment as Ur,jsx as F,jsxs as De}from"react/jsx-runtime";var Fr={UNSUPPORTED_TIF:"widget.trading.rejectCode.UNSUPPORTED_TIF",UNSUPPORTED_ORDER_TYPE:"widget.trading.rejectCode.UNSUPPORTED_ORDER_TYPE",INSUFFICIENT_BUYING_POWER:"widget.trading.rejectCode.INSUFFICIENT_BUYING_POWER",INVALID_QUANTITY:"widget.trading.rejectCode.INVALID_QUANTITY",INVALID_PRICE:"widget.trading.rejectCode.INVALID_PRICE",SHORT_NOT_ALLOWED:"widget.trading.rejectCode.SHORT_NOT_ALLOWED",PRICE_OUT_OF_BAND:"widget.trading.rejectCode.PRICE_OUT_OF_BAND"};function qr({status:r,rejectCode:e}){let{t}=I(),i=r==="filled"?t("widget.trading.statusFilled",{defaultValue:"Filled"}):r==="cancelled"?t("widget.trading.statusCancelled",{defaultValue:"Cancelled"}):r==="rejected"?t("widget.trading.statusRejected",{defaultValue:"Rejected"}):r,n=e?Fr[e]:void 0,a=n?t(n):e;return De(Ur,{children:[i,r==="rejected"&&a?` (${a})`:""]})}function Lt({orders:r}){let{t:e}=I(),t=r.filter(i=>i.status!=="working"&&i.status!=="pending");return t.length===0?F("div",{"data-testid":"history-empty",children:e("widget.trading.noHistory",{defaultValue:"No order history"})}):De("table",{className:c.table,"data-testid":"history-table",children:[F("thead",{children:De("tr",{children:[F("th",{children:e("widget.trading.symbol",{defaultValue:"Symbol"})}),F("th",{children:e("widget.trading.side",{defaultValue:"Side"})}),F("th",{children:e("widget.trading.orderType",{defaultValue:"Type"})}),F("th",{children:e("widget.trading.orderPrice",{defaultValue:"Price"})}),F("th",{children:e("widget.trading.quantity",{defaultValue:"Quantity"})}),F("th",{children:e("widget.trading.orderStatus",{defaultValue:"Status"})}),F("th",{children:e("widget.trading.time",{defaultValue:"Time"})})]})}),F("tbody",{children:t.map(i=>De("tr",{"data-testid":`history-row-${i.id}`,children:[F("td",{children:i.symbol}),F("td",{children:i.side==="buy"?e("widget.trading.buy",{defaultValue:"Buy"}):e("widget.trading.sell",{defaultValue:"Sell"})}),F("td",{children:i.type}),F("td",{children:(i.price??i.stopPrice)?.toLocaleString("en-US")??"\u2014"}),F("td",{children:i.quantity}),F("td",{children:F(qr,{status:i.status,rejectCode:i.rejectCode})}),F("td",{children:new Date(i.updatedAt).toLocaleString()})]},i.id))})]})}import{Fragment as $r,jsx as We,jsxs as K}from"react/jsx-runtime";var Pe=300,ee=80;function zr(r){if(r.length===0)return"";if(r.length===1)return`M 0 ${ee} L ${Pe} ${ee}`;let e=Math.min(...r.map(n=>n.equity)),t=Math.max(...r.map(n=>n.equity)),i=t-e>0?t-e:1;return r.map((n,a)=>{let d=a/(r.length-1)*Pe,o=ee-(n.equity-e)/i*(ee-8)-4;return`${a===0?"M":"L"} ${d.toFixed(1)} ${o.toFixed(1)}`}).join(" ")}function Ft({account:r,analytics:e}){let{t}=I(),i=d=>Math.round(d).toLocaleString("en-US"),n=e.equityCurve.length>200?e.equityCurve.slice(-200):e.equityCurve,a=zr(n);return K("div",{"data-testid":"summary-tab",children:[K("div",{className:c.kpis,children:[K("span",{"data-testid":"kpi-balance",children:[t("widget.trading.balance",{defaultValue:"Cash"}),": ",i(r.balance)]}),K("span",{"data-testid":"kpi-equity",children:[t("widget.trading.equity",{defaultValue:"Equity"}),": ",i(r.equity)]}),K("span",{"data-testid":"kpi-trades",children:[t("widget.trading.totalTrades",{defaultValue:"Total trades"}),": ",e.totalTrades]}),K("span",{"data-testid":"kpi-winrate",children:[t("widget.trading.winRate",{defaultValue:"Win rate"}),": ",(e.winRate*100).toFixed(1),"%"]}),K("span",{"data-testid":"kpi-profitfactor",children:[t("widget.trading.profitFactor",{defaultValue:"Profit factor"}),": ",e.profitFactor.toFixed(2)]}),K("span",{"data-testid":"kpi-netprofit",children:[t("widget.trading.netProfit",{defaultValue:"Net profit"}),": ",e.netProfit>=0?"+":"",i(e.netProfit)]}),K("span",{"data-testid":"kpi-drawdown",children:[t("widget.trading.maxDrawdown",{defaultValue:"Max drawdown"}),": ",e.maxDrawdownPercent.toFixed(2),"%"]}),K("span",{"data-testid":"kpi-sharpe",children:[t("widget.trading.sharpeRatio",{defaultValue:"Sharpe"}),": ",(e.sharpeRatio??0).toFixed(2)]})]}),We("svg",{"data-testid":"equity-curve",width:Pe,height:ee,viewBox:`0 0 ${Pe} ${ee}`,children:a!==""&&K($r,{children:[We("path",{d:`${a} L ${Pe} ${ee} L 0 ${ee} Z`,fill:"rgba(41,98,255,0.18)"}),We("path",{d:a,fill:"none",stroke:"#2962ff",strokeWidth:1.5})]})})]})}import{jsx as Qr,jsxs as Hr}from"react/jsx-runtime";function qt({log:r}){return Qr("div",{className:c.logList,"data-testid":"log-tab",children:r.map((e,t)=>Hr("div",{"data-testid":`log-row-${t}`,children:[new Date(e.timestamp).toLocaleString()," \u2014 ",e.message]},`${e.timestamp}-${t}`))})}import{jsx as q,jsxs as Be}from"react/jsx-runtime";function Ut({trades:r}){let{t:e}=I();return r.length===0?q("div",{"data-testid":"trades-empty",children:e("widget.trading.noTrades",{defaultValue:"No closed positions"})}):Be("table",{className:c.table,"data-testid":"trades-table",children:[q("thead",{children:Be("tr",{children:[q("th",{children:e("widget.trading.symbol",{defaultValue:"Symbol"})}),q("th",{children:e("widget.trading.side",{defaultValue:"Side"})}),q("th",{children:e("widget.trading.quantity",{defaultValue:"Quantity"})}),q("th",{children:e("widget.trading.entryPrice",{defaultValue:"Entry"})}),q("th",{children:e("widget.trading.fillPrice",{defaultValue:"Fill"})}),q("th",{children:"PnL"}),q("th",{children:e("widget.trading.exitReason",{defaultValue:"Exit"})}),q("th",{children:e("widget.trading.time",{defaultValue:"Time"})})]})}),q("tbody",{children:r.map((t,i)=>Be("tr",{"data-testid":`trade-row-${i}`,children:[q("td",{children:t.symbol??"\u2014"}),q("td",{children:t.side==="short"?e("widget.trading.short",{defaultValue:"Short"}):e("widget.trading.long",{defaultValue:"Long"})}),q("td",{children:t.quantity??"\u2014"}),q("td",{children:t.entryPrice?.toLocaleString("en-US")??"\u2014"}),q("td",{children:t.exitPrice?.toLocaleString("en-US")??"\u2014"}),Be("td",{children:[t.realizedPnl>=0?"+":"",Math.round(t.realizedPnl).toLocaleString("en-US")]}),q("td",{children:t.exitReason??"\u2014"}),q("td",{children:new Date(t.timestamp).toLocaleString()})]},`${t.timestamp}-${i}`))})]})}function zt(r){if(r==null)return"";let e=String(r);return e.includes(",")||e.includes('"')||e.includes(`
|
|
2
|
+
`)?`"${e.replace(/"/g,'""')}"`:e}function $t(r,e){let t=[r.map(zt).join(",")];for(let i of e)t.push(i.map(zt).join(","));return t.join(`
|
|
3
|
+
`)}function Ht(r){return{headers:["symbol","side","quantity","entryPrice","currentPrice","unrealizedPnl"],rows:r.map(e=>[e.symbol,e.side,e.quantity,e.entryPrice,e.currentPrice,Math.round(e.unrealizedPnl)])}}function Qt(r){return{headers:["id","symbol","side","type","quantity","price","stopPrice","status","time"],rows:r.map(e=>[e.id,e.symbol,e.side,e.type,e.quantity,e.price??e.stopPrice??"",e.stopPrice??"",e.status,new Date(e.createdAt).toISOString()])}}function jt(r){return{headers:["symbol","side","quantity","entryPrice","exitPrice","realizedPnl","commission","tax","exitReason","time"],rows:r.map(e=>[e.symbol??"",e.side??"",e.quantity??"",e.entryPrice??"",e.exitPrice??"",Math.round(e.realizedPnl),e.commission,e.tax,e.exitReason??"",new Date(e.timestamp).toISOString()])}}function Kt(r,e){try{if(typeof window>"u"||typeof window.URL?.createObjectURL!="function")return!1;let t=new Blob(["\uFEFF"+e],{type:"text/csv;charset=utf-8;"}),i=window.URL.createObjectURL(t),n=document.createElement("a");return n.href=i,n.download=r,document.body.appendChild(n),n.click(),document.body.removeChild(n),window.URL.revokeObjectURL(i),!0}catch{return!1}}import{jsx as H,jsxs as de}from"react/jsx-runtime";var Kr=["positions","orders","history","trades","summary","log"],Gr={positions:"widget.trading.positions",orders:"widget.trading.orders",history:"widget.trading.orderHistory",trades:"widget.trading.tradeHistory",summary:"widget.trading.summary",log:"widget.trading.log"};function Gt({account:r,positions:e,orders:t,orderHistory:i,ordersMargin:n,analytics:a,log:d,onClosePosition:o,onReversePosition:s,onCancelOrder:l,onCloseAllPositions:g,onCancelAllOrders:u,onResetAccount:b,onClose:T,tradingEnabled:D=!0,onEnableTrading:O,titleBadge:L,symbol:_,paperConfig:E,onSavePaperConfig:B,pnlDisplayMode:G,exitFeeRate:U,exitTaxRate:Q,onTogglePnlDisplay:p}){let{t:S}=I(),[M,j]=jr("positions"),$={positions:e.length,orders:t.length,history:0,trades:0,summary:0,log:0};if(!D)return de("div",{className:c.panel,"data-testid":"trading-bottom-panel",children:[L&&H("div",{className:c.titleBadgeRow,children:L}),de("div",{className:c.ctaContainer,"data-testid":"trading-disabled-cta",children:[H("div",{className:c.ctaTitle,children:S("widget.trading.paperTradingOff",{defaultValue:"Paper trading is off"})}),H("div",{className:c.ctaHint,children:S("widget.trading.paperTradingOffHint",{defaultValue:"Enable to see quotes, place orders and drag SL/TP on the chart"})}),H("button",{type:"button",className:c.ctaButton,"data-testid":"trading-enable-btn",onClick:()=>O?.(),children:S("widget.trading.enablePaperTrading",{defaultValue:"Enable paper trading"})})]})]});let _e=()=>{let P=M==="positions"?{name:"positions",...Ht(e)}:M==="orders"||M==="history"?{name:"orders",...Qt(M==="orders"?t:i)}:M==="trades"?{name:"trades",...jt(a.closedTrades)}:null;P&&Kt(`paper-${P.name}.csv`,$t(P.headers,P.rows))};return de("div",{className:c.panel,"data-testid":"trading-bottom-panel",children:[L&&H("div",{className:c.titleBadgeRow,children:L}),H(Dt,{account:r,positions:e,realizedPnl:a.netProfit,ordersMargin:n,onResetAccount:b,onExportCsv:_e,symbol:_,paperConfig:E,onSavePaperConfig:B}),de("div",{className:c.tabBar,role:"tablist",children:[Kr.map(P=>de("button",{type:"button",role:"tab","aria-selected":M===P,className:M===P?c.activeTab:c.tab,"data-testid":`panel-tab-${P}`,onClick:()=>j(P),children:[H("span",{children:S(Gr[P],{defaultValue:P})}),$[P]>0&&H("span",{className:c.tabBadge,children:$[P]})]},P)),T&&H("button",{type:"button",className:c.btnClosePinned,"data-testid":"panel-close",title:S("widget.trading.closePanel",{defaultValue:"Close panel"}),onClick:T,children:"\u2715"})]}),de("div",{className:c.tabBody,"data-testid":`panel-body-${M}`,children:[M==="positions"&&H(Bt,{positions:e,orders:t,onClosePosition:o,onReversePosition:s,onCloseAllPositions:g,pnlDisplayMode:G,exitFeeRate:U,exitTaxRate:Q,onTogglePnlDisplay:p}),M==="orders"&&H(_t,{orders:t,onCancelOrder:l,onCancelAllOrders:u}),M==="history"&&H(Lt,{orders:i}),M==="trades"&&H(Ut,{trades:a.closedTrades}),M==="summary"&&H(Ft,{account:r,analytics:a}),M==="log"&&H(qt,{log:d})]})]})}import{jsx as Wr}from"react/jsx-runtime";function ha({onClose:r}){let{panelProps:e}=Rt();return Wr(Gt,{...e,onClose:r})}export{ht as a,Ri as b,Ei as c,Yr as d,lt as e,ne as f,ae as g,ye as h,Ue as i,hr as j,Mi as k,Rt as l,Ki as m,c as n,Nt as o,nn as p,Gt as q,ha as r};
|
|
4
|
+
//# sourceMappingURL=chunk-66JBEGR3.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as H,b as z,c as G,d as F,e as M}from"./chunk-5T6DGB3V.js";import{d as ae}from"./chunk-FHHSTO6Z.js";import{createContext as ze,useCallback as V,useContext as Ge,useMemo as ee,useReducer as ye}from"react";import{useDrawingInteraction as Fe}from"@vninvestcharts/engine-react";import{useCallback as y,useEffect as we,useMemo as $,useReducer as Le}from"react";function D(n){return typeof n.minHeight=="number"&&n.minHeight>0?n.minHeight:n.id==="price"?80:n.id==="volume"?36:n.id==="momentum"||n.id==="orderflow"||n.id==="strength"?48:40}function Ne(n){return n.filter(e=>e.visible)}function le(n,e){let o=Ne(n);if(o.length===0)return[];let r=o.length,t=new Array(r).fill(0),s=0;for(let a=r-1;a>=1;a--){let d=D(o[a]),f=Math.round(o[a].heightRatio*e),v=Math.max(f,d);t[a]=v,s+=v}let i=D(o[0]);return t[0]=Math.max(e-s,i),t}function Re(n,e,o,r){let t=D(n),s=D(e),i=t-o,a=r-s;return{minDeltaY:i,maxDeltaY:a}}function de(n,e,o,r){let t=[...n],s=e,i=e+1;if(i>=n.length||s<0||s>=r.length||i>=r.length)return t;let{minDeltaY:a,maxDeltaY:d}=Re(r[s],r[i],n[s],n[i]),f=Math.max(a,Math.min(d,o));return t[s]=n[s]+f,t[i]=n[i]-f,t}function ue(n,e,o){let r=[...n],t=e,s=e+1;if(s>=n.length)return r;let i=n[t]+n[s],a=Math.round(i/2),d=o[t]?D(o[t]):0,f=o[s]?D(o[s]):0;return a<d&&(a=d),i-a<f&&(a=i-f),a=Math.max(d,Math.min(i-f,a)),r[t]=a,r[s]=i-a,r}var He=36;function X(n){return n?`${z}:${n}`:z}function ce(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`pane-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function pe(n){return`${n.toLowerCase()}-${ce()}`}function Me(n,e){return`${n}-${e}`}function fe(n){return n.map(e=>({...e,type:H(e.type),id:e.id??pe(H(e.type)),params:e.params?{...e.params}:void 0,lineWidth:typeof e.lineWidth=="number"&&Number.isFinite(e.lineWidth)?e.lineWidth:void 0,subColors:e.subColors?{...e.subColors}:void 0}))}function me(n){return{...n,series:fe(n.series)}}function p(n){return n.map(me)}function _e(n,e){return{...n,label:e.label,pinned:e.pinned,tooltip:e.tooltip}}function _(n){let e=p(n),o=new Map(e.map(s=>[s.id,s])),r=F.map(s=>{let i=o.get(s.id),a;return i?a=_e(i,s):(a=me(s),a.visible=!1),x(a),a}),t=e.filter(s=>!M(s.id));return t.forEach(x),g([...r,...t])}function x(n){n.series.forEach(o=>{o.scaleSlotId=Me(n.id,o.yAxis)});let e=n.series.filter(o=>o.visible!==!1);n.splitScale=e.some(o=>o.yAxis==="left")&&e.some(o=>o.yAxis==="right")}function q(n){return n.filter(e=>e.visible)}function g(n){let e=p(n),o=e.filter(t=>t.visible),r=o.reduce((t,s)=>t+s.heightRatio,0);if(o.length===0)return e;if(r<=0){let t=1/o.length;return o.forEach(s=>{s.heightRatio=t}),e}return o.forEach(t=>{t.heightRatio=t.heightRatio/r}),e}function T(n){return n.reduce((e,o)=>e+(o.visible?1:0),0)}function ke(n){let e=[];return n.forEach((o,r)=>{o.visible&&e.push(r)}),e}function J(n,e){return le(n,e)}function Oe(n){if(!n||typeof n!="object")return!1;let e=n;return typeof e.id=="string"&&typeof e.label=="string"&&typeof e.pinned=="boolean"&&typeof e.visible=="boolean"&&typeof e.heightRatio=="number"&&Array.isArray(e.series)&&typeof e.splitScale=="boolean"&&(e.tooltip==="ohlc"||e.tooltip==="value"||e.tooltip==="none")}function We(n){if(!n||typeof n!="object")return null;let e=n;return e.version!==1||!Array.isArray(e.panes)||e.panes.length===0||!e.panes.every(Oe)?null:_(e.panes)}function Ye(n,e){if(!n)return R();try{let o=n.getItem(X(e));if(!o)return R();let r=JSON.parse(o);return We(r)??R()}catch{return R()}}function Ue(n,e,o){if(e)try{e.setItem(X(o),JSON.stringify({version:1,panes:n}))}catch{}}function R(){return _(F)}function Be(n){return n.length===0?R():_(n)}function Ke(n,e,o){if(e===o)return p(n);let r=p(n),t=ke(r);if(e<0||e>=t.length||o<0||o>=t.length||o===0||r[t[e]]?.pinned)return r;let s=t.map(d=>r[d]),[i]=s.splice(e,1);if(!i)return r;s.splice(o,0,i);let a=0;return r.map(d=>{if(!d.visible)return d;let f=s[a];return a+=1,f})}function C(n,e,o){return typeof o=="number"&&o>=0&&o<n.length?o:n.findIndex(r=>r.type===e)}function Q(n,e){let o=Math.max(1,("maxVisiblePanes"in e?e.maxVisiblePanes:void 0)??G);switch(e.type){case"toggleVisible":{let r=p(n),t=r.find(s=>s.id===e.id);if(!t||t.pinned||t.visible&&T(r)===1)return r;if(t.visible)t.visible=!1;else{if(T(r)>=o)return r;t.visible=!0}return g(r)}case"addPane":{let r=p(n);if(T(r)>=o)return r;let t={...e.pane,id:ce(),series:fe(e.pane.series)};return x(t),r.push(t),g(r)}case"removePane":{let r=p(n),t=r.find(s=>s.id===e.id);return!t||t.pinned||M(t.id)||t.visible&&T(r)===1?r:(t.visible=!1,g(r))}case"deletePane":{let r=p(n),t=r.find(s=>s.id===e.id);return!t||t.pinned||M(t.id)||t.visible&&T(r)===1?r:g(r.filter(s=>s.id!==e.id))}case"renamePane":{let r=p(n),t=r.find(i=>i.id===e.paneId);if(!t||t.pinned||M(t.id))return r;let s=e.label.trim();return s.length===0||s===t.label||(t.label=s),r}case"restorePane":{let r=p(n);if(T(r)>=o)return r;let t=r.find(s=>s.id===e.id);return t?(t.visible=!0,t.series.forEach(s=>{s.visible=!0}),x(t),g(r)):r}case"addSeries":{let r=p(n),t=r.find(s=>s.id===e.paneId);if(!t)return r;if(!t.visible){if(T(r)>=o)return r;t.visible=!0}return t.series.push({...e.series,type:H(e.series.type),id:e.series.id??pe(H(e.series.type)),params:e.series.params?{...e.series.params}:void 0}),x(t),g(r)}case"removeSeries":{let r=p(n),t=r.find(i=>i.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex);return s<0?r:(t.series=t.series.filter((i,a)=>a!==s),t.pinned||!t.series.some(a=>a.visible!==!1)&&t.visible&&T(r)>1&&(t.visible=!1),x(t),g(r))}case"applyDelta":{let r=p(n),t=q(r),s=t[e.splitterIndex],i=t[e.splitterIndex+1];if(!s||!i)return r;let a=t.reduce((h,E)=>h+D(E),0),d=Math.max(e.available,a),f=J(t,d),v=de(f,e.splitterIndex,e.deltaY,t),I=p(r),S=0;return I.forEach(h=>{h.visible&&(h.heightRatio=v[S]/d,S+=1)}),g(I)}case"equalizePair":{let r=p(n),t=q(r);if(e.splitterIndex<0||e.splitterIndex+1>=t.length)return r;let s=t.reduce((I,S)=>I+D(S),0),i=Math.max(e.available,s),a=J(t,i),d=ue(a,e.splitterIndex,t),f=p(r),v=0;return f.forEach(I=>{I.visible&&(I.heightRatio=d[v]/i,v+=1)}),g(f)}case"resetToDefault":return R();case"replaceLayout":return Be(e.panes);case"reorderPanes":return Ke(n,e.fromVisibleIndex,e.toVisibleIndex);case"toggleSeriesVisible":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex),i=t.series[s];if(!i)return r;if(i.visible=i.visible===!1,i.visible===!0&&!t.visible){if(T(r)>=o)return r;t.visible=!0}return t.pinned||!t.series.some(d=>d.visible!==!1)&&t.visible&&T(r)>1&&(t.visible=!1),x(t),g(r)}case"updateSeriesParams":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex),i=t.series[s];return i?(i.params={...i.params??{},...e.params},x(t),g(r)):r}case"updateSeriesType":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex);if(s<0)return r;let i=t.series[s];return i?(i.type=e.seriesType,x(t),g(r)):r}case"updateSeriesYAxis":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex),i=t.series[s];return i?(i.yAxis=e.yAxis,x(t),g(r)):r}case"updateSeriesColor":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex),i=t.series[s];return i&&(i.color=e.color||void 0),r}case"updateSeriesLineWidth":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex),i=t.series[s];return i&&(i.lineWidth=typeof e.lineWidth=="number"&&Number.isFinite(e.lineWidth)?Math.max(1,e.lineWidth):void 0),r}case"updateSeriesSource":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex),i=t.series[s];return i?(i.sourceType=e.sourceType,i.sourceId=e.sourceId,i.sourceKey=e.sourceKey,x(t),g(r)):r}case"updateSeriesSubColor":{let r=p(n),t=r.find(a=>a.id===e.paneId);if(!t)return r;let s=C(t.series,e.seriesType,e.seriesIndex),i=t.series[s];return i&&(i.subColors={...i.subColors??{},[e.subKey]:e.color}),r}default:return p(n)}}function Z(n,e){return Ye(n,e)}function je(n,e,o){Ue(n,e,o)}function fr(n,e={}){let o=typeof globalThis<"u"&&(globalThis.vi!==void 0||globalThis.describe!==void 0||globalThis.process?.env?.NODE_ENV==="test"),[r,t]=Le(Q,void 0,()=>Z(typeof localStorage<"u"&&!o?localStorage:void 0,e.storageScopeId)),s=e.panesOverride??r,i=e.dispatchOverride??t,a=Math.max(1,e.maxVisiblePanes??G),d=$(()=>{let u=s.filter(m=>m.visible).reduce((m,b)=>m+D(b),0);return Math.max(n-He,u)},[s,n]),f=$(()=>q(s),[s]),v=$(()=>J(s,d),[s,d]);we(()=>{je(s,typeof localStorage<"u"&&!o?localStorage:void 0,e.storageScopeId)},[s,o,e.storageScopeId]);let I=y(l=>{i({type:"toggleVisible",id:l,maxVisiblePanes:a})},[a]),S=y(l=>{i({type:"addPane",pane:l,maxVisiblePanes:a})},[a]),h=y(l=>{i({type:"removePane",id:l})},[]),E=y(l=>{i({type:"deletePane",id:l})},[]),N=y((l,u)=>{i({type:"renamePane",paneId:l,label:u})},[]),A=y(l=>{i({type:"restorePane",id:l,maxVisiblePanes:a})},[a]),k=y((l,u)=>{i({type:"addSeries",paneId:l,series:u,maxVisiblePanes:a})},[a]),O=y((l,u,m)=>{i({type:"removeSeries",paneId:l,seriesType:u,seriesIndex:m})},[]),W=y((l,u)=>{i({type:"applyDelta",splitterIndex:l,deltaY:u,available:d})},[d]),B=y(l=>{i({type:"equalizePair",splitterIndex:l,available:d})},[d]),Y=y(l=>{i({type:"replaceLayout",panes:l})},[]),U=y(()=>{try{typeof localStorage<"u"&&localStorage.removeItem(X(e.storageScopeId))}catch{}i({type:"resetToDefault"})},[e.storageScopeId]),K=y((l,u)=>{i({type:"reorderPanes",fromVisibleIndex:l,toVisibleIndex:u})},[]),c=y((l,u,m)=>{i({type:"toggleSeriesVisible",paneId:l,seriesType:u,seriesIndex:m,maxVisiblePanes:a})},[a]),P=y((l,u,m,b)=>{i({type:"updateSeriesParams",paneId:l,seriesType:u,params:m,seriesIndex:b})},[]),L=y((l,u,m,b)=>{i({type:"updateSeriesYAxis",paneId:l,seriesType:u,yAxis:m,seriesIndex:b})},[]),Ve=y((l,u,m,b)=>{i({type:"updateSeriesColor",paneId:l,seriesType:u,color:m,seriesIndex:b})},[]),De=y((l,u,m,b)=>{i({type:"updateSeriesLineWidth",paneId:l,seriesType:u,lineWidth:m,seriesIndex:b})},[]),Te=y((l,u,m,b,j)=>{i({type:"updateSeriesSubColor",paneId:l,seriesType:u,subKey:m,color:b,seriesIndex:j})},[]),Ce=y((l,u,m)=>{i({type:"updateSeriesType",paneId:l,seriesType:u,seriesIndex:m})},[]),Ee=y((l,u,m,b,j,Ae)=>{i({type:"updateSeriesSource",paneId:l,seriesType:u,sourceType:m,sourceId:b,sourceKey:j,seriesIndex:Ae})},[]);return{panes:s,visiblePanes:f,heights:v,available:d,toggleVisible:I,addPane:S,removePane:h,deletePane:E,renamePane:N,restorePane:A,addSeries:k,removeSeries:O,toggleSeriesVisible:c,updateSeriesParams:P,updateSeriesYAxis:L,updateSeriesColor:Ve,updateSeriesLineWidth:De,updateSeriesSubColor:Te,updateSeriesType:Ce,updateSeriesSource:Ee,applyDelta:W,equalizePair:B,replaceLayout:Y,resetToDefault:U,reorderPanes:K,canAddPane:f.length<a}}import{jsx as qe}from"react/jsx-runtime";var ge=void 0,re=ze(ge);function $e(){let n=Ge(re);if(n===ge)throw new Error("useVNInvestChartsState must be used within VNInvestChartsStateProvider");return n}function te({initialPanes:n,initialDrawings:e,initialActiveTool:o,storageScopeId:r,children:t}){let[s,i]=ye(Q,void 0,()=>{if(n)return _(n);let c=typeof globalThis<"u"&&(globalThis.vi!==void 0||globalThis.describe!==void 0||globalThis.process?.env?.NODE_ENV==="test");return Z(typeof localStorage<"u"&&!c?localStorage:void 0,r)}),a=V(c=>{i({type:"toggleVisible",id:c})},[i]),d=V(c=>{i({type:"addPane",pane:c})},[i]),f=V(c=>{i({type:"removePane",id:c})},[i]),v=V(c=>{i({type:"deletePane",id:c})},[i]),I=V((c,P)=>{i({type:"renamePane",paneId:c,label:P})},[i]),S=V(c=>{i({type:"restorePane",id:c})},[i]),h=V((c,P)=>{i({type:"addSeries",paneId:c,series:P})},[i]),E=V((c,P,L)=>{i({type:"removeSeries",paneId:c,seriesType:P,seriesIndex:L})},[i]),N=V((c,P,L)=>{i({type:"toggleSeriesVisible",paneId:c,seriesType:P,seriesIndex:L})},[i]),A=V((c,P)=>{i({type:"reorderPanes",fromVisibleIndex:c,toVisibleIndex:P})},[i]),k=ee(()=>({panes:s,dispatch:i,toggleVisible:a,addPane:d,removePane:f,deletePane:v,renamePane:I,restorePane:S,addSeries:h,removeSeries:E,toggleSeriesVisible:N,reorderPanes:A}),[s,i,a,d,f,v,I,S,h,E,N,A]),O=Fe(e??[]),[W,B]=ye((c,P)=>P,o),Y=V(c=>{B(c)},[]),U=ee(()=>({activeTool:W,setActiveTool:Y}),[W,Y]),K=ee(()=>({paneState:k,drawingInteraction:O,activeTool:U}),[k,O,U]);return qe(re.Provider,{value:K,children:t})}import{createContext as se,useContext as oe,useRef as tr}from"react";import{createContext as Je,useContext as Sr}from"react";import{jsx as Qe}from"react/jsx-runtime";var Xe={theme:"modern-light",locale:"vi",adapter:void 0},ve=Je(Xe);function ne({value:n,children:e}){return Qe(ve.Provider,{value:n,children:e})}import{useCallback as Dr,useEffect as Ze,useRef as er,useState as Tr}from"react";function ie(){return new EventTarget}function rr(n,e){let o=er(e);o.current=e,Ze(()=>{let r=n.current;if(!r)return;let t=s=>{let i=s.detail;o.current(i)};return r.addEventListener("hover",t),()=>{r.removeEventListener("hover",t)}},[n.current,e])}import{jsx as w}from"react/jsx-runtime";var Ie=se(null);function Pe(){return oe(Ie)}var be=se(null),Se=se({current:null});function kr(){return oe(be)}function Or(){return oe(Se)}function Wr({adapter:n,symbol:e,timeframe:o,locale:r,messages:t,theme:s,panes:i,drawings:a,activeTool:d,storageScopeId:f,portalRoot:v,shadowRoot:I,onLocaleChange:S,children:h}){let E=tr(ie()),N=s??"modern-light",A=r??"vi";return w(ae,{locale:A,messages:t,onLocaleChange:S,children:w(ne,{value:{theme:N,locale:A,symbol:e,timeframe:o,adapter:n},children:w(te,{initialPanes:i,initialDrawings:a,initialActiveTool:d,storageScopeId:f,children:w(Ie.Provider,{value:v??null,children:w(be.Provider,{value:I??null,children:w(Se.Provider,{value:E,children:h})})})})})})}import{useEffect as nr,useState as ir,useCallback as sr}from"react";function $r(n){let{portalAdapter:e}=n,o=Pe(),[r,t]=ir(null);nr(()=>{let i=()=>{e?t(e.getContainer()):o?t(o):typeof document<"u"&&document.body&&t(document.body)};i();let a=typeof document<"u"?document:null;return a?.addEventListener("fullscreenchange",i,{capture:!0}),()=>{a?.removeEventListener("fullscreenchange",i,{capture:!0})}},[e,o]);let s=sr(i=>r||null,[r]);return{portalTarget:r,createPortal:s}}var he={MACD:{macd:0,signal:0,divergence:0},BollingerBand:{top:0,middle:0,bottom:0},Whale:{whaleBuyVol:0,whaleSellVol:0},KDJ:{k:0,d:0,j:0},DMI:{plusDI:0,minusDI:0,adx:0},BRAR:{ar:0,br:0},MTM:{mtm:0,signal:0},EMV:{emv:0,signal:0},TRIX:{trix:0,signal:0},DMA:{ddd:0,ama:0},PSY:{psy:0,signal:0},CR:{cr:0,ma1:0,ma2:0,ma3:0,ma4:0},StrengthElder:{bullPower:0,bearPower:0},Ichimoku:{tenkan:0,kijun:0,senkouA:0,senkouB:0,chikou:0},Supertrend:{supertrend:0,direction:0,upperBand:0,lowerBand:0},Keltner:{upper:0,middle:0,lower:0},Donchian:{upper:0,middle:0,lower:0},VWAP:{vwap:0,upper1:0,lower1:0,upper2:0,lower2:0,upper3:0,lower3:0},AnchoredVWAP:{vwap:0,upper1:0,lower1:0,upper2:0,lower2:0,upper3:0,lower3:0},Alligator:{jaw:0,teeth:0,lips:0},Gator:{upper:0,lower:0},Fractals:{bearish:0,bullish:0},AC:{ac:0,color:""},PivotStandard:{pp:0,r1:0,s1:0,r2:0,s2:0,r3:0,s3:0},PivotHighLow:{pp:0,r1:0,s1:0,r2:0,s2:0,r3:0,s3:0},DeltaProfile:{cumulativeDelta:0,barDelta:0,deltaSMA:0},WyckoffWave:{direction:0,zigzag:0,waveVolume:0,waveDuration:0,isPivot:!1},MarketProfile:{tpoBlocks:[],poc:0,valueAreaHigh:0,valueAreaLow:0,initialBalanceHigh:0,initialBalanceLow:0,profileHigh:0,profileLow:0},VolumeProfile:{priceLevels:[],poc:0,valueAreaHigh:0,valueAreaLow:0,highVolumeNodes:[],lowVolumeNodes:[]},Footprint:{timestamp:0,open:0,high:0,low:0,close:0,priceLevels:[]}};function xe(){let n={};for(let[e,o]of Object.entries(he))n[e]=Object.keys(o).filter(r=>typeof o[r]=="number");return n}var or={Footprint:["timestamp"]},ar=(()=>{let n=xe();for(let[e,o]of Object.entries(n)){let r=new Set(or[e]??[]);n[e]=o.filter(t=>!r.has(t))}return n})();function Qr(n){return ar[n]??[]}export{Re as a,je as b,fr as c,re as d,$e as e,rr as f,Pe as g,kr as h,Or as i,Wr as j,$r as k,Qr as l};
|
|
2
|
+
//# sourceMappingURL=chunk-6D7DVBIK.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{drawingToolIcons as i}from"@vninvestcharts/engine-react";import{Fragment as p,jsx as n,jsxs as t}from"react/jsx-runtime";function r({size:o=15,children:e,...c}){return n("svg",{width:o,height:o,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",...c,children:e})}function x({id:o}){let e=i[o];return e?n(p,{children:e}):(typeof process<"u",n("svg",{width:"15",height:"15",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:n("rect",{x:"2.5",y:"2.5",width:"11",height:"11",rx:"2",stroke:"currentColor",strokeWidth:"1.2",strokeDasharray:"2 2"})}))}function u(o){return t(r,{...o,children:[n("circle",{cx:"7.5",cy:"7.5",r:"4.5"}),n("line",{x1:"11",y1:"11",x2:"14",y2:"14"})]})}function h(o){return t(r,{...o,children:[n("line",{x1:"3",y1:"3",x2:"13",y2:"13"}),n("line",{x1:"13",y1:"3",x2:"3",y2:"13"})]})}function y(o){return t(r,{...o,children:[n("line",{x1:"2",y1:"4",x2:"14",y2:"4"}),n("line",{x1:"2",y1:"8",x2:"14",y2:"8"}),n("line",{x1:"2",y1:"12",x2:"14",y2:"12"})]})}function s(o){return t(r,{...o,children:[n("rect",{x:"3.5",y:"7",width:"9",height:"7",rx:"1.5"}),n("path",{d:"M5.5 7V5a2.5 2.5 0 0 1 5 0v2"})]})}function I(o){return t(r,{...o,children:[n("path",{d:"M2.5 4h11"}),n("path",{d:"M6.5 4V2.5h3V4"}),n("path",{d:"M4 4l.8 9.2a1 1 0 0 0 1 .8h4.4a1 1 0 0 0 1-.8L12 4"}),n("line",{x1:"6.5",y1:"7",x2:"6.5",y2:"11"}),n("line",{x1:"9.5",y1:"7",x2:"9.5",y2:"11"})]})}function a(o){return t(r,{...o,children:[n("polyline",{points:"5.5,3.5 2.5,6.5 5.5,9.5"}),n("path",{d:"M2.5 6.5h7a3.5 3.5 0 0 1 0 7H7"})]})}function d(o){return t(r,{...o,children:[n("polyline",{points:"10.5,3.5 13.5,6.5 10.5,9.5"}),n("path",{d:"M13.5 6.5h-7a3.5 3.5 0 0 0 0 7H9"})]})}function g(o){return t(r,{...o,children:[n("circle",{cx:"8",cy:"8",r:"2.5"}),n("path",{d:"M8 1v2M8 13v2M1 8h2M13 8h2M3.05 3.05l1.41 1.41M11.54 11.54l1.41 1.41M3.05 12.95l1.41-1.41M11.54 4.46l1.41-1.41"})]})}function v(o){return n(r,{...o,children:n("path",{d:"M13.5 11A5.5 5.5 0 1 1 5 2.5a4.5 4.5 0 0 0 8.5 8.5z"})})}function f(o){return t(r,{...o,children:[n("circle",{cx:"8",cy:"8",r:"6"}),n("polyline",{points:"8,4.5 8,8 10.5,9.5"})]})}function S(o){return t(r,{...o,children:[n("polyline",{points:"13,2.5 13,6 9.5,6"}),n("path",{d:"M11.2 8.5a4.5 4.5 0 1 1-1.3-4.2L13 6"}),n("polyline",{points:"3,13.5 3,10 6.5,10"}),n("path",{d:"M4.8 7.5a4.5 4.5 0 1 1 1.3 4.2L3 10"})]})}function P(o){return t(r,{...o,children:[n("rect",{x:"2.5",y:"2.5",width:"4.5",height:"4.5",rx:"1"}),n("rect",{x:"9",y:"2.5",width:"4.5",height:"4.5",rx:"1"}),n("rect",{x:"2.5",y:"9",width:"4.5",height:"4.5",rx:"1"}),n("rect",{x:"9",y:"9",width:"4.5",height:"4.5",rx:"1"})]})}function M(o){return t(r,{...o,children:[n("line",{x1:"8",y1:"3",x2:"8",y2:"13"}),n("line",{x1:"3",y1:"8",x2:"13",y2:"8"})]})}function L(o){return t(r,{...o,children:[n("path",{d:"M12 2 H4 A2 2 0 0 0 2 4 V12 A2 2 0 0 0 4 14 H12 A2 2 0 0 0 14 12 V4 A2 2 0 0 0 12 2 Z"}),n("rect",{x:"5",y:"2",width:"6",height:"4"}),n("rect",{x:"4",y:"9",width:"8",height:"5"})]})}function w(o){return t(r,{...o,children:[n("path",{d:"M2 10 V14 H14 V10"}),n("path",{d:"M8 2 V10 M5 7 L8 10 L11 7"})]})}function V(o){return t(r,{...o,children:[n("path",{d:"M5 5.5 L6 3.5 H10 L11 5.5"}),n("rect",{x:"2",y:"5.5",width:"12",height:"8",rx:"1.5"}),n("circle",{cx:"8",cy:"9.5",r:"2"})]})}function C(o){return t(r,{...o,children:[n("path",{d:"M3 6V3.5A.5.5 0 0 1 3.5 3H6"}),n("path",{d:"M10 3h2.5a.5.5 0 0 1 .5.5V6"}),n("path",{d:"M13 10v2.5a.5.5 0 0 1-.5.5H10"}),n("path",{d:"M6 13H3.5a.5.5 0 0 1-.5-.5V10"})]})}function k(o){return t(r,{...o,children:[n("path",{d:"M8 2 C9.5 2 11 3.5 11 5 L11 9 C11 10.5 12 11 12 11.5 L4 11.5 C4 11 5 10.5 5 9 L5 5 C5 3.5 6.5 2 8 2 Z"}),n("path",{d:"M7 13 A1 1 0 0 0 9 13"})]})}function H(o){return t(r,{...o,children:[n("polygon",{points:"8,2 13.5,5 13.5,11 8,14 2.5,11 2.5,5"}),n("circle",{cx:"8",cy:"8",r:"2.5"})]})}function A(o){return t(r,{...o,children:[n("line",{x1:"12",y1:"2",x2:"12",y2:"14"}),n("line",{x1:"4",y1:"8",x2:"10",y2:"8"}),n("line",{x1:"6",y1:"12",x2:"14",y2:"12"})]})}function m(o){return t(r,{...o,children:[n("circle",{cx:"8",cy:"8",r:"6.5"}),n("polygon",{points:"6.5,5.5 11.5,8 6.5,10.5",fill:"currentColor",stroke:"none"})]})}function z(o){return t(r,{...o,children:[n("polyline",{points:"4.7,6.7 8,10 11.3,6.7"}),n("line",{x1:"8",y1:"10",x2:"8",y2:"2"}),n("path",{d:"M14 10v2.7a1.3 1.3 0 0 1-1.3 1.3H3.3A1.3 1.3 0 0 1 2 12.7V10"})]})}function G(o){return t(r,{...o,children:[n("circle",{cx:"3",cy:"4.5",r:"1",fill:"currentColor",stroke:"none"}),n("circle",{cx:"3",cy:"8",r:"1",fill:"currentColor",stroke:"none"}),n("circle",{cx:"3",cy:"11.5",r:"1",fill:"currentColor",stroke:"none"}),n("line",{x1:"6",y1:"4.5",x2:"14",y2:"4.5"}),n("line",{x1:"6",y1:"8",x2:"14",y2:"8"}),n("line",{x1:"6",y1:"11.5",x2:"14",y2:"11.5"})]})}function B(o){return t(r,{...o,children:[n("line",{x1:"2",y1:"13.5",x2:"14",y2:"13.5"}),n("line",{x1:"4.5",y1:"9",x2:"4.5",y2:"13.5"}),n("line",{x1:"8",y1:"6",x2:"8",y2:"13.5"}),n("line",{x1:"11.5",y1:"3.5",x2:"11.5",y2:"13.5"})]})}function E(o){return t(r,{...o,children:[n("polygon",{points:"8,2 14,5.5 8,9 2,5.5"}),n("polyline",{points:"2,8.5 8,12 14,8.5"}),n("polyline",{points:"2,11.5 8,15 14,11.5"})]})}function D(o){return n(r,{...o,children:n("polyline",{points:"14,8 10,8 8,3.5 6,12.5 4,8 2,8"})})}function T(o){return t(r,{...o,children:[n("path",{d:"M10 6.5a3.5 3.5 0 0 0-5 0l-2 2a3.5 3.5 0 0 0 5 5l1.5-1.5"}),n("path",{d:"M6 9.5a3.5 3.5 0 0 0 5 0l2-2a3.5 3.5 0 0 0-5-5L6.5 4"})]})}function O(o){return t(r,{...o,children:[n("path",{d:"M1.5 8S4.5 3.5 8 3.5 14.5 8 14.5 8 11.5 12.5 8 12.5 1.5 8 1.5 8z"}),n("circle",{cx:"8",cy:"8",r:"1.8"})]})}function R(o){return t(r,{...o,children:[n("path",{d:"M1.5 8S4.5 3.5 8 3.5c1.2 0 2.5.5 3.5 1.3M14.5 8S11.5 12.5 8 12.5c-1.2 0-2.5-.5-3.5-1.3"}),n("line",{x1:"2.5",y1:"13.5",x2:"13.5",y2:"2.5"})]})}function U(o){return t(r,{...o,children:[n("polyline",{points:"6,5 3,8 6,11"}),n("polyline",{points:"10,5 13,8 10,11"})]})}function F(o){return t(r,{...o,children:[n("path",{d:"M7 2v4.5L3.8 12a1 1 0 0 0 .9 1.5h6.6a1 1 0 0 0 .9-1.5L9 6.5V2"}),n("path",{d:"M6 2h4"}),n("line",{x1:"7",y1:"10.5",x2:"9",y2:"10.5"})]})}function N(o){return n("svg",{width:o.size??15,height:o.size??15,viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true",children:n("path",{d:"M8 1.5l1.9 3.9 4.3.6-3.1 3 .7 4.3L8 11.3l-3.8 2 .7-4.3-3.1-3 4.3-.6L8 1.5z"})})}function W(o){return t(r,{...o,children:[n("path",{d:"M9.5 2.5h5v3.5l-2.5 1v3.2l1.7 1.1v.7H6.3v-.7L8 10.2V7l-2.5-1V2.5h4z"}),n("line",{x1:"8",y1:"12",x2:"8",y2:"14.5"})]})}function Z(o){return t("svg",{width:o.size??15,height:o.size??15,viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true",children:[n("circle",{cx:"8",cy:"3",r:"1.4"}),n("circle",{cx:"8",cy:"8",r:"1.4"}),n("circle",{cx:"8",cy:"13",r:"1.4"})]})}export{x as a,u as b,h as c,y as d,s as e,I as f,a as g,d as h,g as i,v as j,f as k,S as l,P as m,M as n,L as o,w as p,V as q,C as r,k as s,H as t,A as u,m as v,z as w,G as x,B as y,E as z,D as A,T as B,O as C,R as D,U as E,F,N as G,W as H,Z as I};
|
|
2
|
+
//# sourceMappingURL=chunk-76E7CKUD.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var g="Asia/Ho_Chi_Minh",$=new Map;function C(t){g!==t&&(g=t,$.clear())}function D(){return g}function h(t,i){let e=JSON.stringify({locale:t,options:i});return $.has(e)||$.set(e,new Intl.DateTimeFormat(t,i)),$.get(e)}function F(t,i={}){let e=typeof t=="number"?new Date(t):t,p=D(),s={...i,timeZone:p,...i.hour!==void 0||i.hour12!==void 0?{hour12:i.hour12??!1,hourCycle:"h23"}:{}};try{return h("vi-VN",s).format(e)}catch{let m={...s,timeZone:"UTC"};return h("en-US",m).format(e)}}function z(t){return t==="24"?"00":t}function v(t,i="yyyy-mm-dd",e=!1){let p=typeof t=="number"?new Date(t):t,s=D(),T={year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",hour12:!1,hourCycle:"h23"}:{},timeZone:s},m;try{m=h("en-US",T)}catch{m=h("en-US",{...T,timeZone:"UTC"})}let y=m.formatToParts(p),u="",a="",o="",f="",c="";for(let d=0;d<y.length;d++){let n=y[d];n.type==="year"?u=n.value:n.type==="month"?a=n.value:n.type==="day"?o=n.value:n.type==="hour"?f=z(n.value):n.type==="minute"&&(c=n.value)}let l=e?` ${f}:${c}`:"";return i==="dd/mm/yyyy"?`${o}/${a}/${u}${l}`:i==="mm/dd/yyyy"?`${a}/${o}/${u}${l}`:`${u}-${a}-${o}${l}`}function I(t,i="yyyy-mm-dd",e="dayMonth"){let p=typeof t=="number"?new Date(t):t,s=D(),m={year:"numeric",month:"2-digit",day:"2-digit",...e==="dayMonthTime"||e==="time"?{hour:"2-digit",minute:"2-digit",hour12:!1,hourCycle:"h23"}:{},timeZone:s},y;try{y=h("en-US",m)}catch{y=h("en-US",{...m,timeZone:"UTC"})}let u=y.formatToParts(p),a="",o="",f="",c="",l="";for(let n=0;n<u.length;n++){let r=u[n];r.type==="year"?a=r.value:r.type==="month"?o=r.value:r.type==="day"?f=r.value:r.type==="hour"?c=z(r.value):r.type==="minute"&&(l=r.value)}if(e==="time")return`${c}:${l}`;if(e==="year")return`${a}`;if(e==="monthYear")return`${o}/${a}`;let d=e==="dayMonthTime"?` ${c}:${l}`:"";return i==="mm/dd/yyyy"?`${o}/${f}${d}`:`${f}/${o}${d}`}export{C as a,D as b,F as c,v as d,I as e};
|
|
2
|
+
//# sourceMappingURL=chunk-AKWVXRQ6.js.map
|