@tradecanvas/commons 1.19.1 → 1.20.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
@@ -356,7 +356,7 @@ function xe(e) {
356
356
  second: "numeric"
357
357
  }), ye.set(e, t)), t;
358
358
  }
359
- function Se(e) {
359
+ function b(e) {
360
360
  if (!e) return !1;
361
361
  try {
362
362
  return xe(e), !0;
@@ -364,15 +364,15 @@ function Se(e) {
364
364
  return !1;
365
365
  }
366
366
  }
367
- function b(e, t) {
367
+ function x(e, t) {
368
368
  if (!Number.isFinite(t) || ve.has(e)) return 0;
369
369
  let n = be.get(e);
370
370
  n || (n = /* @__PURE__ */ new Map(), be.set(e, n));
371
371
  let r = Math.floor(t / v), i = n.get(r);
372
- return i || (i = Ce(e, r * v), n.size >= _e && n.clear(), n.set(r, i)), t < i.change ? i.before : i.after;
372
+ return i || (i = Se(e, r * v), n.size >= _e && n.clear(), n.set(r, i)), t < i.change ? i.before : i.after;
373
373
  }
374
- function Ce(e, t) {
375
- let n = x(e, t), r = t + v - _, i = x(e, r);
374
+ function Se(e, t) {
375
+ let n = S(e, t), r = t + v - _, i = S(e, r);
376
376
  if (i === n) return {
377
377
  before: n,
378
378
  change: Infinity,
@@ -381,7 +381,7 @@ function Ce(e, t) {
381
381
  let a = t;
382
382
  for (; r - a > _;) {
383
383
  let t = a + Math.floor((r - a) / _ / 2) * _;
384
- x(e, t) === n ? a = t : r = t;
384
+ S(e, t) === n ? a = t : r = t;
385
385
  }
386
386
  return {
387
387
  before: n,
@@ -389,7 +389,7 @@ function Ce(e, t) {
389
389
  after: i
390
390
  };
391
391
  }
392
- function x(e, t) {
392
+ function S(e, t) {
393
393
  let n = Math.floor(t / _), r = `${e}|${n}`, i = y.get(r);
394
394
  if (i !== void 0) return i;
395
395
  let a = n * _, o = 1970, s = 1, c = 1, l = 0, u = 0, d = 0;
@@ -419,18 +419,18 @@ function x(e, t) {
419
419
  let f = Math.round((Date.UTC(o, s - 1, c, l, u, d) - a) / h);
420
420
  return y.size >= ge && y.clear(), y.set(r, f), f;
421
421
  }
422
- function S(e, t) {
423
- return e === null ? -new Date(t).getTimezoneOffset() : typeof e == "number" ? e : b(e, t);
424
- }
425
- function we(e, t) {
426
- let n = e - S(t, e - g) * h;
427
- if (n + S(t, n) * h === e) return n;
428
- let r = e - S(t, e + g) * h;
429
- return r + S(t, r) * h === e ? r : n;
422
+ function C(e, t) {
423
+ return e === null ? -new Date(t).getTimezoneOffset() : typeof e == "number" ? e : x(e, t);
430
424
  }
431
- var Te = /* @__PURE__ */ new Map();
432
- function Ee(e, t, n) {
433
- let r = `${e}|${JSON.stringify(t)}|${n === null ? "local" : typeof n == "number" ? `fixed:${n}` : n}`, i = Te.get(r);
425
+ function Ce(e, t) {
426
+ let n = e - C(t, e - g) * h;
427
+ if (n + C(t, n) * h === e) return n;
428
+ let r = e - C(t, e + g) * h;
429
+ return r + C(t, r) * h === e ? r : n;
430
+ }
431
+ var we = /* @__PURE__ */ new Map();
432
+ function Te(e, t, n) {
433
+ let r = `${e}|${JSON.stringify(t)}|${n === null ? "local" : typeof n == "number" ? `fixed:${n}` : n}`, i = we.get(r);
434
434
  if (i) return i;
435
435
  let a = n === null ? void 0 : typeof n == "number" ? "UTC" : n, o;
436
436
  try {
@@ -445,11 +445,11 @@ function Ee(e, t, n) {
445
445
  });
446
446
  }
447
447
  let s = typeof n == "number" ? n * h : 0;
448
- return i = (e) => o.format(new Date(e + s)), Te.set(r, i), i;
448
+ return i = (e) => o.format(new Date(e + s)), we.set(r, i), i;
449
449
  }
450
450
  //#endregion
451
451
  //#region src/utils/time.ts
452
- var De = {
452
+ var Ee = {
453
453
  "1s": 1e3,
454
454
  "5s": 5e3,
455
455
  "15s": 15e3,
@@ -476,16 +476,16 @@ var De = {
476
476
  "3M": 7776e6,
477
477
  "6M": 15552e6,
478
478
  "12M": 31536e6
479
- }, C = {
479
+ }, w = {
480
480
  s: 1e3,
481
481
  m: 6e4,
482
482
  h: 36e5,
483
483
  d: 864e5,
484
484
  w: 6048e5,
485
485
  M: 2592e6
486
- }, Oe = /^([1-9]\d*)([smhdwM])$/;
487
- function w(e) {
488
- let t = Oe.exec(e);
486
+ }, De = /^([1-9]\d*)([smhdwM])$/;
487
+ function T(e) {
488
+ let t = De.exec(e);
489
489
  if (!t) return null;
490
490
  let n = Number(t[1]);
491
491
  return Number.isSafeInteger(n) ? {
@@ -493,24 +493,24 @@ function w(e) {
493
493
  unit: t[2]
494
494
  } : null;
495
495
  }
496
- var ke = 1e6;
497
- function Ae(e) {
496
+ var Oe = 1e6;
497
+ function ke(e) {
498
498
  let t = /^([1-9]\d*)T$/.exec(e);
499
499
  if (!t) return null;
500
500
  let n = Number(t[1]);
501
- return Number.isSafeInteger(n) && n <= ke ? n : null;
501
+ return Number.isSafeInteger(n) && n <= Oe ? n : null;
502
502
  }
503
- function je(e) {
504
- return w(e) !== null;
503
+ function Ae(e) {
504
+ return T(e) !== null;
505
505
  }
506
- function T(e) {
507
- let t = De[e];
506
+ function E(e) {
507
+ let t = Ee[e];
508
508
  if (t !== void 0) return t;
509
- let n = w(e);
510
- return n ? n.count * C[n.unit] : NaN;
509
+ let n = T(e);
510
+ return n ? n.count * w[n.unit] : NaN;
511
511
  }
512
- function Me(e, t) {
513
- let n = new Date(e), r = T(t);
512
+ function je(e, t) {
513
+ let n = new Date(e), r = E(t);
514
514
  return r >= 864e5 ? n.toLocaleDateString(void 0, {
515
515
  month: "short",
516
516
  day: "numeric"
@@ -523,11 +523,11 @@ function Me(e, t) {
523
523
  second: "2-digit"
524
524
  });
525
525
  }
526
- function Ne(e, t) {
527
- let n = T(t);
526
+ function Me(e, t) {
527
+ let n = E(t);
528
528
  return Math.floor(e / n) * n;
529
529
  }
530
- function Pe(e, t) {
530
+ function Ne(e, t) {
531
531
  if (t === null) {
532
532
  let t = new Date(e);
533
533
  return {
@@ -538,7 +538,7 @@ function Pe(e, t) {
538
538
  minutes: t.getMinutes()
539
539
  };
540
540
  }
541
- let n = new Date(e + S(t, e) * 6e4);
541
+ let n = new Date(e + C(t, e) * 6e4);
542
542
  return {
543
543
  year: n.getUTCFullYear(),
544
544
  month: n.getUTCMonth() + 1,
@@ -547,11 +547,11 @@ function Pe(e, t) {
547
547
  minutes: n.getUTCMinutes()
548
548
  };
549
549
  }
550
- function Fe(e) {
550
+ function Pe(e) {
551
551
  return e.hours === 0 && e.minutes === 0;
552
552
  }
553
- var Ie = 20 * 36e5;
554
- function Le(e) {
553
+ var Fe = 20 * 36e5;
554
+ function Ie(e) {
555
555
  let t = Math.min(e.length, 64);
556
556
  if (t < 2) return;
557
557
  let n = (e) => e > 0xe8d4a51000 ? e : e * 1e3, r = Infinity;
@@ -559,44 +559,44 @@ function Le(e) {
559
559
  let t = Math.abs(n(e[i].time) - n(e[i - 1].time));
560
560
  t > 0 && t < r && (r = t);
561
561
  }
562
- return r === Infinity ? void 0 : r >= Ie;
562
+ return r === Infinity ? void 0 : r >= Fe;
563
563
  }
564
- function Re(e, t = Date.now()) {
565
- let n = S(e, t), r = n >= 0 ? "+" : "-", i = Math.abs(n), a = Math.floor(i / 60), o = i % 60;
564
+ function Le(e, t = Date.now()) {
565
+ let n = C(e, t), r = n >= 0 ? "+" : "-", i = Math.abs(n), a = Math.floor(i / 60), o = i % 60;
566
566
  return o === 0 ? `UTC${r}${a}` : `UTC${r}${a}:${String(o).padStart(2, "0")}`;
567
567
  }
568
- var ze = Date.UTC(1970, 0, 5);
569
- function Be(e, t, n = 1) {
570
- let { count: r, unit: i } = w(t) ?? {
568
+ var Re = Date.UTC(1970, 0, 5);
569
+ function ze(e, t, n = 1) {
570
+ let { count: r, unit: i } = T(t) ?? {
571
571
  count: 1,
572
572
  unit: "m"
573
573
  };
574
574
  if (i === "s" || i === "m" || i === "h" || i === "d") {
575
- let t = r * C[i];
575
+ let t = r * w[i];
576
576
  return Math.floor(e / t) * t;
577
577
  }
578
578
  let a = new Date(e);
579
579
  if (i === "w") {
580
- let e = C.d, t = (a.getUTCDay() - n + 7) % 7, i = Date.UTC(a.getUTCFullYear(), a.getUTCMonth(), a.getUTCDate() - t);
580
+ let e = w.d, t = (a.getUTCDay() - n + 7) % 7, i = Date.UTC(a.getUTCFullYear(), a.getUTCMonth(), a.getUTCDate() - t);
581
581
  if (r <= 1) return i;
582
- let o = Math.floor((i - ze) / (7 * e));
583
- return ze + Math.floor(o / r) * r * 7 * e;
582
+ let o = Math.floor((i - Re) / (7 * e));
583
+ return Re + Math.floor(o / r) * r * 7 * e;
584
584
  }
585
585
  let o = a.getUTCFullYear() * 12 + a.getUTCMonth(), s = Math.floor(o / r) * r;
586
586
  return Date.UTC(Math.floor(s / 12), s % 12, 1);
587
587
  }
588
588
  //#endregion
589
589
  //#region src/utils/precision.ts
590
- var Ve = 64, E = /* @__PURE__ */ new Map();
591
- function He(e, t) {
592
- let n = `${e}|${t}`, r = E.get(n);
593
- return r || (E.size >= Ve && E.clear(), r = new Intl.NumberFormat(e, {
590
+ var Be = 64, D = /* @__PURE__ */ new Map();
591
+ function Ve(e, t) {
592
+ let n = `${e}|${t}`, r = D.get(n);
593
+ return r || (D.size >= Be && D.clear(), r = new Intl.NumberFormat(e, {
594
594
  minimumFractionDigits: t,
595
595
  maximumFractionDigits: t
596
- }), E.set(n, r)), r;
596
+ }), D.set(n, r)), r;
597
597
  }
598
- function D(e, t = 2, n = "en-US") {
599
- return He(n, t).format(e);
598
+ function He(e, t = 2, n = "en-US") {
599
+ return Ve(n, t).format(e);
600
600
  }
601
601
  function Ue(e, t) {
602
602
  if (!(t > e) || !Number.isFinite(e) || !Number.isFinite(t)) return 2;
@@ -609,9 +609,9 @@ function We(e, t, n, r = 2, i = "en-US") {
609
609
  let t = (e / n - 1) * 100;
610
610
  return `${t > 0 ? "+" : ""}${t.toFixed(2)}%`;
611
611
  }
612
- return D(e / n * 100, 2, i);
612
+ return He(e / n * 100, 2, i);
613
613
  }
614
- return D(e, r, i);
614
+ return He(e, r, i);
615
615
  }
616
616
  function Ge(e, t, n = 1) {
617
617
  let r = Number.isInteger(n) && n > 1 ? n : 1;
@@ -683,7 +683,7 @@ var nt = 864e5;
683
683
  function rt(e, t, n = 1) {
684
684
  let r = [], i = null;
685
685
  for (let a of e) {
686
- let e = Be(a.time, t, n);
686
+ let e = ze(a.time, t, n);
687
687
  i === null || e !== i.time ? (i = {
688
688
  time: e,
689
689
  open: a.open,
@@ -695,37 +695,37 @@ function rt(e, t, n = 1) {
695
695
  }
696
696
  return r;
697
697
  }
698
- var O = (e) => e === "s" || e === "m" || e === "h" || e === "d";
699
- function it(e, t) {
700
- let n = w(e), r = w(t);
698
+ var it = (e) => e === "s" || e === "m" || e === "h" || e === "d";
699
+ function at(e, t) {
700
+ let n = T(e), r = T(t);
701
701
  if (!n || !r) return !1;
702
- let i = T(e);
703
- return n.unit === "d" && n.count > 1 ? !1 : O(r.unit) ? O(n.unit) && T(t) % i === 0 : n.unit === r.unit ? r.count % n.count === 0 : O(n.unit) && nt % i === 0;
702
+ let i = E(e);
703
+ return n.unit === "d" && n.count > 1 ? !1 : it(r.unit) ? it(n.unit) && E(t) % i === 0 : n.unit === r.unit ? r.count % n.count === 0 : it(n.unit) && nt % i === 0;
704
704
  }
705
- function at(e, t) {
705
+ function ot(e, t) {
706
706
  let n = null, r = 0;
707
707
  for (let i of t) {
708
- if (!it(i, e)) continue;
709
- let t = T(i);
708
+ if (!at(i, e)) continue;
709
+ let t = E(i);
710
710
  t > r && (n = i, r = t);
711
711
  }
712
712
  return n;
713
713
  }
714
714
  //#endregion
715
715
  //#region src/utils/symbols.ts
716
- function ot(e, t) {
716
+ function st(e, t) {
717
717
  if (!e) return 0;
718
718
  if (e === t) return 1e3;
719
719
  if (e.startsWith(t)) return 600 - Math.min(100, e.length - t.length);
720
720
  let n = e.indexOf(t);
721
721
  return n >= 0 ? 300 - Math.min(100, n) : 0;
722
722
  }
723
- function st(e, t, n = 50, r) {
723
+ function ct(e, t, n = 50, r) {
724
724
  let i = t.trim().toUpperCase();
725
725
  if (!i) return e.slice(0, n);
726
726
  let a = [];
727
727
  for (let t of e) {
728
- let e = Math.max(ot(t.symbol.toUpperCase(), i), ot((t.description ?? "").toUpperCase(), i) * .8);
728
+ let e = Math.max(st(t.symbol.toUpperCase(), i), st((t.description ?? "").toUpperCase(), i) * .8);
729
729
  e > 0 && a.push({
730
730
  info: t,
731
731
  score: e + (r?.(t) ?? 0)
@@ -733,7 +733,7 @@ function st(e, t, n = 50, r) {
733
733
  }
734
734
  return a.sort((e, t) => t.score - e.score || e.info.symbol.localeCompare(t.info.symbol)), a.slice(0, n).map((e) => e.info);
735
735
  }
736
- function ct(e) {
736
+ function lt(e) {
737
737
  let t = typeof e == "number" ? e : Number(e);
738
738
  if (!Number.isFinite(t) || t <= 0) return 0;
739
739
  for (let e = 0; e <= 12; e++) {
@@ -742,7 +742,7 @@ function ct(e) {
742
742
  }
743
743
  return 12;
744
744
  }
745
- function k(e) {
745
+ function ut(e) {
746
746
  let t = /^(\d{1,2}):(\d{2})$/.exec(e.trim());
747
747
  if (!t) return null;
748
748
  let n = Number(t[1]), r = Number(t[2]);
@@ -750,26 +750,26 @@ function k(e) {
750
750
  }
751
751
  //#endregion
752
752
  //#region src/utils/marketStatus.ts
753
- var A = 864e5, j = 6e4, lt = 8;
754
- function ut(e, t) {
753
+ var O = 864e5, k = 6e4, dt = 8;
754
+ function ft(e, t) {
755
755
  let n = e?.timezone, r = (e?.sessions ?? []).flatMap((e) => {
756
- let t = k(e.start), n = k(e.end);
756
+ let t = ut(e.start), n = ut(e.end);
757
757
  return t === null || n === null || t === n ? [] : [{
758
758
  start: t,
759
759
  end: n,
760
760
  days: Array.isArray(e.days) ? e.days : null
761
761
  }];
762
762
  });
763
- if (!n || !Se(n) || r.length === 0 || !Number.isFinite(t)) return {
763
+ if (!n || !b(n) || r.length === 0 || !Number.isFinite(t)) return {
764
764
  state: "always",
765
765
  next: null
766
766
  };
767
- let i = b(n, t) * j, a = Math.floor((t + i) / A) * A, o = (e) => e - b(n, e - b(n, e - i) * j) * j, s = [];
768
- for (let e = -1; e <= lt; e++) {
769
- let t = a + e * A, n = (Math.floor(t / A) + 4) % 7;
767
+ let i = x(n, t) * k, a = Math.floor((t + i) / O) * O, o = (e) => e - x(n, e - x(n, e - i) * k) * k, s = [];
768
+ for (let e = -1; e <= dt; e++) {
769
+ let t = a + e * O, n = (Math.floor(t / O) + 4) % 7;
770
770
  for (let e of r) {
771
771
  if (e.days && !e.days.includes(n)) continue;
772
- let r = t + e.start * j, i = (e.end > e.start ? t : t + A) + e.end * j;
772
+ let r = t + e.start * k, i = (e.end > e.start ? t : t + O) + e.end * k;
773
773
  s.push([o(r), o(i)]);
774
774
  }
775
775
  }
@@ -792,15 +792,15 @@ function ut(e, t) {
792
792
  }
793
793
  //#endregion
794
794
  //#region src/utils/drawingOptions.ts
795
- var dt = 48, ft = 2e3, pt = 1e4;
796
- function mt(e) {
795
+ var pt = 48, mt = 2e3, ht = 1e4;
796
+ function gt(e) {
797
797
  if (!Array.isArray(e)) return;
798
798
  let t = [];
799
799
  for (let n of e) {
800
- if (t.length >= dt) break;
800
+ if (t.length >= pt) break;
801
801
  if (typeof n != "object" || !n) continue;
802
802
  let { value: e, visible: r, color: i } = n;
803
- if (typeof e != "number" || !Number.isFinite(e) || Math.abs(e) > pt || r !== void 0 && typeof r != "boolean") continue;
803
+ if (typeof e != "number" || !Number.isFinite(e) || Math.abs(e) > ht || r !== void 0 && typeof r != "boolean") continue;
804
804
  let a = {
805
805
  value: e,
806
806
  visible: r ?? !0
@@ -809,109 +809,109 @@ function mt(e) {
809
809
  }
810
810
  return t;
811
811
  }
812
- function ht(e, t) {
812
+ function _t(e, t) {
813
813
  switch (e.kind) {
814
814
  case "boolean": return typeof t == "boolean" ? t : void 0;
815
815
  case "number": return typeof t != "number" || !Number.isFinite(t) ? void 0 : Math.min(e.max ?? Infinity, Math.max(e.min ?? -Infinity, t));
816
816
  case "choice": return typeof t == "string" && e.choices.some((e) => e.value === t) ? t : void 0;
817
- case "levels": return mt(t);
818
- case "text": return typeof t == "string" ? t.slice(0, ft) : void 0;
817
+ case "levels": return gt(t);
818
+ case "text": return typeof t == "string" ? t.slice(0, mt) : void 0;
819
819
  }
820
820
  }
821
- function gt(e, t) {
821
+ function vt(e, t) {
822
822
  if (!e || typeof t != "object" || !t) return {};
823
823
  let n = {};
824
824
  for (let [r, i] of Object.entries(t)) {
825
825
  let t = e[r];
826
826
  if (!t) continue;
827
- let a = ht(t, i);
827
+ let a = _t(t, i);
828
828
  a !== void 0 && (n[r] = a);
829
829
  }
830
830
  return n;
831
831
  }
832
- function _t(e) {
832
+ function yt(e) {
833
833
  return Array.isArray(e) ? e.map((e) => ({ ...e })) : e;
834
834
  }
835
- function vt(e, t, n) {
835
+ function bt(e, t, n) {
836
836
  let r = e?.[n];
837
- return r ? _t((t && n in t ? ht(r, t[n]) : void 0) ?? r.default) : t?.[n];
837
+ return r ? yt((t && n in t ? _t(r, t[n]) : void 0) ?? r.default) : t?.[n];
838
838
  }
839
- function yt(e, t) {
839
+ function xt(e, t) {
840
840
  let n = {};
841
- for (let r of Object.keys(e ?? {})) n[r] = vt(e, t, r);
841
+ for (let r of Object.keys(e ?? {})) n[r] = bt(e, t, r);
842
842
  return n;
843
843
  }
844
844
  //#endregion
845
845
  //#region src/utils/drawingStyle.ts
846
- var bt = [
846
+ var St = [
847
847
  "solid",
848
848
  "dashed",
849
849
  "dotted"
850
- ], xt = 64, St = 2e3, Ct = 20, wt = 200;
851
- function M(e, t, n) {
850
+ ], Ct = 64, wt = 2e3, Tt = 20, Et = 200;
851
+ function A(e, t, n) {
852
852
  return typeof e == "number" && Number.isFinite(e) ? Math.min(n, Math.max(t, e)) : void 0;
853
853
  }
854
- function Tt(e) {
855
- return typeof e == "string" && e.length > 0 && e.length <= xt ? e : void 0;
854
+ function Dt(e) {
855
+ return typeof e == "string" && e.length > 0 && e.length <= Ct ? e : void 0;
856
856
  }
857
- function Et(e) {
857
+ function Ot(e) {
858
858
  if (typeof e != "object" || !e) return {};
859
- let t = e, n = {}, r = Tt(t.color);
859
+ let t = e, n = {}, r = Dt(t.color);
860
860
  r !== void 0 && (n.color = r);
861
- let i = M(t.lineWidth, .5, Ct);
862
- i !== void 0 && (n.lineWidth = i), bt.includes(t.lineStyle) && (n.lineStyle = t.lineStyle);
863
- let a = Tt(t.fillColor);
861
+ let i = A(t.lineWidth, .5, Tt);
862
+ i !== void 0 && (n.lineWidth = i), St.includes(t.lineStyle) && (n.lineStyle = t.lineStyle);
863
+ let a = Dt(t.fillColor);
864
864
  a !== void 0 && (n.fillColor = a);
865
- let o = M(t.fillOpacity, 0, 1);
865
+ let o = A(t.fillOpacity, 0, 1);
866
866
  o !== void 0 && (n.fillOpacity = o);
867
- let s = M(t.fontSize, 6, wt);
868
- return s !== void 0 && (n.fontSize = s), typeof t.text == "string" && (n.text = t.text.slice(0, St)), n;
867
+ let s = A(t.fontSize, 6, Et);
868
+ return s !== void 0 && (n.fontSize = s), typeof t.text == "string" && (n.text = t.text.slice(0, wt)), n;
869
869
  }
870
870
  //#endregion
871
871
  //#region src/utils/chartTypeOptions.ts
872
- var N = (e) => typeof e == "number" && Number.isFinite(e) && e > 0, P = (e, t, n) => typeof e == "number" && Number.isInteger(e) && e >= t && e <= n, F = (e) => typeof e == "object" && !!e && !Array.isArray(e);
873
- function Dt(e) {
874
- if (!F(e)) return {};
872
+ var j = (e) => typeof e == "number" && Number.isFinite(e) && e > 0, M = (e, t, n) => typeof e == "number" && Number.isInteger(e) && e >= t && e <= n, N = (e) => typeof e == "object" && !!e && !Array.isArray(e);
873
+ function kt(e) {
874
+ if (!N(e)) return {};
875
875
  let t = {};
876
- if (F(e.renko)) {
876
+ if (N(e.renko)) {
877
877
  let { boxSize: n, atrPeriod: r } = e.renko;
878
878
  t.renko = {
879
- ...N(n) || n === "atr" ? { boxSize: n } : {},
880
- ...P(r, 1, 500) ? { atrPeriod: r } : {}
879
+ ...j(n) || n === "atr" ? { boxSize: n } : {},
880
+ ...M(r, 1, 500) ? { atrPeriod: r } : {}
881
881
  };
882
882
  }
883
- if (F(e.lineBreak)) {
883
+ if (N(e.lineBreak)) {
884
884
  let { lines: n } = e.lineBreak;
885
- t.lineBreak = P(n, 1, 10) ? { lines: n } : {};
885
+ t.lineBreak = M(n, 1, 10) ? { lines: n } : {};
886
886
  }
887
- if (F(e.kagi)) {
887
+ if (N(e.kagi)) {
888
888
  let { reversal: n, reversalType: r } = e.kagi;
889
889
  t.kagi = {
890
- ...N(n) ? { reversal: n } : {},
890
+ ...j(n) ? { reversal: n } : {},
891
891
  ...r === "percent" || r === "price" ? { reversalType: r } : {}
892
892
  };
893
893
  }
894
- if (F(e.pointAndFigure)) {
894
+ if (N(e.pointAndFigure)) {
895
895
  let { boxSize: n, reversal: r } = e.pointAndFigure;
896
896
  t.pointAndFigure = {
897
- ...N(n) || n === "auto" ? { boxSize: n } : {},
898
- ...P(r, 1, 10) ? { reversal: r } : {}
897
+ ...j(n) || n === "auto" ? { boxSize: n } : {},
898
+ ...M(r, 1, 10) ? { reversal: r } : {}
899
899
  };
900
900
  }
901
- if (F(e.rangeBars)) {
901
+ if (N(e.rangeBars)) {
902
902
  let { range: n } = e.rangeBars;
903
- t.rangeBars = N(n) || n === "auto" ? { range: n } : {};
903
+ t.rangeBars = j(n) || n === "auto" ? { range: n } : {};
904
904
  }
905
905
  return t;
906
906
  }
907
907
  //#endregion
908
908
  //#region src/constants/themes.ts
909
- var Ot = "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif", kt = {
910
- family: Ot,
909
+ var At = "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif", jt = {
910
+ family: At,
911
911
  sizeSmall: 10,
912
912
  sizeMedium: 12,
913
913
  sizeLarge: 14
914
- }, I = {
914
+ }, P = {
915
915
  amber: "#f2a93b",
916
916
  up: "#1fa874",
917
917
  down: "#e8505b",
@@ -922,37 +922,37 @@ var Ot = "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif",
922
922
  rose: "#e25592",
923
923
  neutral: "#7d8696",
924
924
  ink: "#0c1016"
925
- }, At = .22;
926
- function L(e) {
927
- return me(e, At);
928
- }
929
- var R = "#2eb88a", z = "#e85a67", jt = [
930
- I.blue,
931
- I.ochre,
932
- I.violet,
933
- I.cyan,
934
- I.rose
935
- ], B = {
925
+ }, Mt = .22;
926
+ function F(e) {
927
+ return me(e, Mt);
928
+ }
929
+ var I = "#2eb88a", L = "#e85a67", Nt = [
930
+ P.blue,
931
+ P.ochre,
932
+ P.violet,
933
+ P.cyan,
934
+ P.rose
935
+ ], R = {
936
936
  name: "dark",
937
- background: I.ink,
937
+ background: P.ink,
938
938
  text: "#d9dde4",
939
939
  textSecondary: "#7d8696",
940
940
  grid: "#161b23",
941
941
  crosshair: "#8a93a3",
942
- candleUp: R,
943
- candleDown: z,
944
- candleUpWick: R,
945
- candleDownWick: z,
946
- lineColor: I.amber,
942
+ candleUp: I,
943
+ candleDown: L,
944
+ candleUpWick: I,
945
+ candleDownWick: L,
946
+ lineColor: P.amber,
947
947
  areaTopColor: "rgba(242, 169, 59, 0.32)",
948
948
  areaBottomColor: "rgba(242, 169, 59, 0.0)",
949
- volumeUp: L(R),
950
- volumeDown: L(z),
949
+ volumeUp: F(I),
950
+ volumeDown: F(L),
951
951
  axisLine: "#1f2630",
952
952
  axisLabel: "#9aa3b2",
953
953
  axisLabelBackground: "#1f2630",
954
- font: kt
955
- }, V = {
954
+ font: jt
955
+ }, z = {
956
956
  name: "light",
957
957
  background: "#ffffff",
958
958
  text: "#0f131a",
@@ -966,13 +966,13 @@ var R = "#2eb88a", z = "#e85a67", jt = [
966
966
  lineColor: "#c77a0a",
967
967
  areaTopColor: "rgba(199, 122, 10, 0.24)",
968
968
  areaBottomColor: "rgba(199, 122, 10, 0.0)",
969
- volumeUp: L("#16a36a"),
970
- volumeDown: L("#d9414f"),
969
+ volumeUp: F("#16a36a"),
970
+ volumeDown: F("#d9414f"),
971
971
  axisLine: "#dde1e7",
972
972
  axisLabel: "#5b6472",
973
973
  axisLabelBackground: "#eef0f3",
974
- font: kt
975
- }, H = {
974
+ font: jt
975
+ }, B = {
976
976
  name: "terminal",
977
977
  background: "#0E0E0E",
978
978
  text: "#C0C0C0",
@@ -997,18 +997,18 @@ var R = "#2eb88a", z = "#e85a67", jt = [
997
997
  sizeMedium: 12,
998
998
  sizeLarge: 14
999
999
  }
1000
- }, Mt = new Set([
1000
+ }, Pt = new Set([
1001
+ R.volumeUp,
1002
+ R.volumeDown,
1003
+ z.volumeUp,
1004
+ z.volumeDown,
1001
1005
  B.volumeUp,
1002
- B.volumeDown,
1003
- V.volumeUp,
1004
- V.volumeDown,
1005
- H.volumeUp,
1006
- H.volumeDown
1006
+ B.volumeDown
1007
1007
  ]);
1008
- function U(e) {
1008
+ function V(e) {
1009
1009
  let t = (e, t) => {
1010
- if (!Mt.has(e)) return e;
1011
- let n = L(t);
1010
+ if (!Pt.has(e)) return e;
1011
+ let n = F(t);
1012
1012
  return n === t ? e : n;
1013
1013
  };
1014
1014
  return {
@@ -1018,67 +1018,67 @@ function U(e) {
1018
1018
  }
1019
1019
  //#endregion
1020
1020
  //#region src/utils/chartStyle.ts
1021
- var Nt = [
1021
+ var Ft = [
1022
1022
  "solid",
1023
1023
  "dashed",
1024
1024
  "dotted"
1025
- ], Pt = 20, Ft = 64, It = 2, Lt = [
1025
+ ], It = 20, Lt = 64, Rt = 2, zt = [
1026
1026
  /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i,
1027
1027
  /^[a-z]{3,30}$/i,
1028
1028
  /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color)\([0-9a-z.,%/\s-]*\)$/i
1029
1029
  ];
1030
- function W(e) {
1031
- return typeof e == "string" && e.length <= Ft && Lt.some((t) => t.test(e.trim()));
1030
+ function H(e) {
1031
+ return typeof e == "string" && e.length <= Lt && zt.some((t) => t.test(e.trim()));
1032
1032
  }
1033
- function Rt(e, t) {
1033
+ function Bt(e, t) {
1034
1034
  switch (e) {
1035
- case "color": return W(t);
1036
- case "lineStyle": return Nt.includes(t);
1037
- case "width": return typeof t == "number" && Number.isFinite(t) && t > 0 && t <= Pt;
1035
+ case "color": return H(t);
1036
+ case "lineStyle": return Ft.includes(t);
1037
+ case "width": return typeof t == "number" && Number.isFinite(t) && t > 0 && t <= It;
1038
1038
  case "boolean": return typeof t == "boolean";
1039
1039
  }
1040
1040
  }
1041
- function zt(e) {
1041
+ function Vt(e) {
1042
1042
  return Object.prototype.hasOwnProperty.call(t, e);
1043
1043
  }
1044
- function Bt(e) {
1044
+ function Ht(e) {
1045
1045
  let n = {}, r = [];
1046
1046
  if (typeof e != "object" || !e || Array.isArray(e)) return {
1047
1047
  overrides: {},
1048
1048
  rejected: r
1049
1049
  };
1050
- for (let [i, a] of Object.entries(e)) zt(i) ? a === null ? n[i] = null : Rt(t[i], a) ? n[i] = a : r.push(i) : r.push(i);
1050
+ for (let [i, a] of Object.entries(e)) Vt(i) ? a === null ? n[i] = null : Bt(t[i], a) ? n[i] = a : r.push(i) : r.push(i);
1051
1051
  return {
1052
1052
  overrides: n,
1053
1053
  rejected: r
1054
1054
  };
1055
1055
  }
1056
- function Vt(e) {
1056
+ function Ut(e) {
1057
1057
  if (typeof e != "object" || !e || Array.isArray(e)) return null;
1058
1058
  let { background: t, separator: n } = e, r = {
1059
- ...W(t) ? { background: t } : {},
1060
- ...W(n) ? { separator: n } : {}
1059
+ ...H(t) ? { background: t } : {},
1060
+ ...H(n) ? { separator: n } : {}
1061
1061
  };
1062
1062
  return Object.keys(r).length > 0 ? r : null;
1063
1063
  }
1064
- var Ht = /^[A-Za-z0-9_]{1,32}$/;
1065
- function Ut(e) {
1064
+ var Wt = /^[A-Za-z0-9_]{1,32}$/;
1065
+ function Gt(e) {
1066
1066
  if (typeof e != "object" || !e || Array.isArray(e)) return;
1067
1067
  let t = {};
1068
1068
  for (let [n, r] of Object.entries(e)) {
1069
- if (!Ht.test(n) || typeof r != "object" || !r) continue;
1069
+ if (!Wt.test(n) || typeof r != "object" || !r) continue;
1070
1070
  let { lineStyle: e, visible: i } = r, a = {
1071
- ...Nt.includes(e) ? { lineStyle: e } : {},
1071
+ ...Ft.includes(e) ? { lineStyle: e } : {},
1072
1072
  ...typeof i == "boolean" ? { visible: i } : {}
1073
1073
  };
1074
1074
  Object.keys(a).length > 0 && (t[n] = a);
1075
1075
  }
1076
1076
  return Object.keys(t).length > 0 ? t : void 0;
1077
1077
  }
1078
- function Wt(e, t, n = 1) {
1078
+ function Kt(e, t, n = 1) {
1079
1079
  return e === "solid" ? [] : e === "dotted" ? [n, n * 2] : [...t];
1080
1080
  }
1081
- function Gt(e, t, n) {
1081
+ function qt(e, t, n) {
1082
1082
  let r = (e) => t(`series.${n}.${e}`), i = r("upColor") ?? t("series.candlestick.upColor"), a = r("downColor") ?? t("series.candlestick.downColor"), o = i ?? e.candleUp, s = a ?? e.candleDown;
1083
1083
  return {
1084
1084
  up: o,
@@ -1086,12 +1086,12 @@ function Gt(e, t, n) {
1086
1086
  wickUp: r("wickUpColor") ?? t("series.candlestick.wickUpColor") ?? (i === void 0 ? e.candleUpWick : o),
1087
1087
  wickDown: r("wickDownColor") ?? t("series.candlestick.wickDownColor") ?? (a === void 0 ? e.candleDownWick : s),
1088
1088
  line: r("color") ?? r("lineColor") ?? t("series.line.color") ?? e.lineColor,
1089
- lineWidth: r("lineWidth") ?? t("series.line.lineWidth") ?? It,
1089
+ lineWidth: r("lineWidth") ?? t("series.line.lineWidth") ?? Rt,
1090
1090
  top: r("topColor") ?? t("series.area.topColor") ?? e.areaTopColor,
1091
1091
  bottom: r("bottomColor") ?? t("series.area.bottomColor") ?? e.areaBottomColor
1092
1092
  };
1093
1093
  }
1094
- function G(e, t, n) {
1094
+ function U(e, t, n) {
1095
1095
  return {
1096
1096
  visible: e(`${t}.visible`) ?? n.visible,
1097
1097
  color: e(`${t}.color`) ?? n.color,
@@ -1099,21 +1099,21 @@ function G(e, t, n) {
1099
1099
  width: e(`${t}.width`) ?? n.width
1100
1100
  };
1101
1101
  }
1102
- function Kt(e, t, n) {
1103
- let { style: r, ...i } = e, a = n, o = (e) => a[e], s = Gt(i, o, t), c = o("background.color") ?? i.background, l = (e, t) => o(e) ?? t, u = (e) => o(e) ?? null, d = {
1102
+ function Jt(e, t, n) {
1103
+ let { style: r, ...i } = e, a = n, o = (e) => a[e], s = qt(i, o, t), c = o("background.color") ?? i.background, l = (e, t) => o(e) ?? t, u = (e) => o(e) ?? null, d = {
1104
1104
  panes: {
1105
1105
  background: l("panes.background", c),
1106
1106
  separator: l("panes.separatorColor", i.axisLine),
1107
1107
  title: l("panes.titleColor", i.textSecondary)
1108
1108
  },
1109
1109
  grid: {
1110
- horizontal: G(o, "grid.horizontal", {
1110
+ horizontal: U(o, "grid.horizontal", {
1111
1111
  visible: !0,
1112
1112
  color: i.grid,
1113
1113
  style: "solid",
1114
1114
  width: 1
1115
1115
  }),
1116
- vertical: G(o, "grid.vertical", {
1116
+ vertical: U(o, "grid.vertical", {
1117
1117
  visible: !0,
1118
1118
  color: i.grid,
1119
1119
  style: "solid",
@@ -1121,13 +1121,13 @@ function Kt(e, t, n) {
1121
1121
  })
1122
1122
  },
1123
1123
  crosshair: {
1124
- horizontal: G(o, "crosshair.horizontal", {
1124
+ horizontal: U(o, "crosshair.horizontal", {
1125
1125
  visible: !0,
1126
1126
  color: i.crosshair,
1127
1127
  style: "dashed",
1128
1128
  width: 1
1129
1129
  }),
1130
- vertical: G(o, "crosshair.vertical", {
1130
+ vertical: U(o, "crosshair.vertical", {
1131
1131
  visible: !0,
1132
1132
  color: i.crosshair,
1133
1133
  style: "dashed",
@@ -1199,7 +1199,7 @@ function Kt(e, t, n) {
1199
1199
  style: d
1200
1200
  };
1201
1201
  }
1202
- var qt = {
1202
+ var Yt = {
1203
1203
  "background.color": (e) => e.background,
1204
1204
  "panes.background": (e, t) => t.panes.background,
1205
1205
  "panes.separatorColor": (e, t) => t.panes.separator,
@@ -1218,8 +1218,8 @@ var qt = {
1218
1218
  "lastPrice.downColor": (e, t) => t.lastPrice.down,
1219
1219
  "lastPrice.style": (e, t) => t.lastPrice.style,
1220
1220
  "lastPrice.width": (e, t) => t.lastPrice.width,
1221
- "volume.upColor": (e) => U(e).up,
1222
- "volume.downColor": (e) => U(e).down,
1221
+ "volume.upColor": (e) => V(e).up,
1222
+ "volume.downColor": (e) => V(e).down,
1223
1223
  "sessionBreaks.color": (e, t) => t.sessionBreaks.color,
1224
1224
  "sessionBreaks.style": (e, t) => t.sessionBreaks.style,
1225
1225
  "sessionBreaks.width": (e, t) => t.sessionBreaks.width,
@@ -1236,16 +1236,16 @@ var qt = {
1236
1236
  "tradeZones.lossColor": (e, t) => t.tradeZones.loss,
1237
1237
  "tradeZones.activeColor": (e, t) => t.tradeZones.active,
1238
1238
  "drawings.handleColor": (e, t) => t.drawings.handle
1239
- }, Jt = {
1239
+ }, Xt = {
1240
1240
  visible: "visible",
1241
1241
  color: "color",
1242
1242
  style: "style",
1243
1243
  width: "width"
1244
1244
  };
1245
- function Yt(e, t, n, r = "candlestick") {
1245
+ function Zt(e, t, n, r = "candlestick") {
1246
1246
  let i = n.split(".");
1247
1247
  if (i[0] === "series") {
1248
- let n = Gt(e, (e) => t[e], i[1]);
1248
+ let n = qt(e, (e) => t[e], i[1]);
1249
1249
  switch (i[2]) {
1250
1250
  case "upColor": return n.up;
1251
1251
  case "downColor": return n.down;
@@ -1258,12 +1258,12 @@ function Yt(e, t, n, r = "candlestick") {
1258
1258
  case "bottomColor": return n.bottom;
1259
1259
  }
1260
1260
  }
1261
- let a = Kt(e, r, t), o = a.style;
1262
- return i[0] === "grid" || i[0] === "crosshair" && (i[1] === "horizontal" || i[1] === "vertical") ? (i[0] === "grid" ? o.grid : o.crosshair)[i[1]][Jt[i[2]]] : qt[n]?.(a, o) ?? null;
1261
+ let a = Jt(e, r, t), o = a.style;
1262
+ return i[0] === "grid" || i[0] === "crosshair" && (i[1] === "horizontal" || i[1] === "vertical") ? (i[0] === "grid" ? o.grid : o.crosshair)[i[1]][Xt[i[2]]] : Yt[n]?.(a, o) ?? null;
1263
1263
  }
1264
1264
  //#endregion
1265
1265
  //#region src/constants/defaults.ts
1266
- var Xt = {
1266
+ var Qt = {
1267
1267
  autoScale: !0,
1268
1268
  rightMargin: 5,
1269
1269
  minBarSpacing: 2,
@@ -1274,7 +1274,7 @@ var Xt = {
1274
1274
  vLineStyle: "solid"
1275
1275
  },
1276
1276
  crosshair: { mode: "magnet" }
1277
- }, Zt = [
1277
+ }, $t = [
1278
1278
  "1s",
1279
1279
  "1m",
1280
1280
  "3m",
@@ -1291,7 +1291,7 @@ var Xt = {
1291
1291
  "3d",
1292
1292
  "1w",
1293
1293
  "1M"
1294
- ], Qt = [
1294
+ ], en = [
1295
1295
  "1m",
1296
1296
  "5m",
1297
1297
  "15m",
@@ -1305,7 +1305,7 @@ var Xt = {
1305
1305
  "3M",
1306
1306
  "6M",
1307
1307
  "12M"
1308
- ], $t = [
1308
+ ], tn = [
1309
1309
  "1m",
1310
1310
  "5m",
1311
1311
  "15m",
@@ -1315,7 +1315,7 @@ var Xt = {
1315
1315
  "1d",
1316
1316
  "1w",
1317
1317
  "1M"
1318
- ], en = [
1318
+ ], nn = [
1319
1319
  "1m",
1320
1320
  "5m",
1321
1321
  "15m",
@@ -1323,7 +1323,7 @@ var Xt = {
1323
1323
  "4h",
1324
1324
  "1d",
1325
1325
  "1w"
1326
- ], tn = 8, nn = 2, rn = 70, an = 30, on = 60, sn = 120, K = {
1326
+ ], rn = 8, an = 2, on = 70, sn = 30, cn = 60, ln = 120, W = {
1327
1327
  candlestick: "Candlestick",
1328
1328
  line: "Line",
1329
1329
  area: "Area",
@@ -1426,7 +1426,7 @@ var Xt = {
1426
1426
  error: "Error",
1427
1427
  numberDecimalSeparator: ".",
1428
1428
  numberGroupSeparator: ","
1429
- }, cn = {
1429
+ }, un = {
1430
1430
  candlestick: "Nến",
1431
1431
  line: "Đường",
1432
1432
  area: "Vùng",
@@ -1529,43 +1529,43 @@ var Xt = {
1529
1529
  error: "Lỗi",
1530
1530
  numberDecimalSeparator: ",",
1531
1531
  numberGroupSeparator: "."
1532
- }, q = new Map([["en", K], ["vi", cn]]), J = "en", Y = K;
1533
- function ln(e) {
1534
- J = e, Y = q.get(e) ?? K;
1532
+ }, G = new Map([["en", W], ["vi", un]]), K = "en", dn = W;
1533
+ function fn(e) {
1534
+ K = e, dn = G.get(e) ?? W;
1535
1535
  }
1536
- function un() {
1537
- return J;
1536
+ function pn() {
1537
+ return K;
1538
1538
  }
1539
- function dn(e) {
1540
- return Y[e] ?? K[e] ?? e;
1539
+ function mn(e) {
1540
+ return dn[e] ?? W[e] ?? e;
1541
1541
  }
1542
- function fn(e, t) {
1543
- q.set(e, t);
1542
+ function hn(e, t) {
1543
+ G.set(e, t);
1544
1544
  }
1545
- function pn(e) {
1546
- return q.get(e ?? J) ?? K;
1545
+ function gn(e) {
1546
+ return G.get(e ?? K) ?? W;
1547
1547
  }
1548
- function X(e, t = 2, n) {
1549
- let r = q.get(n ?? J) ?? K, i = r.numberDecimalSeparator, a = r.numberGroupSeparator, [o, s] = e.toFixed(t).split("."), c = o.startsWith("-"), l = c ? o.slice(1) : o, u = "";
1548
+ function q(e, t = 2, n) {
1549
+ let r = G.get(n ?? K) ?? W, i = r.numberDecimalSeparator, a = r.numberGroupSeparator, [o, s] = e.toFixed(t).split("."), c = o.startsWith("-"), l = c ? o.slice(1) : o, u = "";
1550
1550
  for (let e = l.length - 1, t = 0; e >= 0; e--, t++) t > 0 && t % 3 == 0 && (u = a + u), u = l[e] + u;
1551
1551
  return c && (u = "-" + u), s ? u + i + s : u;
1552
1552
  }
1553
- function mn(e) {
1554
- return X(e, 0, "vi");
1553
+ function _n(e) {
1554
+ return q(e, 0, "vi");
1555
1555
  }
1556
- function hn(e, t) {
1557
- return e >= 1e9 ? X(e / 1e9, 2, t ?? J) + "B" : e >= 1e6 ? X(e / 1e6, 2, t ?? J) + "M" : e >= 1e3 ? X(e / 1e3, 2, t ?? J) + "K" : X(e, 0, t ?? J);
1556
+ function vn(e, t) {
1557
+ return e >= 1e9 ? q(e / 1e9, 2, t ?? K) + "B" : e >= 1e6 ? q(e / 1e6, 2, t ?? K) + "M" : e >= 1e3 ? q(e / 1e3, 2, t ?? K) + "K" : q(e, 0, t ?? K);
1558
1558
  }
1559
1559
  //#endregion
1560
1560
  //#region src/market/presets.ts
1561
- var Z = {
1562
- up: "#FF0000",
1563
- down: "#0000FF",
1564
- unchanged: "#FFD700",
1565
- ceiling: "#FF00FF",
1566
- floor: "#00FFFF",
1567
- reference: "#FFD700"
1568
- }, Q = [
1561
+ var J = {
1562
+ up: "#22C55E",
1563
+ down: "#EF4444",
1564
+ unchanged: "#EAB308",
1565
+ ceiling: "#D946EF",
1566
+ floor: "#06B6D4",
1567
+ reference: "#EAB308"
1568
+ }, Y = "Asia/Ho_Chi_Minh", yn = [
1569
1569
  {
1570
1570
  name: "ATO",
1571
1571
  startTime: "09:00",
@@ -1596,7 +1596,63 @@ var Z = {
1596
1596
  endTime: "14:45",
1597
1597
  type: "preClose"
1598
1598
  }
1599
- ], $ = [
1599
+ ], bn = [
1600
+ {
1601
+ name: "Phiên 1",
1602
+ startTime: "09:15",
1603
+ endTime: "11:30",
1604
+ type: "continuous"
1605
+ },
1606
+ {
1607
+ name: "Nghỉ trưa",
1608
+ startTime: "11:30",
1609
+ endTime: "13:00",
1610
+ type: "closed"
1611
+ },
1612
+ {
1613
+ name: "Phiên 2",
1614
+ startTime: "13:00",
1615
+ endTime: "14:30",
1616
+ type: "continuous"
1617
+ },
1618
+ {
1619
+ name: "ATC",
1620
+ startTime: "14:30",
1621
+ endTime: "14:45",
1622
+ type: "preClose"
1623
+ },
1624
+ {
1625
+ name: "PLO",
1626
+ startTime: "14:45",
1627
+ endTime: "15:00",
1628
+ type: "postClose"
1629
+ }
1630
+ ], xn = [
1631
+ {
1632
+ name: "Phiên 1",
1633
+ startTime: "09:15",
1634
+ endTime: "11:30",
1635
+ type: "continuous"
1636
+ },
1637
+ {
1638
+ name: "Nghỉ trưa",
1639
+ startTime: "11:30",
1640
+ endTime: "13:00",
1641
+ type: "closed"
1642
+ },
1643
+ {
1644
+ name: "Phiên 2",
1645
+ startTime: "13:00",
1646
+ endTime: "14:30",
1647
+ type: "continuous"
1648
+ }
1649
+ ], Sn = [
1650
+ {
1651
+ name: "ATO",
1652
+ startTime: "08:45",
1653
+ endTime: "09:00",
1654
+ type: "preOpen"
1655
+ },
1600
1656
  {
1601
1657
  name: "Phiên 1",
1602
1658
  startTime: "09:00",
@@ -1621,59 +1677,96 @@ var Z = {
1621
1677
  endTime: "14:45",
1622
1678
  type: "preClose"
1623
1679
  }
1624
- ], gn = {
1680
+ ], Cn = {
1625
1681
  type: "stock",
1626
1682
  exchange: "HOSE",
1627
1683
  currency: "VND",
1628
1684
  pricePrecision: 2,
1629
- volumeUnit: 10,
1630
- priceStep: .05,
1685
+ volumeUnit: 100,
1686
+ priceStep: .01,
1687
+ priceSteps: [
1688
+ {
1689
+ from: 0,
1690
+ step: .01
1691
+ },
1692
+ {
1693
+ from: 10,
1694
+ step: .05
1695
+ },
1696
+ {
1697
+ from: 50,
1698
+ step: .1
1699
+ }
1700
+ ],
1701
+ timeZone: Y,
1631
1702
  priceLimits: {
1632
1703
  enabled: !0,
1633
1704
  ceilingPercent: 7,
1634
1705
  floorPercent: 7
1635
1706
  },
1636
- sessions: Q,
1637
- colorScheme: Z
1638
- }, _n = {
1707
+ sessions: yn,
1708
+ colorScheme: J
1709
+ }, wn = {
1710
+ ...Cn,
1711
+ priceSteps: void 0
1712
+ }, Tn = {
1639
1713
  type: "stock",
1640
1714
  exchange: "HNX",
1641
1715
  currency: "VND",
1642
1716
  pricePrecision: 1,
1643
1717
  volumeUnit: 100,
1644
1718
  priceStep: .1,
1719
+ timeZone: Y,
1645
1720
  priceLimits: {
1646
1721
  enabled: !0,
1647
1722
  ceilingPercent: 10,
1648
1723
  floorPercent: 10
1649
1724
  },
1650
- sessions: $,
1651
- colorScheme: Z
1652
- }, vn = {
1725
+ sessions: bn,
1726
+ colorScheme: J
1727
+ }, En = {
1653
1728
  type: "stock",
1654
1729
  exchange: "UPCOM",
1655
1730
  currency: "VND",
1656
1731
  pricePrecision: 1,
1657
1732
  volumeUnit: 100,
1658
1733
  priceStep: .1,
1734
+ timeZone: Y,
1659
1735
  priceLimits: {
1660
1736
  enabled: !0,
1661
1737
  ceilingPercent: 15,
1662
1738
  floorPercent: 15
1663
1739
  },
1664
- sessions: $,
1665
- colorScheme: Z
1666
- }, yn = {
1740
+ sessions: xn,
1741
+ colorScheme: J
1742
+ }, Dn = {
1743
+ type: "futures",
1744
+ exchange: "HNX",
1745
+ currency: "VND",
1746
+ pricePrecision: 1,
1747
+ volumeUnit: 1,
1748
+ priceStep: .1,
1749
+ contractMultiplier: 1e5,
1750
+ timeZone: Y,
1751
+ priceLimits: {
1752
+ enabled: !0,
1753
+ ceilingPercent: 7,
1754
+ floorPercent: 7
1755
+ },
1756
+ sessions: Sn,
1757
+ colorScheme: J
1758
+ }, On = {
1667
1759
  type: "crypto",
1668
1760
  currency: "USDT",
1669
1761
  pricePrecision: 2,
1670
1762
  priceLimits: { enabled: !1 }
1671
- }, bn = {
1763
+ }, kn = {
1672
1764
  type: "stock",
1673
1765
  exchange: "NYSE",
1674
1766
  currency: "USD",
1675
1767
  pricePrecision: 2,
1676
1768
  priceStep: .01,
1769
+ timeZone: "America/New_York",
1677
1770
  priceLimits: { enabled: !1 },
1678
1771
  sessions: [
1679
1772
  {
@@ -1692,36 +1785,119 @@ var Z = {
1692
1785
  name: "After-Hours",
1693
1786
  startTime: "16:00",
1694
1787
  endTime: "20:00",
1695
- type: "preClose"
1788
+ type: "postClose"
1696
1789
  }
1697
1790
  ]
1698
1791
  };
1699
- function xn(e) {
1792
+ function An(e) {
1700
1793
  return {
1701
1794
  ...e,
1702
- candleUp: Z.up,
1703
- candleDown: Z.down,
1704
- candleUpWick: Z.up,
1705
- candleDownWick: Z.down,
1706
- volumeUp: "rgba(255, 0, 0, 0.3)",
1707
- volumeDown: "rgba(0, 0, 255, 0.3)"
1795
+ candleUp: J.up,
1796
+ candleDown: J.down,
1797
+ candleUpWick: J.up,
1798
+ candleDownWick: J.down,
1799
+ volumeUp: F(J.up),
1800
+ volumeDown: F(J.down)
1708
1801
  };
1709
1802
  }
1710
- function Sn(e, t) {
1803
+ var X = 1e-9;
1804
+ function jn(e, t) {
1805
+ let n = t.priceStep;
1806
+ for (let r of t.priceSteps ?? []) e + X >= r.from && (n = r.step);
1807
+ return n !== void 0 && n > 0 ? n : void 0;
1808
+ }
1809
+ function Mn(e, t) {
1810
+ let n = t.priceStep;
1811
+ for (let r of t.priceSteps ?? []) e - X > r.from && (n = r.step);
1812
+ return n !== void 0 && n > 0 ? n : void 0;
1813
+ }
1814
+ function Z(e, t, n = "nearest") {
1815
+ let r = jn(e, t);
1816
+ if (r === void 0 || !Number.isFinite(e)) return e;
1817
+ let i = e / r, a = n === "down" ? Math.floor(i + X) : n === "up" ? Math.ceil(i - X) : Math.round(i);
1818
+ return Number((a * r).toFixed(lt(r)));
1819
+ }
1820
+ function Nn(e, t) {
1711
1821
  if (!t.priceLimits?.enabled || !t.priceLimits.ceilingPercent) return null;
1712
- let n = t.priceLimits.ceilingPercent / 100, r = (t.priceLimits.floorPercent ?? t.priceLimits.ceilingPercent) / 100;
1822
+ let n = t.priceLimits.ceilingPercent / 100, r = (t.priceLimits.floorPercent ?? t.priceLimits.ceilingPercent) / 100, i = e, a = i * (1 + n), o = i * (1 - r), s = jn(i, t);
1823
+ if (s === void 0) return {
1824
+ ceiling: a,
1825
+ floor: o,
1826
+ reference: i
1827
+ };
1828
+ let c = Z(i + s, t);
1829
+ if (Math.abs(i - s) < X) return {
1830
+ ceiling: c,
1831
+ floor: i,
1832
+ reference: i
1833
+ };
1834
+ let l = Z(a, t, "down"), u = Z(o, t, "up");
1835
+ return l <= i && (l = c), u >= i && (u = Z(i - (Mn(i, t) ?? s), t)), u <= 0 && (u = i), {
1836
+ ceiling: l,
1837
+ floor: u,
1838
+ reference: i
1839
+ };
1840
+ }
1841
+ var Q = (e, t) => Math.round(e * t * 1e9) / 1e9;
1842
+ function Pn(e, t) {
1843
+ let n = Math.round(Math.log10(t));
1713
1844
  return {
1714
- ceiling: e * (1 + n),
1715
- floor: e * (1 - r),
1716
- reference: e
1845
+ ...e,
1846
+ pricePrecision: e.pricePrecision === void 0 ? void 0 : Math.max(0, e.pricePrecision - n),
1847
+ priceStep: e.priceStep === void 0 ? void 0 : Q(e.priceStep, t),
1848
+ priceSteps: e.priceSteps?.map((e) => ({
1849
+ from: Q(e.from, t),
1850
+ step: Q(e.step, t)
1851
+ })),
1852
+ priceLimits: e.priceLimits && {
1853
+ ...e.priceLimits,
1854
+ referencePrice: e.priceLimits.referencePrice === void 0 ? void 0 : Q(e.priceLimits.referencePrice, t)
1855
+ }
1717
1856
  };
1718
1857
  }
1719
- function Cn(e) {
1720
- let t = /* @__PURE__ */ new Date(), n = `${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}`;
1721
- for (let t of e) if (n >= t.startTime && n < t.endTime) return t;
1858
+ var Fn = 6e4, In = 864e5;
1859
+ function Ln(e, t) {
1860
+ let n, r;
1861
+ if (t) {
1862
+ let i = new Date(e + x(t, e) * Fn);
1863
+ n = i.getUTCHours(), r = i.getUTCMinutes();
1864
+ } else {
1865
+ let t = new Date(e);
1866
+ n = t.getHours(), r = t.getMinutes();
1867
+ }
1868
+ return `${String(n).padStart(2, "0")}:${String(r).padStart(2, "0")}`;
1869
+ }
1870
+ function Rn(e, t = Date.now(), n) {
1871
+ if (n !== void 0 && !b(n)) return null;
1872
+ let r = Ln(t, n);
1873
+ for (let t of e) if (r >= t.startTime && r < t.endTime) return t;
1722
1874
  return null;
1723
1875
  }
1876
+ var $ = (e) => String(e).padStart(2, "0"), zn = (e) => {
1877
+ let t = new Date(e);
1878
+ return `${t.getUTCFullYear()}-${$(t.getUTCMonth() + 1)}-${$(t.getUTCDate())}`;
1879
+ }, Bn = 4, Vn = 7 * 36e5;
1880
+ function Hn(e, t, n) {
1881
+ let r = Date.UTC(e, t - 1, 1), i = 1 + (Bn - new Date(r).getUTCDay() + 7) % 7, a = Date.UTC(e, t - 1, i + 14), o = (e) => {
1882
+ let t = new Date(e).getUTCDay();
1883
+ return t === 0 || t === 6 || (n?.(zn(e)) ?? !1);
1884
+ };
1885
+ for (; o(a);) a -= In;
1886
+ return zn(a);
1887
+ }
1888
+ function Un(e, t) {
1889
+ let n = zn(e + Vn), r = (e, n) => ({
1890
+ symbol: `VN30F${$(e % 100)}${$(n)}`,
1891
+ year: e,
1892
+ month: n,
1893
+ lastTradingDay: Hn(e, n, t)
1894
+ }), i = (e) => e.month === 12 ? r(e.year + 1, 1) : r(e.year, e.month + 1), a = new Date(e + Vn), o = r(a.getUTCFullYear(), a.getUTCMonth() + 1);
1895
+ n > o.lastTradingDay && (o = i(o));
1896
+ let s = [o, i(o)], c = i(s[1]);
1897
+ for (; s.length < 4;) c.month % 3 == 0 && s.push(c), c = i(c);
1898
+ return s;
1899
+ }
1724
1900
  //#endregion
1725
- export { t as CHART_STYLE_KEYS, H as DARK_TERMINAL, B as DARK_THEME, nn as DEFAULT_BAR_SPACING, tn as DEFAULT_BAR_WIDTH, Xt as DEFAULT_CHART_OPTIONS, n as DEFAULT_DRAWING_STYLE, Ot as DEFAULT_FONT_FAMILY, sn as DEFAULT_PANEL_HEIGHT, o as DEFAULT_RECONNECT, i as DEFAULT_SIGNAL_STYLE, s as DEFAULT_STREAM_CONFIG, en as DEFAULT_TIMEFRAME_FAVORITES, a as DEFAULT_TRADE_ZONE_STYLE, r as DEFAULT_TRADING_CONFIG, $ as HNX_SESSIONS, Q as HOSE_SESSIONS, V as LIGHT_THEME, e as LayerType, yn as MARKET_CRYPTO, _n as MARKET_HNX, gn as MARKET_HOSE, bn as MARKET_NYSE, vn as MARKET_UPCOM, on as MIN_PANEL_HEIGHT, rn as PRICE_AXIS_WIDTH, Xe as PRICE_SOURCES, I as TC_PALETTE, jt as TC_SERIES_COLORS, Zt as TIMEFRAMES_CRYPTO, $t as TIMEFRAMES_FOREX, Qt as TIMEFRAMES_STOCK, an as TIME_AXIS_HEIGHT, Z as VN_COLORS, At as VOLUME_ALPHA, Ne as alignToTimeframe, Ue as autoPricePrecision, Le as barsAreDaily, Yt as chartStyleValue, ne as clamp, Sn as computePriceLimits, de as computePriceRange, oe as computeTickStep, xn as createVNTheme, Ye as detectPrecision, vt as drawingOption, K as en, ue as findBarIndex, Ge as formatFraction, X as formatNumber, D as formatPrice, We as formatPriceScaleLabel, Me as formatTimestamp, mn as formatVND, Je as formatVolume, hn as formatVolumeLoc, Ke as fractionTick, Cn as getCurrentSession, un as getLocale, pn as getLocaleStrings, pe as hexToRgba, et as indicatorSource, ie as inverseLerp, Fe as isDateOnly, Ze as isPriceSource, je as isTimeFrame, Se as isValidTimeZone, re as lerp, he as lerpColor, Wt as lineDash, ut as marketStatus, fe as mergeBar, m as niceNumber, ce as normalizeBar, se as normalizeBarTime, S as offsetAt, tt as parseIndicatorSource, w as parseTimeframe, at as pickBaseTimeframe, qe as priceFormatterFor, st as rankSymbols, Bt as readChartStyleOverrides, Dt as readChartTypeOptions, Ut as readIndicatorPlotStyles, te as readNews, Vt as readPaneStyle, l as readQuote, fn as registerLocale, rt as resampleBars, Kt as resolveChartTheme, yt as resolveDrawingOptions, U as resolveVolumeColors, ae as roundToStep, gt as sanitizeDrawingOptions, Et as sanitizeDrawingStyle, k as sessionMinute, ln as setLocale, le as sliceVisibleData, Qe as sourcePrice, ct as stepDecimals, dn as t, Ae as tickBarCount, Pe as timeParts, Be as timeframeBucketStart, T as timeframeToMs, Re as tzLabel, cn as vi, L as volumeColor, we as wallToUtc, me as withAlpha, b as zoneOffsetMinutes, Ee as zonedDateFormatter };
1901
+ export { t as CHART_STYLE_KEYS, B as DARK_TERMINAL, R as DARK_THEME, an as DEFAULT_BAR_SPACING, rn as DEFAULT_BAR_WIDTH, Qt as DEFAULT_CHART_OPTIONS, n as DEFAULT_DRAWING_STYLE, At as DEFAULT_FONT_FAMILY, ln as DEFAULT_PANEL_HEIGHT, o as DEFAULT_RECONNECT, i as DEFAULT_SIGNAL_STYLE, s as DEFAULT_STREAM_CONFIG, nn as DEFAULT_TIMEFRAME_FAVORITES, a as DEFAULT_TRADE_ZONE_STYLE, r as DEFAULT_TRADING_CONFIG, bn as HNX_SESSIONS, yn as HOSE_SESSIONS, z as LIGHT_THEME, e as LayerType, On as MARKET_CRYPTO, Tn as MARKET_HNX, Cn as MARKET_HOSE, wn as MARKET_HOSE_ETF, kn as MARKET_NYSE, En as MARKET_UPCOM, Dn as MARKET_VN30F, cn as MIN_PANEL_HEIGHT, on as PRICE_AXIS_WIDTH, Xe as PRICE_SOURCES, P as TC_PALETTE, Nt as TC_SERIES_COLORS, $t as TIMEFRAMES_CRYPTO, tn as TIMEFRAMES_FOREX, en as TIMEFRAMES_STOCK, sn as TIME_AXIS_HEIGHT, xn as UPCOM_SESSIONS, Sn as VN30F_SESSIONS, J as VN_COLORS, Mt as VOLUME_ALPHA, Me as alignToTimeframe, Ue as autoPricePrecision, Ie as barsAreDaily, Zt as chartStyleValue, ne as clamp, Nn as computePriceLimits, de as computePriceRange, oe as computeTickStep, An as createVNTheme, Ye as detectPrecision, bt as drawingOption, W as en, ue as findBarIndex, Ge as formatFraction, q as formatNumber, He as formatPrice, We as formatPriceScaleLabel, je as formatTimestamp, _n as formatVND, Je as formatVolume, vn as formatVolumeLoc, Ke as fractionTick, Rn as getCurrentSession, pn as getLocale, gn as getLocaleStrings, pe as hexToRgba, et as indicatorSource, ie as inverseLerp, Pe as isDateOnly, Ze as isPriceSource, Ae as isTimeFrame, b as isValidTimeZone, re as lerp, he as lerpColor, Kt as lineDash, ft as marketStatus, fe as mergeBar, m as niceNumber, ce as normalizeBar, se as normalizeBarTime, C as offsetAt, tt as parseIndicatorSource, T as parseTimeframe, ot as pickBaseTimeframe, qe as priceFormatterFor, jn as priceStepAt, ct as rankSymbols, Ht as readChartStyleOverrides, kt as readChartTypeOptions, Gt as readIndicatorPlotStyles, te as readNews, Ut as readPaneStyle, l as readQuote, hn as registerLocale, rt as resampleBars, Jt as resolveChartTheme, xt as resolveDrawingOptions, V as resolveVolumeColors, Z as roundToPriceStep, ae as roundToStep, vt as sanitizeDrawingOptions, Ot as sanitizeDrawingStyle, Pn as scaleMarketPrices, ut as sessionMinute, fn as setLocale, le as sliceVisibleData, Qe as sourcePrice, lt as stepDecimals, mn as t, ke as tickBarCount, Ne as timeParts, ze as timeframeBucketStart, E as timeframeToMs, Le as tzLabel, un as vi, Un as vn30fContracts, Hn as vn30fLastTradingDay, F as volumeColor, Ce as wallToUtc, me as withAlpha, x as zoneOffsetMinutes, Te as zonedDateFormatter };
1726
1902
 
1727
1903
  //# sourceMappingURL=index.js.map