@tradecanvas/chart 0.4.0 → 0.5.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/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { DARK_THEME as e, DARK_THEME as t, DEFAULT_DRAWING_STYLE as n, DEFAULT_PANEL_HEIGHT as r, DEFAULT_RECONNECT as i, DEFAULT_STREAM_CONFIG as a, DEFAULT_TIMEFRAME_FAVORITES as o, DEFAULT_TRADING_CONFIG as s, LIGHT_THEME as c, LIGHT_THEME as l, LayerType as u, MARKET_CRYPTO as d, MARKET_HNX as f, MARKET_HOSE as ee, MARKET_NYSE as p, MARKET_UPCOM as te, MIN_PANEL_HEIGHT as m, PRICE_AXIS_WIDTH as h, TIMEFRAMES_CRYPTO as g, TIMEFRAMES_FOREX as _, TIMEFRAMES_STOCK as ne, TIME_AXIS_HEIGHT as v, VN_COLORS as re, computePriceLimits as ie, computePriceLimits as y, createVNTheme as ae, formatNumber as oe, formatVND as se, formatVolumeLoc as ce, getCurrentSession as le, getLocale as ue, mergeBar as de, registerLocale as fe, setLocale as pe, setLocale as me, t as b } from "@tradecanvas/commons";
2
- import { AlertManager as x, AlertManager as S, Animator as C, Animator as w, AreaRenderer as T, BarCountdown as E, BarCountdown as D, BarRenderer as O, BaseFinanceChart as k, BaselineRenderer as A, BinanceAdapter as j, CandlestickRenderer as M, ChartLegend as N, ChartLegend as P, ChartStateManager as F, ChartStateManager as I, CompareRenderer as L, CompareRenderer as R, CrosshairHandler as z, CrosshairTooltip as he, CrosshairTooltip as ge, CurrentPriceLine as _e, CurrentPriceLine as ve, DEFAULT_LEGEND_CONFIG as ye, DataExporter as be, DataExporter as B, DrawingBase as xe, DrawingManager as Se, DrawingRenderer as Ce, Easing as we, EventBus as Te, FinanceCrosshair as V, GridRenderer as Ee, HollowCandleRenderer as De, IndicatorBase as Oe, IndicatorEngine as H, InteractionManager as ke, KagiRenderer as Ae, KeyboardHandler as je, KeyboardHandler as Me, LineRenderer as Ne, MockAdapter as Pe, PanHandler as Fe, PointAndFigureRenderer as Ie, PriceAxis as Le, RenderEngine as Re, RenkoRenderer as ze, ReplayManager as Be, ReplayManager as Ve, Screenshot as He, Screenshot as U, SessionBreaks as Ue, SessionBreaks as We, StreamManager as Ge, StreamManager as Ke, TickAggregator as qe, TimeAxis as Je, TradingManager as Ye, TradingRenderer as Xe, UndoRedoManager as Ze, UndoRedoManager as Qe, Viewport as $e, VolumeRenderer as et, VolumeRenderer as tt, Watermark as nt, Watermark as rt, ZoomHandler as it, layoutSquarifiedTreemap as at, layoutUniformGrid as ot, registerBuiltInDrawingTools as st, registerBuiltInIndicators as W, renderDepthChart as ct, renderEquityCurve as lt, renderGauge as ut, renderHeatmap as dt, renderSparkline as ft, renderWaterfall as pt, toHeikinAshi as mt, toHeikinAshi as ht, toKagi as gt, toKagi as _t, toLineBreak as vt, toLineBreak as yt, toPointAndFigure as bt, toPointAndFigure as xt, toRenko as St, toRenko as Ct } from "@tradecanvas/core";
1
+ import { DARK_TERMINAL as e, DARK_THEME as t, DARK_THEME as n, DEFAULT_DRAWING_STYLE as r, DEFAULT_PANEL_HEIGHT as i, DEFAULT_RECONNECT as a, DEFAULT_STREAM_CONFIG as o, DEFAULT_TIMEFRAME_FAVORITES as s, DEFAULT_TRADING_CONFIG as c, LIGHT_THEME as l, LIGHT_THEME as u, LayerType as d, MARKET_CRYPTO as f, MARKET_HNX as ee, MARKET_HOSE as p, MARKET_NYSE as m, MARKET_UPCOM as h, MIN_PANEL_HEIGHT as g, PRICE_AXIS_WIDTH as _, TIMEFRAMES_CRYPTO as te, TIMEFRAMES_FOREX as ne, TIMEFRAMES_STOCK as re, TIME_AXIS_HEIGHT as v, VN_COLORS as ie, computePriceLimits as ae, computePriceLimits as y, createVNTheme as oe, formatNumber as se, formatVND as ce, formatVolumeLoc as le, getCurrentSession as ue, getLocale as de, mergeBar as fe, normalizeBar as pe, normalizeBarTime as me, registerLocale as b, setLocale as x, setLocale as S, t as C } from "@tradecanvas/commons";
2
+ import { AlertManager as w, AlertManager as T, Animator as E, Animator as D, AreaRenderer as O, BarCountdown as k, BarCountdown as A, BarRenderer as j, BaseFinanceChart as M, BaselineRenderer as N, BinanceAdapter as P, CandlestickRenderer as F, ChartLegend as I, ChartLegend as L, ChartStateManager as R, ChartStateManager as z, CompareRenderer as he, CompareRenderer as ge, CrosshairHandler as _e, CrosshairTooltip as ve, CrosshairTooltip as ye, CurrentPriceLine as be, CurrentPriceLine as xe, DEFAULT_LEGEND_CONFIG as Se, DataExporter as Ce, DataExporter as B, DrawingBase as we, DrawingManager as Te, DrawingRenderer as Ee, Easing as De, EventBus as Oe, FinanceCrosshair as V, GridRenderer as ke, HollowCandleRenderer as Ae, IndicatorBase as je, IndicatorEngine as H, InteractionManager as Me, KagiRenderer as Ne, KeyboardHandler as Pe, KeyboardHandler as Fe, LineRenderer as Ie, MockAdapter as Le, PanHandler as Re, PointAndFigureRenderer as ze, PriceAxis as Be, RenderEngine as Ve, RenkoRenderer as He, ReplayManager as Ue, ReplayManager as U, Screenshot as We, Screenshot as W, SessionBreaks as Ge, SessionBreaks as Ke, StreamManager as qe, StreamManager as Je, TickAggregator as Ye, TimeAxis as Xe, TradingManager as Ze, TradingRenderer as Qe, UndoRedoManager as $e, UndoRedoManager as et, Viewport as tt, VolumeRenderer as nt, VolumeRenderer as rt, Watermark as it, Watermark as at, ZoomHandler as ot, layoutSquarifiedTreemap as st, layoutUniformGrid as ct, registerBuiltInDrawingTools as lt, registerBuiltInIndicators as G, renderDepthChart as ut, renderEquityCurve as dt, renderGauge as ft, renderHeatmap as pt, renderSparkline as mt, renderWaterfall as ht, toHeikinAshi as gt, toHeikinAshi as _t, toKagi as vt, toKagi as yt, toLineBreak as bt, toLineBreak as xt, toPointAndFigure as St, toPointAndFigure as Ct, toRenko as wt, toRenko as Tt } from "@tradecanvas/core";
3
3
  //#region src/DataManager.ts
