minerva-design 1.6.0 → 1.7.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/CHANGELOG.md +13 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +2 -0
- package/dist/charts/engine/data.d.ts +2 -0
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +1 -1
- package/dist/charts/engine/defaults.cjs.map +1 -1
- package/dist/charts/engine/defaults.js +22 -18
- package/dist/charts/engine/defaults.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +1 -1
- package/dist/charts/engine/graph/chart.cjs.map +1 -1
- package/dist/charts/engine/graph/chart.js +532 -493
- package/dist/charts/engine/graph/chart.js.map +1 -1
- package/dist/charts/engine/graph/geometry.cjs +1 -1
- package/dist/charts/engine/graph/geometry.cjs.map +1 -1
- package/dist/charts/engine/graph/geometry.d.cts +12 -2
- package/dist/charts/engine/graph/geometry.d.ts +12 -2
- package/dist/charts/engine/graph/geometry.js +35 -31
- package/dist/charts/engine/graph/geometry.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.js +95 -74
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +1 -1
- package/dist/charts/engine/orderbook/field.cjs.map +1 -1
- package/dist/charts/engine/orderbook/field.d.cts +15 -2
- package/dist/charts/engine/orderbook/field.d.ts +15 -2
- package/dist/charts/engine/orderbook/field.js +21 -9
- package/dist/charts/engine/orderbook/field.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
- package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
- package/dist/charts/engine/orderbook/heatmap.js +576 -453
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +36 -11
- package/dist/charts/engine/orderbook/types.d.ts +36 -11
- package/dist/charts/engine/presets.cjs +1 -1
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +16 -3
- package/dist/charts/engine/presets.d.ts +16 -3
- package/dist/charts/engine/presets.js +42 -32
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +4 -2
- package/dist/charts/engine/scene.d.ts +4 -2
- package/dist/charts/engine/scene.js +185 -107
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/three-d/oit.cjs +119 -34
- package/dist/charts/engine/three-d/oit.cjs.map +1 -1
- package/dist/charts/engine/three-d/oit.d.cts +65 -10
- package/dist/charts/engine/three-d/oit.d.ts +65 -10
- package/dist/charts/engine/three-d/oit.js +119 -34
- package/dist/charts/engine/three-d/oit.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +19 -0
- package/dist/charts/engine/three-d/render-types.d.ts +19 -0
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +14 -6
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +6 -1
- package/dist/charts/engine/three-d/shaders.d.ts +6 -1
- package/dist/charts/engine/three-d/shaders.js +40 -26
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +167 -125
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +169 -140
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.js +1149 -1023
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +12 -0
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/layout.cjs +2 -0
- package/dist/charts/engine/trading/layout.cjs.map +1 -0
- package/dist/charts/engine/trading/layout.d.cts +37 -0
- package/dist/charts/engine/trading/layout.d.ts +37 -0
- package/dist/charts/engine/trading/layout.js +63 -0
- package/dist/charts/engine/trading/layout.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +24 -7
- package/dist/charts/engine/trading/types.d.ts +24 -7
- package/dist/charts/engine/types.d.cts +21 -8
- package/dist/charts/engine/types.d.ts +21 -8
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +104 -83
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +42 -32
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +185 -107
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/taro/index.js +1263 -1152
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
- package/dist/vue/components/Chart/orderbook.d.ts +7 -0
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/weapp/charts/canvas.js +234 -58
- package/package.json +1 -1
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { createDataCanvas as e, styleElement as t } from "../dom.js";
|
|
2
2
|
import { luminance as n, mix as r, packColor as i, parseColor as a, toCss as o } from "../color.js";
|
|
3
|
-
import {
|
|
4
|
-
import { stepDecimals as
|
|
5
|
-
import { createRenderer as
|
|
6
|
-
import { followDefaultRenderer as
|
|
7
|
-
import { readTheme as
|
|
8
|
-
import { anchorCount as
|
|
9
|
-
import { DAY as
|
|
10
|
-
import { AreaBuffer as
|
|
11
|
-
import { heikinAshiInto as
|
|
12
|
-
import { TRADING_LABELS as
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
3
|
+
import { languageOf as s, localeLabels as c, resolveLocale as l } from "../locale.js";
|
|
4
|
+
import { stepDecimals as u } from "../scale.js";
|
|
5
|
+
import { createRenderer as d } from "../renderers/detect.js";
|
|
6
|
+
import { followDefaultRenderer as f } from "../renderers/follow.js";
|
|
7
|
+
import { readTheme as p, themeColorsChanged as m, watchTheme as h } from "../theme.js";
|
|
8
|
+
import { anchorCount as g, drawingPrices as _, handlePoints as v, hitDrawing as y, isFillable as b, isPosition as x, moveHandle as S, paintDrawing as ee, setDash as te } from "./drawings.js";
|
|
9
|
+
import { DAY as ne, HOUR as re, MINUTE as ie, boundaryWeight as ae, detectPrecision as C, formatCountdown as oe, formatCrosshairTime as se, formatFixed as ce, formatPercent as le, formatVolume as ue, inferTimeframe as de, isTimeZone as fe, pickTicks as pe, priceFormatter as me, redUpLocale as he, tickText as ge, zoneOffset as _e } from "./format.js";
|
|
10
|
+
import { AreaBuffer as ve, BarBuffer as ye, LineBuffer as be, TrendBuffer as xe, candleMetrics as Se, clampRange as Ce, pixelRange as we } from "./geometry.js";
|
|
11
|
+
import { heikinAshiInto as Te, parseTimeframe as Ee, volumeProfile as De } from "./indicators.js";
|
|
12
|
+
import { TRADING_LABELS as Oe, fill as ke } from "./labels.js";
|
|
13
|
+
import { firstFree as Ae, placeTags as je, stackLabels as Me } from "./layout.js";
|
|
14
|
+
import { createScale as Ne, fitScale as Pe, fromScaled as Fe, panScale as Ie, scaleTicks as Le, scaledAt as Re, toScaled as ze, valueAt as Be, yOf as w, yOfScaled as Ve, zoomScale as He } from "./scale.js";
|
|
15
|
+
import { appendBars as Ue, barAt as We, createPyramid as Ge, createRangePyramid as Ke, createStore as qe, indexOfTime as Je, inputLength as Ye, invalidateRangePyramid as Xe, lowerBoundTime as Ze, prependBars as Qe, pyramidLevel as $e, rangeLevel as et, readBar as tt, setBars as nt, updateBar as rt } from "./store.js";
|
|
16
|
+
import { LINE_COLORS as it, buildStudies as at } from "./studies.js";
|
|
16
17
|
//#region src/engine/trading/chart.ts
|
|
17
|
-
var
|
|
18
|
+
var ot = 28, st = 60, ct = 60, lt = 48, T = "price", ut = "var(--success-color, #089981)", dt = "var(--danger-color, #f23645)", ft = "var(--warning-color, #f59e0b)", pt = "var(--primary-color, #2962ff)", mt = 100, ht = [
|
|
18
19
|
"#2962ff",
|
|
19
20
|
"#089981",
|
|
20
21
|
"#f23645",
|
|
@@ -23,26 +24,26 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
23
24
|
"#0ea5e9",
|
|
24
25
|
"#ec4899",
|
|
25
26
|
"#787b86"
|
|
26
|
-
],
|
|
27
|
+
], gt = [
|
|
27
28
|
"solid",
|
|
28
29
|
"dashed",
|
|
29
30
|
"dotted"
|
|
30
|
-
],
|
|
31
|
+
], _t = /* @__PURE__ */ new WeakMap(), vt = {
|
|
31
32
|
order: "limit",
|
|
32
33
|
position: "position",
|
|
33
34
|
takeProfit: "takeProfit",
|
|
34
35
|
stopLoss: "stopLoss",
|
|
35
36
|
alert: "alert"
|
|
36
|
-
},
|
|
37
|
+
}, E = (e, t, n) => e < t ? t : e > n ? n : e, yt = (e) => {
|
|
37
38
|
let t = a(e);
|
|
38
39
|
return t && n(t) > .5 ? "#0b0e11" : "#fff";
|
|
39
|
-
},
|
|
40
|
+
}, D = Number.isFinite, bt = "B S Alt+B Alt+S O Shift+O ArrowUp ArrowDown Shift+ArrowUp Shift+ArrowDown Enter Escape Delete", xt = (e, t, n) => D(n) ? e === "buy" ? t <= n ? "limit" : "stop" : t >= n ? "limit" : "stop" : "limit", St = {
|
|
40
41
|
minWidth: "0",
|
|
41
42
|
maxWidth: "100%",
|
|
42
43
|
overflow: "hidden",
|
|
43
44
|
textOverflow: "ellipsis"
|
|
44
|
-
},
|
|
45
|
-
let
|
|
45
|
+
}, Ct = "display:inline-flex;gap:3px;max-width:100%;overflow:hidden;text-overflow:ellipsis", O = (n, a = {}) => {
|
|
46
|
+
let O = n.ownerDocument, wt = O.defaultView, k = { ...a }, Tt = !1, Et = (e, n) => t(O.createElement(e), n), A = Et("div", {
|
|
46
47
|
position: "relative",
|
|
47
48
|
width: "100%",
|
|
48
49
|
height: "100%",
|
|
@@ -55,17 +56,17 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
55
56
|
color: "var(--text-color, #1f2937)",
|
|
56
57
|
cursor: "crosshair"
|
|
57
58
|
});
|
|
58
|
-
|
|
59
|
-
let
|
|
59
|
+
A.className = "minerva-trading-chart", A.tabIndex = 0, A.setAttribute("role", "figure"), A.setAttribute("aria-roledescription", "chart");
|
|
60
|
+
let Dt = (e) => Et(e, {
|
|
60
61
|
position: "absolute",
|
|
61
62
|
left: "0",
|
|
62
63
|
top: "0",
|
|
63
64
|
pointerEvents: "none"
|
|
64
|
-
}),
|
|
65
|
-
|
|
66
|
-
let
|
|
67
|
-
|
|
68
|
-
let
|
|
65
|
+
}), Ot = Dt("canvas"), kt = Dt("canvas");
|
|
66
|
+
Ot.setAttribute("aria-hidden", "true"), kt.setAttribute("aria-hidden", "true");
|
|
67
|
+
let At = Dt("div");
|
|
68
|
+
At.style.right = "0", At.style.bottom = "0";
|
|
69
|
+
let jt = Et("button", {
|
|
69
70
|
position: "absolute",
|
|
70
71
|
display: "none",
|
|
71
72
|
alignItems: "center",
|
|
@@ -80,8 +81,8 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
80
81
|
boxShadow: "0 4px 14px -4px rgba(15, 23, 42, 0.25)",
|
|
81
82
|
cursor: "pointer"
|
|
82
83
|
});
|
|
83
|
-
|
|
84
|
-
let
|
|
84
|
+
jt.type = "button", jt.innerHTML = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3l5 5-5 5M9 3l5 5-5 5\"/></svg>";
|
|
85
|
+
let Mt = Et("div", {
|
|
85
86
|
position: "absolute",
|
|
86
87
|
width: "1px",
|
|
87
88
|
height: "1px",
|
|
@@ -90,8 +91,8 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
90
91
|
clipPath: "inset(50%)",
|
|
91
92
|
whiteSpace: "nowrap"
|
|
92
93
|
});
|
|
93
|
-
|
|
94
|
-
let
|
|
94
|
+
Mt.setAttribute("aria-live", "polite");
|
|
95
|
+
let Nt = Et("div", {
|
|
95
96
|
position: "absolute",
|
|
96
97
|
display: "none",
|
|
97
98
|
alignItems: "center",
|
|
@@ -104,8 +105,8 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
104
105
|
zIndex: "2",
|
|
105
106
|
cursor: "default"
|
|
106
107
|
});
|
|
107
|
-
|
|
108
|
-
let
|
|
108
|
+
Nt.className = "minerva-trading-toolbar", Nt.setAttribute("role", "toolbar");
|
|
109
|
+
let j = Et("textarea", {
|
|
109
110
|
position: "absolute",
|
|
110
111
|
display: "none",
|
|
111
112
|
minWidth: "120px",
|
|
@@ -121,174 +122,174 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
121
122
|
boxShadow: "0 6px 18px -6px rgba(15, 23, 42, 0.3)",
|
|
122
123
|
zIndex: "3"
|
|
123
124
|
});
|
|
124
|
-
|
|
125
|
-
let
|
|
126
|
-
|
|
127
|
-
let
|
|
128
|
-
time:
|
|
125
|
+
j.rows = 1;
|
|
126
|
+
let Pt = Et("style", {});
|
|
127
|
+
Pt.textContent = ".minerva-trading-toolbar button{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;padding:0 5px;border-radius:5px;cursor:pointer;color:var(--text-color,#1f2937)}.minerva-trading-toolbar button:hover{background:color-mix(in srgb,var(--text-color,#1f2937) 9%,transparent)}.minerva-trading-toolbar button:focus-visible{box-shadow:inset 0 0 0 2px var(--primary-color,#2962ff)}.minerva-trading-toolbar button[aria-pressed=\"true\"]{background:color-mix(in srgb,var(--primary-color,#2962ff) 16%,transparent);color:var(--primary-color,#2962ff)}.minerva-trading-toolbar .sep{width:1px;height:18px;margin:0 3px;background:var(--border-color,#e5e7eb)}", A.append(Pt, Ot, kt, At, jt, Nt, j, Mt), n.appendChild(A);
|
|
128
|
+
let M = qe(), Ft = Ge(), It = {
|
|
129
|
+
time: M.time,
|
|
129
130
|
open: /* @__PURE__ */ new Float64Array(),
|
|
130
131
|
high: /* @__PURE__ */ new Float64Array(),
|
|
131
132
|
low: /* @__PURE__ */ new Float64Array(),
|
|
132
133
|
close: /* @__PURE__ */ new Float64Array(),
|
|
133
|
-
volume:
|
|
134
|
-
},
|
|
135
|
-
|
|
136
|
-
}), B = null, V = null, H = null, U = null,
|
|
137
|
-
|
|
138
|
-
}, J =
|
|
139
|
-
J =
|
|
140
|
-
},
|
|
141
|
-
if (
|
|
142
|
-
let t = `${
|
|
143
|
-
return t !==
|
|
144
|
-
},
|
|
134
|
+
volume: M.volume
|
|
135
|
+
}, Lt = 0, Rt = Ge(), zt = [], Bt = /* @__PURE__ */ new Map(), Vt = /* @__PURE__ */ new Map(), Ht = [], Ut = /* @__PURE__ */ new WeakMap(), Wt = /* @__PURE__ */ new WeakMap(), Gt = 0, Kt = 0, qt = 2, Jt = ne, N = k.barSpacing ?? 8, P = NaN, F = 0, I = 0, Yt = st, Xt = 0, Zt = 0, L = [], Qt = /* @__PURE__ */ new Map(), $t = /* @__PURE__ */ new Map(), en = null, tn = 0, R = p(A), nn = 0, rn = 0, z = null, an = 0, on = 0, sn = [], cn = "", ln = -1, un = 0, dn, fn = new Promise((e) => {
|
|
136
|
+
dn = e;
|
|
137
|
+
}), B = null, V = null, pn = !1, H = null, U = null, mn = /* @__PURE__ */ new Map(), hn = null, gn = null, _n = null, vn = null, W = k.drawings ?? [], yn = null, bn = W, xn = [], Sn = [], Cn = "false|false", wn = k.drawingMode ?? "cursor", Tn = null, En = null, G = null, Dn = 0, On = T, kn = 0, An = /* @__PURE__ */ new Map(), jn = null, Mn = "", Nn = !1, Pn = /* @__PURE__ */ new Map(), Fn = null, In = [], Ln = -1, Rn = null, zn = !1, Bn = null, Vn = "", Hn = NaN, Un = null, K = null, Wn = !1, Gn = 4, Kn = null, qn = /* @__PURE__ */ new Map(), q = (e, t) => {
|
|
138
|
+
qn.get(e)?.forEach((e) => e(t));
|
|
139
|
+
}, J = l(k.locale), Jn = c(Oe, J, k.labels), Yn = () => {
|
|
140
|
+
J = l(k.locale), Jn = c(Oe, J, k.labels);
|
|
141
|
+
}, Xn = () => Jn, Y = () => M.length, Zn = () => k.chartStyle ?? "candles", Qn = () => k.colorConvention === "redUp" || k.colorConvention === "auto" && he(J), $n = () => k.upColor ?? (Qn() ? dt : ut), er = () => k.downColor ?? (Qn() ? ut : dt), tr = (e, t = R.primary) => R.resolve ? R.resolve(e, t) : t, X = (e, t = 1) => o(tr(e), t), nr = () => k.precision ?? qt, rr = me(2, void 0), ir = "", Z = (e) => {
|
|
142
|
+
if (k.formatPrice) return k.formatPrice(e);
|
|
143
|
+
let t = `${nr()}|${J}`;
|
|
144
|
+
return t !== ir && (rr = me(nr(), J), ir = t), rr(e);
|
|
145
|
+
}, ar = () => (k.timeframe === void 0 ? null : Ee(k.timeframe)) ?? {
|
|
145
146
|
unit: "ms",
|
|
146
|
-
count:
|
|
147
|
-
ms:
|
|
148
|
-
},
|
|
147
|
+
count: Jt,
|
|
148
|
+
ms: Jt
|
|
149
|
+
}, or = () => ar().ms, Q = (e, t = 400) => `${t} ${e}px ${R.fontFamily}`, sr = (e) => Vt.get(e.id) ?? e.config.visible ?? !0, cr = (e) => F + (e - P) * N, lr = (e) => P - (F - e) / N, ur = (e) => {
|
|
149
150
|
let t = Y();
|
|
150
151
|
if (!t) return 0;
|
|
151
152
|
let n = Math.round(e);
|
|
152
|
-
return n < 0 ?
|
|
153
|
-
},
|
|
153
|
+
return n < 0 ? M.time[0] + n * or() : n >= t ? M.time[t - 1] + (n - t + 1) * or() : M.time[n];
|
|
154
|
+
}, dr = (e) => {
|
|
154
155
|
let t = Y();
|
|
155
156
|
if (!t) return 0;
|
|
156
157
|
let n = Math.floor(e);
|
|
157
158
|
if (n < 0 || n >= t - 1) {
|
|
158
159
|
let r = n < 0 ? 0 : t - 1;
|
|
159
|
-
return
|
|
160
|
+
return M.time[r] + (e - r) * or();
|
|
160
161
|
}
|
|
161
162
|
let r = e - n;
|
|
162
|
-
return
|
|
163
|
-
},
|
|
163
|
+
return M.time[n] + r * (M.time[n + 1] - M.time[n]);
|
|
164
|
+
}, fr = (e) => {
|
|
164
165
|
let t = Y();
|
|
165
166
|
if (!t) return 0;
|
|
166
|
-
if (e >=
|
|
167
|
-
if (e <=
|
|
168
|
-
let n =
|
|
169
|
-
return n + (r > 0 ? (e -
|
|
170
|
-
},
|
|
167
|
+
if (e >= M.time[t - 1]) return t - 1 + (e - M.time[t - 1]) / or();
|
|
168
|
+
if (e <= M.time[0]) return (e - M.time[0]) / or();
|
|
169
|
+
let n = Je(M.time, t, e), r = M.time[n + 1] - M.time[n];
|
|
170
|
+
return n + (r > 0 ? (e - M.time[n]) / r : 0);
|
|
171
|
+
}, pr, mr = (e) => k.utcOffset ?? (pr ? _e(e, pr) : -new Date(D(e) ? e : 0).getTimezoneOffset()), hr = (e) => mr(e), gr = (e) => e + mr(e) * ie, _r = (e) => e === "up" ? $n() : e === "down" ? er() : e, vr = (e, t, n) => e.level ? et(n, t, Y(), e.level) : {
|
|
171
172
|
min: t,
|
|
172
173
|
max: t,
|
|
173
174
|
last: t
|
|
174
|
-
},
|
|
175
|
-
let t =
|
|
176
|
-
return t ||
|
|
177
|
-
},
|
|
178
|
-
let t =
|
|
179
|
-
return t ||
|
|
180
|
-
},
|
|
175
|
+
}, yr = (e) => {
|
|
176
|
+
let t = Wt.get(e);
|
|
177
|
+
return t || Wt.set(e, t = Ke()), t;
|
|
178
|
+
}, br = (e) => {
|
|
179
|
+
let t = Ut.get(e);
|
|
180
|
+
return t || Ut.set(e, t = Ke()), t;
|
|
181
|
+
}, xr = (e) => {
|
|
181
182
|
let t = Y();
|
|
182
183
|
if (!t) return 0;
|
|
183
|
-
let n =
|
|
184
|
-
return e > n ? t - 1 + (e - n) /
|
|
185
|
-
},
|
|
186
|
-
for (let t of
|
|
187
|
-
|
|
184
|
+
let n = M.time[t - 1];
|
|
185
|
+
return e > n ? t - 1 + (e - n) / or() : e < M.time[0] ? (e - M.time[0]) / or() : Je(M.time, t, e);
|
|
186
|
+
}, Sr = () => Zn() === "heikinAshi" ? It : M, Cr = (e) => {
|
|
187
|
+
for (let t of zt) {
|
|
188
|
+
Bt.set(t, Math.min(Bt.get(t) ?? 0, e));
|
|
188
189
|
for (let n of t.outputs) {
|
|
189
|
-
let t =
|
|
190
|
-
t &&
|
|
190
|
+
let t = Ut.get(n);
|
|
191
|
+
t && Xe(t, e);
|
|
191
192
|
}
|
|
192
|
-
let n =
|
|
193
|
-
n &&
|
|
193
|
+
let n = Wt.get(t);
|
|
194
|
+
n && Xe(n, e);
|
|
194
195
|
}
|
|
195
|
-
|
|
196
|
-
for (let t of
|
|
197
|
-
|
|
196
|
+
Lt = Math.min(Lt, e);
|
|
197
|
+
for (let t of Ht) t.valid = Math.min(t.valid, e), Xe(t.lod, e);
|
|
198
|
+
Kn = null;
|
|
198
199
|
let t = (t) => {
|
|
199
200
|
for (let n of t.levels) n && (n.valid = Math.min(n.valid, Math.floor(e / n.size)));
|
|
200
201
|
};
|
|
201
|
-
t(
|
|
202
|
-
},
|
|
202
|
+
t(Ft), t(Rt);
|
|
203
|
+
}, wr = () => {
|
|
203
204
|
let e = Y();
|
|
204
|
-
for (let t of
|
|
205
|
-
let n =
|
|
206
|
-
n < e && (t.compute(
|
|
205
|
+
for (let t of zt) {
|
|
206
|
+
let n = Bt.get(t) ?? 0;
|
|
207
|
+
n < e && (t.compute(M, n), Bt.set(t, e));
|
|
207
208
|
}
|
|
208
|
-
if (
|
|
209
|
-
if (
|
|
209
|
+
if (It.time = M.time, It.volume = M.volume, Zn() === "heikinAshi" && Lt < e) {
|
|
210
|
+
if (It.open.length < M.capacity) for (let e of [
|
|
210
211
|
"open",
|
|
211
212
|
"high",
|
|
212
213
|
"low",
|
|
213
214
|
"close"
|
|
214
215
|
]) {
|
|
215
|
-
let t = new Float64Array(
|
|
216
|
-
t.set(
|
|
216
|
+
let t = new Float64Array(M.capacity);
|
|
217
|
+
t.set(It[e].subarray(0, Lt)), It[e] = t;
|
|
217
218
|
}
|
|
218
|
-
|
|
219
|
+
Te(M.open, M.high, M.low, M.close, e, It, Lt), Lt = e;
|
|
219
220
|
}
|
|
220
|
-
for (let t of
|
|
221
|
-
if (t.values.length <
|
|
222
|
-
let e = new Float64Array(
|
|
221
|
+
for (let t of Ht) if (!(t.valid >= e)) {
|
|
222
|
+
if (t.values.length < M.capacity) {
|
|
223
|
+
let e = new Float64Array(M.capacity).fill(NaN);
|
|
223
224
|
e.set(t.values.subarray(0, t.valid)), t.values = e;
|
|
224
225
|
}
|
|
225
226
|
for (let n = t.valid; n < e; n++) {
|
|
226
|
-
let e =
|
|
227
|
+
let e = Ze(t.times, t.times.length, M.time[n] + .5) - 1;
|
|
227
228
|
t.values[n] = e >= 0 ? t.data[e] : NaN;
|
|
228
229
|
}
|
|
229
230
|
t.valid = e;
|
|
230
231
|
}
|
|
231
|
-
},
|
|
232
|
-
|
|
232
|
+
}, Tr = (e) => {
|
|
233
|
+
Cr(e);
|
|
233
234
|
let t = Y();
|
|
234
|
-
e < t - 1 &&
|
|
235
|
-
},
|
|
236
|
-
let { studies: e, reused: t } =
|
|
237
|
-
for (let e of
|
|
238
|
-
for (let n of e) t.has(n) ||
|
|
239
|
-
|
|
240
|
-
for (let e of [...
|
|
241
|
-
},
|
|
242
|
-
|
|
235
|
+
e < t - 1 && Gt++, Kt++, t && (qt = Math.max(e === 0 ? 0 : qt, C(M.close, e, t), C(M.open, Math.max(e, t - 50), t)), (e === 0 || t < 80) && (Jt = de(M.time, t))), $();
|
|
236
|
+
}, Er = () => {
|
|
237
|
+
let { studies: e, reused: t } = at(k.indicators ?? [], zt, hr);
|
|
238
|
+
for (let e of zt) t.has(e) || Bt.delete(e);
|
|
239
|
+
for (let n of e) t.has(n) || Bt.set(n, 0);
|
|
240
|
+
zt = e;
|
|
241
|
+
for (let e of [...Vt.keys()]) zt.some((t) => t.id === e) || Vt.delete(e);
|
|
242
|
+
}, Dr = () => {
|
|
243
|
+
Ht = (k.compare ?? []).map((e, t) => {
|
|
243
244
|
let n = [...e.data].sort((e, t) => e.time - t.time);
|
|
244
245
|
return {
|
|
245
246
|
id: e.id ?? e.name,
|
|
246
247
|
name: e.name,
|
|
247
|
-
color: e.color ??
|
|
248
|
+
color: e.color ?? it[(t + 2) % it.length],
|
|
248
249
|
width: e.lineWidth ?? 1.5,
|
|
249
250
|
times: Float64Array.from(n, (e) => e.time),
|
|
250
251
|
data: Float64Array.from(n, (e) => e.value),
|
|
251
252
|
values: /* @__PURE__ */ new Float64Array(),
|
|
252
253
|
valid: 0,
|
|
253
|
-
lod:
|
|
254
|
+
lod: Ke()
|
|
254
255
|
};
|
|
255
256
|
});
|
|
256
|
-
},
|
|
257
|
+
}, Or = () => {
|
|
257
258
|
let e = Y();
|
|
258
|
-
if (!e || !
|
|
259
|
-
let t =
|
|
259
|
+
if (!e || !D(P)) return !0;
|
|
260
|
+
let t = cr(e - 1);
|
|
260
261
|
return t >= 0 && t <= F + N * .5;
|
|
261
|
-
},
|
|
262
|
-
|
|
263
|
-
for (let e of
|
|
264
|
-
P = Y() - 1 + (
|
|
265
|
-
},
|
|
266
|
-
let t = Y(), n =
|
|
262
|
+
}, kr = (e) => {
|
|
263
|
+
nt(M, e), Ft = Ge(), Rt = Ge(), Lt = 0, Hn = NaN;
|
|
264
|
+
for (let e of Qt.values()) e.auto = !0;
|
|
265
|
+
P = Y() - 1 + (k.rightOffset ?? 8), gn = null, _n = null, Tr(0);
|
|
266
|
+
}, Ar = (e) => {
|
|
267
|
+
let t = Y(), n = Ye(e);
|
|
267
268
|
if (t >= 2 && n >= t) {
|
|
268
|
-
let r =
|
|
269
|
-
if (r ===
|
|
270
|
-
let r =
|
|
269
|
+
let r = We(e, 0).time, i = M.time[t - 1];
|
|
270
|
+
if (r === M.time[0] && We(e, t - 2).time === M.time[t - 2]) {
|
|
271
|
+
let r = Or(), i = t, a = t;
|
|
271
272
|
for (let r = t - 1; r < n; r++) {
|
|
272
|
-
let t =
|
|
273
|
+
let t = rt(M, We(e, r));
|
|
273
274
|
t >= 0 && (a = Math.min(a, t));
|
|
274
275
|
}
|
|
275
|
-
r && (P += Y() - i), a < Y() &&
|
|
276
|
+
r && (P += Y() - i), a < Y() && Tr(a);
|
|
276
277
|
return;
|
|
277
278
|
}
|
|
278
|
-
if (
|
|
279
|
+
if (We(e, n - 1).time === i && n > t) {
|
|
279
280
|
let r = n - t;
|
|
280
|
-
|
|
281
|
+
nt(M, e), Ft = Ge(), Rt = Ge(), Lt = 0, P += r, Tr(0);
|
|
281
282
|
return;
|
|
282
283
|
}
|
|
283
284
|
}
|
|
284
|
-
|
|
285
|
-
},
|
|
286
|
-
let e =
|
|
287
|
-
let n =
|
|
288
|
-
return n || (n =
|
|
289
|
-
}, u = l(
|
|
285
|
+
kr(e);
|
|
286
|
+
}, jr = () => {
|
|
287
|
+
let e = zt.filter((e) => !e.overlay), t = I, n = e.map((e) => $t.get(e.id) ?? e.height), r = n.reduce((e, t) => e + t, 0), i = Math.max(0, t * .62), a = r > i && r > 0 ? i / r : 1, o = n.map((e) => Math.max(lt * Math.min(1, a * 2), e * a)), s = Math.max(40, t - o.reduce((e, t) => e + t, 0)), c = [], l = (e, t) => {
|
|
288
|
+
let n = Qt.get(e);
|
|
289
|
+
return n || (n = Ne(t), Qt.set(e, n)), n.mode !== t && (n.mode = t, n.auto = !0), n;
|
|
290
|
+
}, u = l(T, k.scaleMode ?? "linear");
|
|
290
291
|
u.top = 0, u.height = s, u.marginTop = .1, u.marginBottom = .08, c.push({
|
|
291
|
-
id:
|
|
292
|
+
id: T,
|
|
292
293
|
study: null,
|
|
293
294
|
scale: u,
|
|
294
295
|
top: 0,
|
|
@@ -309,19 +310,19 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
309
310
|
step: 0
|
|
310
311
|
}), d += o[t];
|
|
311
312
|
});
|
|
312
|
-
for (let e of [...
|
|
313
|
+
for (let e of [...Qt.keys()]) c.some((t) => t.id === e) || Qt.delete(e);
|
|
313
314
|
L = c;
|
|
314
|
-
},
|
|
315
|
+
}, Mr = (e) => L.find((t) => e >= t.top && e < t.top + t.height) ?? null, Nr = () => {
|
|
315
316
|
let e = Y(), t = Math.min(1, F * .8 / Math.max(1, e));
|
|
316
|
-
N =
|
|
317
|
+
N = E(N, Math.max(1e-4, t), ct);
|
|
317
318
|
let n = F / N;
|
|
318
|
-
|
|
319
|
-
let r = Math.max(0, e - 1) + Math.max(
|
|
320
|
-
P =
|
|
321
|
-
},
|
|
319
|
+
D(P) || (P = e - 1 + (k.rightOffset ?? 8));
|
|
320
|
+
let r = Math.max(0, e - 1) + Math.max(k.rightOffset ?? 8, n * .75), i = Math.min(n * .25, r);
|
|
321
|
+
P = E(P, i, r);
|
|
322
|
+
}, Pr = () => {
|
|
322
323
|
let e = Y();
|
|
323
324
|
if (!e) return null;
|
|
324
|
-
let t = P - F / N, n = N >= 2 ? 0 : Math.ceil(Math.log2(2 / N)), r = 2 ** n, i =
|
|
325
|
+
let t = P - F / N, n = N >= 2 ? 0 : Math.ceil(Math.log2(2 / N)), r = 2 ** n, i = Sr(), a = n ? $e(Zn() === "heikinAshi" ? Rt : Ft, i, e, n) : i, o = Math.floor((e - 1) / r), s = E(Math.floor(t) - 1, 0, e - 1), c = E(Math.ceil(P) + 1, 0, e - 1), l = E(Math.ceil(t - .5), 0, e - 1), u = E(Math.floor(P + .5), 0, e - 1);
|
|
325
326
|
return {
|
|
326
327
|
left: t,
|
|
327
328
|
level: n,
|
|
@@ -333,70 +334,70 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
333
334
|
s1: Math.floor(u / r),
|
|
334
335
|
last: o
|
|
335
336
|
};
|
|
336
|
-
},
|
|
337
|
+
}, Fr = (e, t) => t * e.size + (e.size - 1) / 2, Ir = (e, t) => Math.min(e.size, Y() - t * e.size), Lr = () => E(Math.ceil(P - F / N - .5), 0, Math.max(0, Y() - 1)), Rr = (e) => {
|
|
337
338
|
let t = Y();
|
|
338
|
-
for (let n =
|
|
339
|
+
for (let n = Lr(); n < t; n++) {
|
|
339
340
|
let t = e.values[n];
|
|
340
|
-
if (
|
|
341
|
+
if (D(t) && t !== 0) return t;
|
|
341
342
|
}
|
|
342
343
|
return NaN;
|
|
343
|
-
},
|
|
344
|
-
let a =
|
|
344
|
+
}, zr = (e, t, n) => e.mode === "percent" ? (t / n - 1) * 100 : ze(e, t), Br = () => k.baselinePrice ?? Sr().close[Lr()], Vr = (e, t, n, r, i) => {
|
|
345
|
+
let a = vr(e, t, n), o = Math.round(r / e.size), s = E(e.s0 - o, 0, e.last), c = E(e.s1 - o, 0, e.last);
|
|
345
346
|
for (let e = s; e <= c; e++) a.min[e] < i[0] && (i[0] = a.min[e]), a.max[e] > i[1] && (i[1] = a.max[e]);
|
|
346
|
-
},
|
|
347
|
-
if (!
|
|
347
|
+
}, Hr = (e, t) => {
|
|
348
|
+
if (!k.autoscaleIncludesDrawings || !W.length) return;
|
|
348
349
|
let n = P - F / N, r = U?.kind === "drawing" ? U : null;
|
|
349
350
|
for (let i of W) {
|
|
350
|
-
if ((i.pane ??
|
|
351
|
+
if ((i.pane ?? T) !== e) continue;
|
|
351
352
|
let a = r && r.id === i.id ? r.original : i;
|
|
352
|
-
for (let e of
|
|
353
|
+
for (let e of _(a, xr, n, P)) e < t[0] && (t[0] = e), e > t[1] && (t[1] = e);
|
|
353
354
|
}
|
|
354
|
-
},
|
|
355
|
-
|
|
355
|
+
}, Ur = (e) => {
|
|
356
|
+
tn = 0;
|
|
356
357
|
for (let t of L) {
|
|
357
358
|
let n = t.scale;
|
|
358
359
|
if (!e) continue;
|
|
359
|
-
if (t.id ===
|
|
360
|
-
n.base =
|
|
361
|
-
let { cols: t } = e, r =
|
|
360
|
+
if (t.id === T) {
|
|
361
|
+
n.base = M.close[Lr()] || 1;
|
|
362
|
+
let { cols: t } = e, r = Zn(), i = r === "line" || r === "area" || r === "baseline", a = [Infinity, -Infinity];
|
|
362
363
|
for (let n = e.s0; n <= e.s1; n++) {
|
|
363
364
|
let e = i ? t.close[n] : t.low[n], r = i ? t.close[n] : t.high[n];
|
|
364
365
|
e < a[0] && (a[0] = e), r > a[1] && (a[1] = r);
|
|
365
366
|
}
|
|
366
|
-
for (let n of
|
|
367
|
+
for (let n of zt) if (n.overlay && sr(n)) {
|
|
367
368
|
if (n.type === "volume") {
|
|
368
369
|
for (let n = e.s0; n <= e.s1; n++) {
|
|
369
|
-
let r = t.volume[n] /
|
|
370
|
-
r >
|
|
370
|
+
let r = t.volume[n] / Ir(e, n);
|
|
371
|
+
r > tn && (tn = r);
|
|
371
372
|
}
|
|
372
373
|
continue;
|
|
373
374
|
}
|
|
374
|
-
for (let t of n.outputs)
|
|
375
|
+
for (let t of n.outputs) Vr(e, t.values, br(t), t.shift, a);
|
|
375
376
|
}
|
|
376
|
-
|
|
377
|
+
Hr(T, a);
|
|
377
378
|
let [o, s] = a;
|
|
378
379
|
if (r === "baseline") {
|
|
379
|
-
let e =
|
|
380
|
+
let e = Br();
|
|
380
381
|
e < o && (o = e), e > s && (s = e);
|
|
381
382
|
}
|
|
382
383
|
if (!n.auto) continue;
|
|
383
|
-
let c =
|
|
384
|
-
n.mode === "log" && !(o > 0) && (c =
|
|
385
|
-
for (let t of
|
|
386
|
-
let r =
|
|
387
|
-
|
|
384
|
+
let c = ze(n, o), l = ze(n, s);
|
|
385
|
+
n.mode === "log" && !(o > 0) && (c = ze(n, Math.max(s * .001, 1e-12)));
|
|
386
|
+
for (let t of Ht) {
|
|
387
|
+
let r = Rr(t), i = [Infinity, -Infinity];
|
|
388
|
+
Vr(e, t.values, t.lod, 0, i);
|
|
388
389
|
for (let e of i) {
|
|
389
|
-
let t =
|
|
390
|
+
let t = zr(n, e, r);
|
|
390
391
|
t < c && (c = t), t > l && (l = t);
|
|
391
392
|
}
|
|
392
393
|
}
|
|
393
|
-
n.mode === "percent" &&
|
|
394
|
+
n.mode === "percent" && Ht.length && (c = Math.min(c, 0), l = Math.max(l, 0)), Pe(n, c, l);
|
|
394
395
|
continue;
|
|
395
396
|
}
|
|
396
397
|
let r = t.study;
|
|
397
398
|
if (!r || !n.auto) continue;
|
|
398
399
|
if (r.range) {
|
|
399
|
-
|
|
400
|
+
Pe(n, r.range[0], r.range[1]);
|
|
400
401
|
continue;
|
|
401
402
|
}
|
|
402
403
|
let i = [Infinity, -Infinity];
|
|
@@ -404,39 +405,39 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
404
405
|
for (let t of r.outputs) {
|
|
405
406
|
if (t.kind === "volume") {
|
|
406
407
|
for (let t = e.s0; t <= e.s1; t++) {
|
|
407
|
-
let n = e.cols.volume[t] /
|
|
408
|
+
let n = e.cols.volume[t] / Ir(e, t);
|
|
408
409
|
n > i[1] && (i[1] = n);
|
|
409
410
|
}
|
|
410
411
|
continue;
|
|
411
412
|
}
|
|
412
|
-
|
|
413
|
+
Vr(e, t.values, br(t), t.shift, i);
|
|
413
414
|
}
|
|
414
|
-
|
|
415
|
+
Hr(t.id, i);
|
|
415
416
|
let [a, o] = i;
|
|
416
|
-
if (r.bands &&
|
|
417
|
-
r.zero &&
|
|
417
|
+
if (r.bands && D(a) && D(o)) for (let e of r.bands) a = Math.min(a, e), o = Math.max(o, e);
|
|
418
|
+
r.zero && D(a) && D(o) && (a = Math.min(a, 0), o = Math.max(o, 0)), Pe(n, a, o);
|
|
418
419
|
}
|
|
419
|
-
},
|
|
420
|
+
}, Wr = (e, t) => {
|
|
420
421
|
let n = Y();
|
|
421
422
|
if (!n || !e) return [];
|
|
422
|
-
let r =
|
|
423
|
+
let r = or(), i = r < ne, a = Math.floor(Math.max(0, Math.ceil(P)) / e.size), o = (t) => t <= e.last ? e.cols.time[t] : M.time[n - 1] + (t * e.size - (n - 1)) * r, s = [], c = e.g0 > 0 ? gr(o(e.g0 - 1)) : NaN;
|
|
423
424
|
for (let t = e.g0; t <= a; t++) {
|
|
424
|
-
let n =
|
|
425
|
+
let n = gr(o(t)), r = cr(Fr(e, t)), i = ae(c, n);
|
|
425
426
|
r >= -20 && r <= F + 20 && i > 10 && s.push({
|
|
426
427
|
x: r,
|
|
427
428
|
weight: i,
|
|
428
429
|
time: n
|
|
429
430
|
}), c = n;
|
|
430
431
|
}
|
|
431
|
-
t.font =
|
|
432
|
+
t.font = Q(R.fontSize);
|
|
432
433
|
let l = i ? "00:00" : "Sep 30", u = Math.max(t.measureText(l).width, t.measureText("2024").width) + 34;
|
|
433
|
-
return
|
|
434
|
+
return pe(s, u).filter((e) => e.x > 8 && e.x < F - 8).map((e) => ({
|
|
434
435
|
x: e.x,
|
|
435
|
-
text:
|
|
436
|
+
text: ge(e.time, e.weight, J, i),
|
|
436
437
|
bold: e.weight >= (i ? 50 : 60)
|
|
437
438
|
}));
|
|
438
|
-
},
|
|
439
|
-
let n = [], a = e.cols, o =
|
|
439
|
+
}, Gr = (e, t) => e.id === T ? e.scale.mode === "percent" ? le(t, J, Math.min(2, u(e.step))) : Z(Fe(e.scale, t)) : e.study?.compact ? ue(t, J) : ce(t, Math.min(4, u(e.step)), J), Kr = (e, t) => e.overlay && e.type !== "volume" ? Z(t) : e.compact ? ue(t, J) : ce(t, e.range ? 2 : Math.max(2, Math.min(6, nr())), J), qr = (e, t) => {
|
|
440
|
+
let n = [], a = e.cols, o = tr($n()), s = tr(er()), c = i(o), l = i(s), u = R.background, d = Se(N * e.size * t, t), f = (n) => cr(Fr(e, n)) * t, p = Zn(), m = Math.max(.5, d.body / 2), h = {
|
|
440
441
|
up: i([
|
|
441
442
|
o[0],
|
|
442
443
|
o[1],
|
|
@@ -451,33 +452,33 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
451
452
|
])
|
|
452
453
|
};
|
|
453
454
|
for (let g of L) {
|
|
454
|
-
let _ = g.top * t, v = (g.top + g.height) * t, y = g.scale, b = (e) =>
|
|
455
|
-
let c = new
|
|
455
|
+
let _ = g.top * t, v = (g.top + g.height) * t, y = g.scale, b = (e) => w(y, e) * t, x = (t, n, r, i = b) => (a, o, s) => {
|
|
456
|
+
let c = new be(_, v);
|
|
456
457
|
for (let n = s ? Math.max(e.g0, a - 1) : a; n <= o; n++) c.push(f(n), i(t(n)));
|
|
457
458
|
return c.count > 1 ? [c.item("", 0, n, r)] : [];
|
|
458
|
-
},
|
|
459
|
-
let d =
|
|
459
|
+
}, S = (n, r, i, a, o = 0, s = b) => (c, l, u) => {
|
|
460
|
+
let d = vr(e, n, r), p = o * N * t, m = Math.ceil(Math.abs(o) / e.size) + 1, h = u ? Math.max(0, c - 1) : c, g = l;
|
|
460
461
|
!u && o > 0 && (h = Math.max(0, h - m)), !u && o < 0 && (g = Math.min(e.last - 1, g + m));
|
|
461
|
-
let y = new
|
|
462
|
+
let y = new be(_, v), b = NaN;
|
|
462
463
|
for (let t = h; t <= g; t++) {
|
|
463
464
|
let n = f(t) + p, r = d.min[t], i = d.max[t];
|
|
464
|
-
if (!e.level || r === i || !
|
|
465
|
+
if (!e.level || r === i || !D(r) || !D(i)) {
|
|
465
466
|
b = s(d.last[t]), y.push(n, b);
|
|
466
467
|
continue;
|
|
467
468
|
}
|
|
468
|
-
let a = s(r), o = s(i), c =
|
|
469
|
+
let a = s(r), o = s(i), c = D(b) && Math.abs(b - o) < Math.abs(b - a) ? o : a, l = c === o ? a : o;
|
|
469
470
|
y.push(n, c), y.push(n, l), b = l;
|
|
470
471
|
}
|
|
471
472
|
return y.count > 1 ? [y.item("", 0, i, a)] : [];
|
|
472
|
-
},
|
|
473
|
-
let l =
|
|
473
|
+
}, ee = (t, n, r, i, a) => (o, s, c) => {
|
|
474
|
+
let l = vr(e, t.value, n), d = Y(), p = new xe(_, v), m = NaN;
|
|
474
475
|
for (let n = c ? Math.max(0, o - 1) : o; n <= s; n++) {
|
|
475
476
|
let r = l.min[n], i = l.max[n];
|
|
476
|
-
if (!
|
|
477
|
+
if (!D(r) || !D(i)) {
|
|
477
478
|
p.break(), m = NaN;
|
|
478
479
|
continue;
|
|
479
480
|
}
|
|
480
|
-
let a = t.direction[Math.min(d - 1, n * e.size + e.size - 1)] !== -1, o = f(n), s = b(r), c = b(i), u =
|
|
481
|
+
let a = t.direction[Math.min(d - 1, n * e.size + e.size - 1)] !== -1, o = f(n), s = b(r), c = b(i), u = D(m) && Math.abs(m - c) < Math.abs(m - s) ? c : s, h = u === c ? s : c;
|
|
481
482
|
p.push(o, u, a), h !== u && p.push(o, h, a), m = h;
|
|
482
483
|
}
|
|
483
484
|
let h = [
|
|
@@ -489,39 +490,39 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
489
490
|
for (let [e, t] of [[p.up, "u"], [p.down, "d"]]) e.count > 1 && g.push(e.item(`${t}h`, 0, h, a + 2.5));
|
|
490
491
|
return p.up.count > 1 && g.push(p.up.item("u", 0, r, a)), p.down.count > 1 && g.push(p.down.item("d", 0, i, a)), g;
|
|
491
492
|
};
|
|
492
|
-
if (g.id ===
|
|
493
|
-
if (
|
|
493
|
+
if (g.id === T) {
|
|
494
|
+
if (zt.find((e) => e.overlay && e.type === "volume" && sr(e)) && tn > 0) {
|
|
494
495
|
let t = (v - _) * .2;
|
|
495
496
|
n.push((n, r) => {
|
|
496
|
-
let i = new
|
|
497
|
+
let i = new ye();
|
|
497
498
|
for (let o = n; o <= r; o++) {
|
|
498
|
-
let n = a.volume[o] /
|
|
499
|
+
let n = a.volume[o] / Ir(e, o);
|
|
499
500
|
if (!(n > 0)) continue;
|
|
500
|
-
let r = v - n /
|
|
501
|
+
let r = v - n / tn * t, [s, c] = we(r, v);
|
|
501
502
|
i.push(d.snap(f(o)), s, c, a.close[o] >= a.open[o] ? h.up : h.down);
|
|
502
503
|
}
|
|
503
504
|
return [i.item("", 0, m)];
|
|
504
505
|
});
|
|
505
506
|
}
|
|
506
|
-
for (let e of
|
|
507
|
-
let r =
|
|
508
|
-
n.push(
|
|
507
|
+
for (let e of Ht) {
|
|
508
|
+
let r = Rr(e), i = tr(e.color);
|
|
509
|
+
n.push(S(e.values, e.lod, i, e.width, 0, (e) => Ve(y, zr(y, e, r)) * t));
|
|
509
510
|
}
|
|
510
511
|
if (p === "line" || p === "area" || p === "baseline") {
|
|
511
|
-
let t =
|
|
512
|
+
let t = tr(pt);
|
|
512
513
|
if (p === "area" && n.push((n, r, i) => {
|
|
513
|
-
let o = new
|
|
514
|
+
let o = new ve(_, v);
|
|
514
515
|
for (let t = i ? Math.max(e.g0, n - 1) : n; t <= r; t++) o.push(f(t), b(a.close[t]), v);
|
|
515
516
|
return o.count > 1 ? [o.item("", 0, t, .28)] : [];
|
|
516
517
|
}), p === "baseline") {
|
|
517
|
-
let t = b(
|
|
518
|
+
let t = b(Br());
|
|
518
519
|
n.push((n, r, i) => {
|
|
519
|
-
let c = new
|
|
520
|
+
let c = new ve(_, v), l = new ve(_, v), u = new be(_, v), d = new be(_, v), p = NaN, m = NaN, h = (e, n) => {
|
|
520
521
|
c.push(e, Math.min(n, t), t), l.push(e, Math.max(n, t), t), n <= t ? u.push(e, n) : u.break(), n >= t ? d.push(e, n) : d.break();
|
|
521
522
|
};
|
|
522
523
|
for (let o = i ? Math.max(e.g0, n - 1) : n; o <= r; o++) {
|
|
523
524
|
let e = f(o), n = b(a.close[o]);
|
|
524
|
-
if (
|
|
525
|
+
if (D(m) && (m - t) * (n - t) < 0) {
|
|
525
526
|
let r = (t - m) / (n - m);
|
|
526
527
|
h(p + (e - p) * r, t);
|
|
527
528
|
}
|
|
@@ -530,67 +531,67 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
530
531
|
let g = [];
|
|
531
532
|
return c.count > 1 && g.push(c.item("u", 0, o, .22), l.item("d", 0, s, .22)), u.count > 1 && g.push(u.item("ul", 0, o, 2)), d.count > 1 && g.push(d.item("dl", 0, s, 2)), g;
|
|
532
533
|
});
|
|
533
|
-
} else n.push(
|
|
534
|
+
} else n.push(x((e) => a.close[e], t, 2));
|
|
534
535
|
} else {
|
|
535
536
|
let e = p === "hollowCandles", t = p === "bars", r = d.wick, i = d.body;
|
|
536
537
|
n.push((n, o) => {
|
|
537
|
-
let s = new
|
|
538
|
+
let s = new ye(), u = new ye(), p = new ye(), m = new ye(), h = Math.max(r, Math.round((i - r) / 2));
|
|
538
539
|
for (let g = n; g <= o; g++) {
|
|
539
|
-
let n = a.open[g], o = a.high[g], y = a.low[g],
|
|
540
|
-
if (!
|
|
541
|
-
let
|
|
540
|
+
let n = a.open[g], o = a.high[g], y = a.low[g], x = a.close[g];
|
|
541
|
+
if (!D(n) || !D(x)) continue;
|
|
542
|
+
let S = (e ? x >= (g > 0 ? a.close[g - 1] : n) : x >= n) ? c : l, ee = d.snap(f(g)), [te, ne] = we(b(o), b(y));
|
|
542
543
|
if (t) {
|
|
543
|
-
let e =
|
|
544
|
-
e && s.push(
|
|
545
|
-
for (let [e, t] of [[n, -1], [
|
|
544
|
+
let e = Ce(te, ne, _, v);
|
|
545
|
+
e && s.push(ee, e[0], e[1], S);
|
|
546
|
+
for (let [e, t] of [[n, -1], [x, 1]]) {
|
|
546
547
|
let n = Math.round(b(e) - r / 2);
|
|
547
|
-
n < _ || n + r > v || m.push(
|
|
548
|
+
n < _ || n + r > v || m.push(ee + t * (r / 2 + h / 2), n, n + r, S);
|
|
548
549
|
}
|
|
549
550
|
continue;
|
|
550
551
|
}
|
|
551
|
-
let [
|
|
552
|
+
let [re, ie] = we(b(n), b(x));
|
|
552
553
|
if (i <= r) {
|
|
553
|
-
let e =
|
|
554
|
-
e && s.push(
|
|
554
|
+
let e = Ce(te, ne, _, v);
|
|
555
|
+
e && s.push(ee, e[0], e[1], S);
|
|
555
556
|
continue;
|
|
556
557
|
}
|
|
557
|
-
if (e &&
|
|
558
|
-
let e = [[
|
|
558
|
+
if (e && x > n) {
|
|
559
|
+
let e = [[te, re], [ie, ne]];
|
|
559
560
|
for (let [t, n] of e) {
|
|
560
|
-
let e = n > t ?
|
|
561
|
-
e && s.push(
|
|
561
|
+
let e = n > t ? Ce(t, n, _, v) : null;
|
|
562
|
+
e && s.push(ee, e[0], e[1], S);
|
|
562
563
|
}
|
|
563
|
-
let t =
|
|
564
|
-
t && (s.push(
|
|
565
|
-
for (let e of [
|
|
564
|
+
let t = Ce(re, ie, _, v);
|
|
565
|
+
t && (s.push(ee - i / 2 + r / 2, t[0], t[1], S), s.push(ee + i / 2 - r / 2, t[0], t[1], S));
|
|
566
|
+
for (let e of [re, ie - r]) e >= _ && e + r <= v && p.push(ee, e, e + r, S);
|
|
566
567
|
continue;
|
|
567
568
|
}
|
|
568
|
-
let
|
|
569
|
-
|
|
570
|
-
let
|
|
571
|
-
|
|
569
|
+
let ae = Ce(te, ne, _, v);
|
|
570
|
+
ae && s.push(ee, ae[0], ae[1], S);
|
|
571
|
+
let C = Ce(re, ie, _, v);
|
|
572
|
+
C && u.push(ee, C[0], C[1], S);
|
|
572
573
|
}
|
|
573
574
|
let g = [s.item("w", 0, r / 2)];
|
|
574
575
|
return u.count && g.push(u.item("b", 0, i / 2)), p.count && g.push(p.item("c", 0, i / 2)), m.count && g.push(m.item("t", 0, h / 2)), g;
|
|
575
576
|
});
|
|
576
577
|
}
|
|
577
578
|
}
|
|
578
|
-
let
|
|
579
|
-
for (let p of
|
|
580
|
-
if (!
|
|
581
|
-
let g = p.trend, [y,
|
|
582
|
-
if (g && e.level && y &&
|
|
583
|
-
n.push(
|
|
579
|
+
let te = g.id === T ? zt.filter((e) => e.overlay && e.type !== "volume") : g.study ? [g.study] : [];
|
|
580
|
+
for (let p of te) {
|
|
581
|
+
if (!sr(p)) continue;
|
|
582
|
+
let g = p.trend, [y, x] = p.outputs;
|
|
583
|
+
if (g && e.level && y && x) {
|
|
584
|
+
n.push(ee(g, yr(p), tr(_r(y.color)), tr(_r(x.color)), y.width));
|
|
584
585
|
continue;
|
|
585
586
|
}
|
|
586
587
|
for (let g of p.outputs) if (g.kind === "volume") {
|
|
587
588
|
let t = b(0);
|
|
588
589
|
n.push((n, r) => {
|
|
589
|
-
let i = new
|
|
590
|
+
let i = new ye();
|
|
590
591
|
for (let o = n; o <= r; o++) {
|
|
591
|
-
let n = a.volume[o] /
|
|
592
|
+
let n = a.volume[o] / Ir(e, o);
|
|
592
593
|
if (!(n > 0)) continue;
|
|
593
|
-
let r =
|
|
594
|
+
let r = Ce(...we(b(n), t), _, v);
|
|
594
595
|
r && i.push(d.snap(f(o)), r[0], r[1], a.close[o] >= a.open[o] ? h.up : h.down);
|
|
595
596
|
}
|
|
596
597
|
return [i.item("", 0, m)];
|
|
@@ -602,24 +603,24 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
602
603
|
}, p = {
|
|
603
604
|
up: i(r(u, o, .45)),
|
|
604
605
|
down: i(r(u, s, .45))
|
|
605
|
-
}, h =
|
|
606
|
+
}, h = br(g);
|
|
606
607
|
n.push((n, r) => {
|
|
607
|
-
let i =
|
|
608
|
+
let i = vr(e, g.values, h), o = new ye();
|
|
608
609
|
for (let s = n; s <= r; s++) {
|
|
609
610
|
let n = i.last[s];
|
|
610
|
-
if (!
|
|
611
|
-
let r = s > 0 ? i.last[s - 1] : n, c = n >= 0 ? n >= r ? a.up : p.up : n <= r ? a.down : p.down, l = Math.min(0,
|
|
611
|
+
if (!D(n)) continue;
|
|
612
|
+
let r = s > 0 ? i.last[s - 1] : n, c = n >= 0 ? n >= r ? a.up : p.up : n <= r ? a.down : p.down, l = Math.min(0, D(i.min[s]) ? i.min[s] : n), u = Math.max(0, D(i.max[s]) ? i.max[s] : n), m = Ce(...e.level ? we(b(u), b(l)) : we(b(n), t), _, v);
|
|
612
613
|
m && o.push(d.snap(f(s)), m[0], m[1], c);
|
|
613
614
|
}
|
|
614
615
|
return [o.item("", 0, m)];
|
|
615
616
|
});
|
|
616
617
|
} else if (g.kind === "dots") {
|
|
617
|
-
let r = g.color ? i(
|
|
618
|
+
let r = g.color ? i(tr(_r(g.color))) : 0, o = E(N * e.size * .22, 1.25, 2.6), s = o * t;
|
|
618
619
|
n.push((t, n) => {
|
|
619
|
-
let i = new
|
|
620
|
+
let i = new ye();
|
|
620
621
|
for (let o = t; o <= n; o++) {
|
|
621
622
|
let t = e.level ? g.values[Math.min(Y() - 1, o * e.size + e.size - 1)] : g.values[o];
|
|
622
|
-
if (!
|
|
623
|
+
if (!D(t)) continue;
|
|
623
624
|
let n = b(t);
|
|
624
625
|
if (n < _ || n > v) continue;
|
|
625
626
|
let u = r || (t <= a.close[o] ? c : l);
|
|
@@ -628,8 +629,8 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
628
629
|
return i.count ? [i.item("", 0, s, 0, o)] : [];
|
|
629
630
|
});
|
|
630
631
|
} else {
|
|
631
|
-
let e =
|
|
632
|
-
n.push(
|
|
632
|
+
let e = tr(_r(g.color));
|
|
633
|
+
n.push(S(g.values, br(g), [
|
|
633
634
|
e[0],
|
|
634
635
|
e[1],
|
|
635
636
|
e[2],
|
|
@@ -639,14 +640,14 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
639
640
|
}
|
|
640
641
|
}
|
|
641
642
|
return n;
|
|
642
|
-
},
|
|
643
|
-
let i = Math.min(n.g1, n.last - 1), a = r ? n.last >= n.g0 && n.last <= n.g1 ? e(n.last, n.last, !0) : [] : i >= n.g0 ? e(n.g0, i, !1) : [], o = ++
|
|
643
|
+
}, Jr = (e, t, n, r) => {
|
|
644
|
+
let i = Math.min(n.g1, n.last - 1), a = r ? n.last >= n.g0 && n.last <= n.g1 ? e(n.last, n.last, !0) : [] : i >= n.g0 ? e(n.g0, i, !1) : [], o = ++un;
|
|
644
645
|
return a.map((e, n) => ({
|
|
645
646
|
...e,
|
|
646
647
|
key: `L${t}:${n}:${e.kind}:${e.key}${r ? ":live" : ""}`,
|
|
647
648
|
version: o
|
|
648
649
|
}));
|
|
649
|
-
},
|
|
650
|
+
}, Yr = (e, n) => {
|
|
650
651
|
if (!z) return;
|
|
651
652
|
let r = z.canvas;
|
|
652
653
|
t(r, {
|
|
@@ -664,26 +665,26 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
664
665
|
N,
|
|
665
666
|
P,
|
|
666
667
|
e.level,
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
668
|
+
Zn(),
|
|
669
|
+
Gt,
|
|
670
|
+
nn,
|
|
671
|
+
rn,
|
|
672
|
+
tn,
|
|
673
|
+
Zn() === "baseline" ? Br() : 0,
|
|
673
674
|
...L.map((e) => `${e.id}:${e.top}:${e.height}:${e.scale.min}:${e.scale.max}:${e.scale.base}:${e.scale.mode}`),
|
|
674
|
-
...
|
|
675
|
+
...zt.map((e) => `${e.id}:${sr(e)}`)
|
|
675
676
|
].join("|");
|
|
676
|
-
t ===
|
|
677
|
-
t.live =
|
|
678
|
-
})) : (
|
|
677
|
+
t === cn ? ln !== Kt && (ln = Kt, sn.forEach((t, n) => {
|
|
678
|
+
t.live = Jr(t.fn, n, e, !0);
|
|
679
|
+
})) : (cn = t, ln = Kt, sn = qr(e, n).map((e) => ({
|
|
679
680
|
fn: e,
|
|
680
681
|
main: [],
|
|
681
682
|
live: []
|
|
682
|
-
})),
|
|
683
|
-
t.main =
|
|
683
|
+
})), sn.forEach((t, n) => {
|
|
684
|
+
t.main = Jr(t.fn, n, e, !1), t.live = Jr(t.fn, n, e, !0);
|
|
684
685
|
}));
|
|
685
|
-
} else
|
|
686
|
-
let o =
|
|
686
|
+
} else sn = [], cn = "";
|
|
687
|
+
let o = sn.flatMap((e) => [...e.main, ...e.live]);
|
|
687
688
|
z.render(o, {
|
|
688
689
|
transform: {
|
|
689
690
|
xScale: 2 / i,
|
|
@@ -695,15 +696,15 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
695
696
|
height: a,
|
|
696
697
|
dpr: n
|
|
697
698
|
});
|
|
698
|
-
},
|
|
699
|
-
let n = Math.max(1, Math.round(
|
|
700
|
-
e.width !== n && (e.width = n), e.height !== r && (e.height = r), e.style.width = `${
|
|
701
|
-
},
|
|
699
|
+
}, Xr = (e, t) => {
|
|
700
|
+
let n = Math.max(1, Math.round(Xt * t)), r = Math.max(1, Math.round(Zt * t));
|
|
701
|
+
e.width !== n && (e.width = n), e.height !== r && (e.height = r), e.style.width = `${Xt}px`, e.style.height = `${Zt}px`;
|
|
702
|
+
}, Zr = (e, t, n, r, i, a) => {
|
|
702
703
|
e.beginPath(), typeof e.roundRect == "function" ? e.roundRect(t, n, r, i, a) : e.rect(t, n, r, i);
|
|
703
|
-
},
|
|
704
|
+
}, Qr = (e, t, n, r, i) => {
|
|
704
705
|
let a = r.outputs[i.a], o = r.outputs[i.b];
|
|
705
706
|
if (!a || !o) return;
|
|
706
|
-
let s =
|
|
707
|
+
let s = vr(t, a.values, br(a)), c = vr(t, o.values, br(o)), l = a.shift, u = Math.ceil(Math.abs(l) / t.size) + 1, d = Math.max(0, t.g0 - (l > 0 ? u : 0)), f = Math.min(t.last, t.g1 + (l < 0 ? u : 0)), p = X(_r(i.color), i.opacity), m = X(_r(i.colorBelow ?? i.color), i.opacity);
|
|
707
708
|
e.save(), e.beginPath(), e.rect(0, n.top, F, n.height), e.clip();
|
|
708
709
|
let h = [], g = 0, _ = () => {
|
|
709
710
|
if (h.length > 1) {
|
|
@@ -718,11 +719,11 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
718
719
|
};
|
|
719
720
|
for (let e = d; e <= f; e++) {
|
|
720
721
|
let r = s.last[e], i = c.last[e];
|
|
721
|
-
if (!
|
|
722
|
+
if (!D(r) || !D(i)) {
|
|
722
723
|
_(), g = 0;
|
|
723
724
|
continue;
|
|
724
725
|
}
|
|
725
|
-
let a =
|
|
726
|
+
let a = cr(Fr(t, e) + l), o = w(n.scale, r), u = w(n.scale, i), d = r >= i ? 1 : -1, f = h[h.length - 1];
|
|
726
727
|
if (f && d !== g) {
|
|
727
728
|
let e = f.ya - f.yb, t = e / (e - (o - u)), n = f.x + (a - f.x) * t, r = f.ya + (o - f.ya) * t;
|
|
728
729
|
h.push({
|
|
@@ -742,13 +743,13 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
742
743
|
});
|
|
743
744
|
}
|
|
744
745
|
_(), e.restore();
|
|
745
|
-
},
|
|
746
|
-
if (!
|
|
746
|
+
}, $r = (e, t) => {
|
|
747
|
+
if (!k.sessionBreaks || or() >= 864e5) return;
|
|
747
748
|
let n = [], r = NaN;
|
|
748
749
|
for (let e = Math.max(0, t.g0 - 1); e <= Math.min(t.g1, t.last); e++) {
|
|
749
|
-
let i = Math.floor(
|
|
750
|
-
if (
|
|
751
|
-
let r = Math.round(
|
|
750
|
+
let i = Math.floor(gr(t.cols.time[e]) / ne);
|
|
751
|
+
if (D(r) && i !== r) {
|
|
752
|
+
let r = Math.round(cr(e * t.size - .5)) + .5;
|
|
752
753
|
if (r > 0 && r < F && n.push(r), n.length > F / 6) return;
|
|
753
754
|
}
|
|
754
755
|
r = i;
|
|
@@ -758,26 +759,26 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
758
759
|
for (let t of n) e.moveTo(t, 0), e.lineTo(t, I);
|
|
759
760
|
e.stroke(), e.restore();
|
|
760
761
|
}
|
|
761
|
-
},
|
|
762
|
-
let e =
|
|
762
|
+
}, ei = () => {
|
|
763
|
+
let e = k.volumeProfile;
|
|
763
764
|
return e ? e === !0 ? {} : e : null;
|
|
764
|
-
},
|
|
765
|
-
let n =
|
|
766
|
-
if (!n || !r || !
|
|
767
|
-
let i =
|
|
765
|
+
}, ti = (e, t) => {
|
|
766
|
+
let n = ei(), r = L[0];
|
|
767
|
+
if (!n || !r || !M.hasVolume) return;
|
|
768
|
+
let i = E(Math.floor(n.rows ?? 24), 2, 400), a = [
|
|
768
769
|
t.level,
|
|
769
770
|
t.s0,
|
|
770
771
|
t.s1,
|
|
771
772
|
i,
|
|
772
773
|
n.valueArea ?? .7,
|
|
773
|
-
|
|
774
|
-
|
|
774
|
+
Gt,
|
|
775
|
+
Kt
|
|
775
776
|
].join("|");
|
|
776
|
-
if (!
|
|
777
|
-
let e = t.level ?
|
|
778
|
-
|
|
777
|
+
if (!Kn || Kn.key !== a) {
|
|
778
|
+
let e = t.level ? $e(Ft, M, Y(), t.level) : M;
|
|
779
|
+
Kn = {
|
|
779
780
|
key: a,
|
|
780
|
-
result:
|
|
781
|
+
result: De(e, {
|
|
781
782
|
from: t.s0,
|
|
782
783
|
to: t.s1,
|
|
783
784
|
rows: i,
|
|
@@ -785,25 +786,25 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
785
786
|
})
|
|
786
787
|
};
|
|
787
788
|
}
|
|
788
|
-
let s =
|
|
789
|
+
let s = Kn.result;
|
|
789
790
|
if (s.poc < 0) return;
|
|
790
791
|
let c = 0;
|
|
791
792
|
for (let e = 0; e < i; e++) c = Math.max(c, (s.up[e] ?? 0) + (s.down[e] ?? 0));
|
|
792
793
|
if (!(c > 0)) return;
|
|
793
|
-
let l = F *
|
|
794
|
+
let l = F * E(n.width ?? .28, .05, .9), u = (n.side ?? "right") === "right", d = tr(_r(n.upColor ?? "up")), f = tr(_r(n.downColor ?? "down"));
|
|
794
795
|
e.save(), e.beginPath(), e.rect(0, r.top, F, r.height), e.clip();
|
|
795
796
|
for (let t = 0; t < i; t++) {
|
|
796
797
|
let n = s.up[t] ?? 0, i = s.down[t] ?? 0;
|
|
797
798
|
if (!(n + i > 0)) continue;
|
|
798
|
-
let a =
|
|
799
|
+
let a = w(r.scale, s.low + t * s.step), p = w(r.scale, s.low + (t + 1) * s.step), m = Math.min(a, p), h = Math.max(1, Math.abs(p - a) - +(Math.abs(p - a) > 4)), g = t >= s.valueAreaFrom && t <= s.valueAreaTo ? .42 : .17, _ = n / c * l, v = i / c * l, y = u ? F : 0, b = u ? -1 : 1;
|
|
799
800
|
e.fillStyle = o(d, g), e.fillRect(Math.min(y, y + b * _), m, _, h), e.fillStyle = o(f, g);
|
|
800
|
-
let
|
|
801
|
-
e.fillRect(Math.min(
|
|
801
|
+
let x = y + b * _;
|
|
802
|
+
e.fillRect(Math.min(x, x + b * v), m, v, h);
|
|
802
803
|
}
|
|
803
|
-
let p = Math.round(
|
|
804
|
-
e.strokeStyle = X(n.pocColor ??
|
|
805
|
-
},
|
|
806
|
-
let r = o(R.grid), i =
|
|
804
|
+
let p = Math.round(w(r.scale, s.low + (s.poc + .5) * s.step)) + .5;
|
|
805
|
+
e.strokeStyle = X(n.pocColor ?? ft, .9), e.lineWidth = 1, e.beginPath(), e.moveTo(0, p), e.lineTo(F, p), e.stroke(), e.restore();
|
|
806
|
+
}, ni = (e, t, n) => {
|
|
807
|
+
let r = o(R.grid), i = k.grid !== !1;
|
|
807
808
|
if (e.lineWidth = 1, i) {
|
|
808
809
|
e.strokeStyle = r, e.beginPath();
|
|
809
810
|
for (let t of n) {
|
|
@@ -811,84 +812,84 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
811
812
|
e.moveTo(n, 0), e.lineTo(n, I);
|
|
812
813
|
}
|
|
813
814
|
for (let t of L) for (let n of t.ticks) {
|
|
814
|
-
let r = Math.round(
|
|
815
|
+
let r = Math.round(Ve(t.scale, n)) + .5;
|
|
815
816
|
r < t.top + 2 || r > t.top + t.height - 2 || (e.moveTo(0, r), e.lineTo(F, r));
|
|
816
817
|
}
|
|
817
818
|
e.stroke();
|
|
818
819
|
}
|
|
819
|
-
if (
|
|
820
|
+
if (k.watermark) {
|
|
820
821
|
let t = L[0];
|
|
821
|
-
e.save(), e.font =
|
|
822
|
+
e.save(), e.font = Q(Math.min(56, Math.max(22, F / 14)), 700), e.fillStyle = o(R.text, .07), e.textAlign = "center", e.textBaseline = "middle", e.fillText(k.watermark, F / 2, t.top + t.height / 2), e.restore();
|
|
822
823
|
}
|
|
823
824
|
for (let t of L) {
|
|
824
825
|
let n = t.study;
|
|
825
|
-
if (n?.bands &&
|
|
826
|
-
let r =
|
|
826
|
+
if (n?.bands && sr(n)) {
|
|
827
|
+
let r = tr(_r(n.outputs[0]?.color ?? pt)), i = n.bands.map((e) => Math.round(w(t.scale, e)) + .5);
|
|
827
828
|
n.bandFill && i.length === 2 && (e.fillStyle = o(r, .07), e.fillRect(0, Math.min(i[0], i[1]), F, Math.abs(i[1] - i[0]))), e.save(), e.setLineDash([4, 4]), e.strokeStyle = o(R.textMuted, .45), e.beginPath();
|
|
828
829
|
for (let n of i) n < t.top || n > t.top + t.height || (e.moveTo(0, n), e.lineTo(F, n));
|
|
829
830
|
e.stroke(), e.restore();
|
|
830
831
|
}
|
|
831
832
|
}
|
|
832
833
|
if (t) {
|
|
833
|
-
|
|
834
|
-
for (let n of
|
|
835
|
-
if (!n.fills.length || !
|
|
834
|
+
$r(e, t);
|
|
835
|
+
for (let n of zt) {
|
|
836
|
+
if (!n.fills.length || !sr(n)) continue;
|
|
836
837
|
let r = n.overlay ? L[0] : L.find((e) => e.study === n);
|
|
837
|
-
if (r) for (let i of n.fills)
|
|
838
|
+
if (r) for (let i of n.fills) Qr(e, t, r, n, i);
|
|
838
839
|
}
|
|
839
840
|
let n = L[0];
|
|
840
|
-
if (n && n.scale.mode === "percent" &&
|
|
841
|
-
let t = Math.round(
|
|
841
|
+
if (n && n.scale.mode === "percent" && Ht.length) {
|
|
842
|
+
let t = Math.round(Ve(n.scale, 0)) + .5;
|
|
842
843
|
t > n.top && t < n.top + n.height && (e.save(), e.strokeStyle = o(R.textMuted, .6), e.setLineDash([2, 3]), e.beginPath(), e.moveTo(0, t), e.lineTo(F, t), e.stroke(), e.restore());
|
|
843
844
|
}
|
|
844
|
-
|
|
845
|
+
ti(e, t);
|
|
845
846
|
}
|
|
846
847
|
e.strokeStyle = o(R.axis), e.beginPath();
|
|
847
848
|
for (let t of L.slice(1)) {
|
|
848
849
|
let n = Math.round(t.top) + .5;
|
|
849
|
-
e.moveTo(0, n), e.lineTo(
|
|
850
|
+
e.moveTo(0, n), e.lineTo(Xt, n);
|
|
850
851
|
}
|
|
851
|
-
e.moveTo(Math.round(F) + .5, 0), e.lineTo(Math.round(F) + .5,
|
|
852
|
-
},
|
|
853
|
-
let
|
|
854
|
-
|
|
855
|
-
},
|
|
852
|
+
e.moveTo(Math.round(F) + .5, 0), e.lineTo(Math.round(F) + .5, Zt), e.moveTo(0, Math.round(I) + .5), e.lineTo(Xt, Math.round(I) + .5), e.stroke();
|
|
853
|
+
}, ri = (e, t, n, r, i, a, o) => {
|
|
854
|
+
let s = a ? 32 : 18, c = Math.round(o ?? E(Math.round(t - 9), 0, I - s));
|
|
855
|
+
Math.abs(c + 9 - t) > 1.5 && (e.save(), e.strokeStyle = r, e.lineWidth = 1, e.beginPath(), e.moveTo(F - 10, Math.round(t) + .5), e.lineTo(F - 4, Math.round(t) + .5), e.lineTo(F + 2, c + 9.5), e.stroke(), e.restore()), Zr(e, F + 1, c, Yt - 2, s, 3), e.fillStyle = r, e.fill(), e.fillStyle = i, e.textAlign = "left", e.textBaseline = "middle", e.font = Q(R.fontSize, 500), e.fillText(n, F + 7, c + 9.5), a && (e.font = Q(R.fontSize - 1), e.fillText(a, F + 7, c + 24));
|
|
856
|
+
}, ii = (e) => L[0]?.scale.mode === "percent" ? le(ze(L[0].scale, e), J) : Z(e), ai = (e) => {
|
|
856
857
|
if (e.color) return X(e.color);
|
|
857
858
|
let t = e.kind ?? "line";
|
|
858
|
-
return X(t === "takeProfit" ?
|
|
859
|
-
},
|
|
860
|
-
if (!
|
|
859
|
+
return X(t === "takeProfit" ? $n() : t === "stopLoss" ? er() : t === "alert" ? ft : t === "line" ? pt : e.side === "sell" ? er() : $n());
|
|
860
|
+
}, oi = (e) => Pn.get(e.id) ?? e.price, si = () => {
|
|
861
|
+
if (!en || !L.length) return null;
|
|
861
862
|
if (V !== null) {
|
|
862
|
-
let e = V, t = e >= 0 && e < Y() ?
|
|
863
|
+
let e = V, t = e >= 0 && e < Y() ? Sr().close[e] : NaN;
|
|
863
864
|
return {
|
|
864
865
|
index: e,
|
|
865
866
|
pane: L[0],
|
|
866
|
-
y:
|
|
867
|
+
y: w(L[0].scale, t),
|
|
867
868
|
price: t
|
|
868
869
|
};
|
|
869
870
|
}
|
|
870
|
-
if (!B &&
|
|
871
|
-
let e = Math.round(
|
|
871
|
+
if (!B && Bn) {
|
|
872
|
+
let e = Math.round(xr(Bn.time)), t = Bn.price;
|
|
872
873
|
return {
|
|
873
874
|
index: e,
|
|
874
875
|
pane: L[0],
|
|
875
|
-
y:
|
|
876
|
+
y: D(t) ? w(L[0].scale, t) : NaN,
|
|
876
877
|
price: t
|
|
877
878
|
};
|
|
878
879
|
}
|
|
879
880
|
if (!B || B.x > F || B.y > I) return null;
|
|
880
|
-
let e =
|
|
881
|
+
let e = Mr(B.y);
|
|
881
882
|
if (!e) return null;
|
|
882
|
-
let t = Math.round(
|
|
883
|
-
if (e.id ===
|
|
884
|
-
let i =
|
|
883
|
+
let t = Math.round(lr(B.x)), n = B.y, r = Be(e.scale, n);
|
|
884
|
+
if (e.id === T && k.crosshair !== "free" && t >= 0 && t < Y() && wn === "cursor") {
|
|
885
|
+
let i = Sr(), a = Infinity;
|
|
885
886
|
for (let o of [
|
|
886
887
|
i.open[t],
|
|
887
888
|
i.high[t],
|
|
888
889
|
i.low[t],
|
|
889
890
|
i.close[t]
|
|
890
891
|
]) {
|
|
891
|
-
let t =
|
|
892
|
+
let t = w(e.scale, o);
|
|
892
893
|
Math.abs(t - B.y) < a && (a = Math.abs(t - B.y), n = t, r = o);
|
|
893
894
|
}
|
|
894
895
|
}
|
|
@@ -898,34 +899,40 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
898
899
|
y: n,
|
|
899
900
|
price: r
|
|
900
901
|
};
|
|
901
|
-
},
|
|
902
|
-
x:
|
|
903
|
-
y: (t) =>
|
|
904
|
-
index:
|
|
902
|
+
}, ci = (e) => L.find((t) => t.id === (e ?? T)) ?? null, li = (e) => e ? {
|
|
903
|
+
x: cr,
|
|
904
|
+
y: (t) => w(e.scale, t),
|
|
905
|
+
index: xr,
|
|
905
906
|
left: 0,
|
|
906
907
|
right: F,
|
|
907
908
|
top: e.top,
|
|
908
909
|
bottom: e.top + e.height
|
|
909
|
-
} : null,
|
|
910
|
-
let n =
|
|
911
|
-
return a && i.push(
|
|
912
|
-
},
|
|
913
|
-
let t = 10 ** -
|
|
914
|
-
return Number((Math.round(e / t) * t).toFixed(
|
|
915
|
-
},
|
|
916
|
-
e
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
910
|
+
} : null, ui = (e, t) => {
|
|
911
|
+
let n = Xn(), r = Math.abs(t), i = [], a = Math.floor(r / ne), o = Math.floor(r % ne / re), s = Math.floor(r % re / ie);
|
|
912
|
+
return a && i.push(ke(n.days, { count: a })), o && i.push(ke(n.hours, { count: o })), s && !a && i.push(ke(n.minutes, { count: s })), `${ke(Xn().bars, { count: e })}, ${i.join(" ") || ke(n.minutes, { count: 0 })}`;
|
|
913
|
+
}, di = (e, t) => e.id === T ? Z(t) : Gr(e, t), fi = (e) => {
|
|
914
|
+
let t = 10 ** -nr();
|
|
915
|
+
return Number((Math.round(e / t) * t).toFixed(nr()));
|
|
916
|
+
}, pi = () => {
|
|
917
|
+
let e = Y();
|
|
918
|
+
return e ? M.close[e - 1] : NaN;
|
|
919
|
+
}, mi = (e, t, n) => {
|
|
920
|
+
let r = Xn(), i = e === "buy" ? t === "stop" ? r.buyStop : r.buyLimit : t === "stop" ? r.sellStop : r.sellLimit;
|
|
921
|
+
return ke(i, { price: Z(n) });
|
|
922
|
+
}, hi = (e, t, n, r, i, a = "center") => {
|
|
923
|
+
e.font = Q(R.fontSize, 500);
|
|
924
|
+
let o = e.measureText(t).width + 16, s = E(a === "center" ? n - o / 2 : a === "right" ? n - o : n, 2, Math.max(2, F - o - 2));
|
|
925
|
+
return Zr(e, s, r, o, 22, 11), e.fillStyle = i, e.fill(), e.fillStyle = yt(i), e.textAlign = "center", e.textBaseline = "middle", e.fillText(t, s + o / 2, r + 11.5), o;
|
|
926
|
+
}, gi = (e, t, n, r, i) => (In.push({
|
|
920
927
|
x: e,
|
|
921
928
|
y: t,
|
|
922
929
|
w: n,
|
|
923
930
|
h: r,
|
|
924
931
|
action: i
|
|
925
|
-
}),
|
|
926
|
-
let n = Y(), r = n ?
|
|
932
|
+
}), Ln === In.length - 1), _i = (e, t) => {
|
|
933
|
+
let n = Y(), r = n ? M.close[n - 1] : NaN, i = G ? [...W, G] : W;
|
|
927
934
|
if (!i.length) return;
|
|
928
|
-
let a =
|
|
935
|
+
let a = Xn(), o = {
|
|
929
936
|
target: a.target,
|
|
930
937
|
stop: a.stop,
|
|
931
938
|
riskReward: a.riskReward,
|
|
@@ -934,44 +941,135 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
934
941
|
short: a.short
|
|
935
942
|
};
|
|
936
943
|
for (let n of L) {
|
|
937
|
-
let s =
|
|
944
|
+
let s = li(n);
|
|
938
945
|
if (!s) continue;
|
|
939
|
-
let c = i.filter((e) => (e.pane ??
|
|
946
|
+
let c = i.filter((e) => (e.pane ?? T) === n.id);
|
|
940
947
|
if (c.length) {
|
|
941
948
|
e.save(), e.beginPath(), e.rect(0, n.top, F, n.height), e.clip();
|
|
942
949
|
for (let i of c) {
|
|
943
|
-
let c =
|
|
950
|
+
let c = ee(e, i, s, {
|
|
944
951
|
...t,
|
|
945
|
-
color: X(i.color ??
|
|
946
|
-
font:
|
|
952
|
+
color: X(i.color ?? pt),
|
|
953
|
+
font: Q(R.fontSize, 500),
|
|
947
954
|
fontFamily: R.fontFamily,
|
|
948
|
-
formatPrice: (e) =>
|
|
949
|
-
formatPercent: (e) =>
|
|
950
|
-
formatSpan:
|
|
951
|
-
textOn:
|
|
955
|
+
formatPrice: (e) => di(n, e),
|
|
956
|
+
formatPercent: (e) => le(e, J),
|
|
957
|
+
formatSpan: ui,
|
|
958
|
+
textOn: yt,
|
|
952
959
|
defaultText: a.text,
|
|
953
960
|
position: o,
|
|
954
|
-
last: n.id ===
|
|
955
|
-
fill:
|
|
961
|
+
last: n.id === T ? r : NaN,
|
|
962
|
+
fill: ke
|
|
956
963
|
}, {
|
|
957
|
-
selected: i === G || i.id ===
|
|
958
|
-
hovered: i.id ===
|
|
964
|
+
selected: i === G || i.id === Tn,
|
|
965
|
+
hovered: i.id === En
|
|
959
966
|
});
|
|
960
|
-
c &&
|
|
967
|
+
c && An.set(i.id, c);
|
|
961
968
|
}
|
|
962
969
|
e.restore();
|
|
963
970
|
}
|
|
964
971
|
}
|
|
965
|
-
},
|
|
972
|
+
}, vi = (e, t, n) => {
|
|
966
973
|
let r = L[0];
|
|
967
974
|
if (!r) return;
|
|
968
|
-
|
|
969
|
-
let i = Y(), a = o(R.text), s = o(R.textMuted), c = o(R.background), l = X(
|
|
970
|
-
|
|
975
|
+
In = [];
|
|
976
|
+
let i = Y(), a = o(R.text), s = o(R.textMuted), c = o(R.background), l = X($n()), u = X(er()), d = Xn(), f = i ? M.close[i - 1] : NaN, p = r.top + r.height, m = p - 32, h = [], g = (t, n, r, i = "left") => {
|
|
977
|
+
e.font = Q(R.fontSize, 500);
|
|
978
|
+
let a = e.measureText(t).width + 16, o = E(i === "center" ? n - a / 2 : n, 2, Math.max(2, F - a - 2));
|
|
979
|
+
return {
|
|
980
|
+
left: o,
|
|
981
|
+
top: r,
|
|
982
|
+
right: o + a,
|
|
983
|
+
bottom: r + 22
|
|
984
|
+
};
|
|
985
|
+
}, _ = null;
|
|
986
|
+
if (H?.kind === "create" && i) {
|
|
987
|
+
let t = Math.round(w(r.scale, H.price)) + .5;
|
|
988
|
+
if (D(t) && t >= r.top && t <= p) {
|
|
989
|
+
let n = Pa(H), i = mi(H.side, n, H.price);
|
|
990
|
+
e.font = Q(R.fontSize, 500);
|
|
991
|
+
let a = g(i, F - 56 - (e.measureText(i).width + 16), E(t - 11, r.top + 2, p - 24));
|
|
992
|
+
_ = {
|
|
993
|
+
y: t,
|
|
994
|
+
color: H.side === "buy" ? l : u,
|
|
995
|
+
text: i,
|
|
996
|
+
type: n,
|
|
997
|
+
box: a
|
|
998
|
+
}, h.push(a);
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
let v = Wn ? d.replayHint : K && i ? ke(d.replay, { time: se(gr(M.time[i - 1]), or(), J) }) : "";
|
|
1002
|
+
v && h.push(g(v, F / 2, m, "center"));
|
|
1003
|
+
let y = !!H && i > 0 && !v;
|
|
1004
|
+
y && h.push(g(d.orderHint, 8, m));
|
|
1005
|
+
let b = [];
|
|
1006
|
+
e.font = Q(R.fontSize, 600);
|
|
1007
|
+
for (let t of k.priceLines ?? []) {
|
|
1008
|
+
let n = oi(t), i = w(r.scale, n), a = Math.round(i) + .5;
|
|
1009
|
+
if (!D(a) || a < r.top || a > p) continue;
|
|
1010
|
+
let o = ai(t), s = t.kind ?? "line", m = vt[s], h = t.title ?? (m ? d[m] : ""), g = [];
|
|
1011
|
+
if (h && g.push({
|
|
1012
|
+
text: h,
|
|
1013
|
+
fill: o,
|
|
1014
|
+
color: yt(o)
|
|
1015
|
+
}), t.quantity !== void 0 && t.quantity !== "" && g.push({
|
|
1016
|
+
text: String(t.quantity),
|
|
1017
|
+
fill: c,
|
|
1018
|
+
color: o
|
|
1019
|
+
}), s === "position" && typeof t.quantity == "number" && D(f)) {
|
|
1020
|
+
let e = (f - n) * t.quantity * (t.side === "sell" ? -1 : 1), r = e >= 0 ? l : u;
|
|
1021
|
+
g.push({
|
|
1022
|
+
text: `${e >= 0 ? "+" : "−"}${Z(Math.abs(e))}`,
|
|
1023
|
+
fill: r,
|
|
1024
|
+
color: yt(r)
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
t.cancellable && g.push({
|
|
1028
|
+
text: "×",
|
|
1029
|
+
fill: c,
|
|
1030
|
+
color: o,
|
|
1031
|
+
cancel: !0
|
|
1032
|
+
});
|
|
1033
|
+
let _ = g.length > 0 || !!t.draggable, v = g.map((t) => t.cancel ? 20 : e.measureText(t.text).width + 12), y = t.draggable ? 14 : 0, x = _ ? v.reduce((e, t) => e + t, 0) + y : 0;
|
|
1034
|
+
b.push({
|
|
1035
|
+
line: t,
|
|
1036
|
+
price: n,
|
|
1037
|
+
at: i,
|
|
1038
|
+
y: a,
|
|
1039
|
+
top: Math.round(a - 9.5),
|
|
1040
|
+
left: Math.round(F - x - 56),
|
|
1041
|
+
color: o,
|
|
1042
|
+
parts: g,
|
|
1043
|
+
widths: v,
|
|
1044
|
+
grip: y,
|
|
1045
|
+
total: x
|
|
1046
|
+
});
|
|
1047
|
+
}
|
|
1048
|
+
let x = b.filter((e) => e.total > 0).sort((e, t) => Number(t.line.kind === "position") - Number(e.line.kind === "position"));
|
|
1049
|
+
if (je(x.map((e) => ({
|
|
1050
|
+
right: F - 56,
|
|
1051
|
+
top: e.top,
|
|
1052
|
+
width: e.total,
|
|
1053
|
+
height: 18
|
|
1054
|
+
})), _ ? [_.box] : [], 6).forEach((e, t) => {
|
|
1055
|
+
let n = x[t];
|
|
1056
|
+
n && (n.left = Math.round(e), h.push({
|
|
1057
|
+
left: n.left - 4,
|
|
1058
|
+
top: n.top - 4,
|
|
1059
|
+
right: n.left + n.total + 4,
|
|
1060
|
+
bottom: n.top + 22
|
|
1061
|
+
}));
|
|
1062
|
+
}), e.save(), e.beginPath(), e.rect(0, r.top, F, r.height), e.clip(), t && k.highLowMarkers !== !1 && Zn() !== "line" && Zn() !== "area" && Zn() !== "baseline") {
|
|
971
1063
|
let n = -Infinity, i = Infinity, a = -1, o = -1;
|
|
972
1064
|
for (let e = t.s0; e <= t.s1; e++) t.cols.high[e] > n && (n = t.cols.high[e], a = e), t.cols.low[e] < i && (i = t.cols.low[e], o = e);
|
|
973
|
-
e.font =
|
|
974
|
-
|
|
1065
|
+
e.font = Q(R.fontSize), e.fillStyle = s, e.strokeStyle = s, e.lineWidth = 1;
|
|
1066
|
+
let c = bi.map((e) => ({
|
|
1067
|
+
left: 0,
|
|
1068
|
+
top: e.top,
|
|
1069
|
+
right: e.right,
|
|
1070
|
+
bottom: e.bottom
|
|
1071
|
+
}));
|
|
1072
|
+
for (let [s, l, u] of [[
|
|
975
1073
|
a,
|
|
976
1074
|
n,
|
|
977
1075
|
!1
|
|
@@ -980,193 +1078,214 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
980
1078
|
i,
|
|
981
1079
|
!0
|
|
982
1080
|
]]) {
|
|
983
|
-
if (s < 0 || !
|
|
984
|
-
let n =
|
|
985
|
-
for (let e of
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
1081
|
+
if (s < 0 || !D(l)) continue;
|
|
1082
|
+
let n = cr(Fr(t, s)), i = Z(l), a = e.measureText(i).width, o = r.top + 8, d = p - 8, f = E(w(r.scale, l) + (u ? 9 : -9), o, d), m = F - 4 - (n + 17 + a), g = n - 17 - a - 4, _ = (m < 0 || n > F * .6) && g >= Math.min(0, m), v = [], y = u ? 1 : -1;
|
|
1083
|
+
for (let e of [
|
|
1084
|
+
0,
|
|
1085
|
+
1,
|
|
1086
|
+
2,
|
|
1087
|
+
3,
|
|
1088
|
+
-1,
|
|
1089
|
+
-2
|
|
1090
|
+
]) {
|
|
1091
|
+
let t = E(f + e * y * 17, o, d);
|
|
1092
|
+
if (!v.some((e) => e.y === t)) for (let e of [_, !_]) v.push({
|
|
1093
|
+
y: t,
|
|
1094
|
+
left: e,
|
|
1095
|
+
tx: E(e ? n - 17 - a : n + 17, 2, F - a - 2)
|
|
1096
|
+
});
|
|
1097
|
+
}
|
|
1098
|
+
for (let e of bi) {
|
|
1099
|
+
let t = e.bottom + 10;
|
|
1100
|
+
if (!(t > d || v.some((e) => e.y === t))) for (let e of [_, !_]) v.push({
|
|
1101
|
+
y: t,
|
|
1102
|
+
left: e,
|
|
1103
|
+
tx: E(e ? n - 17 - a : n + 17, 2, F - a - 2)
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
let b = v.map((e) => ({
|
|
1107
|
+
left: e.tx - 2,
|
|
1108
|
+
top: e.y - 8,
|
|
1109
|
+
right: e.tx + a + 2,
|
|
1110
|
+
bottom: e.y + 8
|
|
1111
|
+
})), x = Ae(b, [...h, ...c]);
|
|
1112
|
+
x < 0 && (x = Ae(b, h));
|
|
1113
|
+
let S = v[x], ee = b[x];
|
|
1114
|
+
if (!S || !ee) continue;
|
|
1115
|
+
h.push(ee);
|
|
1116
|
+
let te = S.left ? -1 : 1;
|
|
1117
|
+
e.textBaseline = "middle", e.textAlign = "left", e.beginPath(), e.moveTo(n, f), e.lineTo(n + te * 14, S.y), e.stroke(), e.fillText(i, S.tx, S.y);
|
|
990
1118
|
}
|
|
991
1119
|
}
|
|
992
|
-
if (t &&
|
|
1120
|
+
if (t && k.markers?.length) {
|
|
993
1121
|
let n = /* @__PURE__ */ new Map();
|
|
994
|
-
e.font =
|
|
995
|
-
let a =
|
|
996
|
-
for (let o of
|
|
997
|
-
let s =
|
|
1122
|
+
e.font = Q(R.fontSize, 600), e.textAlign = "center";
|
|
1123
|
+
let a = k.markers.length > 400;
|
|
1124
|
+
for (let o of k.markers) {
|
|
1125
|
+
let s = xr(o.time);
|
|
998
1126
|
if (s < 0 || s > i - 1) continue;
|
|
999
1127
|
let d = Math.floor(s / t.size);
|
|
1000
1128
|
if (d < t.g0 || d > t.g1) continue;
|
|
1001
|
-
let f = Math.round(
|
|
1129
|
+
let f = Math.round(cr(Fr(t, d))), p = o.side === "sell", m = o.color ? X(o.color) : p ? u : l, h = `${d}:${p}`, g = n.get(h) ?? 0;
|
|
1002
1130
|
n.set(h, g + (o.text && !a ? 30 : 16));
|
|
1003
|
-
let _ =
|
|
1004
|
-
e.fillStyle = m, e.beginPath(), e.moveTo(f, y), e.lineTo(f - 5.5, y + v * 7), e.lineTo(f - 2, y + v * 7), e.lineTo(f - 2, y + v * 12), e.lineTo(f + 2, y + v * 12), e.lineTo(f + 2, y + v * 7), e.lineTo(f + 5.5, y + v * 7), e.closePath(), e.fill(), o.text && !a && (e.textBaseline = p ? "bottom" : "top", e.fillText(o.text, f, y + v * 14)), o.price !== void 0 &&
|
|
1131
|
+
let _ = w(r.scale, p ? t.cols.high[d] : t.cols.low[d]), v = p ? -1 : 1, y = _ + v * (6 + g);
|
|
1132
|
+
e.fillStyle = m, e.beginPath(), e.moveTo(f, y), e.lineTo(f - 5.5, y + v * 7), e.lineTo(f - 2, y + v * 7), e.lineTo(f - 2, y + v * 12), e.lineTo(f + 2, y + v * 12), e.lineTo(f + 2, y + v * 7), e.lineTo(f + 5.5, y + v * 7), e.closePath(), e.fill(), o.text && !a && (e.textBaseline = p ? "bottom" : "top", e.fillText(o.text, f, y + v * 14)), o.price !== void 0 && D(o.price) && (e.beginPath(), e.arc(f, w(r.scale, o.price), 3, 0, Math.PI * 2), e.fill(), e.lineWidth = 1.5, e.strokeStyle = c, e.stroke());
|
|
1005
1133
|
}
|
|
1006
1134
|
}
|
|
1007
|
-
e.restore(),
|
|
1135
|
+
e.restore(), _i(e, {
|
|
1008
1136
|
text: a,
|
|
1009
1137
|
background: c,
|
|
1010
1138
|
up: l,
|
|
1011
1139
|
down: u
|
|
1012
1140
|
}), e.save(), e.beginPath(), e.rect(0, r.top, F, r.height), e.clip();
|
|
1013
|
-
let
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
text: m,
|
|
1022
|
-
fill: a,
|
|
1023
|
-
color: _t(a)
|
|
1024
|
-
}), t.quantity !== void 0 && t.quantity !== "" && h.push({
|
|
1025
|
-
text: String(t.quantity),
|
|
1026
|
-
fill: c,
|
|
1027
|
-
color: a
|
|
1028
|
-
}), o === "position" && typeof t.quantity == "number" && T(f)) {
|
|
1029
|
-
let e = (f - n) * t.quantity * (t.side === "sell" ? -1 : 1), r = e >= 0 ? l : u;
|
|
1030
|
-
h.push({
|
|
1031
|
-
text: `${e >= 0 ? "+" : "−"}${Z(Math.abs(e))}`,
|
|
1032
|
-
fill: r,
|
|
1033
|
-
color: _t(r)
|
|
1034
|
-
});
|
|
1141
|
+
for (let t of b) {
|
|
1142
|
+
let { line: n, y: r, color: i } = t, a = n.kind ?? "line", o = n.lineStyle ?? (a === "position" || a === "line" ? "solid" : "dashed");
|
|
1143
|
+
if (e.save(), e.strokeStyle = i, e.lineWidth = Fn === n.id || U?.kind === "order" && U.line.id === n.id || H?.kind === "move" && H.id === n.id ? 1.5 : 1, te(e, o, 1), e.beginPath(), e.moveTo(0, r), e.lineTo(F, r), e.stroke(), e.restore(), !t.total) continue;
|
|
1144
|
+
let { parts: s, widths: l, grip: u, total: d, top: f } = t, p = t.left;
|
|
1145
|
+
if (e.font = Q(R.fontSize, 600), p + d < F - 56 && (e.save(), e.strokeStyle = i, e.lineWidth = 1, e.setLineDash([]), e.beginPath(), e.moveTo(p + d, r), e.lineTo(Math.min(p + d + 6, F - 56), r), e.stroke(), e.restore()), H?.kind === "move" && H.id === n.id && (Zr(e, p - 3.5, f - 3.5, d + 7, 25, 5), e.strokeStyle = X(pt), e.lineWidth = 2, e.setLineDash([]), e.stroke()), Zr(e, p - .5, f - .5, d + 1, 19, 3), e.fillStyle = c, e.fill(), e.strokeStyle = i, e.lineWidth = 1, e.setLineDash([]), e.stroke(), u) {
|
|
1146
|
+
e.fillStyle = i;
|
|
1147
|
+
for (let t = 0; t < 3; t++) e.fillRect(p + 4, f + 5 + t * 3.5, 6, 1.5);
|
|
1148
|
+
p += u;
|
|
1035
1149
|
}
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
e.font = tr(R.fontSize, 600);
|
|
1043
|
-
let g = h.map((t) => t.cancel ? 20 : e.measureText(t.text).width + 12), _ = t.draggable ? 14 : 0, v = g.reduce((e, t) => e + t, 0) + _, y = Math.round(F - v - 56), b = Math.round(i - 9.5);
|
|
1044
|
-
if (H?.kind === "move" && H.id === t.id && (Gr(e, y - 3.5, b - 3.5, v + 7, 25, 5), e.strokeStyle = X(dt), e.lineWidth = 2, e.setLineDash([]), e.stroke()), Gr(e, y - .5, b - .5, v + 1, 19, 3), e.fillStyle = c, e.fill(), e.strokeStyle = a, e.lineWidth = 1, e.setLineDash([]), e.stroke(), _) {
|
|
1045
|
-
e.fillStyle = a;
|
|
1046
|
-
for (let t = 0; t < 3; t++) e.fillRect(y + 4, b + 5 + t * 3.5, 6, 1.5);
|
|
1047
|
-
y += _;
|
|
1048
|
-
}
|
|
1049
|
-
e.textBaseline = "middle", e.textAlign = "center", h.forEach((n, r) => {
|
|
1050
|
-
let i = g[r] ?? 0, o = n.fill;
|
|
1051
|
-
n.cancel && (ci(y, b, i, 18, () => q("orderCancel", {
|
|
1052
|
-
id: t.id,
|
|
1053
|
-
line: t
|
|
1054
|
-
})) && (o = a), e.fillStyle = a, e.fillRect(y, b + 3, 1, 12)), o !== c && (e.fillStyle = o, e.fillRect(y, b, i, 18)), e.fillStyle = n.cancel && o !== c ? _t(a) : n.color, n.cancel && (e.font = tr(R.fontSize + 3, 500)), e.fillText(n.text, y + i / 2, b + (n.cancel ? 9 : 9.5)), e.font = tr(R.fontSize, 600), y += i;
|
|
1150
|
+
e.textBaseline = "middle", e.textAlign = "center", s.forEach((t, r) => {
|
|
1151
|
+
let a = l[r] ?? 0, o = t.fill;
|
|
1152
|
+
t.cancel && (gi(p, f, a, 18, () => q("orderCancel", {
|
|
1153
|
+
id: n.id,
|
|
1154
|
+
line: n
|
|
1155
|
+
})) && (o = i), e.fillStyle = i, e.fillRect(p, f + 3, 1, 12)), o !== c && (e.fillStyle = o, e.fillRect(p, f, a, 18)), e.fillStyle = t.cancel && o !== c ? yt(i) : t.color, t.cancel && (e.font = Q(R.fontSize + 3, 500)), e.fillText(t.text, p + a / 2, f + (t.cancel ? 9 : 9.5)), e.font = Q(R.fontSize, 600), p += a;
|
|
1055
1156
|
});
|
|
1056
1157
|
}
|
|
1057
|
-
let
|
|
1058
|
-
if (
|
|
1059
|
-
let t = Math.round(
|
|
1060
|
-
e.save(), e.strokeStyle =
|
|
1158
|
+
let S = k.lastPriceLine !== !1 && i > 0, ee = i > 0 && M.close[i - 1] >= M.open[i - 1], ne = Zn() === "line" || Zn() === "area" ? X(pt) : ee ? l : u;
|
|
1159
|
+
if (S) {
|
|
1160
|
+
let t = Math.round(w(r.scale, f)) + .5;
|
|
1161
|
+
e.save(), e.strokeStyle = ne, e.setLineDash([1, 2]), e.beginPath(), e.moveTo(0, t), e.lineTo(F, t), e.stroke(), e.restore();
|
|
1061
1162
|
}
|
|
1062
1163
|
e.restore();
|
|
1063
|
-
let
|
|
1064
|
-
for (let e of
|
|
1164
|
+
let re = [];
|
|
1165
|
+
for (let e of Ht) {
|
|
1065
1166
|
let t = i - 1;
|
|
1066
|
-
for (; t >= 0 && !
|
|
1167
|
+
for (; t >= 0 && !D(e.values[t]);) t--;
|
|
1067
1168
|
if (t < 0) continue;
|
|
1068
|
-
let n = e.values[t], a =
|
|
1069
|
-
!
|
|
1169
|
+
let n = e.values[t], a = zr(r.scale, n, Rr(e)), o = Ve(r.scale, a);
|
|
1170
|
+
!D(o) || o < r.top || o > r.top + r.height || re.push({
|
|
1070
1171
|
y: o,
|
|
1071
|
-
text: r.scale.mode === "percent" ?
|
|
1172
|
+
text: r.scale.mode === "percent" ? le(a, J) : Z(n),
|
|
1072
1173
|
color: X(e.color)
|
|
1073
1174
|
});
|
|
1074
1175
|
}
|
|
1075
|
-
let
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1176
|
+
let ie = [], ae = {
|
|
1177
|
+
position: 3,
|
|
1178
|
+
order: 2,
|
|
1179
|
+
takeProfit: 2,
|
|
1180
|
+
stopLoss: 2
|
|
1181
|
+
};
|
|
1182
|
+
for (let e of b) ie.push({
|
|
1183
|
+
pane: r,
|
|
1184
|
+
y: e.at,
|
|
1185
|
+
text: ii(e.price),
|
|
1186
|
+
fill: e.color,
|
|
1187
|
+
priority: H?.kind === "move" && H.id === e.line.id ? 6 : ae[e.line.kind ?? "line"] ?? 1
|
|
1079
1188
|
});
|
|
1080
1189
|
for (let e of W) {
|
|
1081
|
-
let t =
|
|
1082
|
-
t
|
|
1083
|
-
|
|
1084
|
-
|
|
1190
|
+
let t = ci(e.pane);
|
|
1191
|
+
if (!t || e.type !== "horizontalLine" || !e.points[0]) continue;
|
|
1192
|
+
let n = e.points[0].price, r = w(t.scale, n);
|
|
1193
|
+
r < t.top || r > t.top + t.height || ie.push({
|
|
1194
|
+
pane: t,
|
|
1195
|
+
y: r,
|
|
1196
|
+
text: t.id === T ? ii(n) : di(t, n),
|
|
1197
|
+
fill: X(e.color ?? pt),
|
|
1198
|
+
priority: 0
|
|
1085
1199
|
});
|
|
1086
1200
|
}
|
|
1087
|
-
for (let e of
|
|
1088
|
-
pane:
|
|
1089
|
-
y: e.y
|
|
1201
|
+
for (let e of re) ie.push({
|
|
1202
|
+
pane: r,
|
|
1203
|
+
y: e.y,
|
|
1204
|
+
text: e.text,
|
|
1205
|
+
fill: e.color,
|
|
1206
|
+
priority: 1
|
|
1090
1207
|
});
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
let i = D.countdown && t.id === C ? 18 : 14;
|
|
1099
|
-
_.some((e) => e.pane === t.id && Math.abs(e.y - r) < i) || e.fillText(zr(t, n), F + 8, r);
|
|
1100
|
-
}
|
|
1101
|
-
e.textAlign = "center";
|
|
1102
|
-
for (let t of n) e.font = tr(R.fontSize, t.bold ? 600 : 400), e.fillStyle = t.bold ? a : s, e.fillText(t.text, t.x, I + it / 2);
|
|
1103
|
-
for (let t of D.priceLines ?? []) {
|
|
1104
|
-
let n = ei(t), i = S(r.scale, n);
|
|
1105
|
-
if (!T(i) || i < r.top || i > r.top + r.height) continue;
|
|
1106
|
-
let a = $r(t);
|
|
1107
|
-
Zr(e, i, Qr(n), a, _t(a));
|
|
1108
|
-
}
|
|
1109
|
-
for (let t of W) {
|
|
1110
|
-
let n = ni(t.pane);
|
|
1111
|
-
if (!n || t.type !== "horizontalLine" || !t.points[0]) continue;
|
|
1112
|
-
let r = t.points[0].price, i = S(n.scale, r);
|
|
1113
|
-
if (i < n.top || i > n.top + n.height) continue;
|
|
1114
|
-
let a = X(t.color ?? dt);
|
|
1115
|
-
Zr(e, i, n.id === C ? Qr(r) : ai(n, r), a, _t(a));
|
|
1116
|
-
}
|
|
1117
|
-
for (let t of g) Zr(e, t.y, t.text, t.color, _t(t.color));
|
|
1118
|
-
if (p) {
|
|
1119
|
-
let t;
|
|
1120
|
-
if (D.countdown) {
|
|
1121
|
-
let e = $n(), n = j.time[i - 1], r = n + e.ms;
|
|
1122
|
-
if (e.unit === "month") {
|
|
1123
|
-
let t = new Date(n);
|
|
1124
|
-
r = Date.UTC(t.getUTCFullYear(), t.getUTCMonth() + e.count, t.getUTCDate(), t.getUTCHours(), t.getUTCMinutes());
|
|
1208
|
+
if (S) {
|
|
1209
|
+
let e;
|
|
1210
|
+
if (k.countdown) {
|
|
1211
|
+
let t = ar(), n = M.time[i - 1], r = n + t.ms;
|
|
1212
|
+
if (t.unit === "month") {
|
|
1213
|
+
let e = new Date(n);
|
|
1214
|
+
r = Date.UTC(e.getUTCFullYear(), e.getUTCMonth() + t.count, e.getUTCDate(), e.getUTCHours(), e.getUTCMinutes());
|
|
1125
1215
|
}
|
|
1126
|
-
|
|
1216
|
+
e = oe(r - Date.now(), d);
|
|
1127
1217
|
}
|
|
1128
|
-
|
|
1218
|
+
ie.push({
|
|
1219
|
+
pane: r,
|
|
1220
|
+
y: w(r.scale, f),
|
|
1221
|
+
text: ii(f),
|
|
1222
|
+
fill: ne,
|
|
1223
|
+
second: e,
|
|
1224
|
+
priority: 5
|
|
1225
|
+
});
|
|
1129
1226
|
}
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1227
|
+
_ && H?.kind === "create" && ie.push({
|
|
1228
|
+
pane: r,
|
|
1229
|
+
y: _.y,
|
|
1230
|
+
text: ii(H.price),
|
|
1231
|
+
fill: _.color,
|
|
1232
|
+
priority: 7
|
|
1233
|
+
});
|
|
1234
|
+
for (let e of L) {
|
|
1235
|
+
let t = ie.filter((t) => t.pane === e);
|
|
1236
|
+
if (!t.length) continue;
|
|
1237
|
+
let n = Me(t.map((e) => ({
|
|
1238
|
+
top: Math.round(e.y - 9),
|
|
1239
|
+
height: e.second ? 32 : 18,
|
|
1240
|
+
priority: e.priority
|
|
1241
|
+
})), e.top, Math.min(e.top + e.height, I), 1);
|
|
1242
|
+
t.forEach((e, t) => e.top = n[t] ?? null);
|
|
1243
|
+
}
|
|
1244
|
+
e.font = Q(R.fontSize), e.textAlign = "left", e.textBaseline = "middle", e.fillStyle = s;
|
|
1245
|
+
for (let t of L) {
|
|
1246
|
+
let n = ie.filter((e) => e.pane === t && e.top != null);
|
|
1247
|
+
for (let r of t.ticks) {
|
|
1248
|
+
let i = Ve(t.scale, r);
|
|
1249
|
+
i < t.top + 8 || i > t.top + t.height - 8 || n.some((e) => i > (e.top ?? 0) - 6 && i < (e.top ?? 0) + (e.second ? 32 : 18) + 6) || e.fillText(Gr(t, r), F + 8, i);
|
|
1139
1250
|
}
|
|
1140
|
-
!K && !Rn && si(e, d.orderHint, 8, v, o(R.text, .86), "left");
|
|
1141
1251
|
}
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1252
|
+
e.textAlign = "center";
|
|
1253
|
+
for (let t of n) e.font = Q(R.fontSize, t.bold ? 600 : 400), e.fillStyle = t.bold ? a : s, e.fillText(t.text, t.x, I + ot / 2);
|
|
1254
|
+
for (let t of [...ie].sort((e, t) => e.priority - t.priority)) t.top != null && ri(e, t.y, t.text, t.fill, yt(t.fill), t.second, t.top);
|
|
1255
|
+
if (Wn) {
|
|
1256
|
+
let t = B && B.x <= F ? B.x : NaN;
|
|
1257
|
+
D(t) && (e.fillStyle = o(R.background, .62), e.fillRect(t, 0, F - t, I), e.strokeStyle = X(pt), e.lineWidth = 1.5, e.beginPath(), e.moveTo(Math.round(t) + .5, 0), e.lineTo(Math.round(t) + .5, I), e.stroke());
|
|
1258
|
+
}
|
|
1259
|
+
v && hi(e, v, F / 2, m, X(pt)), _ && (e.save(), e.strokeStyle = _.color, e.lineWidth = 1.5, e.setLineDash(_.type === "stop" ? [2, 3] : [6, 4]), e.beginPath(), e.moveTo(0, _.y), e.lineTo(F, _.y), e.stroke(), e.restore(), hi(e, _.text, _.box.left, _.box.top, _.color, "left")), y && hi(e, d.orderHint, 8, m, o(R.text, .86), "left");
|
|
1260
|
+
let C = si();
|
|
1261
|
+
if (C && t && !Wn) {
|
|
1262
|
+
let t = Math.round(cr(C.index)) + .5;
|
|
1145
1263
|
e.save(), e.strokeStyle = o(R.textMuted, .75), e.lineWidth = 1, e.setLineDash([4, 3]), e.beginPath(), t >= 0 && t <= F && (e.moveTo(t, 0), e.lineTo(t, I));
|
|
1146
|
-
let n = Math.round(
|
|
1147
|
-
|
|
1264
|
+
let n = Math.round(C.y) + .5;
|
|
1265
|
+
D(n) && n >= C.pane.top && n <= C.pane.top + C.pane.height && (e.moveTo(0, n), e.lineTo(F, n)), e.stroke(), e.restore();
|
|
1148
1266
|
let a = o(R.text);
|
|
1149
|
-
if (
|
|
1150
|
-
let t =
|
|
1151
|
-
|
|
1267
|
+
if (D(C.y) && C.y >= C.pane.top && C.y <= C.pane.top + C.pane.height) {
|
|
1268
|
+
let t = Re(C.pane.scale, C.y), n = C.pane.id === T ? ii(Fe(C.pane.scale, t)) : Gr(C.pane, t);
|
|
1269
|
+
ri(e, C.y, n, a, c);
|
|
1152
1270
|
}
|
|
1153
1271
|
if (t >= 0 && t <= F && i) {
|
|
1154
|
-
let n =
|
|
1155
|
-
e.font =
|
|
1156
|
-
let r = e.measureText(n).width + 16, i =
|
|
1157
|
-
|
|
1272
|
+
let n = se(gr(ur(C.index)), or(), J);
|
|
1273
|
+
e.font = Q(R.fontSize, 500);
|
|
1274
|
+
let r = e.measureText(n).width + 16, i = E(t - r / 2, 0, Xt - r);
|
|
1275
|
+
Zr(e, i, I + 3, r, 21, 3), e.fillStyle = a, e.fill(), e.fillStyle = c, e.textAlign = "center", e.textBaseline = "middle", e.fillText(n, i + r / 2, I + 14);
|
|
1158
1276
|
}
|
|
1159
|
-
if (
|
|
1160
|
-
let t = F - 18 - 4, n =
|
|
1277
|
+
if (k.orderEntry && B && C.pane.id === T && D(C.y) && wn === "cursor" && !U && i) {
|
|
1278
|
+
let t = F - 18 - 4, n = E(Math.round(C.y - 9), r.top + 1, r.top + r.height - 18 - 1), i = fi(C.price), o = fi(f), s = i < o ? "buy" : "sell", d = pn ? s === "buy" ? "sell" : "buy" : s, p = xt(d, i, o), m = gi(t, n, 18, 18, () => q("orderCreate", {
|
|
1161
1279
|
price: i,
|
|
1162
|
-
side:
|
|
1280
|
+
side: d,
|
|
1281
|
+
orderType: p
|
|
1163
1282
|
}));
|
|
1164
|
-
|
|
1283
|
+
Zr(e, t, n, 18, 18, 4), e.fillStyle = m ? X(pt) : a, e.fill(), e.strokeStyle = m ? yt(X(pt)) : c, e.lineWidth = 1.5, e.beginPath(), e.moveTo(t + 5, n + 9), e.lineTo(t + 18 - 5, n + 9), e.moveTo(t + 9, n + 5), e.lineTo(t + 9, n + 18 - 5), e.stroke(), m && hi(e, mi(d, p, i), t - 6, n - 2, d === "buy" ? l : u, "right");
|
|
1165
1284
|
}
|
|
1166
1285
|
}
|
|
1167
|
-
},
|
|
1168
|
-
let t =
|
|
1169
|
-
return t || (t =
|
|
1286
|
+
}, yi = "", bi = [], xi = /* @__PURE__ */ new Map(), Si = /* @__PURE__ */ new Map(), Ci = (e) => {
|
|
1287
|
+
let t = Si.get(e);
|
|
1288
|
+
return t || (t = Et("div", {
|
|
1170
1289
|
position: "absolute",
|
|
1171
1290
|
left: "4px",
|
|
1172
1291
|
display: "flex",
|
|
@@ -1180,9 +1299,9 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1180
1299
|
fontVariantNumeric: "tabular-nums",
|
|
1181
1300
|
whiteSpace: "nowrap",
|
|
1182
1301
|
pointerEvents: "none"
|
|
1183
|
-
}),
|
|
1184
|
-
},
|
|
1185
|
-
let i =
|
|
1302
|
+
}), At.appendChild(t), Si.set(e, t)), t;
|
|
1303
|
+
}, wi = (e, t, n, r) => {
|
|
1304
|
+
let i = Et("div", {
|
|
1186
1305
|
display: "flex",
|
|
1187
1306
|
flexWrap: "wrap",
|
|
1188
1307
|
alignItems: "center",
|
|
@@ -1194,32 +1313,32 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1194
1313
|
borderRadius: "4px",
|
|
1195
1314
|
background: "color-mix(in srgb, var(--surface-color, var(--background-color, #fff)) 86%, transparent)"
|
|
1196
1315
|
}), a = null;
|
|
1197
|
-
if (n) a =
|
|
1316
|
+
if (n) a = Et("button", {
|
|
1198
1317
|
all: "unset",
|
|
1199
1318
|
cursor: "pointer",
|
|
1200
1319
|
pointerEvents: "auto",
|
|
1201
1320
|
color: "var(--text-color, #1f2937)",
|
|
1202
1321
|
fontWeight: "500",
|
|
1203
1322
|
borderRadius: "3px",
|
|
1204
|
-
...
|
|
1205
|
-
}), a.type = "button", a.textContent = t, a.setAttribute("aria-label",
|
|
1323
|
+
...St
|
|
1324
|
+
}), a.type = "button", a.textContent = t, a.setAttribute("aria-label", ke(Xn().toggleIndicator, { name: t })), a.addEventListener("click", (e) => {
|
|
1206
1325
|
e.stopPropagation();
|
|
1207
|
-
let t = !
|
|
1208
|
-
|
|
1326
|
+
let t = !sr(n);
|
|
1327
|
+
Vt.set(n.id, t), q("indicatorToggle", {
|
|
1209
1328
|
id: n.id,
|
|
1210
1329
|
visible: t
|
|
1211
|
-
}),
|
|
1330
|
+
}), Oi(), $();
|
|
1212
1331
|
}), a.addEventListener("pointerdown", (e) => e.stopPropagation()), i.appendChild(a);
|
|
1213
1332
|
else if (t) {
|
|
1214
|
-
let e =
|
|
1333
|
+
let e = Et("span", {
|
|
1215
1334
|
fontWeight: "600",
|
|
1216
|
-
...
|
|
1335
|
+
...St
|
|
1217
1336
|
});
|
|
1218
1337
|
e.textContent = t, i.appendChild(e);
|
|
1219
1338
|
}
|
|
1220
1339
|
let o = [];
|
|
1221
1340
|
for (let e = 0; e < r; e++) {
|
|
1222
|
-
let e =
|
|
1341
|
+
let e = Et("span", St);
|
|
1223
1342
|
i.appendChild(e), o.push(e);
|
|
1224
1343
|
}
|
|
1225
1344
|
return e.appendChild(i), {
|
|
@@ -1227,36 +1346,36 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1227
1346
|
values: o,
|
|
1228
1347
|
button: a
|
|
1229
1348
|
};
|
|
1230
|
-
},
|
|
1231
|
-
|
|
1232
|
-
for (let e of
|
|
1233
|
-
if (
|
|
1234
|
-
let e =
|
|
1235
|
-
|
|
1236
|
-
for (let t of
|
|
1349
|
+
}, Ti = () => {
|
|
1350
|
+
xi.clear();
|
|
1351
|
+
for (let e of Si.values()) e.remove();
|
|
1352
|
+
if (Si.clear(), k.legend === !1) return;
|
|
1353
|
+
let e = Ci(T), t = [k.symbol, k.labels?.timeframe ?? (typeof k.timeframe == "string" ? k.timeframe : "")].filter(Boolean).join(" · ");
|
|
1354
|
+
xi.set("ohlc", wi(e, t, null, 1));
|
|
1355
|
+
for (let t of zt) {
|
|
1237
1356
|
let n = t.mergeLegend ? 1 : t.outputs.length;
|
|
1238
|
-
t.overlay && t.type === "volume" ?
|
|
1357
|
+
t.overlay && t.type === "volume" ? xi.set(t.id, wi(e, Ei(t), t, 1)) : t.overlay && xi.set(t.id, wi(e, Ei(t), t, n));
|
|
1239
1358
|
}
|
|
1240
|
-
for (let t of
|
|
1241
|
-
for (let e of
|
|
1242
|
-
},
|
|
1359
|
+
for (let t of Ht) xi.set(`compare:${t.id}`, wi(e, "", null, 1));
|
|
1360
|
+
for (let e of zt) e.overlay || xi.set(e.id, wi(Ci(e.id), Ei(e), e, e.mergeLegend ? 1 : e.outputs.length));
|
|
1361
|
+
}, Ei = (e) => e.type === "volume" ? Xn().volume : e.titleKey ? `${Xn()[e.titleKey]} ${e.title}` : e.title, Di = (e, t, n) => {
|
|
1243
1362
|
if (!e) return;
|
|
1244
1363
|
e.textContent !== t && (e.textContent = t);
|
|
1245
1364
|
let r = n ?? "";
|
|
1246
1365
|
e.style.color !== r && (e.style.color = r);
|
|
1247
|
-
},
|
|
1366
|
+
}, Oi = () => {
|
|
1248
1367
|
let e = [
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
...
|
|
1253
|
-
...
|
|
1254
|
-
|
|
1255
|
-
|
|
1368
|
+
k.legend !== !1,
|
|
1369
|
+
k.symbol,
|
|
1370
|
+
k.timeframe,
|
|
1371
|
+
...zt.map((e) => `${e.id}:${Ei(e)}:${e.outputs.length}`),
|
|
1372
|
+
...Ht.map((e) => e.id),
|
|
1373
|
+
Jn.toggleIndicator,
|
|
1374
|
+
k.labels?.timeframe
|
|
1256
1375
|
].join("|");
|
|
1257
|
-
if (e !==
|
|
1376
|
+
if (e !== yi && (yi = e, Ti()), k.legend === !1) return;
|
|
1258
1377
|
for (let e of L) {
|
|
1259
|
-
let t =
|
|
1378
|
+
let t = Si.get(e.id);
|
|
1260
1379
|
if (!t) continue;
|
|
1261
1380
|
t.style.top = `${e.top + 6}px`;
|
|
1262
1381
|
let n = `${Math.max(60, Math.floor(F - 10))}px`;
|
|
@@ -1264,211 +1383,211 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1264
1383
|
let r = `${Math.max(18, Math.floor(e.height - 10))}px`;
|
|
1265
1384
|
t.style.maxHeight !== r && (t.style.maxHeight = r);
|
|
1266
1385
|
}
|
|
1267
|
-
let t =
|
|
1386
|
+
let t = Si.get(T), n = t ? Array.from(t.children, (e) => ({
|
|
1268
1387
|
right: t.offsetLeft + e.offsetLeft + e.offsetWidth,
|
|
1269
1388
|
top: t.offsetTop + e.offsetTop,
|
|
1270
1389
|
bottom: t.offsetTop + e.offsetTop + e.offsetHeight
|
|
1271
|
-
})) : [], r = n.length !==
|
|
1272
|
-
let n =
|
|
1390
|
+
})) : [], r = n.length !== bi.length || n.some((e, t) => {
|
|
1391
|
+
let n = bi[t];
|
|
1273
1392
|
return !n || n.right !== e.right || n.top !== e.top || n.bottom !== e.bottom;
|
|
1274
1393
|
});
|
|
1275
|
-
|
|
1276
|
-
let i = Y(), a =
|
|
1394
|
+
bi = n, r && $();
|
|
1395
|
+
let i = Y(), a = si(), o = E(a && a.index >= 0 && a.index < i ? a.index : i - 1, 0, Math.max(0, i - 1)), s = Xn(), c = xi.get("ohlc"), l = X($n()), u = X(er());
|
|
1277
1396
|
if (c && i) {
|
|
1278
|
-
let e =
|
|
1397
|
+
let e = Sr(), t = e.open[o], n = e.close[o], r = o > 0 ? e.close[o - 1] : t, i = n - r, a = n >= t ? l : u, d = c.values[0], f = [
|
|
1279
1398
|
[s.open, e.open[o]],
|
|
1280
1399
|
[s.high, e.high[o]],
|
|
1281
1400
|
[s.low, e.low[o]],
|
|
1282
1401
|
[s.close, n]
|
|
1283
|
-
].map(([e, t]) => `<span style="${
|
|
1402
|
+
].map(([e, t]) => `<span style="${Ct}"><span style="color:var(--text-secondary-color,#6b7280)">${ki(String(e))}</span><span style="color:${a}">${ki(Z(t))}</span></span>`).join(""), p = r ? i / r * 100 : NaN, m = `${f}${`<span style="${Ct}">${s.change ? `<span style="color:var(--text-secondary-color,#6b7280)">${ki(s.change)}</span>` : ""}<span style="color:${i >= 0 ? l : u}">${i >= 0 ? "+" : "−"}${ki(Z(Math.abs(i)))} (${ki(le(p, J))})</span></span>`}${M.hasVolume ? `<span style="${Ct}"><span style="color:var(--text-secondary-color,#6b7280)">${ki(s.volume)}</span>${ki(ue(M.volume[o], J))}</span>` : ""}`;
|
|
1284
1403
|
d && d.dataset.html !== m && (d.innerHTML = m, d.dataset.html = m, d.style.display = "inline-flex", d.style.columnGap = "6px", d.style.flexWrap = "wrap");
|
|
1285
1404
|
}
|
|
1286
|
-
for (let e of
|
|
1287
|
-
let t =
|
|
1405
|
+
for (let e of zt) {
|
|
1406
|
+
let t = xi.get(e.id);
|
|
1288
1407
|
if (!t) continue;
|
|
1289
|
-
let n =
|
|
1408
|
+
let n = sr(e);
|
|
1290
1409
|
t.row.style.opacity = n ? "1" : "0.5", t.button && (t.button.setAttribute("aria-pressed", String(n)), t.button.style.textDecoration = n ? "none" : "line-through");
|
|
1291
1410
|
let r = e.outputs.length;
|
|
1292
1411
|
if (e.mergeLegend) {
|
|
1293
|
-
let r = e.outputs.find((e) =>
|
|
1294
|
-
|
|
1412
|
+
let r = e.outputs.find((e) => D(e.values[o]));
|
|
1413
|
+
Di(t.values[0], n && i && r ? Kr(e, r.values[o]) : "", r ? X(_r(r.color)) : void 0);
|
|
1295
1414
|
continue;
|
|
1296
1415
|
}
|
|
1297
1416
|
e.outputs.forEach((a, s) => {
|
|
1298
1417
|
let c = t.values[e.type === "macd" ? (s + r - 1) % r : s];
|
|
1299
1418
|
if (!n || !i) {
|
|
1300
|
-
|
|
1419
|
+
Di(c, "");
|
|
1301
1420
|
return;
|
|
1302
1421
|
}
|
|
1303
1422
|
if (a.kind === "volume") {
|
|
1304
|
-
let e =
|
|
1305
|
-
|
|
1423
|
+
let e = M.close[o] >= M.open[o] ? l : u;
|
|
1424
|
+
Di(c, ue(M.volume[o], J), e);
|
|
1306
1425
|
return;
|
|
1307
1426
|
}
|
|
1308
|
-
let d = o - a.shift, f = d >= 0 && d < i ? a.values[d] : NaN, p = a.color ? X(
|
|
1309
|
-
a.kind === "histogram" && (p = f >= 0 ? l : u), a.kind === "dots" && !a.color && (p = f <=
|
|
1427
|
+
let d = o - a.shift, f = d >= 0 && d < i ? a.values[d] : NaN, p = a.color ? X(_r(a.color)) : void 0;
|
|
1428
|
+
a.kind === "histogram" && (p = f >= 0 ? l : u), a.kind === "dots" && !a.color && (p = f <= M.close[o] ? l : u);
|
|
1310
1429
|
let m = e.outputs.length > 1 && !e.plainLegend ? `${a.label} ` : "";
|
|
1311
|
-
|
|
1430
|
+
Di(c, `${m}${Kr(e, f)}`, p);
|
|
1312
1431
|
});
|
|
1313
1432
|
}
|
|
1314
|
-
for (let e of
|
|
1315
|
-
let t =
|
|
1433
|
+
for (let e of Ht) {
|
|
1434
|
+
let t = xi.get(`compare:${e.id}`);
|
|
1316
1435
|
if (!t) continue;
|
|
1317
|
-
let n = e.values[o], r =
|
|
1318
|
-
|
|
1436
|
+
let n = e.values[o], r = Rr(e), i = D(r) ? (n / r - 1) * 100 : NaN;
|
|
1437
|
+
Di(t.values[0], `${e.name} ${Z(n)} ${le(i, J)}`, X(e.color));
|
|
1319
1438
|
}
|
|
1320
|
-
},
|
|
1321
|
-
|
|
1322
|
-
},
|
|
1439
|
+
}, ki = (e) => e.replace(/[&<>"]/g, (e) => e === "&" ? "&" : e === "<" ? "<" : e === ">" ? ">" : """), $ = () => {
|
|
1440
|
+
Tt || on || (on = wt?.requestAnimationFrame ? wt.requestAnimationFrame(Mi) : setTimeout(() => Mi(Date.now()), 16));
|
|
1441
|
+
}, Ai = (e) => {
|
|
1323
1442
|
let t = !1;
|
|
1324
|
-
if (
|
|
1325
|
-
let n = Math.min(1, (e -
|
|
1326
|
-
P =
|
|
1443
|
+
if (_n) {
|
|
1444
|
+
let n = Math.min(1, (e - _n.start) / 320), r = 1 - (1 - n) ** 3;
|
|
1445
|
+
P = _n.from + (_n.to - _n.from) * r, n >= 1 ? _n = null : t = !0;
|
|
1327
1446
|
}
|
|
1328
|
-
if (
|
|
1329
|
-
let n = Math.min(64, e -
|
|
1330
|
-
|
|
1447
|
+
if (gn) {
|
|
1448
|
+
let n = Math.min(64, e - gn.t);
|
|
1449
|
+
gn.t = e;
|
|
1331
1450
|
let r = P;
|
|
1332
|
-
P -=
|
|
1451
|
+
P -= gn.v * n / N, gn.v *= Math.exp(-n / 320), Nr(), Math.abs(gn.v) < .02 || P === r ? gn = null : t = !0;
|
|
1333
1452
|
}
|
|
1334
1453
|
return t;
|
|
1335
|
-
},
|
|
1336
|
-
e.font =
|
|
1454
|
+
}, ji = (e) => {
|
|
1455
|
+
e.font = Q(R.fontSize, 500);
|
|
1337
1456
|
let t = 0;
|
|
1338
|
-
for (let n of L) for (let r of n.ticks) t = Math.max(t, e.measureText(
|
|
1457
|
+
for (let n of L) for (let r of n.ticks) t = Math.max(t, e.measureText(Gr(n, r)).width);
|
|
1339
1458
|
let n = Y();
|
|
1340
|
-
n && (t = Math.max(t, e.measureText(
|
|
1341
|
-
let r = Math.max(
|
|
1342
|
-
(r >
|
|
1459
|
+
n && (t = Math.max(t, e.measureText(ii(M.close[n - 1])).width), k.countdown && (t = Math.max(t, e.measureText("00:00:00").width)));
|
|
1460
|
+
let r = Math.max(st, Math.ceil(t + 18));
|
|
1461
|
+
(r > Yt || r < Yt - 12) && (Yt = r);
|
|
1343
1462
|
};
|
|
1344
|
-
function
|
|
1345
|
-
if (
|
|
1346
|
-
let t =
|
|
1347
|
-
|
|
1348
|
-
let r =
|
|
1349
|
-
I = Math.max(1,
|
|
1463
|
+
function Mi(e) {
|
|
1464
|
+
if (on = 0, Tt || (Xt = A.clientWidth, Zt = A.clientHeight, Xt <= 0 || Zt <= 0)) return;
|
|
1465
|
+
let t = Ai(typeof performance < "u" ? performance.now() : e ?? Date.now()), n = wt?.devicePixelRatio || 1;
|
|
1466
|
+
wr(), Xr(Ot, n), Xr(kt, n);
|
|
1467
|
+
let r = Ot.getContext("2d"), i = kt.getContext("2d");
|
|
1468
|
+
I = Math.max(1, Zt - ot);
|
|
1350
1469
|
for (let e = 0; e < 2; e++) {
|
|
1351
|
-
F = Math.max(1,
|
|
1470
|
+
F = Math.max(1, Xt - Yt), jr(), vn && Li(vn), Nr(), en = Pr(), Ur(en);
|
|
1352
1471
|
for (let e of L) {
|
|
1353
|
-
let t =
|
|
1472
|
+
let t = Le(e.scale, e.id === T ? 44 : 30), n = e.study?.range, r = e.study?.bands;
|
|
1354
1473
|
e.ticks = n && r ? [...r, (n[0] + n[1]) / 2].sort((e, t) => e - t) : t.scaled, e.step = t.step;
|
|
1355
1474
|
}
|
|
1356
|
-
let e =
|
|
1357
|
-
if (i &&
|
|
1475
|
+
let e = Yt;
|
|
1476
|
+
if (i && ji(i), Yt === e) break;
|
|
1358
1477
|
}
|
|
1359
|
-
let a =
|
|
1360
|
-
|
|
1361
|
-
let o = i ?
|
|
1362
|
-
|
|
1478
|
+
let a = en;
|
|
1479
|
+
vn = null;
|
|
1480
|
+
let o = i ? Wr(a, i) : [];
|
|
1481
|
+
Yr(a, n), r && (r.setTransform(n, 0, 0, n, 0, 0), r.clearRect(0, 0, Xt, Zt), ni(r, a, o)), i && (i.setTransform(n, 0, 0, n, 0, 0), i.clearRect(0, 0, Xt, Zt), vi(i, a, o)), Oi(), Ni(), fa(), aa(), Fi(), B && !U && na(B.x, B.y) !== Ln && (Sa(B.x, B.y), $()), t && $();
|
|
1363
1482
|
}
|
|
1364
|
-
let
|
|
1365
|
-
let e = Y(), t = L[0], n = e > 0 && t &&
|
|
1366
|
-
if (
|
|
1367
|
-
|
|
1368
|
-
let e =
|
|
1369
|
-
|
|
1370
|
-
}
|
|
1371
|
-
},
|
|
1483
|
+
let Ni = () => {
|
|
1484
|
+
let e = Y(), t = L[0], n = e > 0 && t && cr(e - 1) > F + N * .5;
|
|
1485
|
+
if (jt.style.display = n ? "flex" : "none", n && t) {
|
|
1486
|
+
jt.style.left = `${F - 40}px`, jt.style.top = `${t.top + t.height - 40}px`;
|
|
1487
|
+
let e = Xn().scrollToRealtime;
|
|
1488
|
+
jt.getAttribute("aria-label") !== e && (jt.setAttribute("aria-label", e), jt.title = e);
|
|
1489
|
+
}
|
|
1490
|
+
}, Pi = () => {
|
|
1372
1491
|
let e = P - F / N;
|
|
1373
1492
|
return {
|
|
1374
1493
|
from: e,
|
|
1375
1494
|
to: P,
|
|
1376
|
-
fromTime:
|
|
1377
|
-
toTime:
|
|
1495
|
+
fromTime: ur(e),
|
|
1496
|
+
toTime: ur(P)
|
|
1378
1497
|
};
|
|
1379
|
-
},
|
|
1498
|
+
}, Fi = () => {
|
|
1380
1499
|
let e = Y();
|
|
1381
1500
|
if (!e) return;
|
|
1382
|
-
let t =
|
|
1383
|
-
(!
|
|
1384
|
-
firstTime:
|
|
1501
|
+
let t = Pi();
|
|
1502
|
+
(!Rn || Math.abs(Rn.from - t.from) > 1e-6 || Math.abs(Rn.to - t.to) > 1e-6) && (Rn = t, zn || q("visibleRangeChange", t)), zn = !1, t.from < 10 && Hn !== M.time[0] && (Hn = M.time[0], q("historyRequest", {
|
|
1503
|
+
firstTime: M.time[0],
|
|
1385
1504
|
count: e
|
|
1386
1505
|
}));
|
|
1387
|
-
let n =
|
|
1388
|
-
if (i !==
|
|
1389
|
-
if (
|
|
1506
|
+
let n = si(), r = n && (B || V !== null) ? n : null, i = r ? `${r.index}|${r.price}|${r.pane.id}` : "";
|
|
1507
|
+
if (i !== Vn) {
|
|
1508
|
+
if (Vn = i, !r) q("crosshairMove", null);
|
|
1390
1509
|
else {
|
|
1391
1510
|
let t = {
|
|
1392
1511
|
index: r.index,
|
|
1393
|
-
time:
|
|
1394
|
-
bar: r.index >= 0 && r.index < e ?
|
|
1512
|
+
time: ur(r.index),
|
|
1513
|
+
bar: r.index >= 0 && r.index < e ? tt(M, r.index) : null,
|
|
1395
1514
|
price: r.price,
|
|
1396
1515
|
pane: r.pane.id,
|
|
1397
|
-
x:
|
|
1516
|
+
x: cr(r.index),
|
|
1398
1517
|
y: r.y
|
|
1399
1518
|
};
|
|
1400
1519
|
q("crosshairMove", t);
|
|
1401
1520
|
}
|
|
1402
1521
|
}
|
|
1403
|
-
},
|
|
1404
|
-
let t =
|
|
1522
|
+
}, Ii = (e) => {
|
|
1523
|
+
let t = A.getBoundingClientRect();
|
|
1405
1524
|
return {
|
|
1406
1525
|
x: e.clientX - t.left,
|
|
1407
1526
|
y: e.clientY - t.top
|
|
1408
1527
|
};
|
|
1409
|
-
},
|
|
1410
|
-
N = F / (e.to - e.from), P = e.to,
|
|
1411
|
-
},
|
|
1528
|
+
}, Li = (e) => {
|
|
1529
|
+
N = F / (e.to - e.from), P = e.to, Nr();
|
|
1530
|
+
}, Ri = (e, t) => {
|
|
1412
1531
|
let n = Y();
|
|
1413
|
-
n &&
|
|
1414
|
-
let r =
|
|
1415
|
-
N *= t,
|
|
1416
|
-
},
|
|
1417
|
-
let r = Math.round(
|
|
1532
|
+
n && Or() && (e = Math.min(F, cr(n - 1)));
|
|
1533
|
+
let r = lr(e);
|
|
1534
|
+
N *= t, Nr(), P = r + (F - e) / N, Nr(), gn = null, _n = null, $();
|
|
1535
|
+
}, zi = (e, t, n) => {
|
|
1536
|
+
let r = Math.round(lr(e));
|
|
1418
1537
|
return {
|
|
1419
|
-
time:
|
|
1420
|
-
price:
|
|
1538
|
+
time: ur(r),
|
|
1539
|
+
price: Be(n.scale, t)
|
|
1421
1540
|
};
|
|
1422
|
-
}, Mi = (e, t) => {
|
|
1423
|
-
e !== vn && (vn = e, G = null, xn = 0, t && q("drawingToolChange", e), $());
|
|
1424
|
-
}, Ni = (e) => {
|
|
1425
|
-
e !== yn && (yn = e, Dn = !1, q("drawingSelect", e), $());
|
|
1426
|
-
}, Pi = () => ({
|
|
1427
|
-
canUndo: hn.length > 0,
|
|
1428
|
-
canRedo: gn.length > 0
|
|
1429
|
-
}), Fi = () => {
|
|
1430
|
-
let e = Pi(), t = `${e.canUndo}|${e.canRedo}`;
|
|
1431
|
-
t !== _n && (_n = t, q("undoChange", e));
|
|
1432
|
-
}, Ii = (e, t = !0) => {
|
|
1433
|
-
e !== mn && (hn.push(mn), hn.length > ft && hn.shift(), gn.length = 0, mn = e), W = e, t && (pn = e, q("drawingsChange", e)), yn && !e.some((e) => e.id === yn) && Ni(null), Fi(), $();
|
|
1434
|
-
}, Li = (e) => {
|
|
1435
|
-
mn = e, W = e, pn = e, G = null, yn && !e.some((e) => e.id === yn) && Ni(null), q("drawingsChange", e), Fi(), $();
|
|
1436
|
-
}, Ri = () => {
|
|
1437
|
-
let e = hn.pop();
|
|
1438
|
-
e && (Tn && $i(!1), gn.push(mn), Li(e));
|
|
1439
|
-
}, zi = () => {
|
|
1440
|
-
let e = gn.pop();
|
|
1441
|
-
e && (hn.push(mn), Li(e));
|
|
1442
1541
|
}, Bi = (e, t) => {
|
|
1443
|
-
|
|
1542
|
+
e !== wn && (wn = e, G = null, Dn = 0, t && q("drawingToolChange", e), $());
|
|
1543
|
+
}, Vi = (e) => {
|
|
1544
|
+
e !== Tn && (Tn = e, Nn = !1, q("drawingSelect", e), $());
|
|
1545
|
+
}, Hi = () => ({
|
|
1546
|
+
canUndo: xn.length > 0,
|
|
1547
|
+
canRedo: Sn.length > 0
|
|
1548
|
+
}), Ui = () => {
|
|
1549
|
+
let e = Hi(), t = `${e.canUndo}|${e.canRedo}`;
|
|
1550
|
+
t !== Cn && (Cn = t, q("undoChange", e));
|
|
1551
|
+
}, Wi = (e, t = !0) => {
|
|
1552
|
+
e !== bn && (xn.push(bn), xn.length > mt && xn.shift(), Sn.length = 0, bn = e), W = e, t && (yn = e, q("drawingsChange", e)), Tn && !e.some((e) => e.id === Tn) && Vi(null), Ui(), $();
|
|
1553
|
+
}, Gi = (e) => {
|
|
1554
|
+
bn = e, W = e, yn = e, G = null, Tn && !e.some((e) => e.id === Tn) && Vi(null), q("drawingsChange", e), Ui(), $();
|
|
1555
|
+
}, Ki = () => {
|
|
1556
|
+
let e = xn.pop();
|
|
1557
|
+
e && (jn && sa(!1), Sn.push(bn), Gi(e));
|
|
1558
|
+
}, qi = () => {
|
|
1559
|
+
let e = Sn.pop();
|
|
1560
|
+
e && (xn.push(bn), Gi(e));
|
|
1561
|
+
}, Ji = (e, t) => {
|
|
1562
|
+
W.some((t) => t.id === e) && Wi(W.map((n) => n.id === e ? {
|
|
1444
1563
|
...n,
|
|
1445
1564
|
...t,
|
|
1446
1565
|
id: n.id,
|
|
1447
1566
|
type: n.type
|
|
1448
1567
|
} : n));
|
|
1449
|
-
},
|
|
1450
|
-
W.some((t) => t.id === e) && (
|
|
1451
|
-
},
|
|
1452
|
-
let r =
|
|
1568
|
+
}, Yi = (e) => {
|
|
1569
|
+
W.some((t) => t.id === e) && (Tn === e && Vi(null), Wi(W.filter((t) => t.id !== e)));
|
|
1570
|
+
}, Xi = (e, t, n) => {
|
|
1571
|
+
let r = w(t.scale, e.price), i = Math.max(12, t.height * .07), a = Be(t.scale, r + (n ? -2 : 2) * i), o = Be(t.scale, r + (n ? 1 : -1) * i), s = Math.max(6, Math.round(F * .16 / N)), c = ur(Math.round(xr(e.time)) + s);
|
|
1453
1572
|
return [
|
|
1454
1573
|
e,
|
|
1455
1574
|
{
|
|
1456
1575
|
time: c,
|
|
1457
|
-
price:
|
|
1576
|
+
price: fi(a)
|
|
1458
1577
|
},
|
|
1459
1578
|
{
|
|
1460
1579
|
time: c,
|
|
1461
|
-
price:
|
|
1580
|
+
price: fi(o)
|
|
1462
1581
|
}
|
|
1463
1582
|
];
|
|
1464
|
-
},
|
|
1583
|
+
}, Zi = () => {
|
|
1465
1584
|
if (!G) return;
|
|
1466
1585
|
let e = G;
|
|
1467
|
-
G = null,
|
|
1468
|
-
},
|
|
1586
|
+
G = null, Dn = 0, Wi([...W, e]), Vi(e.id), k.keepDrawingMode || Bi("cursor", !0), e.type === "text" && oa(e.id, !0);
|
|
1587
|
+
}, Qi = () => {
|
|
1469
1588
|
if (!G) return;
|
|
1470
|
-
if (
|
|
1471
|
-
|
|
1589
|
+
if (Dn--, Dn <= 0) {
|
|
1590
|
+
Zi();
|
|
1472
1591
|
return;
|
|
1473
1592
|
}
|
|
1474
1593
|
let e = G.points[G.points.length - 1];
|
|
@@ -1476,28 +1595,28 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1476
1595
|
...G,
|
|
1477
1596
|
points: [...G.points, e]
|
|
1478
1597
|
});
|
|
1479
|
-
},
|
|
1480
|
-
let n =
|
|
1481
|
-
!G || !n ||
|
|
1598
|
+
}, $i = (e, t) => {
|
|
1599
|
+
let n = ci(On);
|
|
1600
|
+
!G || !n || Dn <= 0 || (G = {
|
|
1482
1601
|
...G,
|
|
1483
|
-
points: [...G.points.slice(0, -1),
|
|
1602
|
+
points: [...G.points.slice(0, -1), zi(e, t, n)]
|
|
1484
1603
|
});
|
|
1485
|
-
},
|
|
1604
|
+
}, ea = (e, t) => {
|
|
1486
1605
|
let n = L[0];
|
|
1487
1606
|
if (!n || e > F) return null;
|
|
1488
|
-
for (let e of
|
|
1607
|
+
for (let e of k.priceLines ?? []) if (e.draggable && Math.abs(w(n.scale, oi(e)) - t) <= 5) return e;
|
|
1489
1608
|
return null;
|
|
1490
|
-
},
|
|
1609
|
+
}, ta = (e, t) => {
|
|
1491
1610
|
if (e > F) return null;
|
|
1492
|
-
let n =
|
|
1611
|
+
let n = Mr(t), r = li(n);
|
|
1493
1612
|
if (!n || !r) return null;
|
|
1494
1613
|
for (let i = W.length - 1; i >= 0; i--) {
|
|
1495
1614
|
let a = W[i];
|
|
1496
|
-
if (!a || (a.pane ??
|
|
1497
|
-
let o =
|
|
1615
|
+
if (!a || (a.pane ?? T) !== n.id) continue;
|
|
1616
|
+
let o = y(a, r, {
|
|
1498
1617
|
x: e,
|
|
1499
1618
|
y: t
|
|
1500
|
-
}, 6,
|
|
1619
|
+
}, 6, An.get(a.id));
|
|
1501
1620
|
if (o) return {
|
|
1502
1621
|
drawing: a,
|
|
1503
1622
|
hit: o,
|
|
@@ -1505,81 +1624,81 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1505
1624
|
};
|
|
1506
1625
|
}
|
|
1507
1626
|
return null;
|
|
1508
|
-
},
|
|
1627
|
+
}, na = (e, t) => In.findIndex((n) => e >= n.x && e <= n.x + n.w && t >= n.y && t <= n.y + n.h), ra = (e) => {
|
|
1509
1628
|
for (let t = 1; t < L.length; t++) if (Math.abs(L[t].top - e) <= 4) return t;
|
|
1510
1629
|
return -1;
|
|
1511
|
-
},
|
|
1512
|
-
|
|
1513
|
-
},
|
|
1514
|
-
if (!
|
|
1515
|
-
let e =
|
|
1630
|
+
}, ia = () => {
|
|
1631
|
+
j.style.height = "auto", j.style.height = `${Math.max(28, j.scrollHeight + 2)}px`;
|
|
1632
|
+
}, aa = () => {
|
|
1633
|
+
if (!jn) return;
|
|
1634
|
+
let e = jn.id, t = W.find((t) => t.id === e), n = t ? ci(t.pane) : null, r = t?.points[0];
|
|
1516
1635
|
if (!t || !n || !r) return;
|
|
1517
|
-
let i =
|
|
1518
|
-
|
|
1636
|
+
let i = cr(xr(r.time)), a = w(n.scale, r.price);
|
|
1637
|
+
j.style.left = `${E(i, 2, Math.max(2, F - 160))}px`, j.style.top = `${E(a, 2, Math.max(2, I - 40))}px`;
|
|
1519
1638
|
};
|
|
1520
|
-
function
|
|
1639
|
+
function oa(e, t) {
|
|
1521
1640
|
let n = W.find((t) => t.id === e);
|
|
1522
|
-
n && !n.locked && (
|
|
1641
|
+
n && !n.locked && (jn = {
|
|
1523
1642
|
id: e,
|
|
1524
1643
|
created: t
|
|
1525
|
-
},
|
|
1644
|
+
}, j.value = t ? "" : n.text ?? "", j.placeholder = Xn().text, j.setAttribute("aria-label", Xn().editText), j.style.display = "block", aa(), ia(), j.focus(), j.select(), $());
|
|
1526
1645
|
}
|
|
1527
|
-
function
|
|
1528
|
-
if (!
|
|
1529
|
-
let { id: t, created: n } =
|
|
1530
|
-
|
|
1531
|
-
let r =
|
|
1646
|
+
function sa(e) {
|
|
1647
|
+
if (!jn) return;
|
|
1648
|
+
let { id: t, created: n } = jn;
|
|
1649
|
+
jn = null, j.style.display = "none";
|
|
1650
|
+
let r = j.value.replace(/\s+$/, ""), i = W.find((e) => e.id === t);
|
|
1532
1651
|
if (i && n && (!e || !r)) {
|
|
1533
|
-
let e =
|
|
1534
|
-
|
|
1652
|
+
let e = xn.pop();
|
|
1653
|
+
Gi(e ?? W.filter((e) => e.id !== t));
|
|
1535
1654
|
} else if (i && e && r !== (i.text ?? "")) {
|
|
1536
1655
|
if (n) {
|
|
1537
1656
|
let e = W.map((e) => e.id === t ? {
|
|
1538
1657
|
...e,
|
|
1539
1658
|
text: r
|
|
1540
1659
|
} : e);
|
|
1541
|
-
|
|
1542
|
-
} else
|
|
1660
|
+
bn = e, W = e, yn = e, q("drawingsChange", e);
|
|
1661
|
+
} else Ji(t, { text: r });
|
|
1543
1662
|
}
|
|
1544
|
-
(
|
|
1663
|
+
(O.activeElement === j || O.activeElement === O.body) && A.focus(), $();
|
|
1545
1664
|
}
|
|
1546
|
-
|
|
1547
|
-
e.stopPropagation(), e.key === "Enter" && !e.shiftKey ? (e.preventDefault(),
|
|
1548
|
-
}),
|
|
1549
|
-
let
|
|
1550
|
-
let i =
|
|
1665
|
+
j.addEventListener("keydown", (e) => {
|
|
1666
|
+
e.stopPropagation(), e.key === "Enter" && !e.shiftKey ? (e.preventDefault(), sa(!0)) : e.key === "Escape" && (e.preventDefault(), sa(!1));
|
|
1667
|
+
}), j.addEventListener("input", ia), j.addEventListener("blur", () => sa(!0)), j.addEventListener("pointerdown", (e) => e.stopPropagation()), j.addEventListener("dblclick", (e) => e.stopPropagation());
|
|
1668
|
+
let ca = (e, t = "", n = 1.5) => `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="${n}" stroke-linecap="round" stroke-linejoin="round"${t ? ` stroke-dasharray="${t}"` : ""} aria-hidden="true"><path d="${e}"/></svg>`, la = (e, t, n, r) => {
|
|
1669
|
+
let i = O.createElement("button");
|
|
1551
1670
|
return i.type = "button", i.setAttribute("aria-label", e), i.title = e, r !== void 0 && i.setAttribute("aria-pressed", String(r)), i.innerHTML = t, i.addEventListener("click", (e) => {
|
|
1552
1671
|
e.stopPropagation(), n();
|
|
1553
1672
|
}), i;
|
|
1554
|
-
},
|
|
1555
|
-
let e =
|
|
1673
|
+
}, ua = () => {
|
|
1674
|
+
let e = O.createElement("span");
|
|
1556
1675
|
return e.className = "sep", e;
|
|
1557
|
-
},
|
|
1558
|
-
|
|
1559
|
-
let t =
|
|
1560
|
-
|
|
1676
|
+
}, da = (e) => {
|
|
1677
|
+
Nt.textContent = "";
|
|
1678
|
+
let t = Xn();
|
|
1679
|
+
Nt.setAttribute("aria-label", t.lineStyle);
|
|
1561
1680
|
let n = e.id, r = [];
|
|
1562
1681
|
if (!e.locked) {
|
|
1563
|
-
let i = X(e.color ??
|
|
1564
|
-
|
|
1682
|
+
let i = X(e.color ?? pt), a = la(t.color, `<span style="display:block;width:14px;height:14px;border-radius:50%;background:${i};box-shadow:inset 0 0 0 1px rgba(127,127,127,.35)"></span>`, () => {
|
|
1683
|
+
Nn = !Nn, Mn = "", fa();
|
|
1565
1684
|
});
|
|
1566
|
-
a.setAttribute("aria-expanded", String(
|
|
1685
|
+
a.setAttribute("aria-expanded", String(Nn)), r.push(a);
|
|
1567
1686
|
let o = e.lineWidth ?? 1.5, s = [
|
|
1568
1687
|
1,
|
|
1569
1688
|
2,
|
|
1570
1689
|
3,
|
|
1571
1690
|
4
|
|
1572
1691
|
];
|
|
1573
|
-
r.push(
|
|
1692
|
+
r.push(la(`${t.lineWidth}: ${o}px`, `${ca("M2 8h12", "", Math.min(4, o))}<span style="font-size:11px;margin-left:3px">${o}</span>`, () => Ji(n, { lineWidth: s.find((e) => e > o) ?? s[0] })));
|
|
1574
1693
|
let c = e.lineStyle ?? "solid";
|
|
1575
|
-
r.push(
|
|
1694
|
+
r.push(la(t.lineStyle, ca("M2 8h12", c === "dashed" ? "3.5 2.5" : c === "dotted" ? "0.1 3" : "", c === "dotted" ? 2.2 : 1.6), () => Ji(n, { lineStyle: gt[(gt.indexOf(c) + 1) % gt.length] }))), b(e.type) && r.push(la(t.fill, "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"9\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\".3\" stroke=\"currentColor\" stroke-width=\"1.3\"/></svg>", () => Ji(n, { fill: e.fill === !1 }), e.fill !== !1)), e.type === "text" && r.push(la(t.editText, ca("M3 13h3l7-7-3-3-7 7zM9 4l3 3"), () => oa(n, !1))), r.push(ua());
|
|
1576
1695
|
}
|
|
1577
|
-
if (r.push(
|
|
1578
|
-
let e =
|
|
1696
|
+
if (r.push(la(t.lock, e.locked ? ca("M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 4 0v2") : ca("M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 3.8-.9"), () => Ji(n, { locked: !e.locked }), !!e.locked)), !e.locked) {
|
|
1697
|
+
let e = la(t.remove, ca("M3 4.5h10M6.5 4.5V3h3v1.5M4.5 4.5l.7 8.5h5.6l.7-8.5"), () => Yi(n));
|
|
1579
1698
|
e.style.color = "var(--danger-color, #f23645)", r.push(e);
|
|
1580
1699
|
}
|
|
1581
|
-
if (
|
|
1582
|
-
let r =
|
|
1700
|
+
if (Nt.append(...r), Nn && !e.locked) {
|
|
1701
|
+
let r = Et("div", {
|
|
1583
1702
|
position: "absolute",
|
|
1584
1703
|
left: "0",
|
|
1585
1704
|
top: "calc(100% + 4px)",
|
|
@@ -1591,19 +1710,19 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1591
1710
|
background: "var(--surface-elevated-color, var(--surface-color, #fff))",
|
|
1592
1711
|
boxShadow: "0 8px 24px -8px rgba(15, 23, 42, 0.35)"
|
|
1593
1712
|
});
|
|
1594
|
-
for (let i of
|
|
1595
|
-
let a =
|
|
1596
|
-
|
|
1713
|
+
for (let i of ht) {
|
|
1714
|
+
let a = la(`${t.color} ${i}`, `<span style="display:block;width:16px;height:16px;border-radius:50%;background:${i}"></span>`, () => {
|
|
1715
|
+
Nn = !1, Ji(n, { color: i });
|
|
1597
1716
|
}, (e.color ?? "").toLowerCase() === i);
|
|
1598
1717
|
r.appendChild(a);
|
|
1599
1718
|
}
|
|
1600
|
-
|
|
1719
|
+
Nt.appendChild(r);
|
|
1601
1720
|
}
|
|
1602
1721
|
};
|
|
1603
|
-
function
|
|
1604
|
-
let e =
|
|
1605
|
-
if (!e || !t || !n ||
|
|
1606
|
-
|
|
1722
|
+
function fa() {
|
|
1723
|
+
let e = Tn ? W.find((e) => e.id === Tn) : void 0, t = e ? ci(e.pane) : null, n = li(t), r = U?.kind === "drawing" && U.moved;
|
|
1724
|
+
if (!e || !t || !n || k.drawingToolbar === !1 || jn || r || G) {
|
|
1725
|
+
Nt.style.display = "none", Mn = "", Nn = !1;
|
|
1607
1726
|
return;
|
|
1608
1727
|
}
|
|
1609
1728
|
let i = [
|
|
@@ -1613,126 +1732,126 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1613
1732
|
e.lineStyle,
|
|
1614
1733
|
e.fill,
|
|
1615
1734
|
e.locked,
|
|
1616
|
-
|
|
1735
|
+
Nn,
|
|
1617
1736
|
J,
|
|
1618
|
-
|
|
1737
|
+
nn
|
|
1619
1738
|
].join("|");
|
|
1620
|
-
i !==
|
|
1621
|
-
let a =
|
|
1739
|
+
i !== Mn && (Mn = i, da(e)), Nt.style.display = "flex";
|
|
1740
|
+
let a = v(e, n, An.get(e.id)), o = An.get(e.id);
|
|
1622
1741
|
e.type === "text" && o && a.push({
|
|
1623
1742
|
x: o.x + o.w,
|
|
1624
1743
|
y: o.y + o.h
|
|
1625
1744
|
});
|
|
1626
1745
|
let s = Infinity, c = -Infinity, l = Infinity, u = -Infinity;
|
|
1627
|
-
for (let e of a) s = Math.min(s,
|
|
1746
|
+
for (let e of a) s = Math.min(s, E(e.x, 0, F)), c = Math.max(c, E(e.x, 0, F)), l = Math.min(l, E(e.y, t.top, t.top + t.height)), u = Math.max(u, E(e.y, t.top, t.top + t.height));
|
|
1628
1747
|
e.type === "horizontalLine" && (s = F * .35, c = F * .65);
|
|
1629
|
-
let d =
|
|
1630
|
-
m < 4 && (m = u + 32),
|
|
1748
|
+
let d = Nt.offsetWidth || 200, f = Nt.offsetHeight || 34, p = E((s + c) / 2 - d / 2, 4, Math.max(4, F - d - 4)), m = l - f - 14;
|
|
1749
|
+
m < 4 && (m = u + 32), Nt.style.left = `${Math.round(p)}px`, Nt.style.top = `${Math.round(E(m, 4, Math.max(4, I - f - 4)))}px`;
|
|
1631
1750
|
}
|
|
1632
|
-
|
|
1633
|
-
B = null,
|
|
1751
|
+
Nt.addEventListener("pointerdown", (e) => e.stopPropagation()), Nt.addEventListener("dblclick", (e) => e.stopPropagation()), Nt.addEventListener("pointermove", (e) => e.stopPropagation()), Nt.addEventListener("pointerenter", () => {
|
|
1752
|
+
B = null, En = null, A.style.cursor = "default", $();
|
|
1634
1753
|
});
|
|
1635
|
-
let
|
|
1754
|
+
let pa = () => ({
|
|
1636
1755
|
active: !!K,
|
|
1637
|
-
picking:
|
|
1756
|
+
picking: Wn,
|
|
1638
1757
|
playing: !!K?.playing,
|
|
1639
|
-
speed: K?.speed ??
|
|
1758
|
+
speed: K?.speed ?? Gn,
|
|
1640
1759
|
index: Y(),
|
|
1641
1760
|
total: K ? K.source.length : Y(),
|
|
1642
|
-
time: Y() ?
|
|
1643
|
-
}),
|
|
1761
|
+
time: Y() ? M.time[Y() - 1] : NaN
|
|
1762
|
+
}), ma = () => q("replayChange", pa()), ha = (e, t) => ({
|
|
1644
1763
|
time: e.time.subarray(0, t),
|
|
1645
1764
|
open: e.open.subarray(0, t),
|
|
1646
1765
|
high: e.high.subarray(0, t),
|
|
1647
1766
|
low: e.low.subarray(0, t),
|
|
1648
1767
|
close: e.close.subarray(0, t),
|
|
1649
1768
|
volume: e.volume.subarray(0, t)
|
|
1650
|
-
}),
|
|
1769
|
+
}), ga = (e, t) => {
|
|
1651
1770
|
let n = e.hasVolume;
|
|
1652
|
-
|
|
1653
|
-
},
|
|
1771
|
+
nt(M, ha(e, t)), M.hasVolume = n, Ft = Ge(), Rt = Ge(), Lt = 0, Hn = NaN, Tr(0);
|
|
1772
|
+
}, _a = () => {
|
|
1654
1773
|
K?.timer && clearInterval(K.timer), K && (K.timer = null, K.playing = !1);
|
|
1655
|
-
},
|
|
1656
|
-
if (
|
|
1774
|
+
}, va = (e) => {
|
|
1775
|
+
if (Wn = !1, !K) {
|
|
1657
1776
|
if (!Y()) return;
|
|
1658
|
-
let e =
|
|
1659
|
-
|
|
1777
|
+
let e = qe();
|
|
1778
|
+
nt(e, ha(M, Y())), e.hasVolume = M.hasVolume, K = {
|
|
1660
1779
|
source: e,
|
|
1661
1780
|
playing: !1,
|
|
1662
|
-
speed:
|
|
1781
|
+
speed: Gn,
|
|
1663
1782
|
timer: null
|
|
1664
1783
|
};
|
|
1665
1784
|
}
|
|
1666
|
-
|
|
1667
|
-
let t =
|
|
1668
|
-
|
|
1669
|
-
for (let e of
|
|
1670
|
-
|
|
1671
|
-
},
|
|
1785
|
+
_a();
|
|
1786
|
+
let t = E(Math.round(e) + 1, 1, K.source.length);
|
|
1787
|
+
ga(K.source, t), P = t - 1 + (k.rightOffset ?? 8);
|
|
1788
|
+
for (let e of Qt.values()) e.auto = !0;
|
|
1789
|
+
ma();
|
|
1790
|
+
}, ya = (e) => {
|
|
1672
1791
|
if (!K) return;
|
|
1673
|
-
let t = K.source, n = Y(), r =
|
|
1792
|
+
let t = K.source, n = Y(), r = Or(), i = -1;
|
|
1674
1793
|
for (let n = 0; n < e && Y() < t.length; n++) {
|
|
1675
|
-
let e =
|
|
1794
|
+
let e = rt(M, tt(t, Y()));
|
|
1676
1795
|
i < 0 && (i = e);
|
|
1677
1796
|
}
|
|
1678
|
-
|
|
1679
|
-
},
|
|
1797
|
+
M.hasVolume = t.hasVolume, i >= 0 && (r && (P += Y() - n), Tr(i)), Y() >= t.length && _a(), ma();
|
|
1798
|
+
}, ba = (e) => {
|
|
1680
1799
|
if (!K) return;
|
|
1681
|
-
if (e !== void 0 && e > 0 && (K.speed =
|
|
1682
|
-
|
|
1800
|
+
if (e !== void 0 && e > 0 && (K.speed = Gn = e), _a(), Y() >= K.source.length) {
|
|
1801
|
+
ma();
|
|
1683
1802
|
return;
|
|
1684
1803
|
}
|
|
1685
1804
|
let t = Math.max(16, 1e3 / K.speed), n = Math.max(1, Math.round(K.speed * t / 1e3));
|
|
1686
|
-
K.playing = !0, K.timer = setInterval(() =>
|
|
1687
|
-
},
|
|
1688
|
-
let t =
|
|
1689
|
-
if (
|
|
1690
|
-
t && (
|
|
1805
|
+
K.playing = !0, K.timer = setInterval(() => ya(n), t), ma();
|
|
1806
|
+
}, xa = (e) => {
|
|
1807
|
+
let t = Wn;
|
|
1808
|
+
if (Wn = !1, !K) {
|
|
1809
|
+
t && (ma(), $());
|
|
1691
1810
|
return;
|
|
1692
1811
|
}
|
|
1693
|
-
|
|
1812
|
+
_a();
|
|
1694
1813
|
let n = K.source;
|
|
1695
|
-
K = null, e &&
|
|
1696
|
-
},
|
|
1814
|
+
K = null, e && ga(n, n.length), ma();
|
|
1815
|
+
}, Sa = (e, t) => {
|
|
1697
1816
|
let n = "crosshair";
|
|
1698
|
-
|
|
1699
|
-
let r = null, i = U ? -1 :
|
|
1700
|
-
if (i !==
|
|
1817
|
+
Fn = null;
|
|
1818
|
+
let r = null, i = U ? -1 : na(e, t);
|
|
1819
|
+
if (i !== Ln && (Ln = i), U?.kind === "pan" && U.moved) n = "grabbing";
|
|
1701
1820
|
else if (i >= 0) n = "pointer";
|
|
1702
|
-
else if (
|
|
1703
|
-
else if (
|
|
1821
|
+
else if (Wn && e <= F && t <= I) n = "pointer";
|
|
1822
|
+
else if (ra(t) > 0) n = "row-resize";
|
|
1704
1823
|
else if (e > F && t < I) n = "ns-resize";
|
|
1705
1824
|
else if (t > I) n = "ew-resize";
|
|
1706
|
-
else if (
|
|
1707
|
-
let i =
|
|
1708
|
-
if (i) n = "ns-resize",
|
|
1825
|
+
else if (wn === "cursor") {
|
|
1826
|
+
let i = ea(e, t);
|
|
1827
|
+
if (i) n = "ns-resize", Fn = i.id;
|
|
1709
1828
|
else {
|
|
1710
|
-
let i =
|
|
1829
|
+
let i = ta(e, t);
|
|
1711
1830
|
i && (r = i.drawing.id, n = i.drawing.locked ? "pointer" : i.hit.part === "handle" ? "move" : "pointer");
|
|
1712
1831
|
}
|
|
1713
1832
|
}
|
|
1714
|
-
r !==
|
|
1715
|
-
},
|
|
1833
|
+
r !== En && (En = r), A.style.cursor !== n && (A.style.cursor = n);
|
|
1834
|
+
}, Ca = (e) => {
|
|
1716
1835
|
if (e.button !== 0 && e.pointerType === "mouse") return;
|
|
1717
|
-
let { x: t, y: n } =
|
|
1836
|
+
let { x: t, y: n } = Ii(e);
|
|
1718
1837
|
if (B = {
|
|
1719
1838
|
x: t,
|
|
1720
1839
|
y: n
|
|
1721
|
-
}, V = null, H &&
|
|
1840
|
+
}, V = null, H && Na(!0), gn = null, _n = null, jn && sa(!0), Nn && (Nn = !1, $()), e.pointerType === "touch" && (mn.set(e.pointerId, {
|
|
1722
1841
|
x: t,
|
|
1723
1842
|
y: n
|
|
1724
|
-
}),
|
|
1725
|
-
let [e, t] = [...
|
|
1726
|
-
|
|
1843
|
+
}), mn.size === 2)) {
|
|
1844
|
+
let [e, t] = [...mn.values()];
|
|
1845
|
+
hn = {
|
|
1727
1846
|
distance: Math.hypot(e.x - t.x, e.y - t.y),
|
|
1728
1847
|
spacing: N
|
|
1729
1848
|
}, U = null;
|
|
1730
1849
|
return;
|
|
1731
1850
|
}
|
|
1732
1851
|
try {
|
|
1733
|
-
|
|
1852
|
+
A.setPointerCapture(e.pointerId);
|
|
1734
1853
|
} catch {}
|
|
1735
|
-
let r =
|
|
1854
|
+
let r = na(t, n), i = In[r];
|
|
1736
1855
|
if (i) {
|
|
1737
1856
|
U = {
|
|
1738
1857
|
kind: "button",
|
|
@@ -1740,11 +1859,11 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1740
1859
|
};
|
|
1741
1860
|
return;
|
|
1742
1861
|
}
|
|
1743
|
-
if (
|
|
1744
|
-
|
|
1862
|
+
if (Wn && t <= F && n <= I) {
|
|
1863
|
+
va(Math.min(Y() - 1, Math.round(lr(t))));
|
|
1745
1864
|
return;
|
|
1746
1865
|
}
|
|
1747
|
-
let a =
|
|
1866
|
+
let a = ra(n);
|
|
1748
1867
|
if (a > 0) {
|
|
1749
1868
|
let e = L[a - 1], t = L[a];
|
|
1750
1869
|
U = {
|
|
@@ -1757,7 +1876,7 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1757
1876
|
return;
|
|
1758
1877
|
}
|
|
1759
1878
|
if (t > F && n < I) {
|
|
1760
|
-
let e =
|
|
1879
|
+
let e = Mr(n);
|
|
1761
1880
|
e && (U = {
|
|
1762
1881
|
kind: "axisY",
|
|
1763
1882
|
pane: e,
|
|
@@ -1775,26 +1894,26 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1775
1894
|
};
|
|
1776
1895
|
return;
|
|
1777
1896
|
}
|
|
1778
|
-
let o =
|
|
1779
|
-
if (
|
|
1897
|
+
let o = Mr(n);
|
|
1898
|
+
if (wn !== "cursor" && o && Y()) {
|
|
1780
1899
|
if (G) {
|
|
1781
|
-
|
|
1900
|
+
$i(t, n), Qi(), U = null, $();
|
|
1782
1901
|
return;
|
|
1783
1902
|
}
|
|
1784
|
-
let e =
|
|
1785
|
-
if (
|
|
1786
|
-
id: `drawing-${Date.now().toString(36)}-${++
|
|
1903
|
+
let e = wn, r = x(e), i = r ? L[0] : o, a = zi(t, E(n, i.top, i.top + i.height), i), s = g(e);
|
|
1904
|
+
if (On = i.id, G = {
|
|
1905
|
+
id: `drawing-${Date.now().toString(36)}-${++kn}`,
|
|
1787
1906
|
type: e,
|
|
1788
|
-
points: r ?
|
|
1907
|
+
points: r ? Xi({
|
|
1789
1908
|
...a,
|
|
1790
|
-
price:
|
|
1909
|
+
price: fi(a.price)
|
|
1791
1910
|
}, i, e === "longPosition") : s === 1 ? [a] : [a, a],
|
|
1792
|
-
...i.id ===
|
|
1911
|
+
...i.id === T ? {} : { pane: i.id }
|
|
1793
1912
|
}, s === 1) {
|
|
1794
|
-
|
|
1913
|
+
Zi();
|
|
1795
1914
|
return;
|
|
1796
1915
|
}
|
|
1797
|
-
|
|
1916
|
+
Dn = s - 1, U = {
|
|
1798
1917
|
kind: "create",
|
|
1799
1918
|
pane: i,
|
|
1800
1919
|
x: t,
|
|
@@ -1803,8 +1922,8 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1803
1922
|
}, $();
|
|
1804
1923
|
return;
|
|
1805
1924
|
}
|
|
1806
|
-
if (
|
|
1807
|
-
let e =
|
|
1925
|
+
if (wn === "cursor") {
|
|
1926
|
+
let e = ea(t, n);
|
|
1808
1927
|
if (e) {
|
|
1809
1928
|
U = {
|
|
1810
1929
|
kind: "order",
|
|
@@ -1813,9 +1932,9 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1813
1932
|
};
|
|
1814
1933
|
return;
|
|
1815
1934
|
}
|
|
1816
|
-
let r =
|
|
1935
|
+
let r = ta(t, n);
|
|
1817
1936
|
if (r) {
|
|
1818
|
-
|
|
1937
|
+
Vi(r.drawing.id), r.drawing.locked || (U = {
|
|
1819
1938
|
kind: "drawing",
|
|
1820
1939
|
id: r.drawing.id,
|
|
1821
1940
|
pane: r.pane,
|
|
@@ -1840,63 +1959,63 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1840
1959
|
lastT: e.timeStamp,
|
|
1841
1960
|
velocity: 0
|
|
1842
1961
|
};
|
|
1843
|
-
},
|
|
1844
|
-
let { x: t, y: n } =
|
|
1962
|
+
}, wa = (e) => {
|
|
1963
|
+
let { x: t, y: n } = Ii(e);
|
|
1845
1964
|
if (B = {
|
|
1846
1965
|
x: t,
|
|
1847
1966
|
y: n
|
|
1848
|
-
}, e.pointerType === "touch" &&
|
|
1967
|
+
}, pn = e.altKey, e.pointerType === "touch" && mn.has(e.pointerId) && (mn.set(e.pointerId, {
|
|
1849
1968
|
x: t,
|
|
1850
1969
|
y: n
|
|
1851
|
-
}),
|
|
1852
|
-
let [e, t] = [...
|
|
1853
|
-
N =
|
|
1970
|
+
}), hn && mn.size === 2)) {
|
|
1971
|
+
let [e, t] = [...mn.values()], n = Math.hypot(e.x - t.x, e.y - t.y), r = Y(), i = r && Or() ? Math.min(F, cr(r - 1)) : (e.x + t.x) / 2, a = lr(i);
|
|
1972
|
+
N = hn.spacing * n / Math.max(1, hn.distance), Nr(), P = a + (F - i) / N, Nr(), $();
|
|
1854
1973
|
return;
|
|
1855
1974
|
}
|
|
1856
1975
|
let r = U;
|
|
1857
1976
|
if (!r) {
|
|
1858
|
-
G &&
|
|
1977
|
+
G && $i(t, n), Sa(t, n), $();
|
|
1859
1978
|
return;
|
|
1860
1979
|
}
|
|
1861
1980
|
switch (r.kind) {
|
|
1862
1981
|
case "pan": {
|
|
1863
1982
|
let i = t - r.x;
|
|
1864
1983
|
if (!r.moved && Math.hypot(i, n - r.y) < 3) break;
|
|
1865
|
-
r.moved = !0, P = r.right - i / N, r.pane && !r.pane.scale.auto &&
|
|
1984
|
+
r.moved = !0, P = r.right - i / N, r.pane && !r.pane.scale.auto && Ie(r.pane.scale, n - r.lastY), r.lastY = n;
|
|
1866
1985
|
let a = Math.max(1, e.timeStamp - r.lastT);
|
|
1867
|
-
r.velocity = .6 * ((t - r.lastX) / a) + .4 * r.velocity, r.lastX = t, r.lastT = e.timeStamp,
|
|
1986
|
+
r.velocity = .6 * ((t - r.lastX) / a) + .4 * r.velocity, r.lastX = t, r.lastT = e.timeStamp, Nr(), A.style.cursor = "grabbing";
|
|
1868
1987
|
break;
|
|
1869
1988
|
}
|
|
1870
1989
|
case "axisY": {
|
|
1871
1990
|
let e = r.pane.scale;
|
|
1872
|
-
e.min = r.min, e.max = r.max,
|
|
1991
|
+
e.min = r.min, e.max = r.max, He(e, Math.exp((n - r.y) * .006));
|
|
1873
1992
|
break;
|
|
1874
1993
|
}
|
|
1875
1994
|
case "axisX": {
|
|
1876
1995
|
let e = P;
|
|
1877
|
-
N = r.spacing * Math.exp((t - r.x) * .006),
|
|
1996
|
+
N = r.spacing * Math.exp((t - r.x) * .006), Nr(), P = e, Nr();
|
|
1878
1997
|
break;
|
|
1879
1998
|
}
|
|
1880
1999
|
case "separator": {
|
|
1881
2000
|
let e = n - r.y, t = L[r.index - 1], i = L[r.index];
|
|
1882
2001
|
if (!t || !i) break;
|
|
1883
|
-
let a = r.above + r.below, o =
|
|
1884
|
-
|
|
2002
|
+
let a = r.above + r.below, o = E(r.below - e, lt, a - lt);
|
|
2003
|
+
$t.set(i.id, o), t.id !== T && $t.set(t.id, a - o);
|
|
1885
2004
|
break;
|
|
1886
2005
|
}
|
|
1887
2006
|
case "order":
|
|
1888
|
-
|
|
2007
|
+
Pn.set(r.line.id, fi(Be(L[0].scale, n)));
|
|
1889
2008
|
break;
|
|
1890
2009
|
case "drawing": {
|
|
1891
2010
|
if (!r.moved && Math.hypot(t - r.x, n - r.y) < 3) break;
|
|
1892
2011
|
r.moved = !0;
|
|
1893
2012
|
let e = r.pane.scale, i;
|
|
1894
|
-
if (r.handle >= 0) i =
|
|
2013
|
+
if (r.handle >= 0) i = S(r.original, r.handle, zi(t, n, r.pane));
|
|
1895
2014
|
else {
|
|
1896
|
-
let a = Math.round(
|
|
2015
|
+
let a = Math.round(lr(t) - lr(r.x)), o = Re(e, n) - Re(e, r.y);
|
|
1897
2016
|
i = r.original.points.map((t) => ({
|
|
1898
|
-
time:
|
|
1899
|
-
price:
|
|
2017
|
+
time: ur(Math.round(xr(t.time)) + a),
|
|
2018
|
+
price: Fe(e, ze(e, t.price) + o)
|
|
1900
2019
|
}));
|
|
1901
2020
|
}
|
|
1902
2021
|
W = W.map((e) => e.id === r.id ? {
|
|
@@ -1906,191 +2025,198 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
1906
2025
|
break;
|
|
1907
2026
|
}
|
|
1908
2027
|
case "create":
|
|
1909
|
-
Math.hypot(t - r.x, n - r.y) >= 4 && (r.moved = !0),
|
|
2028
|
+
Math.hypot(t - r.x, n - r.y) >= 4 && (r.moved = !0), $i(t, n);
|
|
1910
2029
|
break;
|
|
1911
|
-
default:
|
|
2030
|
+
default: Sa(t, n);
|
|
1912
2031
|
}
|
|
1913
2032
|
$();
|
|
1914
|
-
},
|
|
1915
|
-
|
|
2033
|
+
}, Ta = (e) => {
|
|
2034
|
+
mn.delete(e.pointerId), mn.size < 2 && (hn = null);
|
|
1916
2035
|
let t = U;
|
|
1917
2036
|
U = null;
|
|
1918
|
-
let { x: n, y: r } =
|
|
2037
|
+
let { x: n, y: r } = Ii(e);
|
|
1919
2038
|
if (e.pointerType === "touch" && (B = null), !t) {
|
|
1920
2039
|
$();
|
|
1921
2040
|
return;
|
|
1922
2041
|
}
|
|
1923
2042
|
switch (t.kind) {
|
|
1924
2043
|
case "pan":
|
|
1925
|
-
if (t.moved)
|
|
2044
|
+
if (t.moved) k.kineticScroll !== !1 && e.timeStamp - t.lastT < 60 && Math.abs(t.velocity) > .25 && (gn = {
|
|
1926
2045
|
v: t.velocity,
|
|
1927
2046
|
t: typeof performance < "u" ? performance.now() : Date.now()
|
|
1928
2047
|
});
|
|
1929
2048
|
else {
|
|
1930
|
-
|
|
1931
|
-
let e =
|
|
2049
|
+
Tn && Vi(null);
|
|
2050
|
+
let e = Mr(r);
|
|
1932
2051
|
e && n <= F && q("click", {
|
|
1933
|
-
index: Math.round(
|
|
1934
|
-
time:
|
|
1935
|
-
price:
|
|
2052
|
+
index: Math.round(lr(n)),
|
|
2053
|
+
time: ur(Math.round(lr(n))),
|
|
2054
|
+
price: Be(e.scale, r),
|
|
1936
2055
|
pane: e.id
|
|
1937
2056
|
});
|
|
1938
2057
|
}
|
|
1939
2058
|
break;
|
|
1940
2059
|
case "order": {
|
|
1941
|
-
let e =
|
|
2060
|
+
let e = Pn.get(t.line.id);
|
|
1942
2061
|
e !== void 0 && e !== t.startPrice ? q("orderMove", {
|
|
1943
2062
|
id: t.line.id,
|
|
1944
2063
|
price: e,
|
|
1945
2064
|
previousPrice: t.startPrice,
|
|
1946
2065
|
line: t.line
|
|
1947
|
-
}) :
|
|
2066
|
+
}) : Pn.delete(t.line.id);
|
|
1948
2067
|
break;
|
|
1949
2068
|
}
|
|
1950
2069
|
case "drawing":
|
|
1951
|
-
t.moved &&
|
|
2070
|
+
t.moved && Wi(W);
|
|
1952
2071
|
break;
|
|
1953
2072
|
case "create":
|
|
1954
|
-
t.moved &&
|
|
2073
|
+
t.moved && Qi();
|
|
1955
2074
|
break;
|
|
1956
|
-
case "button":
|
|
2075
|
+
case "button": na(n, r) >= 0 && t.action();
|
|
1957
2076
|
}
|
|
1958
|
-
|
|
1959
|
-
},
|
|
1960
|
-
U || e.pointerType === "touch" || (B = null,
|
|
1961
|
-
},
|
|
1962
|
-
let t =
|
|
2077
|
+
Sa(n, r), $();
|
|
2078
|
+
}, Ea = (e) => {
|
|
2079
|
+
U || e.pointerType === "touch" || (B = null, En = null, Fn = null, $());
|
|
2080
|
+
}, Da = (e) => {
|
|
2081
|
+
let t = k.wheel ?? "zoom";
|
|
1963
2082
|
if (t === "none") return;
|
|
1964
|
-
let { x: n } =
|
|
2083
|
+
let { x: n } = Ii(e), r = e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? F : 1, i = e.deltaX * r, a = e.deltaY * r, o = e.ctrlKey || e.metaKey;
|
|
1965
2084
|
if (t === "modifier" && !o && Math.abs(i) <= Math.abs(a)) return;
|
|
1966
2085
|
if (e.preventDefault(), V = null, Math.abs(i) > Math.abs(a) || e.shiftKey) {
|
|
1967
|
-
P += (Math.abs(i) > Math.abs(a) ? i : a) / N,
|
|
2086
|
+
P += (Math.abs(i) > Math.abs(a) ? i : a) / N, Nr(), gn = null, $();
|
|
1968
2087
|
return;
|
|
1969
2088
|
}
|
|
1970
2089
|
let s = Math.exp(-a * (e.ctrlKey ? .01 : .0015));
|
|
1971
|
-
|
|
1972
|
-
},
|
|
1973
|
-
let { x: t, y: n } =
|
|
2090
|
+
Ri(Math.min(n, F), s);
|
|
2091
|
+
}, Oa = (e) => {
|
|
2092
|
+
let { x: t, y: n } = Ii(e), r = wn === "cursor" ? ta(t, n) : null;
|
|
1974
2093
|
if (r?.drawing.type === "text") {
|
|
1975
|
-
|
|
2094
|
+
oa(r.drawing.id, !1);
|
|
1976
2095
|
return;
|
|
1977
2096
|
}
|
|
1978
2097
|
if (t > F && n < I) {
|
|
1979
|
-
let e =
|
|
2098
|
+
let e = Mr(n);
|
|
1980
2099
|
e && (e.scale.auto = !0);
|
|
1981
|
-
} else if (n > I) N =
|
|
1982
|
-
else for (let e of
|
|
2100
|
+
} else if (n > I) N = k.barSpacing ?? 8, Ja.scrollToRealtime(!0);
|
|
2101
|
+
else for (let e of Qt.values()) e.auto = !0;
|
|
1983
2102
|
$();
|
|
1984
|
-
},
|
|
2103
|
+
}, ka = (e) => {
|
|
1985
2104
|
if (e < 0 || e >= Y()) return;
|
|
1986
|
-
let t =
|
|
1987
|
-
|
|
1988
|
-
time:
|
|
2105
|
+
let t = Sr(), n = Xn();
|
|
2106
|
+
Mt.textContent = ke(n.announcement, {
|
|
2107
|
+
time: se(gr(M.time[e]), or(), J),
|
|
1989
2108
|
open: Z(t.open[e]),
|
|
1990
2109
|
high: Z(t.high[e]),
|
|
1991
2110
|
low: Z(t.low[e]),
|
|
1992
2111
|
close: Z(t.close[e])
|
|
1993
2112
|
});
|
|
1994
|
-
},
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2113
|
+
}, Aa = (...e) => {
|
|
2114
|
+
let t = ["zh", "ja"].includes(s(J));
|
|
2115
|
+
Mt.textContent = e.filter(Boolean).map((e) => e.replace(/[.。]$/, "")).join(t ? "。" : ". ");
|
|
2116
|
+
}, ja = () => (k.priceLines ?? []).filter((e) => e.draggable || e.cancellable), Ma = (e) => {
|
|
2117
|
+
let t = vt[e.kind ?? "line"];
|
|
2118
|
+
return e.title ?? (t ? Xn()[t] : "");
|
|
2119
|
+
}, Na = (e) => {
|
|
2120
|
+
H?.kind === "move" && e && (H.override === void 0 ? Pn.delete(H.id) : Pn.set(H.id, H.override)), H = null;
|
|
2121
|
+
}, Pa = (e) => e.pinned ?? xt(e.side, e.price, fi(pi())), Fa = (e) => {
|
|
2002
2122
|
let t = Y();
|
|
2003
|
-
if (!
|
|
2004
|
-
let n =
|
|
2005
|
-
if (
|
|
2006
|
-
|
|
2007
|
-
|
|
2123
|
+
if (!k.orderEntry || !t || e.ctrlKey || e.metaKey) return !1;
|
|
2124
|
+
let n = Xn(), r = e.code === "KeyB" ? "b" : e.code === "KeyS" ? "s" : void 0, i = e.altKey ? r ? `alt+${r}` : "" : e.key.length === 1 ? e.key.toLowerCase() : e.key;
|
|
2125
|
+
if (i === "b" || i === "s" || i === "alt+b" || i === "alt+s") {
|
|
2126
|
+
let e = i.endsWith("b") ? "buy" : "sell", r, a;
|
|
2127
|
+
if (H?.kind === "create" && H.side === e) a = H.price, i.startsWith("alt") && (r = Pa(H) === "limit" ? "stop" : "limit");
|
|
2128
|
+
else {
|
|
2129
|
+
Na(!0);
|
|
2130
|
+
let n = si();
|
|
2131
|
+
a = fi(n && n.pane.id === T && D(n.price) ? n.price : M.close[t - 1]), i.startsWith("alt") && (r = xt(e, a, fi(M.close[t - 1])) === "limit" ? "stop" : "limit");
|
|
2132
|
+
}
|
|
2008
2133
|
return H = {
|
|
2009
2134
|
kind: "create",
|
|
2010
|
-
side:
|
|
2011
|
-
price:
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2135
|
+
side: e,
|
|
2136
|
+
price: a,
|
|
2137
|
+
pinned: r
|
|
2138
|
+
}, Aa(mi(e, Pa(H), a), n.orderHint, n.orderTypeHint), !0;
|
|
2139
|
+
}
|
|
2140
|
+
if (e.altKey) return !1;
|
|
2141
|
+
if (i === "o") {
|
|
2142
|
+
let t = ja();
|
|
2016
2143
|
if (!t.length) return !1;
|
|
2017
2144
|
let r = H?.kind === "move" ? H.id : null;
|
|
2018
|
-
|
|
2145
|
+
Na(!0);
|
|
2019
2146
|
let i = t.findIndex((e) => e.id === r), a = e.shiftKey ? -1 : 1, o = t[i < 0 ? a > 0 ? 0 : t.length - 1 : (i + a + t.length) % t.length];
|
|
2020
2147
|
if (!o) return !1;
|
|
2021
2148
|
H = {
|
|
2022
2149
|
kind: "move",
|
|
2023
2150
|
id: o.id,
|
|
2024
|
-
start:
|
|
2025
|
-
override:
|
|
2151
|
+
start: oi(o),
|
|
2152
|
+
override: Pn.get(o.id)
|
|
2026
2153
|
};
|
|
2027
|
-
let s =
|
|
2028
|
-
title:
|
|
2029
|
-
price: Z(
|
|
2154
|
+
let s = ke(n.orderLine, {
|
|
2155
|
+
title: Ma(o),
|
|
2156
|
+
price: Z(oi(o))
|
|
2030
2157
|
});
|
|
2031
|
-
return
|
|
2032
|
-
s,
|
|
2033
|
-
o.draggable ? n.orderHint : "",
|
|
2034
|
-
o.cancellable ? n.orderCancelHint : ""
|
|
2035
|
-
].filter(Boolean).join(". ")), !0;
|
|
2158
|
+
return Aa(s, o.draggable ? n.orderHint : "", o.cancellable ? n.orderCancelHint : ""), !0;
|
|
2036
2159
|
}
|
|
2037
2160
|
if (!H) return !1;
|
|
2038
|
-
let a = H.kind === "move" ? H.id : null, o = (
|
|
2161
|
+
let a = H.kind === "move" ? H.id : null, o = (k.priceLines ?? []).find((e) => e.id === a);
|
|
2039
2162
|
switch (e.key) {
|
|
2040
2163
|
case "ArrowUp":
|
|
2041
2164
|
case "ArrowDown": {
|
|
2042
|
-
let t = 10 ** -
|
|
2043
|
-
if (H.kind === "create") H.price =
|
|
2165
|
+
let t = 10 ** -nr() * (e.shiftKey ? 10 : 1) * (e.key === "ArrowUp" ? 1 : -1);
|
|
2166
|
+
if (H.kind === "create") H.price = fi(H.price + t), Aa(mi(H.side, Pa(H), H.price));
|
|
2044
2167
|
else if (o?.draggable) {
|
|
2045
|
-
let e = oi(
|
|
2046
|
-
|
|
2168
|
+
let e = fi(oi(o) + t);
|
|
2169
|
+
Pn.set(o.id, e), Aa(Z(e));
|
|
2047
2170
|
}
|
|
2048
2171
|
return !0;
|
|
2049
2172
|
}
|
|
2050
2173
|
case "Enter": {
|
|
2051
2174
|
if (H.kind === "create") {
|
|
2052
|
-
let { price: e, side: t } = H;
|
|
2053
|
-
return
|
|
2175
|
+
let { price: e, side: t } = H, r = Pa(H);
|
|
2176
|
+
return Na(!1), q("orderCreate", {
|
|
2054
2177
|
price: e,
|
|
2055
|
-
side: t
|
|
2056
|
-
|
|
2178
|
+
side: t,
|
|
2179
|
+
orderType: r
|
|
2180
|
+
}), Aa(mi(t, r, e), ke(n.orderPlaced, { price: Z(e) })), !0;
|
|
2057
2181
|
}
|
|
2058
2182
|
let e = H.start;
|
|
2059
|
-
|
|
2060
|
-
let t = o ?
|
|
2183
|
+
Na(!1);
|
|
2184
|
+
let t = o ? Pn.get(o.id) : void 0;
|
|
2061
2185
|
return o && t !== void 0 && t !== e && (q("orderMove", {
|
|
2062
2186
|
id: o.id,
|
|
2063
2187
|
price: t,
|
|
2064
2188
|
previousPrice: e,
|
|
2065
2189
|
line: o
|
|
2066
|
-
}),
|
|
2190
|
+
}), Aa(ke(n.orderPlaced, { price: Z(t) }))), !0;
|
|
2067
2191
|
}
|
|
2068
|
-
case "Escape": return H.kind === "create" ?
|
|
2069
|
-
title:
|
|
2192
|
+
case "Escape": return H.kind === "create" ? Aa(n.orderCancelled) : o && Aa(ke(n.orderLine, {
|
|
2193
|
+
title: Ma(o),
|
|
2070
2194
|
price: Z(H.start)
|
|
2071
|
-
})),
|
|
2195
|
+
})), Na(!0), !0;
|
|
2072
2196
|
case "Delete":
|
|
2073
|
-
case "Backspace": return o?.cancellable && (
|
|
2197
|
+
case "Backspace": return o?.cancellable && (Na(!0), q("orderCancel", {
|
|
2074
2198
|
id: o.id,
|
|
2075
2199
|
line: o
|
|
2076
|
-
}),
|
|
2200
|
+
}), Aa(n.orderCancelled)), !0;
|
|
2077
2201
|
default: return !1;
|
|
2078
2202
|
}
|
|
2203
|
+
}, Ia = (e) => {
|
|
2204
|
+
e.key === "Alt" && pn !== (e.type === "keydown") && (pn = e.type === "keydown", B && k.orderEntry && $());
|
|
2079
2205
|
};
|
|
2080
|
-
|
|
2081
|
-
if (e.target ===
|
|
2206
|
+
A.addEventListener("pointerdown", Ca), A.addEventListener("pointermove", wa), A.addEventListener("pointerup", Ta), A.addEventListener("pointercancel", Ta), A.addEventListener("pointerleave", Ea), A.addEventListener("wheel", Da, { passive: !1 }), A.addEventListener("dblclick", Oa), A.addEventListener("keydown", (e) => {
|
|
2207
|
+
if (Ia(e), e.target === A && Fa(e)) {
|
|
2082
2208
|
e.preventDefault(), $();
|
|
2083
2209
|
return;
|
|
2084
2210
|
}
|
|
2085
2211
|
if ((e.ctrlKey || e.metaKey) && !e.altKey) {
|
|
2086
2212
|
let t = e.key.toLowerCase();
|
|
2087
|
-
(t === "z" || t === "y") && (t === "y" || e.shiftKey ?
|
|
2213
|
+
(t === "z" || t === "y") && (t === "y" || e.shiftKey ? qi() : Ki(), e.preventDefault());
|
|
2088
2214
|
return;
|
|
2089
2215
|
}
|
|
2090
2216
|
let t = Y(), n = Math.max(1, Math.floor(F / N / 2)), r = (e) => {
|
|
2091
|
-
V =
|
|
2092
|
-
let n =
|
|
2093
|
-
n < N && (P += (N - n) / N + 1), n > F - N && (P -= (n - F + N) / N - 1),
|
|
2217
|
+
V = E(e, 0, Math.max(0, t - 1));
|
|
2218
|
+
let n = cr(V);
|
|
2219
|
+
n < N && (P += (N - n) / N + 1), n > F - N && (P -= (n - F + N) / N - 1), Nr(), ka(V);
|
|
2094
2220
|
}, i = V ?? Math.min(t - 1, Math.round(P));
|
|
2095
2221
|
switch (e.key) {
|
|
2096
2222
|
case "ArrowLeft":
|
|
@@ -2109,104 +2235,104 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
2109
2235
|
r(0);
|
|
2110
2236
|
break;
|
|
2111
2237
|
case "End":
|
|
2112
|
-
r(t - 1),
|
|
2238
|
+
r(t - 1), Ja.scrollToRealtime(!0);
|
|
2113
2239
|
break;
|
|
2114
2240
|
case "+":
|
|
2115
2241
|
case "=":
|
|
2116
2242
|
case "ArrowUp":
|
|
2117
|
-
|
|
2243
|
+
Ri(V === null ? F : cr(V), 1.2);
|
|
2118
2244
|
break;
|
|
2119
2245
|
case "-":
|
|
2120
2246
|
case "_":
|
|
2121
2247
|
case "ArrowDown":
|
|
2122
|
-
|
|
2248
|
+
Ri(V === null ? F : cr(V), 1 / 1.2);
|
|
2123
2249
|
break;
|
|
2124
2250
|
case "Escape":
|
|
2125
|
-
|
|
2251
|
+
Nn ? Nn = !1 : Wn ? xa(!1) : G ? (G = null, Dn = 0) : wn === "cursor" ? Tn ? Vi(null) : V = null : Bi("cursor", !0);
|
|
2126
2252
|
break;
|
|
2127
2253
|
case "Delete":
|
|
2128
2254
|
case "Backspace": {
|
|
2129
|
-
let e = W.find((e) => e.id ===
|
|
2255
|
+
let e = W.find((e) => e.id === Tn);
|
|
2130
2256
|
if (!e || e.locked) return;
|
|
2131
|
-
|
|
2257
|
+
Yi(e.id);
|
|
2132
2258
|
break;
|
|
2133
2259
|
}
|
|
2134
2260
|
default: return;
|
|
2135
2261
|
}
|
|
2136
2262
|
e.preventDefault(), $();
|
|
2137
|
-
}),
|
|
2263
|
+
}), A.addEventListener("keyup", Ia), A.addEventListener("focus", () => {
|
|
2138
2264
|
let e = !0;
|
|
2139
2265
|
try {
|
|
2140
|
-
e =
|
|
2266
|
+
e = A.matches(":focus-visible");
|
|
2141
2267
|
} catch {}
|
|
2142
|
-
e && (
|
|
2143
|
-
}),
|
|
2144
|
-
|
|
2145
|
-
}),
|
|
2146
|
-
let
|
|
2147
|
-
|
|
2148
|
-
let
|
|
2149
|
-
if (
|
|
2150
|
-
let e =
|
|
2151
|
-
|
|
2152
|
-
},
|
|
2153
|
-
typeof MutationObserver == "function" &&
|
|
2154
|
-
if (
|
|
2268
|
+
e && (A.style.boxShadow = `inset 0 0 0 2px ${o(R.primary, .6)}`);
|
|
2269
|
+
}), A.addEventListener("blur", () => {
|
|
2270
|
+
A.style.boxShadow = "", H && (Na(!0), $()), V !== null && (V = null, $());
|
|
2271
|
+
}), jt.addEventListener("pointerdown", (e) => e.stopPropagation()), jt.addEventListener("click", () => Ja.scrollToRealtime(!0));
|
|
2272
|
+
let La = typeof ResizeObserver == "function" ? new ResizeObserver(() => $()) : null;
|
|
2273
|
+
La?.observe(A);
|
|
2274
|
+
let Ra = () => {
|
|
2275
|
+
if (Tt) return;
|
|
2276
|
+
let e = p(A);
|
|
2277
|
+
m(R, e) && nn++, R = e, yi = "", $();
|
|
2278
|
+
}, za = h(Ra), Ba = null;
|
|
2279
|
+
typeof MutationObserver == "function" && A.ownerDocument && (Ba = new MutationObserver(() => {
|
|
2280
|
+
if (k.locale) return;
|
|
2155
2281
|
let e = J;
|
|
2156
|
-
|
|
2157
|
-
}),
|
|
2282
|
+
Yn(), J !== e && (yi = "", rn++, Ga(), $());
|
|
2283
|
+
}), Ba.observe(A.ownerDocument.documentElement, {
|
|
2158
2284
|
attributes: !0,
|
|
2159
2285
|
attributeFilter: ["lang"]
|
|
2160
2286
|
}));
|
|
2161
|
-
let
|
|
2162
|
-
if (
|
|
2163
|
-
|
|
2164
|
-
let e =
|
|
2165
|
-
t.width = Math.max(1, Math.round(
|
|
2287
|
+
let Va = () => {
|
|
2288
|
+
if (Tt) return null;
|
|
2289
|
+
on && (wt?.cancelAnimationFrame ? wt.cancelAnimationFrame(on) : clearTimeout(on), on = 0), Mi();
|
|
2290
|
+
let e = wt?.devicePixelRatio || 1, t = O.createElement("canvas");
|
|
2291
|
+
t.width = Math.max(1, Math.round(Xt * e)), t.height = Math.max(1, Math.round(Zt * e));
|
|
2166
2292
|
let n = t.getContext("2d");
|
|
2167
2293
|
if (!n) return null;
|
|
2168
2294
|
n.fillStyle = o(R.background), n.fillRect(0, 0, t.width, t.height);
|
|
2169
2295
|
try {
|
|
2170
|
-
n.drawImage(
|
|
2296
|
+
n.drawImage(Ot, 0, 0), z && n.drawImage(z.canvas, 0, 0, Math.round(F * e), Math.round(I * e)), n.drawImage(kt, 0, 0);
|
|
2171
2297
|
} catch {}
|
|
2172
2298
|
n.setTransform(e, 0, 0, e, 0, 0);
|
|
2173
|
-
let r =
|
|
2174
|
-
return
|
|
2299
|
+
let r = A.getBoundingClientRect(), i = wt ?? null;
|
|
2300
|
+
return At.querySelectorAll("span, button").forEach((e) => {
|
|
2175
2301
|
let t = e.textContent ?? "";
|
|
2176
2302
|
if (e.children.length || !t.trim() || !i) return;
|
|
2177
2303
|
let a = e.getBoundingClientRect(), s = i.getComputedStyle(e);
|
|
2178
2304
|
n.font = `${s.fontWeight} ${s.fontSize} ${s.fontFamily}`, n.fillStyle = s.color || o(R.text), n.textAlign = "left", n.textBaseline = "middle", n.fillText(t, a.left - r.left, a.top - r.top + a.height / 2);
|
|
2179
2305
|
}), t;
|
|
2180
|
-
},
|
|
2181
|
-
let e =
|
|
2182
|
-
e !==
|
|
2306
|
+
}, Ha = !1, Ua = () => {
|
|
2307
|
+
let e = O.fullscreenElement === A;
|
|
2308
|
+
e !== Ha && (Ha = e, A.style.background = e ? o(R.background) : "", q("fullscreenChange", e), $());
|
|
2183
2309
|
};
|
|
2184
|
-
|
|
2185
|
-
let
|
|
2186
|
-
let n =
|
|
2187
|
-
|
|
2310
|
+
O.addEventListener("fullscreenchange", Ua);
|
|
2311
|
+
let Wa = async (t = /* @__PURE__ */ new Set()) => {
|
|
2312
|
+
let n = ++an, r = await d(k.renderer ?? "auto", () => e(O), (e) => {
|
|
2313
|
+
Tt || z?.kind !== e || (z.destroy(), z.canvas.remove(), z = null, Wa(/* @__PURE__ */ new Set([...t, e])));
|
|
2188
2314
|
}, t);
|
|
2189
|
-
if (
|
|
2315
|
+
if (Tt || n !== an) {
|
|
2190
2316
|
r?.destroy();
|
|
2191
2317
|
return;
|
|
2192
2318
|
}
|
|
2193
|
-
z && (z.destroy(), z.canvas.remove()), z = r,
|
|
2194
|
-
},
|
|
2195
|
-
let e =
|
|
2196
|
-
|
|
2197
|
-
let t = !!
|
|
2198
|
-
t && !
|
|
2199
|
-
},
|
|
2200
|
-
let t =
|
|
2201
|
-
|
|
2202
|
-
let n = t.timeZone &&
|
|
2203
|
-
if (
|
|
2204
|
-
if ((!e || t.compare !== e.compare) &&
|
|
2205
|
-
let e =
|
|
2319
|
+
z && (z.destroy(), z.canvas.remove()), z = r, cn = "", r && (A.dataset.renderer = r.kind, A.insertBefore(r.canvas, kt), q("renderer", r.kind)), dn(r?.kind ?? null), $();
|
|
2320
|
+
}, Ga = () => {
|
|
2321
|
+
let e = k.symbol ?? "";
|
|
2322
|
+
A.setAttribute("aria-label", k.ariaLabel ?? ke(Xn().chart, { symbol: e }).trim());
|
|
2323
|
+
let t = !!k.countdown && k.lastPriceLine !== !1;
|
|
2324
|
+
t && !Un && (Un = setInterval($, 1e3)), !t && Un && (clearInterval(Un), Un = null);
|
|
2325
|
+
}, Ka = (e) => {
|
|
2326
|
+
let t = k;
|
|
2327
|
+
Yn();
|
|
2328
|
+
let n = t.timeZone && fe(t.timeZone) ? t.timeZone : void 0, r = !!e && (t.utcOffset !== e.utcOffset || n !== pr);
|
|
2329
|
+
if (pr = n, (!e || t.indicators !== e.indicators) && Er(), r) for (let e of zt) Bt.set(e, 0);
|
|
2330
|
+
if ((!e || t.compare !== e.compare) && Dr(), t.bars && (!e || t.bars !== e.bars) ? (K && xa(!1), e ? Ar(t.bars) : kr(t.bars)) : !t.bars && e?.bars && (K && xa(!1), kr([])), e && t.barSpacing !== e.barSpacing && t.barSpacing && (N = t.barSpacing), e && t.scaleMode !== e.scaleMode) {
|
|
2331
|
+
let e = Qt.get(T);
|
|
2206
2332
|
e && (e.auto = !0);
|
|
2207
2333
|
}
|
|
2208
|
-
if (t.drawings && t.drawings !==
|
|
2209
|
-
let e = H.id, t =
|
|
2334
|
+
if (t.drawings && t.drawings !== yn && (!e || t.drawings !== e.drawings) && (e ? Wi(t.drawings, !1) : W = bn = t.drawings), e && (t.drawingMode ?? "cursor") !== (e.drawingMode ?? "cursor") && Bi(t.drawingMode ?? "cursor", !1), e && t.priceLines !== e.priceLines && (Pn.clear(), H?.kind === "move")) {
|
|
2335
|
+
let e = H.id, t = ja().find((t) => t.id === e);
|
|
2210
2336
|
H = t ? {
|
|
2211
2337
|
kind: "move",
|
|
2212
2338
|
id: e,
|
|
@@ -2214,44 +2340,44 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
2214
2340
|
override: void 0
|
|
2215
2341
|
} : null;
|
|
2216
2342
|
}
|
|
2217
|
-
t.orderEntry ?
|
|
2343
|
+
t.orderEntry ? A.setAttribute("aria-keyshortcuts", bt) : (A.removeAttribute("aria-keyshortcuts"), H && Na(!0)), e && t.chartStyle !== e.chartStyle && (Lt = Math.min(Lt, 0)), rn++, Ga(), $();
|
|
2218
2344
|
};
|
|
2219
|
-
|
|
2220
|
-
let
|
|
2345
|
+
Ka(null), Wa();
|
|
2346
|
+
let qa = f(() => k.renderer, () => void Wa()), Ja = {
|
|
2221
2347
|
setOptions(e) {
|
|
2222
|
-
if (
|
|
2223
|
-
let t =
|
|
2224
|
-
|
|
2348
|
+
if (Tt) return;
|
|
2349
|
+
let t = k;
|
|
2350
|
+
k = { ...e }, Ka(t), (e.renderer ?? "auto") !== (t.renderer ?? "auto") && Wa();
|
|
2225
2351
|
},
|
|
2226
2352
|
setBars(e) {
|
|
2227
|
-
K &&
|
|
2353
|
+
K && xa(!1), kr(e);
|
|
2228
2354
|
},
|
|
2229
2355
|
update(e) {
|
|
2230
2356
|
if (K) {
|
|
2231
|
-
|
|
2357
|
+
rt(K.source, e);
|
|
2232
2358
|
return;
|
|
2233
2359
|
}
|
|
2234
|
-
let t = Y(), n =
|
|
2235
|
-
r < 0 || (Y() > t && n && (P += Y() - t),
|
|
2360
|
+
let t = Y(), n = Or(), r = rt(M, e);
|
|
2361
|
+
r < 0 || (Y() > t && n && (P += Y() - t), Tr(r));
|
|
2236
2362
|
},
|
|
2237
2363
|
appendBars(e) {
|
|
2238
2364
|
if (K) {
|
|
2239
|
-
|
|
2365
|
+
Ue(K.source, e);
|
|
2240
2366
|
return;
|
|
2241
2367
|
}
|
|
2242
|
-
let t = Y(), n =
|
|
2243
|
-
r < 0 || (n && (P += Y() - t),
|
|
2368
|
+
let t = Y(), n = Or(), r = Ue(M, e);
|
|
2369
|
+
r < 0 || (n && (P += Y() - t), Tr(r));
|
|
2244
2370
|
},
|
|
2245
2371
|
prependBars(e) {
|
|
2246
|
-
K &&
|
|
2247
|
-
let t =
|
|
2248
|
-
t && (
|
|
2372
|
+
K && Qe(K.source, e);
|
|
2373
|
+
let t = Qe(M, e);
|
|
2374
|
+
t && (Ft = Ge(), Rt = Ge(), Lt = 0, P += t, V !== null && (V += t), Tr(0));
|
|
2249
2375
|
},
|
|
2250
2376
|
getBarCount: () => Y(),
|
|
2251
|
-
getBar: (e) => e >= 0 && e < Y() ?
|
|
2377
|
+
getBar: (e) => e >= 0 && e < Y() ? tt(M, Math.floor(e)) : null,
|
|
2252
2378
|
scrollToRealtime(e = !0) {
|
|
2253
|
-
let t = Y() - 1 + (
|
|
2254
|
-
|
|
2379
|
+
let t = Y() - 1 + (k.rightOffset ?? 8);
|
|
2380
|
+
gn = null, e && D(P) && Math.abs(t - P) * N < F * 6 ? _n = {
|
|
2255
2381
|
from: P,
|
|
2256
2382
|
to: t,
|
|
2257
2383
|
start: typeof performance < "u" ? performance.now() : Date.now()
|
|
@@ -2259,113 +2385,113 @@ var it = 28, at = 60, ot = 60, st = 48, C = "price", ct = "var(--success-color,
|
|
|
2259
2385
|
},
|
|
2260
2386
|
fitContent() {
|
|
2261
2387
|
let e = Y();
|
|
2262
|
-
e &&
|
|
2388
|
+
e && Ja.setVisibleRange({
|
|
2263
2389
|
from: -.5,
|
|
2264
|
-
to: e - 1 + (
|
|
2390
|
+
to: e - 1 + (k.rightOffset ?? 8)
|
|
2265
2391
|
});
|
|
2266
2392
|
},
|
|
2267
|
-
getVisibleRange: () =>
|
|
2393
|
+
getVisibleRange: () => Pi(),
|
|
2268
2394
|
setVisibleRange({ from: e, to: t }) {
|
|
2269
|
-
t > e && (
|
|
2395
|
+
t > e && (gn = null, _n = null, vn = {
|
|
2270
2396
|
from: e,
|
|
2271
2397
|
to: t
|
|
2272
|
-
},
|
|
2398
|
+
}, Li(vn), $());
|
|
2273
2399
|
},
|
|
2274
2400
|
getVisibleTimeRange() {
|
|
2275
|
-
let e =
|
|
2401
|
+
let e = Pi();
|
|
2276
2402
|
return {
|
|
2277
|
-
from:
|
|
2278
|
-
to:
|
|
2403
|
+
from: dr(e.from),
|
|
2404
|
+
to: dr(e.to)
|
|
2279
2405
|
};
|
|
2280
2406
|
},
|
|
2281
2407
|
setVisibleTimeRange({ from: e, to: t }) {
|
|
2282
|
-
Y() && t > e &&
|
|
2283
|
-
from:
|
|
2284
|
-
to:
|
|
2408
|
+
Y() && t > e && Ja.setVisibleRange({
|
|
2409
|
+
from: fr(e),
|
|
2410
|
+
to: fr(t)
|
|
2285
2411
|
});
|
|
2286
2412
|
},
|
|
2287
2413
|
setCrosshair(e, t) {
|
|
2288
|
-
|
|
2414
|
+
Bn = e === null || !D(e) ? null : {
|
|
2289
2415
|
time: e,
|
|
2290
2416
|
price: t ?? NaN
|
|
2291
2417
|
}, $();
|
|
2292
2418
|
},
|
|
2293
2419
|
setScaleMode(e) {
|
|
2294
|
-
|
|
2295
|
-
...
|
|
2420
|
+
k = {
|
|
2421
|
+
...k,
|
|
2296
2422
|
scaleMode: e
|
|
2297
2423
|
};
|
|
2298
|
-
let t =
|
|
2424
|
+
let t = Qt.get(T);
|
|
2299
2425
|
t && (t.auto = !0), $();
|
|
2300
2426
|
},
|
|
2301
2427
|
resetPriceScales() {
|
|
2302
|
-
for (let e of
|
|
2428
|
+
for (let e of Qt.values()) e.auto = !0;
|
|
2303
2429
|
$();
|
|
2304
2430
|
},
|
|
2305
|
-
setDrawingTool: (e) =>
|
|
2306
|
-
getDrawingTool: () =>
|
|
2431
|
+
setDrawingTool: (e) => Bi(e, !0),
|
|
2432
|
+
getDrawingTool: () => wn,
|
|
2307
2433
|
getDrawings: () => W,
|
|
2308
2434
|
setDrawings(e) {
|
|
2309
|
-
|
|
2435
|
+
Wi(e, !1);
|
|
2310
2436
|
},
|
|
2311
|
-
removeDrawing:
|
|
2312
|
-
updateDrawing:
|
|
2313
|
-
selectDrawing: (e) =>
|
|
2314
|
-
undo:
|
|
2315
|
-
redo:
|
|
2316
|
-
getUndoState:
|
|
2437
|
+
removeDrawing: Yi,
|
|
2438
|
+
updateDrawing: Ji,
|
|
2439
|
+
selectDrawing: (e) => Vi(e),
|
|
2440
|
+
undo: Ki,
|
|
2441
|
+
redo: qi,
|
|
2442
|
+
getUndoState: Hi,
|
|
2317
2443
|
startReplay(e) {
|
|
2318
2444
|
if (!Y() && !K) return;
|
|
2319
2445
|
if (e === void 0) {
|
|
2320
|
-
K &&
|
|
2446
|
+
K && xa(!0), Wn = !0, ma(), $();
|
|
2321
2447
|
return;
|
|
2322
2448
|
}
|
|
2323
|
-
let t = K ? K.source :
|
|
2324
|
-
|
|
2449
|
+
let t = K ? K.source : M;
|
|
2450
|
+
va(Je(t.time, t.length, e));
|
|
2325
2451
|
},
|
|
2326
|
-
replayStep: (e = 1) =>
|
|
2327
|
-
replayPlay: (e) =>
|
|
2452
|
+
replayStep: (e = 1) => ya(Math.max(1, Math.floor(e))),
|
|
2453
|
+
replayPlay: (e) => ba(e),
|
|
2328
2454
|
replayPause() {
|
|
2329
|
-
K && (
|
|
2455
|
+
K && (_a(), ma());
|
|
2330
2456
|
},
|
|
2331
|
-
stopReplay: () =>
|
|
2332
|
-
getReplayState:
|
|
2457
|
+
stopReplay: () => xa(!0),
|
|
2458
|
+
getReplayState: pa,
|
|
2333
2459
|
toDataURL(e = "image/png", t) {
|
|
2334
|
-
return
|
|
2460
|
+
return Va()?.toDataURL(e, t) ?? "";
|
|
2335
2461
|
},
|
|
2336
2462
|
toBlob(e = "image/png", t) {
|
|
2337
|
-
let n =
|
|
2463
|
+
let n = Va();
|
|
2338
2464
|
return new Promise((r) => {
|
|
2339
2465
|
!n || typeof n.toBlob != "function" ? r(null) : n.toBlob(r, e, t);
|
|
2340
2466
|
});
|
|
2341
2467
|
},
|
|
2342
2468
|
async requestFullscreen() {
|
|
2343
|
-
typeof
|
|
2469
|
+
typeof A.requestFullscreen == "function" && await A.requestFullscreen();
|
|
2344
2470
|
},
|
|
2345
2471
|
async exitFullscreen() {
|
|
2346
|
-
|
|
2472
|
+
O.fullscreenElement === A && typeof O.exitFullscreen == "function" && await O.exitFullscreen();
|
|
2347
2473
|
},
|
|
2348
|
-
isFullscreen: () =>
|
|
2474
|
+
isFullscreen: () => O.fullscreenElement === A,
|
|
2349
2475
|
setIndicatorVisible(e, t) {
|
|
2350
|
-
|
|
2476
|
+
Vt.set(e, t), $();
|
|
2351
2477
|
},
|
|
2352
2478
|
getRenderer: () => z?.kind ?? null,
|
|
2353
|
-
ready:
|
|
2354
|
-
refreshTheme:
|
|
2479
|
+
ready: fn,
|
|
2480
|
+
refreshTheme: Ra,
|
|
2355
2481
|
resize: () => $(),
|
|
2356
2482
|
on(e, t) {
|
|
2357
|
-
let n =
|
|
2358
|
-
return n ||
|
|
2483
|
+
let n = qn.get(e);
|
|
2484
|
+
return n || qn.set(e, n = /* @__PURE__ */ new Set()), n.add(t), () => n.delete(t);
|
|
2359
2485
|
},
|
|
2360
2486
|
destroy() {
|
|
2361
|
-
|
|
2487
|
+
Tt || (Tt = !0, on && (wt?.cancelAnimationFrame ? wt.cancelAnimationFrame(on) : clearTimeout(on)), Un && clearInterval(Un), K?.timer && clearInterval(K.timer), O.removeEventListener("fullscreenchange", Ua), La?.disconnect(), qa(), za(), Ba?.disconnect(), A.removeEventListener("wheel", Da), z?.destroy(), z = null, dn(null), qn.clear(), A.remove());
|
|
2362
2488
|
}
|
|
2363
2489
|
};
|
|
2364
|
-
return
|
|
2365
|
-
|
|
2366
|
-
} }),
|
|
2490
|
+
return _t.set(Ja, { setTimeRange(e) {
|
|
2491
|
+
zn = !0, Ja.setVisibleTimeRange(e);
|
|
2492
|
+
} }), Ja;
|
|
2367
2493
|
};
|
|
2368
2494
|
//#endregion
|
|
2369
|
-
export {
|
|
2495
|
+
export { O as createTradingChart, _t as syncHooks };
|
|
2370
2496
|
|
|
2371
2497
|
//# sourceMappingURL=chart.js.map
|