4
- function G(e) {
4
+ function K(e) {
5
5
  if (!e || typeof e.time != "number") return !1;
6
6
  let { open: t, high: n, low: r, close: i } = e;
7
7
  return !(!isFinite(t) || !isFinite(n) || !isFinite(r) || !isFinite(i) || t < 0 || n < 0 || r < 0 || i < 0 || n < r || e.volume !== void 0 && (!isFinite(e.volume) || e.volume < 0));
8
8
  }
9
- function K(e) {
9
+ function q(e) {
10
10
  return {
11
11
  ...e,
12
12
  high: Math.max(e.open, e.high, e.low, e.close),
@@ -14,20 +14,20 @@ function K(e) {
14
14
  volume: e.volume === void 0 ? 0 : Math.max(0, e.volume)
15
15
  };
16
16
  }
17
- var q = class {
17
+ var J = class {
18
18
  data = [];
19
19
  getData() {
20
20
  return this.data;
21
21
  }
22
22
  setData(e) {
23
- this.data = e.filter(G).map(K);
23
+ this.data = e.filter(K).map(q);
24
24
  }
25
25
  appendBar(e) {
26
- G(e) && this.data.push(K(e));
26
+ K(e) && this.data.push(q(e));
27
27
  }
28
28
  updateLastBar(e) {
29
- if (!G(e)) return;
30
- let t = K(e);
29
+ if (!K(e)) return;
30
+ let t = q(e);
31
31
  if (this.data.length === 0) {
32
32
  this.data.push(t);
33
33
  return;
@@ -35,7 +35,7 @@ var q = class {
35
35
  this.data[this.data.length - 1] = t;
36
36
  }
37
37
  updateLastBarFromTick(e) {
38
- this.data.length !== 0 && (!isFinite(e.price) || e.price < 0 || e.volume !== void 0 && (!isFinite(e.volume) || e.volume < 0) || (this.data[this.data.length - 1] = de(this.data[this.data.length - 1], e)));
38
+ this.data.length !== 0 && (!isFinite(e.price) || e.price < 0 || e.volume !== void 0 && (!isFinite(e.volume) || e.volume < 0) || (this.data[this.data.length - 1] = fe(this.data[this.data.length - 1], e)));
39
39
  }
40
40
  getLength() {
41
41
  return this.data.length;
@@ -43,18 +43,18 @@ var q = class {
43
43
  clear() {
44
44
  this.data = [];
45
45
  }
46
- }, J = class {
46
+ }, Y = class {
47
47
  theme;
48
48
  constructor(e) {
49
- !e || e === "dark" ? this.theme = { ...t } : e === "light" ? this.theme = { ...l } : this.theme = { ...e };
49
+ !e || e === "dark" ? this.theme = { ...n } : e === "light" ? this.theme = { ...u } : this.theme = { ...e };
50
50
  }
51
51
  getTheme() {
52
52
  return this.theme;
53
53
  }
54
54
  setTheme(e) {
55
- e === "dark" ? this.theme = { ...t } : e === "light" ? this.theme = { ...l } : this.theme = { ...e };
55
+ e === "dark" ? this.theme = { ...n } : e === "light" ? this.theme = { ...u } : this.theme = { ...e };
56
56
  }
57
- }, Y = 200, X = 80, Z = class {
57
+ }, X = 200, Z = 80, Q = class {
58
58
  panels = [];
59
59
  containerWidth = 0;
60
60
  containerHeight = 0;
@@ -62,12 +62,12 @@ var q = class {
62
62
  this.containerWidth = e, this.containerHeight = t;
63
63
  }
64
64
  addPanel(e, t = "bottom", n) {
65
- let i = t === "left" || t === "right";
65
+ let r = t === "left" || t === "right";
66
66
  this.panels.push({
67
67
  id: e,
68
68
  position: t,
69
- size: n ?? (i ? Y : r),
70
- minSize: i ? X : m,
69
+ size: n ?? (r ? X : i),
70
+ minSize: r ? Z : g,
71
71
  content: {
72
72
  type: "indicator",
73
73
  indicatorInstanceId: e
@@ -80,8 +80,8 @@ var q = class {
80
80
  setPanelPosition(e, t) {
81
81
  let n = this.panels.find((t) => t.id === e);
82
82
  if (n) {
83
- let e = n.position === "left" || n.position === "right", i = t === "left" || t === "right";
84
- n.position = t, e !== i && (n.size = i ? Y : r, n.minSize = i ? X : m);
83
+ let e = n.position === "left" || n.position === "right", r = t === "left" || t === "right";
84
+ n.position = t, e !== r && (n.size = r ? X : i, n.minSize = r ? Z : g);
85
85
  }
86
86
  }
87
87
  setPanelSize(e, t) {
@@ -95,7 +95,7 @@ var q = class {
95
95
  let e = this.panels.filter((e) => e.position === "left"), t = this.panels.filter((e) => e.position === "right"), n = this.panels.filter((e) => e.position === "top"), r = this.panels.filter((e) => e.position === "bottom"), i = e.reduce((e, t) => e + t.size, 0), a = t.reduce((e, t) => e + t.size, 0), o = n.reduce((e, t) => e + t.size, 0), s = r.reduce((e, t) => e + t.size, 0), c = {
96
96
  x: i,
97
97
  y: o,
98
- width: Math.max(0, this.containerWidth - i - a - h),
98
+ width: Math.max(0, this.containerWidth - i - a - _),
99
99
  height: Math.max(0, this.containerHeight - o - s - v)
100
100
  }, l = [], u = [], d = 0;
101
101
  for (let t of e) l.push({
@@ -154,7 +154,7 @@ var q = class {
154
154
  },
155
155
  orientation: "horizontal"
156
156
  }), f += e.size;
157
- d = i + c.width + h;
157
+ d = i + c.width + _;
158
158
  for (let e of t) l.push({
159
159
  config: e,
160
160
  rect: {
@@ -182,14 +182,14 @@ var q = class {
182
182
  getMainChartRect() {
183
183
  return this.resolve().mainChartRect;
184
184
  }
185
- }, Q = class {
185
+ }, $ = class {
186
186
  constructor(e) {
187
187
  this.indicatorEngine = e;
188
188
  }
189
189
  registerIndicator(e) {
190
190
  this.indicatorEngine.register(e);
191
191
  }
192
- }, wt = class {
192
+ }, Et = class {
193
193
  static version = "0.3.0";
194
194
  engine;
195
195
  viewport;
@@ -240,6 +240,7 @@ var q = class {
240
240
  numberLocale;
241
241
  keyboardHandler = null;
242
242
  onWindowKeyDown = null;
243
+ currentSymbol = "";
243
244
  constructor(e, t) {
244
245
  this.container = e, this.options = t, this.numberLocale = t.numberLocale ?? "en-US";
245
246
  let n = t.features ?? {};
@@ -273,19 +274,19 @@ var q = class {
273
274
  logScale: n.logScale ?? !0,
274
275
  timeframes: n.timeframes ?? [],
275
276
  defaultTimeframeFavorites: n.defaultTimeframeFavorites ?? []
276
- }, e.style.position = "relative", e.style.overflow = "hidden", e.tabIndex = 0, e.style.outline = "none", this.dataManager = new q(), this.themeManager = new J(t.theme), this.layoutManager = new Z(), this.indicatorEngine = new H(), this.pluginManager = new Q(this.indicatorEngine), this.eventBus = new Te(), W(this.indicatorEngine), this.drawingManager = new Se(), st(this.drawingManager), this.drawingRenderer = new Ce(this.drawingManager), this.drawingManager.setRequestRender(() => {
277
- this.syncRenderContext(), this.engine.requestRender(u.Overlay), this.scheduleAutoSave();
277
+ }, e.style.position = "relative", e.style.overflow = "hidden", e.tabIndex = 0, e.style.outline = "none", this.dataManager = new J(), this.themeManager = new Y(t.theme), this.layoutManager = new Q(), this.indicatorEngine = new H(), this.pluginManager = new $(this.indicatorEngine), this.eventBus = new Oe(), G(this.indicatorEngine), this.drawingManager = new Te(), lt(this.drawingManager), this.drawingRenderer = new Ee(this.drawingManager), this.drawingManager.setRequestRender(() => {
278
+ this.syncRenderContext(), this.engine.requestRender(d.Overlay), this.scheduleAutoSave();
278
279
  }), this.drawingManager.setEventCallback((e, t) => {
279
280
  this.eventBus.emit(e, t);
280
- }), this.undoRedoManager = new Qe(), this.drawingManager.setUndoRedoManager(this.undoRedoManager), this.drawingManager.setDataGetter(() => this.dataManager.getData()), this.drawingManager.setDisplayDataGetter(() => this.getDisplayData()), t.crosshair?.mode === "magnet" && this.drawingManager.setMagnetMode("magnet"), this.tradingManager = new Ye(), this.tradingRenderer = new Xe(this.tradingManager), this.tradingManager.setContainer(e), this.tradingManager.setRequestRender(() => this.engine.requestRender(u.Overlay)), this.tradingManager.setEventCallback((e, t) => {
281
+ }), this.undoRedoManager = new et(), this.drawingManager.setUndoRedoManager(this.undoRedoManager), this.drawingManager.setDataGetter(() => this.dataManager.getData()), this.drawingManager.setDisplayDataGetter(() => this.getDisplayData()), t.crosshair?.mode === "magnet" && this.drawingManager.setMagnetMode("magnet"), this.tradingManager = new Ze(), this.tradingRenderer = new Qe(this.tradingManager), this.tradingManager.setContainer(e), this.tradingManager.setRequestRender(() => this.engine.requestRender(d.Overlay)), this.tradingManager.setEventCallback((e, t) => {
281
282
  this.eventBus.emit(e, t);
282
- }), this.engine = new Re(e);
283
+ }), this.engine = new Ve(e);
283
284
  let r = this.engine.dprManager.getContainerSize();
284
- this.viewport = new $e(r.width, r.height, t.minBarSpacing ?? 2, t.maxBarSpacing ?? 30, t.rightMargin ?? 5), this.layoutManager.resize(r.width, r.height), this.engine.onContainerResize = (e) => {
285
+ this.viewport = new tt(r.width, r.height, t.minBarSpacing ?? 2, t.maxBarSpacing ?? 30, t.rightMargin ?? 5), this.layoutManager.resize(r.width, r.height), this.engine.onContainerResize = (e) => {
285
286
  if (e.width <= 0 || e.height <= 0) return;
286
287
  let t = this.viewport.isAtEnd();
287
288
  this.viewport.resize(e.width, e.height), this.layoutManager.resize(e.width, e.height), this.updateViewportAndRender(t);
288
- }, this.chartRenderer = this.createChartRenderer(t.chartType), this.gridRenderer = new Ee(), t.grid?.visible === !1 && this.gridRenderer.setVisible(!1), this.priceAxis = new Le(), this.priceAxis.setLocale(this.numberLocale), this.timeAxis = new Je(), this.crosshairHandler = new z(), this.crosshairHandler.setLocale(this.numberLocale), t.crosshair?.mode && this.crosshairHandler.setMode(t.crosshair.mode), this.crosshairHandler.setCallback((e, t) => {
289
+ }, this.chartRenderer = this.createChartRenderer(t.chartType), this.gridRenderer = new ke(), t.grid?.visible === !1 && this.gridRenderer.setVisible(!1), this.priceAxis = new Be(), this.priceAxis.setLocale(this.numberLocale), this.timeAxis = new Xe(), this.crosshairHandler = new _e(), this.crosshairHandler.setLocale(this.numberLocale), t.crosshair?.mode && this.crosshairHandler.setMode(t.crosshair.mode), this.crosshairHandler.setCallback((e, t) => {
289
290
  if (e !== null && t) {
290
291
  let n = this.dataManager.getData(), r = e < n.length ? n[e] : void 0;
291
292
  this.chartLegend.setHoverBar(r ?? null), r && this.crosshairTooltip.show(t, r, this.themeManager.getTheme(), this.cachedContainerSize()), this.eventBus.emit("crosshairMove", {
@@ -294,12 +295,12 @@ var q = class {
294
295
  barIndex: e
295
296
  });
296
297
  } else this.crosshairTooltip.hide(), this.chartLegend.setHoverBar(null);
297
- }), this.chartLegend = new P(), this.chartLegend.setChartType(t.chartType), this.watermark = new rt(), t.watermark && this.watermark.setConfig(t.watermark), this.volumeRenderer = new tt(), this.barCountdown = new D(), this.sessionBreaks = new We(), this.compareRenderer = new R(), t.sessionBreaks ? this.sessionBreaks.setConfig({
298
+ }), this.chartLegend = new L(), this.chartLegend.setChartType(t.chartType), this.watermark = new at(), t.watermark && this.watermark.setConfig(t.watermark), this.volumeRenderer = new rt(), this.barCountdown = new A(), this.sessionBreaks = new Ke(), this.compareRenderer = new ge(), t.sessionBreaks ? this.sessionBreaks.setConfig({
298
299
  visible: t.sessionBreaks.visible ?? !0,
299
300
  color: t.sessionBreaks.color,
300
301
  lineStyle: t.sessionBreaks.lineStyle,
301
302
  lineWidth: t.sessionBreaks.lineWidth
302
- }) : t.features?.sessionBreaks !== !1 && this.sessionBreaks.setVisible(!0), t.logScale && this.viewport.setLogScale(!0), this.animator = new w(), this.crosshairTooltip = new ge(), this.crosshairTooltip.create(e), this.keyboardHandler = new Me({
303
+ }) : t.features?.sessionBreaks !== !1 && this.sessionBreaks.setVisible(!0), t.logScale && this.viewport.setLogScale(!0), this.animator = new D(), this.crosshairTooltip = new ye(), this.crosshairTooltip.create(e), this.keyboardHandler = new Fe({
303
304
  scrollBars: (e) => {
304
305
  let t = this.viewport.getState().barWidth + this.viewport.getState().barSpacing;
305
306
  this.viewport.scrollBy(e * t), this.updateViewportAndRender();
@@ -319,19 +320,19 @@ var q = class {
319
320
  if (!this.keyboardHandler) return;
320
321
  let t = document.activeElement;
321
322
  t && t !== this.container && !this.container.contains(t) || t && (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.isContentEditable) || this.keyboardHandler.handleKey(e) && e.preventDefault();
322
- }, window.addEventListener("keydown", this.onWindowKeyDown), this.currentPriceLine = new ve(), this.alertManager = new S(), this.alertManager.setRequestRender(() => this.engine.requestRender(u.Overlay)), this.alertManager.on("triggered", (e) => {
323
+ }, window.addEventListener("keydown", this.onWindowKeyDown), this.currentPriceLine = new xe(), this.alertManager = new T(), this.alertManager.setRequestRender(() => this.engine.requestRender(d.Overlay)), this.alertManager.on("triggered", (e) => {
323
324
  this.eventBus.emit("dataUpdate", {
324
325
  alert: "triggered",
325
326
  alertId: e.id,
326
327
  price: e.price,
327
328
  message: e.message
328
329
  });
329
- }), this.replayManager = new Ve(), this.interactionManager = new ke(e), this.features.panning && this.interactionManager.setPanHandler(new Fe((e) => {
330
+ }), this.replayManager = new U(), this.interactionManager = new Me(e), this.features.panning && this.interactionManager.setPanHandler(new Re((e) => {
330
331
  this.viewport.scrollBy(e), this.updateViewportAndRender();
331
- })), this.features.zooming && this.interactionManager.setZoomHandler(new it((e, t) => {
332
+ })), this.features.zooming && this.interactionManager.setZoomHandler(new ot((e, t) => {
332
333
  this.viewport.zoom(e, t), this.updateViewportAndRender();
333
334
  })), this.features.crosshair && this.interactionManager.setCrosshairHandler(this.crosshairHandler), this.features.drawings && this.interactionManager.setDrawingManager(this.drawingManager, () => this.viewport.getState()), this.features.trading && this.interactionManager.setTradingManager(this.tradingManager, () => this.viewport.getState()), this.interactionManager.setOverlayDirtyCallback(() => {
334
- this.engine.requestRender(u.Overlay), this.layoutManager.getPanels().length > 0 && this.engine.requestRender(u.UI);
335
+ this.engine.requestRender(d.Overlay), this.layoutManager.getPanels().length > 0 && this.engine.requestRender(d.UI);
335
336
  }), this.interactionManager.attach(), this.syncRenderContext(), this.engine.start();
336
337
  }
337
338
  setData(e) {
@@ -340,6 +341,12 @@ var q = class {
340
341
  appendBar(e) {
341
342
  this.dataManager.appendBar(e), this.crosshairHandler.setData(this.dataManager.getData()), this.displayDataCache = null, this.autoScrollOnNewBar && this.viewport.scrollToEnd(), this.indicatorEngine.recalculateAll(this.dataManager.getData()), this.updateViewportAndRender();
342
343
  }
344
+ appendBars(e) {
345
+ if (e.length !== 0) {
346
+ for (let t of e) this.dataManager.appendBar(t);
347
+ this.displayDataCache = null, this.indicatorEngine.recalculateAll(this.dataManager.getData()), this.crosshairHandler.setData(this.dataManager.getData()), this.updateViewportAndRender(this.viewport.isAtEnd());
348
+ }
349
+ }
343
350
  updateLastBar(e) {
344
351
  this.dataManager.updateLastBar(e), this.currentPriceLine.setPrice(e.close), this.options.chartType !== "candlestick" && this.options.chartType !== "line" && this.options.chartType !== "area" && this.options.chartType !== "bar" && this.options.chartType !== "hollowCandle" && (this.displayDataCache = null), this.indicatorEngine.recalculateAll(this.dataManager.getData()), this.scheduleRender();
345
352
  }
@@ -372,7 +379,7 @@ var q = class {
372
379
  }
373
380
  static indicators() {
374
381
  let e = new H();
375
- return W(e), e.getAvailableIndicators();
382
+ return G(e), e.getAvailableIndicators();
376
383
  }
377
384
  setPanelPosition(e, t) {
378
385
  this.layoutManager.setPanelPosition(e, t), this.engine.requestRender();
@@ -498,42 +505,46 @@ var q = class {
498
505
  setDepthData(e) {
499
506
  this.features.trading && this.tradingManager.setDepthData(e);
500
507
  }
501
- setCurrentPrice(e) {
508
+ setCurrentPrice(e, t) {
502
509
  this.tradingManager.setCurrentPrice(e), this.currentPriceLine.setPrice(e), this.scheduleRender(), this.features.alerts && this.alertManager.checkPrice(e);
503
510
  }
504
511
  setTradingConfig(e) {
505
512
  this.features.trading && this.tradingManager.setConfig(e);
506
513
  }
507
514
  async connect(e) {
508
- this.disconnectStream(), this.streamManager = new Ke(), this.streamManager.on("snapshot", (e) => {
515
+ this.disconnectStream(), this.streamManager = new Je(), this.streamManager.on("snapshot", (e) => {
509
516
  this.setData(e);
510
517
  }), this.streamManager.on("barClose", (e) => {
511
518
  this.dataManager.appendBar(e), this.crosshairHandler.setData(this.dataManager.getData()), this.autoScrollOnNewBar && this.viewport.scrollToEnd(), this.indicatorEngine.recalculateAll(this.dataManager.getData()), this.updateViewportAndRender();
512
519
  }), this.streamManager.on("barUpdate", (e) => {
513
520
  this.dataManager.updateLastBar(e), this.currentPriceLine.setPrice(e.close), this.indicatorEngine.recalculateAll(this.dataManager.getData()), this.scheduleRender();
514
521
  }), this.streamManager.on("priceChange", ({ price: e }) => {
515
- this.tradingManager.setCurrentPrice(e), this.currentPriceLine.setPrice(e), this.engine.requestRender(u.Overlay), this.engine.requestRender(u.UI);
522
+ this.tradingManager.setCurrentPrice(e), this.currentPriceLine.setPrice(e), this.engine.requestRender(d.Overlay), this.engine.requestRender(d.UI);
516
523
  }), this.streamManager.on("connectionChange", (e) => {
517
524
  this.eventBus.emit("dataUpdate", { connection: e });
518
525
  }), this.streamManager.on("error", (e) => {
519
526
  this.eventBus.emit("dataUpdate", { error: e.message });
520
- }), this.autoScrollOnNewBar = e.autoScroll !== !1, await this.streamManager.connect(e);
527
+ }), this.autoScrollOnNewBar = e.autoScroll !== !1, this.currentSymbol = e.symbol, await this.streamManager.connect(e);
521
528
  let t = this.timeframeToMs(e.timeframe);
522
529
  this.barCountdown.setTimeframeMs(t), this.countdownInterval && clearInterval(this.countdownInterval), this.countdownInterval = setInterval(() => {
523
- this.barCountdown.isVisible() && this.engine.requestRender(u.UI);
530
+ this.barCountdown.isVisible() && this.engine.requestRender(d.UI);
524
531
  }, 1e3);
525
532
  }
526
533
  async switchStream(e, t) {
527
- this.streamManager && await this.streamManager.switchTo(e, t);
534
+ this.streamManager && (this.currentSymbol = e, await this.streamManager.switchTo(e, t));
535
+ }
536
+ async setTimeframe(e) {
537
+ if (!this.streamManager) throw Error("No active stream. Call connect() first.");
538
+ await this.switchStream(this.currentSymbol, e);
528
539
  }
529
540
  disconnectStream() {
530
541
  this.streamManager &&= (this.streamManager.dispose(), null);
531
542
  }
532
543
  setBarCountdownVisible(e) {
533
- this.barCountdown.setVisible(e), this.engine.requestRender(u.UI);
544
+ this.barCountdown.setVisible(e), this.engine.requestRender(d.UI);
534
545
  }
535
546
  setSessionBreaksVisible(e) {
536
- this.sessionBreaks.setVisible(e), this.engine.requestRender(u.Background);
547
+ this.sessionBreaks.setVisible(e), this.engine.requestRender(d.Background);
537
548
  }
538
549
  addCompareSymbol(e, t, n, r) {
539
550
  this.compareRenderer.addSymbol({
@@ -542,19 +553,19 @@ var q = class {
542
553
  data: n,
543
554
  color: r,
544
555
  visible: !0
545
- }), this.engine.requestRender(u.Main);
556
+ }), this.engine.requestRender(d.Main);
546
557
  }
547
558
  removeCompareSymbol(e) {
548
- this.compareRenderer.removeSymbol(e), this.engine.requestRender(u.Main);
559
+ this.compareRenderer.removeSymbol(e), this.engine.requestRender(d.Main);
549
560
  }
550
561
  updateCompareData(e, t) {
551
- this.compareRenderer.setSymbolData(e, t), this.engine.requestRender(u.Main);
562
+ this.compareRenderer.setSymbolData(e, t), this.engine.requestRender(d.Main);
552
563
  }
553
564
  setCompareMode(e) {
554
- this.compareRenderer.setMode(e), this.engine.requestRender(u.Main);
565
+ this.compareRenderer.setMode(e), this.engine.requestRender(d.Main);
555
566
  }
556
567
  clearCompareSymbols() {
557
- this.compareRenderer.clear(), this.engine.requestRender(u.Main);
568
+ this.compareRenderer.clear(), this.engine.requestRender(d.Main);
558
569
  }
559
570
  setLogScale(e) {
560
571
  this.viewport.setLogScale(e), this.updateViewportAndRender();
@@ -563,7 +574,7 @@ var q = class {
563
574
  return this.viewport.isLogScale();
564
575
  }
565
576
  setSessionBreaksConfig(e) {
566
- this.sessionBreaks.setConfig(e), this.engine.requestRender(u.Background);
577
+ this.sessionBreaks.setConfig(e), this.engine.requestRender(d.Background);
567
578
  }
568
579
  getConnectionState() {
569
580
  return this.streamManager?.getConnectionState() ?? "disconnected";
@@ -639,7 +650,7 @@ var q = class {
639
650
  this.watermark.setConfig({
640
651
  text: e,
641
652
  ...t
642
- }), this.engine.requestRender(u.Background);
653
+ }), this.engine.requestRender(d.Background);
643
654
  }
644
655
  setAutoScale(e) {
645
656
  this.options.autoScale = e, this.updateViewportAndRender();
@@ -648,37 +659,40 @@ var q = class {
648
659
  return this.options.autoScale !== !1;
649
660
  }
650
661
  setCrosshairMode(e) {
651
- this.crosshairHandler.setMode(e), this.engine.requestRender(u.Overlay);
662
+ this.crosshairHandler.setMode(e), this.engine.requestRender(d.Overlay);
652
663
  }
653
664
  getCrosshairMode() {
654
665
  return this.crosshairHandler.getMode();
655
666
  }
656
667
  setGridVisible(e) {
657
- this.gridRenderer.setVisible(e), this.engine.requestRender(u.Background);
668
+ this.gridRenderer.setVisible(e), this.engine.requestRender(d.Background);
658
669
  }
659
670
  isGridVisible() {
660
671
  return this.gridRenderer.isVisible();
661
672
  }
662
673
  setVolumeVisible(e) {
663
- this.volumeRenderer.setVisible(e), this.engine.requestRender(u.Main);
674
+ this.volumeRenderer.setVisible(e), this.engine.requestRender(d.Main);
664
675
  }
665
676
  setTooltipVisible(e) {
666
677
  e || this.crosshairTooltip.hide();
667
678
  }
668
679
  setLegend(e) {
669
- this.chartLegend.setConfig(e), this.engine.requestRender(u.UI);
680
+ this.chartLegend.setConfig(e), this.engine.requestRender(d.UI);
670
681
  }
671
682
  setSymbolName(e) {
672
- this.chartLegend.setSymbol(e), this.engine.requestRender(u.UI);
683
+ this.chartLegend.setSymbol(e), this.engine.requestRender(d.UI);
684
+ }
685
+ setStatusText(e) {
686
+ this.chartLegend.setStatusText(e), this.engine.requestRender(d.UI);
673
687
  }
674
688
  screenshot(e) {
675
- this.features.screenshot && U.download(this.container, e, this.themeManager.getTheme().background);
689
+ this.features.screenshot && W.download(this.container, e, this.themeManager.getTheme().background);
676
690
  }
677
691
  screenshotDataURL() {
678
- return this.features.screenshot ? U.toDataURL(this.container, this.themeManager.getTheme().background) : null;
692
+ return this.features.screenshot ? W.toDataURL(this.container, this.themeManager.getTheme().background) : null;
679
693
  }
680
694
  async screenshotBlob() {
681
- return this.features.screenshot ? U.toBlob(this.container, this.themeManager.getTheme().background) : null;
695
+ return this.features.screenshot ? W.toBlob(this.container, this.themeManager.getTheme().background) : null;
682
696
  }
683
697
  addAlert(e, t = "crossing", n) {
684
698
  if (!this.features.alerts) return null;
@@ -698,7 +712,7 @@ var q = class {
698
712
  this.alertManager.saveToStorage(e);
699
713
  }
700
714
  loadAlerts(e) {
701
- this.alertManager.loadFromStorage(e), this.engine.requestRender(u.Overlay);
715
+ this.alertManager.loadFromStorage(e), this.engine.requestRender(d.Overlay);
702
716
  }
703
717
  replay(e) {
704
718
  if (!this.features.replay) return;
@@ -731,16 +745,16 @@ var q = class {
731
745
  }
732
746
  saveState(e) {
733
747
  if (!this.features.saveLoad) return null;
734
- let t = I.capture({
748
+ let t = z.capture({
735
749
  getDrawings: () => this.getDrawings(),
736
750
  getTheme: () => this.getTheme(),
737
751
  getAlerts: () => this.getAlerts()
738
- }, { chartType: this.options.chartType }), n = I.serialize(t);
739
- return e && I.saveToStorage(e, t), n;
752
+ }, { chartType: this.options.chartType }), n = z.serialize(t);
753
+ return e && z.saveToStorage(e, t), n;
740
754
  }
741
755
  loadState(e) {
742
756
  if (!this.features.saveLoad) return;
743
- let t = I.deserialize(e);
757
+ let t = z.deserialize(e);
744
758
  if (t.chartType && this.setChartType(t.chartType), t.drawings && this.setDrawings(t.drawings), t.theme && this.setTheme(t.theme), t.alerts) {
745
759
  this.clearAlerts();
746
760
  for (let e of t.alerts) this.addAlert(e.price, e.condition, e.message);
@@ -748,25 +762,25 @@ var q = class {
748
762
  }
749
763
  loadStateFromStorage(e) {
750
764
  if (!this.features.saveLoad) return !1;
751
- let t = I.loadFromStorage(e);
752
- return t ? (this.loadState(I.serialize(t)), !0) : !1;
765
+ let t = z.loadFromStorage(e);
766
+ return t ? (this.loadState(z.serialize(t)), !0) : !1;
753
767
  }
754
768
  downloadState(e) {
755
769
  if (!this.features.saveLoad) return;
756
- let t = I.capture({
770
+ let t = z.capture({
757
771
  getDrawings: () => this.getDrawings(),
758
772
  getTheme: () => this.getTheme(),
759
773
  getAlerts: () => this.getAlerts()
760
774
  }, { chartType: this.options.chartType });
761
- I.downloadFile(t, e);
775
+ z.downloadFile(t, e);
762
776
  }
763
777
  async loadStateFromFile() {
764
778
  if (!this.features.saveLoad) return;
765
- let e = await I.loadFromFile();
766
- this.loadState(I.serialize(e));
779
+ let e = await z.loadFromFile();
780
+ this.loadState(z.serialize(e));
767
781
  }
768
782
  setLocale(e) {
769
- me(e), this.engine.requestRender();
783
+ S(e), this.engine.requestRender();
770
784
  }
771
785
  setNumberLocale(e) {
772
786
  this.numberLocale = e, this.priceAxis.setLocale(e), this.crosshairHandler.setLocale(e), this.syncRenderContext(), this.engine.requestRender();
@@ -802,7 +816,7 @@ var q = class {
802
816
  return this.features;
803
817
  }
804
818
  setFeatures(e) {
805
- Object.assign(this.features, e), e.crosshair === !1 && this.crosshairTooltip.hide(), e.grid !== void 0 && this.engine.requestRender(u.Background), e.volume !== void 0 && (this.volumeRenderer.setVisible(e.volume), this.engine.requestRender(u.Main)), e.drawings === !1 && this.drawingManager.setActiveTool(null), e.trading === !1 && (this.tradingManager.setOrders([]), this.tradingManager.setPositions([])), e.keyboard !== void 0 && this.keyboardHandler?.setEnabled(e.keyboard), this.engine.requestRender();
819
+ Object.assign(this.features, e), e.crosshair === !1 && this.crosshairTooltip.hide(), e.grid !== void 0 && this.engine.requestRender(d.Background), e.volume !== void 0 && (this.volumeRenderer.setVisible(e.volume), this.engine.requestRender(d.Main)), e.drawings === !1 && this.drawingManager.setActiveTool(null), e.trading === !1 && (this.tradingManager.setOrders([]), this.tradingManager.setPositions([])), e.keyboard !== void 0 && this.keyboardHandler?.setEnabled(e.keyboard), this.engine.requestRender();
806
820
  }
807
821
  resize() {
808
822
  let e = this.engine.dprManager.readContainerSize();
@@ -818,18 +832,18 @@ var q = class {
818
832
  }
819
833
  createChartRenderer(e) {
820
834
  switch (e) {
821
- case "candlestick": return new M();
822
- case "heikinAshi": return new M();
823
- case "line": return new Ne();
824
- case "area": return new T();
825
- case "bar": return new O();
826
- case "hollowCandle": return new De();
827
- case "baseline": return new A();
828
- case "renko": return new ze();
829
- case "lineBreak": return new M();
830
- case "kagi": return new Ae();
831
- case "pointAndFigure": return new Ie();
832
- default: return new M();
835
+ case "candlestick": return new F();
836
+ case "heikinAshi": return new F();
837
+ case "line": return new Ie();
838
+ case "area": return new O();
839
+ case "bar": return new j();
840
+ case "hollowCandle": return new Ae();
841
+ case "baseline": return new N();
842
+ case "renko": return new He();
843
+ case "lineBreak": return new F();
844
+ case "kagi": return new Ne();
845
+ case "pointAndFigure": return new ze();
846
+ default: return new F();
833
847
  }
834
848
  }
835
849
  getDisplayData() {
@@ -839,23 +853,23 @@ var q = class {
839
853
  let t;
840
854
  switch (this.options.chartType) {
841
855
  case "heikinAshi":
842
- t = ht(e);
856
+ t = _t(e);
843
857
  break;
844
858
  case "renko":
845
- t = Ct(e, {
859
+ t = Tt(e, {
846
860
  brickSize: 0,
847
861
  useATR: !0,
848
862
  atrPeriod: 14
849
863
  });
850
864
  break;
851
865
  case "lineBreak":
852
- t = yt(e, 3);
866
+ t = xt(e, 3);
853
867
  break;
854
868
  case "kagi":
855
- t = _t(e, 4);
869
+ t = yt(e, 4);
856
870
  break;
857
871
  case "pointAndFigure":
858
- t = xt(e, e.reduce((e, t) => e + t.close, 0) / e.length * .01, 3);
872
+ t = Ct(e, e.reduce((e, t) => e + t.close, 0) / e.length * .01, 3);
859
873
  break;
860
874
  default: t = e;
861
875
  }
@@ -984,13 +998,13 @@ var q = class {
984
998
  } : void 0
985
999
  } : null;
986
1000
  }
987
- }, Tt = class extends k {
1001
+ }, Dt = class extends M {
988
1002
  options;
989
1003
  constructor(e, t) {
990
1004
  super(e, t.theme), this.options = t, this.requestRender();
991
1005
  }
992
1006
  renderChart(e, t, n, r) {
993
- ft(e, t, n, this.options, r);
1007
+ mt(e, t, n, this.options, r);
994
1008
  }
995
1009
  update(e) {
996
1010
  this.options = {
@@ -1004,7 +1018,7 @@ var q = class {
1004
1018
  ...e
1005
1019
  }, this.requestRender();
1006
1020
  }
1007
- }, $ = class extends k {
1021
+ }, Ot = class extends M {
1008
1022
  options;
1009
1023
  crosshair = null;
1010
1024
  constructor(e, t) {
@@ -1012,7 +1026,7 @@ var q = class {
1012
1026
  }
1013
1027
  renderChart(e, t, n, r) {
1014
1028
  let i = this.crosshair?.getPosition() ?? null;
1015
- ct(e, t, n, this.options, r, i);
1029
+ ut(e, t, n, this.options, r, i);
1016
1030
  }
1017
1031
  update(e) {
1018
1032
  this.options = {
@@ -1029,7 +1043,7 @@ var q = class {
1029
1043
  destroy() {
1030
1044
  this.crosshair?.destroy(), super.destroy();
1031
1045
  }
1032
- }, Et = class extends k {
1046
+ }, kt = class extends M {
1033
1047
  options;
1034
1048
  crosshair = null;
1035
1049
  constructor(e, t) {
@@ -1037,7 +1051,7 @@ var q = class {
1037
1051
  }
1038
1052
  renderChart(e, t, n, r) {
1039
1053
  let i = this.crosshair?.getPosition() ?? null;
1040
- lt(e, t, n, this.options, r, i);
1054
+ dt(e, t, n, this.options, r, i);
1041
1055
  }
1042
1056
  update(e, t) {
1043
1057
  this.options = {
@@ -1057,7 +1071,7 @@ var q = class {
1057
1071
  destroy() {
1058
1072
  this.crosshair?.destroy(), super.destroy();
1059
1073
  }
1060
- }, Dt = class extends k {
1074
+ }, At = class extends M {
1061
1075
  options;
1062
1076
  crosshair = null;
1063
1077
  cachedRects = [];
@@ -1078,10 +1092,10 @@ var q = class {
1078
1092
  width: this.width,
1079
1093
  height: this.height
1080
1094
  }, t = this.options.cellPadding ?? 2;
1081
- this.lastLayoutWidth = this.width, this.lastLayoutHeight = this.height, this.options.weighted ? this.cachedRects = at(this.currentData.map((e) => ({
1095
+ this.lastLayoutWidth = this.width, this.lastLayoutHeight = this.height, this.options.weighted ? this.cachedRects = st(this.currentData.map((e) => ({
1082
1096
  id: e.id,
1083
1097
  weight: e.weight ?? (Math.abs(e.value) || 1)
1084
- })), e, t) : this.cachedRects = ot(this.currentData.map((e) => ({ id: e.id })), e, t);
1098
+ })), e, t) : this.cachedRects = ct(this.currentData.map((e) => ({ id: e.id })), e, t);
1085
1099
  }
1086
1100
  onCanvasClick(e, t) {
1087
1101
  if (this.options.onCellClick) for (let n of this.cachedRects) {
@@ -1096,7 +1110,7 @@ var q = class {
1096
1110
  renderChart(e, t, n, r) {
1097
1111
  (t !== this.lastLayoutWidth || n !== this.lastLayoutHeight) && this.recomputeLayout();
1098
1112
  let i = this.crosshair?.getPosition() ?? null;
1099
- dt(e, t, n, this.currentData, this.cachedRects, this.options, r, i);
1113
+ pt(e, t, n, this.currentData, this.cachedRects, this.options, r, i);
1100
1114
  }
1101
1115
  update(e) {
1102
1116
  this.currentData = e, this.options = {
@@ -1113,7 +1127,7 @@ var q = class {
1113
1127
  destroy() {
1114
1128
  this.crosshair?.destroy(), this.handleClick && this.canvas.removeEventListener("click", this.handleClick), super.destroy();
1115
1129
  }
1116
- }, Ot = class extends k {
1130
+ }, jt = class extends M {
1117
1131
  options;
1118
1132
  crosshair = null;
1119
1133
  constructor(e, t) {
@@ -1121,7 +1135,7 @@ var q = class {
1121
1135
  }
1122
1136
  renderChart(e, t, n, r) {
1123
1137
  let i = this.crosshair?.getPosition() ?? null;
1124
- pt(e, t, n, this.options, r, i);
1138
+ ht(e, t, n, this.options, r, i);
1125
1139
  }
1126
1140
  update(e) {
1127
1141
  this.options = {
@@ -1138,12 +1152,12 @@ var q = class {
1138
1152
  destroy() {
1139
1153
  this.crosshair?.destroy(), super.destroy();
1140
1154
  }
1141
- }, kt = 500;
1142
- function At(e) {
1155
+ }, Mt = 500;
1156
+ function Nt(e) {
1143
1157
  let t = 1 - e;
1144
1158
  return 1 - t * t * t;
1145
1159
  }
1146
- var jt = class extends k {
1160
+ var Pt = class extends M {
1147
1161
  options;
1148
1162
  currentValue;
1149
1163
  targetValue;
@@ -1154,7 +1168,7 @@ var jt = class extends k {
1154
1168
  super(e, t.theme), this.options = t, this.currentValue = t.value, this.targetValue = t.value, this.requestRender();
1155
1169
  }
1156
1170
  renderChart(e, t, n, r) {
1157
- ut(e, t, n, this.options, r, this.currentValue);
1171
+ ft(e, t, n, this.options, r, this.currentValue);
1158
1172
  }
1159
1173
  setValue(e) {
1160
1174
  if (this.options.animate === !1) {
@@ -1184,7 +1198,7 @@ var jt = class extends k {
1184
1198
  if (this.animationFrameId !== null) return;
1185
1199
  let e = () => {
1186
1200
  if (this.animationFrameId = null, this.animationStart === null) return;
1187
- let t = this.options.animationDuration ?? kt, n = performance.now() - this.animationStart, r = Math.min(1, n / Math.max(1, t)), i = At(r);
1201
+ let t = this.options.animationDuration ?? Mt, n = performance.now() - this.animationStart, r = Math.min(1, n / Math.max(1, t)), i = Nt(r);
1188
1202
  this.currentValue = this.animationFrom + (this.targetValue - this.animationFrom) * i, this.requestRender(), r < 1 ? this.animationFrameId = requestAnimationFrame(e) : (this.currentValue = this.targetValue, this.animationStart = null);
1189
1203
  };
1190
1204
  this.animationFrameId = requestAnimationFrame(e);
@@ -1197,6 +1211,6 @@ var jt = class extends k {
1197
1211
  }
1198
1212
  };
1199
1213
  //#endregion
1200
- export { x as AlertManager, C as Animator, E as BarCountdown, j as BinanceAdapter, wt as Chart, N as ChartLegend, F as ChartStateManager, L as CompareRenderer, he as CrosshairTooltip, _e as CurrentPriceLine, e as DARK_THEME, n as DEFAULT_DRAWING_STYLE, ye as DEFAULT_LEGEND_CONFIG, i as DEFAULT_RECONNECT, a as DEFAULT_STREAM_CONFIG, o as DEFAULT_TIMEFRAME_FAVORITES, s as DEFAULT_TRADING_CONFIG, be as DataExporter, q as DataManager, $ as DepthChart, xe as DrawingBase, we as Easing, Et as EquityCurveChart, jt as GaugeChart, Dt as HeatmapChart, Oe as IndicatorBase, je as KeyboardHandler, c as LIGHT_THEME, Z as LayoutManager, d as MARKET_CRYPTO, f as MARKET_HNX, ee as MARKET_HOSE, p as MARKET_NYSE, te as MARKET_UPCOM, Pe as MockAdapter, Q as PluginManager, Be as ReplayManager, He as Screenshot, Ue as SessionBreaks, Tt as SparklineChart, Ge as StreamManager, g as TIMEFRAMES_CRYPTO, _ as TIMEFRAMES_FOREX, ne as TIMEFRAMES_STOCK, J as ThemeManager, qe as TickAggregator, Ze as UndoRedoManager, re as VN_COLORS, et as VolumeRenderer, Ot as WaterfallChart, nt as Watermark, ie as computePriceLimits, ae as createVNTheme, oe as formatNumber, se as formatVND, ce as formatVolumeLoc, le as getCurrentSession, ue as getLocale, fe as registerLocale, pe as setLocale, b as t, mt as toHeikinAshi, gt as toKagi, vt as toLineBreak, bt as toPointAndFigure, St as toRenko };
1214
+ export { w as AlertManager, E as Animator, k as BarCountdown, P as BinanceAdapter, Et as Chart, I as ChartLegend, R as ChartStateManager, he as CompareRenderer, ve as CrosshairTooltip, be as CurrentPriceLine, e as DARK_TERMINAL, t as DARK_THEME, r as DEFAULT_DRAWING_STYLE, Se as DEFAULT_LEGEND_CONFIG, a as DEFAULT_RECONNECT, o as DEFAULT_STREAM_CONFIG, s as DEFAULT_TIMEFRAME_FAVORITES, c as DEFAULT_TRADING_CONFIG, Ce as DataExporter, J as DataManager, Ot as DepthChart, we as DrawingBase, De as Easing, kt as EquityCurveChart, Pt as GaugeChart, At as HeatmapChart, je as IndicatorBase, Pe as KeyboardHandler, l as LIGHT_THEME, Q as LayoutManager, f as MARKET_CRYPTO, ee as MARKET_HNX, p as MARKET_HOSE, m as MARKET_NYSE, h as MARKET_UPCOM, Le as MockAdapter, $ as PluginManager, Ue as ReplayManager, We as Screenshot, Ge as SessionBreaks, Dt as SparklineChart, qe as StreamManager, te as TIMEFRAMES_CRYPTO, ne as TIMEFRAMES_FOREX, re as TIMEFRAMES_STOCK, Y as ThemeManager, Ye as TickAggregator, $e as UndoRedoManager, ie as VN_COLORS, nt as VolumeRenderer, jt as WaterfallChart, it as Watermark, ae as computePriceLimits, oe as createVNTheme, se as formatNumber, ce as formatVND, le as formatVolumeLoc, ue as getCurrentSession, de as getLocale, pe as normalizeBar, me as normalizeBarTime, b as registerLocale, x as setLocale, C as t, gt as toHeikinAshi, vt as toKagi, bt as toLineBreak, St as toPointAndFigure, wt as toRenko };
1201
1215
 
1202
1216
  //# sourceMappingURL=index.js.map